WDK logoWDK documentation

Transfer Jetton Tokens

Transfer Jetton tokens gaslessly with fees paid in paymaster tokens.

This guide explains how to transfer Jetton tokens gaslessly, override paymaster configuration, estimate transfer fees, and validate inputs before executing.

Transfer Tokens (Gasless)

You can send Jetton tokens gaslessly using account.transfer(). Fees are deducted from the configured paymaster token:

Gasless Jetton Transfer
const result = await account.transfer({
  token: 'EQ...',      // Jetton master contract address
  recipient: 'EQ...',  // Recipient's TON address
  amount: 1000000000   // Amount in Jetton's base units
})
console.log('Transfer hash:', result.hash)
console.log('Transfer fee:', result.fee, 'paymaster token units')

Override Paymaster Configuration

You can override the default paymaster token and maximum fee on a per-transfer basis by passing a second configuration argument to account.transfer():

Transfer with Config Override
const result = await account.transfer({
  token: 'EQ...',
  recipient: 'EQ...',
  amount: 1000000000
}, {
  paymasterToken: {
    address: 'EQ...' // Override default paymaster token
  },
  transferMaxFee: 2000000000 // Override maximum allowed fee
})
console.log('Transfer hash:', result.hash)
console.log('Transfer fee:', result.fee, 'paymaster token units')

Estimate Transfer Fees

You can get a fee estimate before executing the transfer using account.quoteTransfer():

Quote Gasless Transfer
const quote = await account.quoteTransfer({
  token: 'EQ...',
  recipient: 'EQ...',
  amount: 1000000
})
console.log('Transfer fee estimate:', quote.fee, 'paymaster token units')

Transfer with Validation

Validate balances before transferring:

  1. Use account.getTokenBalance() to check Jetton balance.
  2. Use account.getPaymasterTokenBalance() to verify sufficient paymaster funds.
  3. Use account.quoteTransfer() to estimate fees.
  4. Execute the transfer with account.transfer():
Validated Gasless Transfer
async function transferWithValidation(account, jettonAddress, recipient, amount) {
  if (typeof jettonAddress !== 'string' || jettonAddress.length === 0) {
    throw new Error('Invalid Jetton address format')
  }

  if (typeof recipient !== 'string' || recipient.length === 0) {
    throw new Error('Invalid recipient address format')
  }

  const balance = await account.getTokenBalance(jettonAddress)
  if (balance < amount) {
    throw new Error('Insufficient Jetton balance')
  }

  const paymasterBalance = await account.getPaymasterTokenBalance()
  console.log('Paymaster token balance:', paymasterBalance)

  const quote = await account.quoteTransfer({
    token: jettonAddress,
    recipient,
    amount
  })
  console.log('Estimated fee (paymaster token):', quote.fee)

  const result = await account.transfer({
    token: jettonAddress,
    recipient,
    amount
  })
  console.log('Transfer hash:', result.hash)
  console.log('Actual fee (paymaster token):', result.fee)

  return result
}

Next Steps

Learn how to sign and verify messages with your gasless TON account.

On this page