WDK logoWDK documentation
TONStandard TONGuides

Send TON

Send native TON and estimate transaction fees.

This guide explains how to send native TON, estimate transaction fees, cap transaction fees, read mainnet fee rates, prepare a signed transaction body, and quote and send a signed transaction body.

On TON, values are expressed in nanotons (1 TON = 10^9 nanotons). Transactions support an optional bounceable parameter specific to the TON network.

Send Native TON

You can transfer TON to a recipient address using account.sendTransaction():

Send TON
const result = await account.sendTransaction({
  to: 'EQ...', // TON address
  value: 1000000000, // 1 TON in nanotons
  bounceable: true // Optional: specify if the address is bounceable
})
console.log('Signed transfer body hash:', result.hash)
console.log('Transaction fee:', result.fee, 'nanotons')

Estimate Transaction Fees

You can get a fee estimate before sending using account.quoteSendTransaction():

Quote Transaction Fee
const quote = await account.quoteSendTransaction({
  to: 'EQ...',
  value: 1000000000,
  bounceable: true
})
console.log('Estimated fee:', quote.fee, 'nanotons')

Cap Transaction Fees

Set transactionMaxFee when you create the wallet to stop native sendTransaction() and signTransaction() calls if the estimated fee exceeds your limit.

Cap Native Transaction Fees
const wallet = new WalletManagerTon(seedPhrase, {
  tonClient: { url: 'https://toncenter.com/api/v2/jsonRPC' },
  transactionMaxFee: 1000000000n
})

Read Mainnet Fee Rates

You can retrieve mainnet TON API fee rates from the wallet manager using wallet.getFeeRates(). Through 1.0.0-beta.12, this method does not follow a configured testnet client and returns the same calculated value for normal and fast:

Get Fee Rates
const feeRates = await wallet.getFeeRates()
console.log('Normal fee rate:', feeRates.normal, 'nanotons')
console.log('Fast fee rate:', feeRates.fast, 'nanotons')

Prepare a Signed Transaction Body

You can build a signed transaction body without broadcasting it using account.signTransaction(). The method still requires the configured TON client to read the current sequence number and, when a fee cap is configured, estimate the fee. It returns the body Cell accepted by the matching opened WalletContractV5R1.send() call, not a complete external-message BOC.

Prepare Signed Transaction Body
const cell = await account.signTransaction({
  to: 'EQ...', // TON address
  value: 1000000000 // 1 TON in nanotons
})

// `cell` is not broadcast by signTransaction().

Quote and Send a Signed Transaction Body

Pass the Cell returned by signTransaction() to the quote and send methods when review and submission are separate steps.

Quote and Send a Signed Body
const cell = await account.signTransaction({
  to: 'EQ...',
  value: 1000000000n
})

const quote = await account.quoteSendTransaction(cell)
console.log('Estimated fee:', quote.fee, 'nanotons')

const result = await account.sendTransaction(cell)
console.log('Signed transfer body hash:', result.hash)

The signed body contains the wallet sequence number read during signing. Submit it through the same matching account before that sequence number changes. WDK sends the Cell unchanged and does not rebuild or re-sign it; sendTransaction() estimates its fee again and enforces transactionMaxFee. The returned hash identifies the signed transfer body, not a network transaction hash.

Next Steps

To transfer Jetton tokens instead of native TON, see Transfer Jetton Tokens.

On this page