Handle Errors
Handle errors, manage fees, and dispose of sensitive data in TON wallets.
This guide covers how to handle transaction errors and handle token transfer errors, plus best practices for fee management and memory cleanup.
Handle Transaction Errors
Wrap transactions in try/catch blocks to handle common failure scenarios. Use account.sendTransaction() with proper error handling:
try {
const result = await account.sendTransaction({
to: 'EQ...',
value: 1000000000,
bounceable: true
})
console.log('Transaction hash:', result.hash)
console.log('Fee paid:', result.fee, 'nanotons')
} catch (error) {
if (error.message.includes('insufficient balance')) {
console.error('Not enough TON to complete transaction')
} else if (error.message.includes('invalid address')) {
console.error('Invalid recipient address')
} else if (error.message.includes('timeout')) {
console.error('Network timeout, please try again')
} else {
console.error('Transaction failed:', error.message)
}
}Handle Token Transfer Errors
Jetton transfers can fail for multiple reasons, such as insufficient token balances. Use account.transfer() with error handling:
try {
const result = await account.transfer({
token: 'EQ...',
recipient: 'EQ...',
amount: 1000000
})
console.log('Transfer submitted:', result.hash)
} catch (error) {
console.error('Transfer failed:', error.message)
if (error.message.toLowerCase().includes('insufficient')) {
console.log('Please add more tokens to your wallet')
} else if (error.message.toLowerCase().includes('fee')) {
console.log('The transfer fee exceeds your configured maximum')
}
}Best Practices
Manage Fee Limits
Set transferMaxFee when creating the wallet to prevent transactions from exceeding a maximum cost. You can retrieve current network rates using wallet.getFeeRates():
const feeRates = await wallet.getFeeRates()
console.log('Normal fee rate:', feeRates.normal, 'nanotons')
console.log('Fast fee rate:', feeRates.fast, 'nanotons')Dispose of Sensitive Data
Call dispose() on accounts and wallet managers to clear private keys and sensitive data from memory when they are no longer needed:
account.dispose()
wallet.dispose()Always call dispose() in a finally block or cleanup handler to ensure sensitive data is cleared even if an error occurs.