// Function to convert base64 to VersionedTransaction import { getAllLookupTables, transformFromLookupTableAccounts } from './index'; import { Account, Address, CompiledTransactionMessage, decompileTransactionMessage, getCompiledTransactionMessageDecoder, getTransactionDecoder, Instruction, Rpc, SolanaRpcApi, Transaction, } from '@solana/kit'; import { AddressLookupTable } from '@solana-program/address-lookup-table'; import { CompilableTransactionMessage } from '@solana/transaction-messages'; export function base64ToTransaction(base64Txn: string): Transaction { // Decode base64 into a Uint8Array const txnBuffer = Buffer.from(base64Txn, 'base64'); // Deserialize the transaction return getTransactionDecoder().decode(txnBuffer); } export async function extractInstructionsAndLookupTablesFromTxn( connection: Rpc, txn: Transaction, ): Promise<{ instructions: Instruction[]; lookupTables: Account[]; }> { const dMessage: CompiledTransactionMessage = getCompiledTransactionMessageDecoder().decode(txn.messageBytes); let lutAddresses: Address[] = []; if (dMessage.version !== 'legacy') { lutAddresses = dMessage.addressTableLookups?.map((lut) => lut.lookupTableAddress) ?? []; } let decompiled: CompilableTransactionMessage; let lutAccounts: Account[] = []; if (lutAddresses.length) { lutAccounts = await getAllLookupTables(connection, lutAddresses); const addresses = transformFromLookupTableAccounts(lutAccounts); decompiled = decompileTransactionMessage(dMessage, { addressesByLookupTableAddress: addresses }); } else { decompiled = decompileTransactionMessage(dMessage); } const instructions: Instruction[] = decompiled.instructions.map((ix) => ({ ...ix })); return { instructions, lookupTables: lutAccounts }; }