Transaction structure
Solana transactions can include multiple instructions in a single transaction. The Transfer API creates one instruction per transaction, while the Broadcast API allows you to combine multiple instructions. Each transaction is identified by its signature (the transaction ID is the signature itself).Receiving SPL tokens
Before a wallet can receive an SPL token, it needs an Associated Token Account (ATA) for that specific token. This is a Solana network requirement.- Automatic: When using the Transfer Asset endpoint, set
createDestinationAccount: trueto automatically create the recipient’s ATA. - Manual: To create an ATA using the Broadcast API with the
@solana/spl-tokenlibrary, see the Solana SDK examples for complete implementation details.
Creating an ATA costs a small amount of SOL (rent). When using
createDestinationAccount: true, the sender pays this fee.Recent blockhash and transaction timing
Solana transactions require a recent blockhash that must be within the last ~100 blocks (approximately 10 seconds). This short window can cause issues when:- Policies require approval before broadcast
- Network latency is high
- Multiple signatures are needed
- Transfer Asset (recommended): bootstrap a nonce account pool on the wallet with
kind: CreateSolanaNonceAccountsvia Sign and Broadcast Transaction, then setuseDurableNonce: trueon subsequent SOL or SPL transfers. Dfns picks a nonce from the pool server-side. - Broadcast API: build the durable-nonce transaction yourself using
@solana/web3.js. See the durable nonce SDK example.
Transfers
Use the Transfer Asset endpoint for all Solana transfers:- Native SOL: Use
kind: Nativewith amount in lamports (1 SOL = 1,000,000,000 lamports) - SPL tokens: Use
kind: Splwith the token’s mint address incontract - Token Extensions (SPL 2022): Use
kind: Spl2022with the token’s mint address
memo field (alphanumeric, max 64 characters).
Solana accounts must keep a rent-exempt minimum balance (about 0.00089 SOL for a basic account). A native SOL transfer that would drain the sender below this minimum, or that funds a brand-new account with less than the minimum, is rejected during transaction simulation (often surfaced as a compute-unit / simulation error). Leave enough SOL to stay above the minimum and to cover fees.