diff --git a/packages/widget/src/providers/misc/solana-connector.ts b/packages/widget/src/providers/misc/solana-connector.ts index 7b0fb31a..4a9982ec 100644 --- a/packages/widget/src/providers/misc/solana-connector.ts +++ b/packages/widget/src/providers/misc/solana-connector.ts @@ -1,6 +1,10 @@ import type { Wallet } from "@solana/wallet-adapter-react"; import { WalletConnectWalletAdapter } from "@solana/wallet-adapter-wallets"; -import { type Connection, Transaction } from "@solana/web3.js"; +import { + type Connection, + Transaction, + VersionedTransaction, +} from "@solana/web3.js"; import { MiscNetworks } from "@stakekit/common"; import type { Chain, @@ -38,7 +42,26 @@ const createSolanaConnector = ({ type: solanaWallet.adapter.name, showQrModal: false, sendTransaction: async (tx) => { - const solanaTx = Transaction.from(Buffer.from(tx, "hex")); + const base64Decoded = Buffer.from(tx, "base64"); + const isBase64 = base64Decoded.toString("base64") === tx; + + const buffer = isBase64 ? base64Decoded : Buffer.from(tx, "hex"); + + let solanaTx: Transaction | VersionedTransaction; + let versionedError: unknown; + try { + solanaTx = VersionedTransaction.deserialize(buffer); + } catch (err) { + versionedError = err; + try { + solanaTx = Transaction.from(buffer); + } catch (legacyErr) { + throw new Error( + `Failed to deserialize Solana transaction. VersionedTransaction error: ${versionedError instanceof Error ? versionedError.message : String(versionedError)}. Legacy Transaction error: ${legacyErr instanceof Error ? legacyErr.message : String(legacyErr)}` + ); + } + } + const signed = await solanaWallet.adapter.sendTransaction( solanaTx, connection