Skip to main content

Overview

This guide shows how to sign Solana transactions using Dynamic’s Node SDK and broadcast them to the network.
signTransaction returns the raw signature, not the full signed transaction.DynamicSvmWalletClient.signTransaction() returns a base58-encoded Ed25519 signature: exactly 88 characters as a string, which decodes to 64 bytes. It is not a serialized transaction — calling VersionedTransaction.deserialize() on the decoded bytes throws immediately.You must decode the signature and add it back to the original transaction before broadcasting. See Step 3 below.

Prerequisites

Step 1: Set Up the Client

Step 2: Build the Transaction

Step 3: Sign and Broadcast

signTransaction returns the 64-byte Ed25519 signature as a base58 string. Add it to the transaction before sending.

Legacy Transaction

VersionedTransaction (e.g. from Checkout API)

If you receive a pre-built VersionedTransaction — for example the base64-encoded serializedTransaction from the Checkout API /prepare endpoint — decode it first:
Why skipPreflight: true for VersionedTransaction?Pre-built transactions from swap/bridge protocols may include oracle update instructions that simulation rejects with errors like “PythOracleOutdated” — even though the transaction would succeed on validators. Use skipPreflight: true to bypass local simulation for these cases.
Do not pass signTransaction() output directly to connection.sendRawTransaction() or the SDK’s sendTransaction() export.signTransaction() returns a base58 string. Calling Buffer.from(base58string) interprets it as UTF-8 (not decoded bytes), producing a garbled payload that fails with “failed to deserialize VersionedTransaction”. Always follow the decode → add signature → serialize → sendRawTransaction pattern.

Manual Backup (externalServerKeyShares)

If the wallet was created with backUpToDynamic: false, supply key shares explicitly:

Complete Example: Send SOL

Next Steps

Last modified on July 15, 2026