Documentation Index
Fetch the complete documentation index at: https://docs.dynamic.xyz/docs/llms.txt
Use this file to discover all available pages before exploring further.
Overview
This guide walks you through creating Solana (SVM) wallets using Dynamic’s Node SDK. You’ll learn how to set up different threshold signature schemes and understand the security implications for Solana blockchain operations.
Prerequisites
Before you begin, make sure you have:
Step 1: Choose Your Security Model
Dynamic supports two threshold signature schemes for Solana wallets:
TWO_OF_TWO (Recommended for most use cases)
- Security: Highest - requires both your server and Dynamic’s infrastructure
- Availability: Lower - both parties must be online
- Use case: High-value transactions, maximum security
TWO_OF_THREE
- Security: High - requires 2 out of 3 shares
- Availability: Medium - can tolerate one party being offline
- Use case: Balanced security and availability
Step 2: Create Your First Solana Wallet
Here’s a complete example of creating a Solana wallet:
import { DynamicSvmWalletClient } from '@dynamic-labs-wallet/node-svm';
import { ThresholdSignatureScheme } from '@dynamic-labs-wallet/node';
// Create authenticated client
export const authenticatedSvmClient = async () => {
const client = new DynamicSvmWalletClient({
environmentId: process.env.DYNAMIC_ENVIRONMENT_ID!,
});
await client.authenticateApiToken(process.env.DYNAMIC_AUTH_TOKEN!);
return client;
};
export const createSvmWallet = async ({
thresholdSignatureScheme = ThresholdSignatureScheme.TWO_OF_TWO,
password,
onError
}: {
thresholdSignatureScheme?: ThresholdSignatureScheme;
password?: string;
onError?: (error: Error) => void;
}) => {
const svmClient = await authenticatedSvmClient();
const wallet = await svmClient.createWalletAccount({
thresholdSignatureScheme,
password,
onError,
backUpToClientShareService: true,
});
return {
accountAddress: wallet.accountAddress,
rawPublicKey: wallet.rawPublicKey,
walletId: wallet.walletId,
externalServerKeyShares: wallet.externalServerKeyShares,
};
};
// Usage example
const wallet = await createSvmWallet({
thresholdSignatureScheme: ThresholdSignatureScheme.TWO_OF_TWO,
password: 'your-secure-password',
onError: (error: Error) => {
console.error('SVM wallet creation error:', error);
},
});
console.log('Solana wallet created:', wallet.accountAddress);
console.log('External server key shares:', wallet.externalServerKeyShares);
Step 3: Handle Errors Gracefully
Always implement proper error handling for Solana wallet creation:
try {
const wallet = await createSvmWallet({
thresholdSignatureScheme: ThresholdSignatureScheme.TWO_OF_TWO,
onError: (error: Error) => {
console.error('Wallet creation error:', error);
},
});
console.log('Solana wallet created successfully:', wallet.accountAddress);
} catch (error) {
if (error.message.includes('insufficient funds')) {
console.error('Insufficient funds for wallet creation');
} else if (error.message.includes('invalid session')) {
console.error('Invalid session ID - please re-authenticate');
} else {
console.error('Solana wallet creation failed:', error.message);
}
}
After creating a Solana wallet, you’ll receive important information that should be stored securely:
const wallet = await svmClient.createWalletAccount({
thresholdSignatureScheme: ThresholdSignatureScheme.TWO_OF_TWO,
backUpToClientShareService: true,
});
// Store these securely in your database
const walletData = {
accountAddress: wallet.accountAddress,
walletId: wallet.walletId,
thresholdScheme: ThresholdSignatureScheme.TWO_OF_TWO,
chainName: 'solana',
createdAt: new Date().toISOString(),
externalServerKeyShares: wallet.externalServerKeyShares,
};
// Never store externalServerKeyShares in plain text
// They should be encrypted and stored securely
Step 5: Verify Your Solana Wallet
You can verify your wallet was created correctly by checking the Solana network:
import { Connection, PublicKey } from '@solana/web3.js';
const connection = new Connection('https://api.mainnet-beta.solana.com', 'confirmed');
const publicKey = new PublicKey(wallet.accountAddress);
// Check if the account exists
const accountInfo = await connection.getAccountInfo(publicKey);
if (accountInfo) {
console.log('Solana wallet verified on network');
} else {
console.log('Wallet created but not yet on network (normal for new wallets)');
}
Best Practices
- Password Security: Use strong, unique passwords for each Solana wallet
- Error Handling: Always handle potential errors during wallet creation with the
onError callback
- Monitoring: Log wallet creation events for audit purposes
- Backup Strategy: Implement secure backup strategies for key shares with
backUpToClientShareService: true
- Network Selection: Choose the appropriate Solana network (mainnet, devnet, testnet)
Solana-Specific Considerations
Network Selection
- Mainnet: For production applications
- Devnet: For development and testing
- Testnet: For testing with test tokens
Account Types
- System Accounts: Standard Solana accounts for SOL storage
- Token Accounts: For SPL token storage (created separately)
Rent Exemption
Solana accounts require rent exemption (minimum balance). Dynamic handles this automatically during wallet creation.
Next Steps
Now that you’ve created a Solana wallet, you can: