Skip to main content
This guide shows you how to get token swap quotes on TON using the OKX DEX SDK. The SDK provides quote and swap data functionality for TON.

Prerequisites

  • OKX API credentials (API key, secret key, passphrase, project ID)
  • TON wallet address for swap data queries
  • Basic understanding of TON token addresses

Setup

1

Install Dependencies

Install the OKX DEX SDK:
npm install @okx-dex/sdk dotenv
2

Configure Environment

Set up your environment variables:
OKX_API_KEY=your_api_key
OKX_SECRET_KEY=your_secret_key
OKX_API_PASSPHRASE=your_passphrase
OKX_PROJECT_ID=your_project_id
3

Initialize the Client

Create the OKX DEX client:
import { OKXDexClient } from '@okx-dex/sdk';
import 'dotenv/config';

const client = new OKXDexClient({
  apiKey: process.env.OKX_API_KEY!,
  secretKey: process.env.OKX_SECRET_KEY!,
  apiPassphrase: process.env.OKX_API_PASSPHRASE!,
  projectId: process.env.OKX_PROJECT_ID!
});
For TON quotes, you don’t need to configure a wallet in the client initialization.

Common Token Addresses

TON uses base64-encoded addresses:
TokenAddress
TON (Native)EQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAM9c
USDCEQCxE6mUtQJKFnGfaROTKOt1lZbDiiX1kCixRv7Nw2Id_sDs

Getting a Quote

Fetch a swap quote to preview rates and output amounts:
const quote = await client.dex.getQuote({
  chainIndex: '607',  // TON Chain ID
  amount: '10000000000',  // Amount in smallest units
  fromTokenAddress: 'EQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAM9c',  // TON
  toTokenAddress: 'EQCxE6mUtQJKFnGfaROTKOt1lZbDiiX1kCixRv7Nw2Id_sDs',    // USDC
  slippagePercent: '0.1'  // 0.1% slippage tolerance
});

console.log('Quote response:', JSON.stringify(quote, null, 2));

Understanding Quote Response

The quote response contains detailed information about the swap:
const quote = await client.dex.getQuote({
  chainIndex: '607',
  fromTokenAddress: 'EQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAM9c',
  toTokenAddress: 'EQCxE6mUtQJKFnGfaROTKOt1lZbDiiX1kCixRv7Nw2Id_sDs',
  amount: '10000000000',
  slippagePercent: '0.1'
});

// Access quote information
if (quote.data && quote.data.length > 0) {
  const quoteData = quote.data[0];
  
  console.log('From Token:', quoteData.fromToken.tokenSymbol);
  console.log('To Token:', quoteData.toToken.tokenSymbol);
  console.log('Input Amount:', quoteData.fromToken.tokenAmount);
  console.log('Output Amount:', quoteData.toToken.tokenAmount);
  console.log('Price Impact:', quoteData.routerResult?.priceImpactPercent);
  console.log('Estimated Gas:', quoteData.estimateGasFee);
}

Getting Swap Data

For more detailed swap information including transaction data:
const walletAddress = "YOUR_TON_WALLET_ADDRESS";

const swapData = await client.dex.getSwapData({
  chainIndex: '607',
  fromTokenAddress: 'EQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAM9c',
  toTokenAddress: 'EQCxE6mUtQJKFnGfaROTKOt1lZbDiiX1kCixRv7Nw2Id_sDs',
  amount: '10000000000',
  slippagePercent: '0.1',
  userWalletAddress: walletAddress,
  autoSlippage: true  // Automatically adjust slippage if needed
});

console.log('Swap Data:', JSON.stringify(swapData, null, 2));

Complete Example

Here’s a complete working example:
import { OKXDexClient } from '@okx-dex/sdk';
import 'dotenv/config';

const client = new OKXDexClient({
  apiKey: process.env.OKX_API_KEY!,
  secretKey: process.env.OKX_SECRET_KEY!,
  apiPassphrase: process.env.OKX_API_PASSPHRASE!,
  projectId: process.env.OKX_PROJECT_ID!
});

async function getTONQuote() {
  try {
    // Get quote for swapping 10 TON to USDC
    const quote = await client.dex.getQuote({
      chainIndex: '607',
      amount: '10000000000',  // 10 TON (9 decimals)
      fromTokenAddress: 'EQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAM9c',
      toTokenAddress: 'EQCxE6mUtQJKFnGfaROTKOt1lZbDiiX1kCixRv7Nw2Id_sDs',
      slippagePercent: '0.1'
    });

    if (quote.code === '0' && quote.data?.length > 0) {
      const data = quote.data[0];
      
      console.log('✅ Quote Retrieved Successfully');
      console.log('================================');
      console.log(`Swap: ${data.fromToken.tokenSymbol}${data.toToken.tokenSymbol}`);
      console.log(`Input: ${data.fromToken.tokenAmount} ${data.fromToken.tokenSymbol}`);
      console.log(`Output: ${data.toToken.tokenAmount} ${data.toToken.tokenSymbol}`);
      console.log(`Rate: 1 ${data.fromToken.tokenSymbol} = ${parseFloat(data.toToken.tokenAmount) / parseFloat(data.fromToken.tokenAmount)} ${data.toToken.tokenSymbol}`);
      
      if (data.routerResult?.priceImpactPercent) {
        console.log(`Price Impact: ${data.routerResult.priceImpactPercent}%`);
      }
      
      if (data.estimateGasFee) {
        console.log(`Estimated Gas: ${data.estimateGasFee}`);
      }
    } else {
      console.error('❌ Failed to get quote:', quote.msg);
    }
  } catch (error) {
    console.error('❌ Error:', error.message);
    process.exit(1);
  }
}

getTONQuote();

Quote Parameters

All available parameters for TON quotes:
ParameterTypeRequiredDescription
chainIndexstringYesChain ID for TON ('607')
fromTokenAddressstringYesSource token address
toTokenAddressstringYesDestination token address
amountstringYesAmount in smallest units
slippagePercentstringYesMax slippage (e.g., '0.1' for 0.1%)

Swap Data Parameters

Additional parameters when getting swap data:
await client.dex.getSwapData({
  chainIndex: '607',              // Required: TON chain ID
  fromTokenAddress: string,       // Required: Source token
  toTokenAddress: string,         // Required: Destination token
  amount: string,                 // Required: Amount in base units
  slippagePercent: string,        // Required: Slippage tolerance
  userWalletAddress: string,      // Required: Your TON wallet
  autoSlippage: boolean          // Optional: Auto-adjust slippage
});

Understanding TON Amounts

TON uses 9 decimals for native tokens:
// Converting TON amounts
1 TON = 1000000000 (smallest units)
10 TON = 10000000000
0.1 TON = 100000000

// Example conversion
function tonToSmallestUnits(ton: number): string {
  return (ton * 1_000_000_000).toString();
}

const amount = tonToSmallestUnits(10); // "10000000000"

Best Practices

Check Quote Response

Always verify quote.code === '0' before using data

Use Appropriate Slippage

Set 0.1-0.5% for stable pairs, higher for volatile pairs

Handle Errors Gracefully

Check response codes and handle API errors

Monitor Price Impact

Review price impact before executing large swaps

Error Handling

try {
  const quote = await client.dex.getQuote({
    chainIndex: '607',
    fromTokenAddress: 'EQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAM9c',
    toTokenAddress: 'EQCxE6mUtQJKFnGfaROTKOt1lZbDiiX1kCixRv7Nw2Id_sDs',
    amount: '10000000000',
    slippagePercent: '0.1'
  });

  if (quote.code !== '0') {
    throw new Error(`API Error: ${quote.msg}`);
  }

  if (!quote.data || quote.data.length === 0) {
    throw new Error('No quote data available');
  }

  // Process quote
  const data = quote.data[0];
  console.log('Quote received:', data);
  
} catch (error) {
  if (error.message.includes('network')) {
    console.error('Network error - check your connection');
  } else if (error.message.includes('insufficient')) {
    console.error('Insufficient liquidity for this trade');
  } else {
    console.error('Quote failed:', error.message);
  }
}

Response Structure

Typical quote response structure:
{
  "code": "0",
  "msg": "",
  "data": [
    {
      "fromToken": {
        "tokenSymbol": "TON",
        "tokenAmount": "10",
        "decimal": "9",
        "tokenUnitPrice": "5.23"
      },
      "toToken": {
        "tokenSymbol": "USDC",
        "tokenAmount": "52.3",
        "decimal": "6",
        "tokenUnitPrice": "1.0"
      },
      "estimateGasFee": "0.01",
      "routerResult": {
        "priceImpactPercent": "0.05"
      }
    }
  ]
}

Next Steps

TRON Quotes

Learn how to get quotes on TRON

API Reference

View complete quote API documentation

Build docs developers (and LLMs) love