WDK logoWDK documentation
TRONStandard TRONGuides

Send TRX and Transactions

Send native TRX, smart-contract calls, and pre-built TronWeb transactions on Tron.

This guide explains how to send native TRX, send smart-contract calls, send pre-built TronWeb transactions, estimate transaction fees, cap transaction fees, sign without broadcasting, quote and send a signed transaction, and use dynamic fee rates.

On Tron, values are expressed in sun (1 TRX = 1,000,000 sun).

Send Native TRX

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

Send TRX
const result = await account.sendTransaction({
  to: 'TLyqzVGLV1srkB7dToTAEqgDSfPtXRJZYH',
  value: 1000000 // 1 TRX in sun
})
console.log('Transaction hash:', result.hash)
console.log('Transaction fee:', result.fee, 'sun')
console.log('Activation fee:', result.activationFee, 'sun')

Send Smart-Contract Calls

sendTransaction(), quoteSendTransaction(), and signTransaction() also accept smart-contract call descriptors. WDK builds a TronWeb TriggerSmartContract transaction from the contract address, function selector, parameters, and optional trigger options.

Send A Smart-Contract Call
const result = await account.sendTransaction({
  contractAddress: 'TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t',
  functionSelector: 'transfer(address,uint256)',
  parameters: [
    { type: 'address', value: 'TLyqzVGLV1srkB7dToTAEqgDSfPtXRJZYH' },
    { type: 'uint256', value: 1000000 }
  ],
  options: {
    feeLimit: 20_000_000
  }
})

console.log('Transaction hash:', result.hash)
console.log('Total fee:', result.fee, 'sun')

Smart-contract quotes include bandwidth plus the net energy cost after the sender's available resources are considered.

Send Pre-built TronWeb Transactions

Pass a pre-built TronWeb transaction when you need a transaction type that WDK does not model directly, such as staking or voting. This example uses sendTrx() for brevity; the same pattern works with other TronWeb transaction-builder methods that return an unsigned transaction owned by the account.

Send A Pre-built TronWeb Transaction
const address = await account.getAddress()

const transaction = await tronWeb.transactionBuilder.sendTrx(
  'TLyqzVGLV1srkB7dToTAEqgDSfPtXRJZYH',
  1_000_000,
  address
)

const result = await account.sendTransaction(transaction)
console.log('Transaction hash:', result.hash)

Before signing or sending an unsigned pre-built transaction, WDK checks that the transaction owner address matches the wallet account address.

Estimate Transaction Fees

You can get a fee estimate before sending using account.quoteSendTransaction(). For native TRX transfers, the quote includes activationFee, which is non-zero when the recipient account must be activated:

Quote Transaction Fee
const quote = await account.quoteSendTransaction({
  to: 'TLyqzVGLV1srkB7dToTAEqgDSfPtXRJZYH',
  value: 1000000
})
console.log('Estimated fee:', quote.fee, 'sun')
console.log('Activation fee:', quote.activationFee, 'sun')

Cap Transaction Fees

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

Cap Native TRX Fees
const wallet = new WalletManagerTron(seedPhrase, {
  provider: 'https://api.trongrid.io',
  transactionMaxFee: 10000000n
})

Sign Without Broadcasting

Use account.signTransaction() when you need a signed Tron transaction but do not want WDK to broadcast it.

Sign TRX Transaction
const signedTransaction = await account.signTransaction({
  to: 'TLyqzVGLV1srkB7dToTAEqgDSfPtXRJZYH',
  value: 1000000
})

console.log('Signed transaction:', signedTransaction)

Quote and Send a Signed Transaction

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

Quote and Send a Signed Transaction
const signedTransaction = await account.signTransaction({
  to: 'TLyqzVGLV1srkB7dToTAEqgDSfPtXRJZYH',
  value: 1000000
})

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

const result = await account.sendTransaction(signedTransaction)
console.log('Transaction hash:', result.hash)

WDK forwards a signed object unchanged and does not refresh its reference block or expiration, re-sign it, or repeat the unsigned owner-address check. Validate that the signed transaction belongs to the intended account and submit it while it remains valid. sendTransaction() quotes it again and enforces transactionMaxFee.

Use Dynamic Fee Rates

You can retrieve current fee rates from the wallet manager using wallet.getFeeRates():

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

Next Steps

To transfer TRC20 tokens instead of native TRX, see Transfer TRC20 Tokens.

On this page