From ac98aff7738046dd1af1697fb8e374d862e67eab Mon Sep 17 00:00:00 2001 From: Joey Meere <100378695+joeymeere@users.noreply.github.com> Date: Wed, 6 Nov 2024 09:35:38 -0500 Subject: [PATCH] remove decompile --- lib/transaction/decodeAndDeserialize.ts | 64 ++++++++++++++++++++----- lib/transaction/importTransaction.ts | 3 +- 2 files changed, 54 insertions(+), 13 deletions(-) diff --git a/lib/transaction/decodeAndDeserialize.ts b/lib/transaction/decodeAndDeserialize.ts index 89f3e5a..c31b13b 100644 --- a/lib/transaction/decodeAndDeserialize.ts +++ b/lib/transaction/decodeAndDeserialize.ts @@ -1,26 +1,66 @@ import * as bs58 from "bs58"; -import { Message, TransactionMessage, VersionedMessage } from "@solana/web3.js"; +import { + Message, + MessageAccountKeys, + MessageV0, + PublicKey, + Transaction, + TransactionMessage, + VersionedMessage, + VersionedTransaction, +} from "@solana/web3.js"; -export function decodeAndDeserialize(tx: string): { - message: VersionedMessage; +interface DeserializedTransaction { + message: TransactionMessage; version: number | "legacy"; -} { + accountKeys: PublicKey[]; +} + +/** + * Decodes a base58 encoded transaction and deserializes it into a TransactionMessage + * @param tx - Base58 encoded transaction string + * @returns Object containing the deserialized message, version, and account keys + * @throws Error if deserialization fails + */ +export function decodeAndDeserialize(tx: string): DeserializedTransaction { + if (!tx) { + throw new Error("Transaction string is required"); + } + try { const messageBytes = bs58.default.decode(tx); const version = VersionedMessage.deserializeMessageVersion(messageBytes); + let message: TransactionMessage; + let accountKeys: PublicKey[]; - let message; if (version === "legacy") { - let legMsg = Message.from(messageBytes); - let converted = TransactionMessage.decompile(legMsg).compileToV0Message(); - message = VersionedMessage.deserialize(converted.serialize()); + const legacyMessage = Message.from(messageBytes); + accountKeys = legacyMessage.accountKeys; + + const intermediate = VersionedMessage.deserialize( + new MessageV0(legacyMessage).serialize() + ); + message = TransactionMessage.decompile(intermediate, { + addressLookupTableAccounts: [], + }); } else { - message = VersionedMessage.deserialize(messageBytes); + const versionedMessage = VersionedMessage.deserialize(messageBytes); + accountKeys = versionedMessage.staticAccountKeys; + + message = TransactionMessage.decompile(versionedMessage, { + addressLookupTableAccounts: [], + }); } - return { version, message }; + return { + version, + message, + accountKeys, + }; } catch (error) { - console.error(error); - throw new Error("Failed to decode transaction."); + if (error instanceof Error) { + throw new Error(`Failed to decode transaction: ${error.message}`); + } + throw new Error("Failed to decode transaction: Unknown error"); } } diff --git a/lib/transaction/importTransaction.ts b/lib/transaction/importTransaction.ts index 9eaa0ad..4a34356 100644 --- a/lib/transaction/importTransaction.ts +++ b/lib/transaction/importTransaction.ts @@ -3,6 +3,7 @@ import { Connection, PublicKey, TransactionMessage, + VersionedMessage, VersionedTransaction, } from "@solana/web3.js"; import { decodeAndDeserialize } from "./decodeAndDeserialize"; @@ -29,7 +30,7 @@ export const importTransaction = async ( new PublicKey(multisigPda) ); - const transactionMessage = TransactionMessage.decompile(message); + const transactionMessage = new TransactionMessage(message); const addressLookupTableAccounts = version === 0