Skip to main content

Overview

Your Monei Solana wallet allows you to manage SOL and SPL tokens on the Solana blockchain. This guide covers wallet operations, balance management, and portfolio tracking. What you’ll learn:
  • Get Solana wallet address
  • Check SOL balance
  • Check SPL token balances
  • View complete portfolio
  • Send SOL and SPL tokens
  • Network selection (mainnet/devnet/testnet)

Your Solana Wallet

Fast Transactions

~0.4 second block time, near-instant finality

Low Fees

~$0.00025 per transaction

Custodial

Monei securely manages your private keys

Get Wallet Address

Retrieve your Solana wallet address.
import MoneiSDK from 'monei-sdk';

const monei = new MoneiSDK({
  apiKey: process.env.MONEI_API_KEY,
});

// Get Solana wallet address
const address = await monei.solana.getAddress();

console.log('Solana Address:', address.address);
Response:
{
  "statusCode": 200,
  "message": "Address retrieved successfully",
  "data": {
    "address": "7KX8kq1vXWBYGNHWD3HqLNcJ6J6xWN5N3J6J6J6J6J6J"
  }
}

Network Selection

Solana supports multiple networks for different use cases.
NetworkDescriptionUse Case
mainnet-betaProduction networkReal transactions
devnetDevelopment networkTesting
testnetTesting networkTesting
// Get balance on mainnet (default)
const mainnetBalance = await monei.solana.getBalance({
  network: 'mainnet-beta'
});

// Get balance on devnet for testing
const devnetBalance = await monei.solana.getBalance({
  network: 'devnet'
});

console.log('Mainnet Balance:', mainnetBalance.balance, 'SOL');
console.log('Devnet Balance:', devnetBalance.balance, 'SOL');
Default network is mainnet-beta. Specify network parameter for devnet or testnet.

Get SOL Balance

Check your native SOL balance.
// Get SOL balance
const balance = await monei.solana.getBalance({
  network: 'mainnet-beta' // optional, defaults to mainnet-beta
});

console.log('SOL Balance:', balance.balance);
console.log('In Lamports:', balance.balanceLamports);
Response:
{
  "statusCode": 200,
  "message": "Balance retrieved successfully",
  "data": {
    "balance": "2.5"
  }
}
1 SOL = 1,000,000,000 lamports (9 decimals)

Get SPL Token Balance

Check balance for a specific SPL token.
// Get USDC balance on Solana
const usdcBalance = await monei.solana.getTokenBalance({
  tokenMintAddress: 'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v', // USDC mint
  network: 'mainnet-beta'
});

console.log('USDC Balance:', usdcBalance.balance);

// Get USDT balance
const usdtBalance = await monei.solana.getTokenBalance({
  tokenMintAddress: 'Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB', // USDT mint
  network: 'mainnet-beta'
});

console.log('USDT Balance:', usdtBalance.balance);
Response:
{
  "statusCode": 200,
  "message": "Token balance retrieved successfully",
  "data": {
    "balance": "1500.50"
  }
}

Get Portfolio

View your complete Solana portfolio including SOL and all SPL tokens.
// Get complete portfolio
const portfolio = await monei.solana.getPortfolio({
  network: 'mainnet-beta'
});

console.log('User ID:', portfolio.userId);
console.log('Address:', portfolio.address);
console.log('Total Value:', portfolio.totalValueUsd, 'USD');

// Native SOL
console.log('\nNative SOL:');
console.log('  Balance:', portfolio.nativeBalance, 'SOL');
console.log('  Lamports:', portfolio.nativeBalanceLamports);
console.log('  USD Value:', portfolio.nativeBalanceUsd);

// SPL Tokens
console.log('\nSPL Tokens:');
portfolio.tokens.forEach(token => {
  console.log(`\n  ${token.symbol} (${token.name})`);
  console.log(`    Mint: ${token.mintAddress}`);
  console.log(`    Balance: ${token.balance}`);
  console.log(`    Raw Balance: ${token.rawBalance}`);
  console.log(`    Decimals: ${token.decimals}`);
  console.log(`    Price USD: $${token.priceUsd}`);
  console.log(`    Value USD: $${token.valueUsd}`);
});
Response:
{
  "statusCode": 200,
  "message": "Portfolio retrieved successfully",
  "data": {
    "userId": "user-uuid-here",
    "address": "7KX8kq1vXWBYGNHWD3HqLNcJ6J6xWN5N3J6J6J6J6J6J",
    "nativeBalance": "2.5",
    "nativeBalanceLamports": "2500000000",
    "nativeBalanceUsd": 250.0,
    "tokens": [
      {
        "mintAddress": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
        "name": "USD Coin",
        "symbol": "USDC",
        "balance": "1500.50",
        "rawBalance": "1500500000",
        "decimals": 6,
        "priceUsd": 1.00,
        "valueUsd": 1500.50
      },
      {
        "mintAddress": "Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB",
        "name": "USDT",
        "symbol": "USDT",
        "balance": "500.00",
        "rawBalance": "500000000",
        "decimals": 6,
        "priceUsd": 1.00,
        "valueUsd": 500.00
      }
    ],
    "totalValueUsd": 2250.50
  }
}

Send SOL

Transfer SOL to another Solana address.
// Send 0.5 SOL
const tx = await monei.solana.transferSol({
  to: '9B5XszUGdMaxCZ7uSQhPzdks5ZQSmWxrmzCSvtJ6Ns6g',
  amount: '0.5',
  network: 'mainnet-beta'
});

console.log('Transaction Signature:', tx.signature);
console.log('View on Solscan:', `https://solscan.io/tx/${tx.signature}`);

// Wait for confirmation
await monei.solana.waitForConfirmation(tx.signature);
console.log('Transaction confirmed!');
Response:
{
  "statusCode": 200,
  "message": "Transfer successful",
  "data": {
    "signature": "5VERv8NMvzbJMEkV8xnrLkEaWRtSz9CosKDYjCJjBRnTPLgTLpjvS3yJG3TBhVLiYt5mMXe4EH7zJ2VSkQfpYjG"
  }
}
Request Parameters:
ParameterTypeRequiredDescription
tostringYesRecipient Solana address
amountstringYesAmount of SOL to send
networkstringNoNetwork (default: mainnet-beta)

Send SPL Token

Transfer SPL tokens to another address.
// Send 100 USDC
const tx = await monei.solana.transferToken({
  to: '9B5XszUGdMaxCZ7uSQhPzdks5ZQSmWxrmzCSvtJ6Ns6g',
  tokenMintAddress: 'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v', // USDC
  amount: '100',
  network: 'mainnet-beta'
});

console.log('Transaction Signature:', tx.signature);
console.log('View on Solscan:', `https://solscan.io/tx/${tx.signature}`);

// Send USDT
const usdtTx = await monei.solana.transferToken({
  to: '9B5XszUGdMaxCZ7uSQhPzdks5ZQSmWxrmzCSvtJ6Ns6g',
  tokenMintAddress: 'Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB', // USDT
  amount: '50',
  network: 'mainnet-beta'
});

console.log('USDT Transaction:', usdtTx.signature);
Response:
{
  "statusCode": 200,
  "message": "Token transfer successful",
  "data": {
    "signature": "3yKGPvn2mVTpVqKLh9nWxkqVZL9RHkP2Uh8N5GqYqR7rRqKJ3sVHnT8LJ5VYqR7rRqKJ3sVHnT8LJ5VYqR7rR"
  }
}
Request Parameters:
ParameterTypeRequiredDescription
tostringYesRecipient Solana address
tokenMintAddressstringYesSPL token mint address
amountstringYesAmount of tokens to send
networkstringNoNetwork (default: mainnet-beta)

Common SPL Token Addresses

Stablecoins

TokenMint Address
USDCEPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v
USDTEs9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB
PYUSD2b1kV6DkPAnxd5ixfnxCpjxmKwqjjaYmCZfHsFu24GXo

Wrapped Assets

TokenMint Address
Wrapped SOLSo11111111111111111111111111111111111111112
Wrapped BTC9n4nbM75f5Ui33ZbPYXn59EwSgE8CGsHtAeTH5YFeJ9E
Wrapped ETH7vfCXTUXx5WJV5JADk17DUJ4ksgau7utNKj4b963voxs
TokenMint Address
JUP (Jupiter)JUPyiwrYJFskUPiHa7hkeR8VUtAeFoSYbKedZNsDvCN
BONKDezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263
WIFEKpQGSJtjMFqKZ9KQanSqYXRcF8fBopzLHYxdM65zcjm
Always verify token mint addresses from official sources before using them.

Transaction Fees

Solana has extremely low transaction fees:
Transaction TypeFee (SOL)Fee (USD)
SOL Transfer~0.000005~$0.0005
SPL Token Transfer~0.000005~$0.0005
Token Swap~0.00001~$0.001
Fee Structure:
  • Base fee: 5,000 lamports (0.000005 SOL)
  • Priority fees: Optional, for faster processing
  • Rent: Required for new token accounts (~0.002 SOL, refundable)
// Check if recipient has token account
async function checkTokenAccount(recipientAddress, tokenMint) {
  try {
    const balance = await connection.getTokenAccountBalance(tokenMint);
    console.log('Token account exists');
    return true;
  } catch (error) {
    console.log('Token account does not exist');
    console.log('Will require rent: ~0.002 SOL');
    return false;
  }
}

Best Practices

Verify Addresses

Always verify recipient addresses before sending

Keep SOL for Fees

Maintain minimum 0.01 SOL for transaction fees

Test Small First

Send small test amount before large transfers

Check Token Accounts

Ensure recipient has token account to avoid rent

Monitor Portfolio

Regularly check portfolio for all holdings

Use Mainnet

Always use mainnet-beta for real transactions

Solana vs EVM Comparison

FeatureSolanaEVM (Ethereum, BSC, etc.)
Block Time~0.4 seconds2-15 seconds
Transaction Fee~$0.00050.010.01 - 50
Finality~1 second30 seconds - 3 minutes
TPS65,000+15 - 2,000
Address FormatBase58 (44 chars)Hex (42 chars, 0x…)
TokensSPL tokensERC-20 tokens
Use CaseHigh-speed, low-costGeneral purpose, DeFi

Troubleshooting

Error: Insufficient balance for transactionCommon causes:
  • Not enough SOL for amount + fees
  • Not enough token balance
  • Need rent for new token account (~0.002 SOL)
Solution:
// Check balance before sending
const balance = await monei.solana.getBalance({ network: 'mainnet-beta' });
const minRequired = parseFloat(amount) + 0.01; // amount + buffer

if (parseFloat(balance.balance) < minRequired) {
  console.log('Insufficient SOL balance');
  console.log('Need:', minRequired, 'SOL');
  console.log('Have:', balance.balance, 'SOL');
}
Error: Recipient token account not foundCause: Recipient has never received this token beforeSolution:
  • First transfer will create token account (costs ~0.002 SOL rent)
  • Rent is paid by sender
  • Ensure you have extra SOL for rent
  • Recipient can close account later to reclaim rent
Problem: Transaction not confirmingExpected confirmation time: ~1 secondAction:
  1. Check transaction on Solscan/Solana Explorer
  2. Wait up to 30 seconds
  3. If still pending, check network status
  4. Contact support if pending > 1 minute
Error: Invalid Solana addressValid format:
  • Base58 encoded
  • 32-44 characters
  • Example: 9B5XszUGdMaxCZ7uSQhPzdks5ZQSmWxrmzCSvtJ6Ns6g
Validation:
function isValidSolanaAddress(address) {
  return /^[1-9A-HJ-NP-Za-km-z]{32,44}$/.test(address);
}

if (!isValidSolanaAddress(recipientAddress)) {
  console.log('Invalid Solana address format');
}
Error: Blockhash not found or expiredCause: Transaction took too long to processSolution:
  • Transactions on Solana expire after ~60 seconds
  • Retry the transaction
  • This is handled automatically by Monei

Next Steps

Transactions

Learn about Solana transaction management

Token Swaps

Swap SOL and SPL tokens on Jupiter

EVM Wallet

Compare with EVM wallet operations

Networks

Learn about supported networks