Demonstrates how to use TonWeb (JavaScript SDK) with a Chainstack endpoint to fetch Jetton metadata, user balances, and transaction histories on the TON blockchain.
Shows step-by-step examples of requesting token data via TonWeb or HTTP, highlighting the modular approach for Jetton data, balance, and transfer queries.
Emphasizes the difference between the minter contract (master) and wallet contracts, and how to verify or fetch wallet addresses and check balances.
Provides working code snippets to integrate these concepts easily into your application.
Jettons are the standard token implementation on the TON blockchain, analogous to ERC-20 tokens on Ethereum. They enable developers to create and manage custom tokens that can represent a variety of assets or utilities within decentralized applications. The standard for Jettons on TON is described in TEP64.
To interact with the TON blockchain, developers can use either HTTP APIs or the ADNL protocol. HTTP APIs are simpler and suitable for most applications, while ADNL offers advanced low-level network communication.
The TON HTTP API has two versions: V2, which provides real-time data, and V3, which offers indexed blockchain data. In this tutorial, we will use TonWeb, which operates on the V2 JSON-RPC endpoint.
Jettons are smart contracts on TON that follow a standard interface, allowing wallets and applications to interact with them uniformly. Each Jetton consists of:
Master (or minter) contract: the contract that manages the Jetton metadata and logic.
Wallet contract: a contract for each user holding the Jetton, managing the user’s balance and transfers.
Fetching Jetton metadata allows you to retrieve essential information about a specific Jetton token. To achieve the same using HTTP requests, you can use the /getTokenData endpoint of TON API v2.
constTonWeb=require('tonweb');// Initialize TonWeb with a providerconst tonweb =newTonWeb(newTonWeb.HttpProvider('https://ton-mainnet.core.chainstack.com/.../api/v2/jsonRPC'));// Replace with the actual Jetton master contract addressconst jettonMasterAddress ='EQCxE6mUtQJKFnGfaROTKOt1lZbDiiX1kCixRv7Nw2Id_sDs';// e.g., mainnet USDTasyncfunctionfetchJettonMetadata(jettonMasterAddress){try{const jettonMinter =newTonWeb.token.jetton.JettonMinter(tonweb.provider,{address: jettonMasterAddress});const data =await jettonMinter.getJettonData();console.log('Jetton Metadata:');console.log('Total supply:', data.totalSupply.toString());console.log('URI to off-chain metadata:', data.jettonContentUri);}catch(error){console.error('Error fetching jetton metadata:', error);}}fetchJettonMetadata(jettonMasterAddress);
To display a user’s Jetton balance, you need to query the blockchain for the amount of a specific Jetton that the user holds. The first example shows how to obtain a Jetton wallet for a specific user.
constTonWeb=require('tonweb');const tonweb =newTonWeb(newTonWeb.HttpProvider('https://ton-mainnet.core.chainstack.com/.../api/v2/jsonRPC'));// Replace with the actual Jetton master contract address and owner wallet addressconst jettonMasterAddress ='EQCxE6mUtQJKFnGfaROTKOt1lZbDiiX1kCixRv7Nw2Id_sDs';// e.g., mainnet USDTconst ownerWalletAddress ='UQ...';asyncfunctionfetchJettonWalletAddress(jettonMasterAddress, ownerWalletAddress){try{const jettonMinter =newTonWeb.token.jetton.JettonMinter(tonweb.provider,{address: jettonMasterAddress});const jettonWalletAddress =await jettonMinter.getJettonWalletAddress(newTonWeb.utils.Address(ownerWalletAddress));const jettonWallet =newTonWeb.token.jetton.JettonWallet(tonweb.provider,{address: jettonWalletAddress});const jettonData =await jettonWallet.getData();// Verify that the Jetton Minter address matchesif(jettonData.jettonMinterAddress.toString(false)!== jettonMinter.address.toString(false)){thrownewError('Jetton minter address from jetton wallet does not match the expected minter address');}console.log('Jetton wallet address:', jettonWalletAddress.toString(true,true,true));}catch(error){console.error('Error fetching jetton wallet address:', error);}}fetchJettonWalletAddress(jettonMasterAddress, ownerWalletAddress);
When the Jetton wallet is known, we can fetch its balance:
constTonWeb=require('tonweb');const tonweb =newTonWeb(newTonWeb.HttpProvider('https://ton-mainnet.core.chainstack.com/.../api/v2/jsonRPC'));// Replace with the actual Jetton wallet addressconst walletAddress ='EQ...';asyncfunctionfetchJettonBalance(walletAddress){try{const jettonWallet =newTonWeb.token.jetton.JettonWallet(tonweb.provider,{address: walletAddress });const data =await jettonWallet.getData();console.log('Jetton balance:', data.balance.toString());console.log('Jetton owner address:', data.ownerAddress.toString(true,true,true));}catch(error){console.error('Error fetching jetton balance:', error);}}fetchJettonBalance(walletAddress);
TonWeb is a JavaScript SDK that simplifies the process of interacting with Jetton contracts on the TON blockchain. In this tutorial, we explored how to peform basic fetching operations with Jettons.
Multiple years of software development and Web3 expertise. Creator of the open-source Compare Dashboard for RPC provider performance benchmarking. Core contributor to the DevEx team’s pump.fun trading bot. Author of technical tutorials on EVM blockchains, Solana, TON and Subgraphs.