This page provides complete, working code examples for integrating Solana with OneBalance. All examples use real data from our testing environment.

Transaction Signing Implementation

First, here’s the core signing function you’ll need for Solana operations:
import { MessageV0, VersionedTransaction, PublicKey } from '@solana/web3.js';
import bs58 from 'bs58';

/**
 * Signs a Solana chain operation from OneBalance quote response
 * @param dataToSign - Base64 encoded data from quote response
 * @param wallet - Solana wallet instance (Phantom, Solflare, etc.)
 * @returns Base58 encoded signature
 */
async function signSolanaOperation(dataToSign: string, wallet: any): Promise<string> {
  // 1. Convert base64 data to message buffer
  const msgBuffer = Buffer.from(dataToSign, 'base64');
  
  // 2. Deserialize into MessageV0
  const message = MessageV0.deserialize(msgBuffer);
  
  // 3. Create versioned transaction
  const transaction = new VersionedTransaction(message);
  
  // 4. Sign with wallet
  const signedTx = await wallet.signTransaction(transaction);
  
  // 5. Extract signature and encode as base58
  const signature = bs58.encode(Buffer.from(signedTx.signatures[signedTx.signatures.length - 1]));
  
  return signature;
}

Example 1: SOL → USDC (Same Chain)

Swap SOL to USDC within the Solana ecosystem:
const quoteRequest = {
  "from": {
    "accounts": [{
      "type": "solana",
      "accountAddress": "J5CCzBULFax899tcirb6wMbenQUd8whbaetG7EfSick5"
    }],
    "asset": {
      "assetId": "solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp/slip44:501"
    },
    "amount": "10000000" // 0.01 SOL (9 decimals)
  },
  "to": {
    "asset": {
      "assetId": "solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp/token:EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v"
    }
  }
};

const response = await fetch('https://be.staging.onebalance.io/api/v3/quote', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
    'x-api-key': 'your-api-key'
  },
  body: JSON.stringify(quoteRequest)
});

const quote = await response.json();

Example 2: SOL → USDC (Cross-Chain to Arbitrum)

Swap SOL on Solana to USDC on Arbitrum:
const crossChainQuote = {
  "from": {
    "accounts": [{
      "type": "solana",
      "accountAddress": "J5CCzBULFax899tcirb6wMbenQUd8whbaetG7EfSick5"
    }],
    "asset": {
      "assetId": "solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp/slip44:501"
    },
    "amount": "10000000" // 0.01 SOL
  },
  "to": {
    "asset": {
      "assetId": "eip155:42161/erc20:0xaf88d065e77c8cC2239327C5EDb3A432268e5831"
    },
    "account": "eip155:42161:0x895Cf62399bF1F8b88195E741b64278b41EB7F09"
  }
};

const response = await fetch('https://be.staging.onebalance.io/api/v3/quote', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
    'x-api-key': 'your-api-key'
  },
  body: JSON.stringify(crossChainQuote)
});

Example 3: USDC (Solana) → USDC (Arbitrum)

Transfer USDC from Solana to Arbitrum:
const usdcTransfer = {
  "from": {
    "accounts": [{
      "type": "solana",
      "accountAddress": "J5CCzBULFax899tcirb6wMbenQUd8whbaetG7EfSick5"
    }],
    "asset": {
      "assetId": "solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp/token:EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v"
    },
    "amount": "1000000" // 1 USDC (6 decimals)
  },
  "to": {
    "asset": {
      "assetId": "eip155:42161/erc20:0xaf88d065e77c8cC2239327C5EDb3A432268e5831"
    },
    "account": "eip155:42161:0x895Cf62399bF1F8b88195E741b64278b41EB7F09"
  }
};
This operation only requires a Solana account since the funds are coming entirely from Solana. The recipient is specified in the to.account field.

Example 4: Aggregated USDC → SOL (Multi-Account)

Use aggregated USDC balance from both EVM and Solana to buy SOL:
const aggregatedSwap = {
  "from": {
    "accounts": [
      {
        "type": "kernel-v3.1-ecdsa",
        "accountAddress": "0xd4f5A60c9b500f875ADf757BC3027A4424079E05",
        "deploymentType": "ERC4337",
        "signerAddress": "0x9b747cC14A5672a7166b4eccdc92d7F4003f8081"
      },
      {
        "type": "solana",
        "accountAddress": "J5CCzBULFax899tcirb6wMbenQUd8whbaetG7EfSick5"
      }
    ],
    "asset": {
      "assetId": "int:usdc" // Aggregated USDC across chains
    },
    "amount": "10000000" // 10 USDC
  },
  "to": {
    "asset": {
      "assetId": "solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp/slip44:501"
    }
  }
};

Balance Queries

Check aggregated balances across Solana and EVM:
// Single Solana account balance
const solanaBalance = await fetch(
  'https://be.staging.onebalance.io/api/v3/balances/aggregated-balance?account=solana:J5CCzBULFax899tcirb6wMbenQUd8whbaetG7EfSick5',
  {
    headers: { 'x-api-key': 'your-api-key' }
  }
);

// Multi-chain aggregated balance
const aggregatedBalance = await fetch(
  'https://be.staging.onebalance.io/api/v3/balances/aggregated-balance?account=eip155:42161:0xfe52613d747E20F2f62e0A5cC36B0DFAe771C442,solana:J5CCzBULFax899tcirb6wMbenQUd8whbaetG7EfSick5',
  {
    headers: { 'x-api-key': 'your-api-key' }
  }
);

Testing Tips

Use staging environment (https://be.staging.onebalance.io) for testing before going to production.
Always validate account addresses before making requests. Invalid Solana addresses will cause quote failures.
Monitor transaction status using the Quote Status v3 endpoint with the quote ID.

Common Issues & Solutions

Wallet Connection Issues

// Check if wallet is connected and supports signing
if (!wallet.connected || !wallet.signTransaction) {
  throw new Error('Wallet not properly connected');
}

Invalid Asset IDs

// Ensure you're using correct Solana asset IDs
const SOL_ASSET_ID = "solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp/slip44:501";
const USDC_SOLANA_ASSET_ID = "solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp/token:EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v";

Signature Encoding

// Always use base58 encoding for Solana signatures
const signature = bs58.encode(Buffer.from(signedTransaction.signatures[0]));
// NOT: signedTransaction.signatures[0].toString()

API Reference

For complete endpoint documentation: For more help, join our Discord or reach out via support.