Настройка приёма платежей в Tron (TRX)
Tron популярен для платёжных систем по одной причине: комиссии на переводы TRC-20 (USDT) близки к нулю при наличии достаточного Energy и Bandwidth у отправителя. Это делает его предпочтительным каналом для малых платежей и high-volume транзакций в развивающихся рынках. Настройка приёма — прямолинейная задача, но есть специфика работы с ресурсной моделью Tron.
Ресурсная модель: Energy и Bandwidth
В Tron нет привычного gas. Вместо этого — два ресурса:
Bandwidth — для обычных TRX-переводов и активации аккаунтов. Каждый аккаунт получает 600 Bandwidth бесплатно в сутки. Если не хватает — списывается TRX (0.1 TRX за 1000 Bandwidth).
Energy — для взаимодействия со смарт-контрактами, в том числе TRC-20 переводов. Бесплатно не даётся. Источники:
- Заморозить TRX → получить Energy
- Купить Energy напрямую у делегаторов (дешевле заморозки для разовых операций)
- Если Energy нет — транзакция сгорает TRX напрямую
Для приёма USDT TRC-20: отправитель тратит Energy из своего аккаунта. Ваш receiving-адрес Energy не тратит. Но есть нюанс: первое взаимодействие со смарт-контрактом на новом аккаунте требует активации (1 TRX). Если пользователь переводит с нового кошелька — убедитесь что у него активирован аккаунт.
Настройка через TronWeb
const TronWeb = require('tronweb');
const tronWeb = new TronWeb({
fullHost: 'https://api.trongrid.io', // или собственная нода
headers: { 'TRON-PRO-API-KEY': process.env.TRONGRID_API_KEY },
privateKey: process.env.TRON_PRIVATE_KEY,
});
// Получение баланса TRC-20 (USDT)
const USDT_CONTRACT = 'TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t';
async function getUsdtBalance(address: string): Promise<bigint> {
const contract = await tronWeb.contract().at(USDT_CONTRACT);
const balance = await contract.balanceOf(address).call();
return BigInt(balance.toString());
}
TronGrid — официальный публичный API. Лимиты без API ключа: 15 req/sec, с ключом (бесплатно): 1000 req/sec.
Генерация платёжных адресов
HD Wallet для Tron использует coin type 195 по BIP-44:
import { ethers } from 'ethers';
import TronWeb from 'tronweb';
function deriveTronAddress(mnemonic: string, index: number): string {
const hdNode = ethers.HDNodeWallet.fromMnemonic(
ethers.Mnemonic.fromPhrase(mnemonic)
).derivePath(`m/44'/195'/0'/0/${index}`);
// Tron-адрес — это Ethereum-адрес с другим prefix (T вместо 0x)
return TronWeb.address.fromPrivateKey(hdNode.privateKey.slice(2));
}
Tron-адрес технически совпадает с Ethereum-адресом, только отображается в Base58Check с префиксом T.
Мониторинг входящих транзакций
async function pollTrc20Transactions(address: string, fromTimestamp: number) {
const response = await fetch(
`https://api.trongrid.io/v1/accounts/${address}/transactions/trc20` +
`?min_timestamp=${fromTimestamp}&contract_address=${USDT_CONTRACT}&limit=200`,
{ headers: { 'TRON-PRO-API-KEY': process.env.TRONGRID_API_KEY! } }
);
const data = await response.json();
for (const tx of data.data) {
if (tx.to === address && tx.type === 'Transfer') {
await processPayment({
txId: tx.transaction_id,
amount: BigInt(tx.value), // в sun, 1 USDT = 1_000_000 sun
confirmations: tx.confirmed ? 20 : 0,
});
}
}
}
Tron финализирует блоки через DPOS-консенсус. Транзакция считается confirmed примерно через 19 блоков (~57 сек). Для платежей: ждите confirmed: true из API — этого достаточно, вероятность reorg в Tron крайне низкая.
Конфигурация нотификаций
TronGrid поддерживает webhook-подписки через TronWatch или сторонние сервисы. Альтернатива — Moralis Streams с поддержкой Tron:
// Пример с Moralis Streams
const stream = await Moralis.Streams.add({
chains: [EvmChain.TRON_MAINNET],
description: "USDT TRC-20 payments",
tag: "payments",
webhookUrl: "https://your-api.com/tron-webhook",
includeContractLogs: true,
abi: ERC20_ABI,
topic0: ["Transfer(address,address,uint256)"],
advancedOptions: [
{ topic0: "Transfer(address,address,uint256)", filter: { "eq": ["to", receivingAddress] } }
],
});
Чеклист настройки
- API-ключ TronGrid зарегистрирован и добавлен в конфиг
- Адреса генерируются из HD Wallet с coin type 195
- Мониторинг TRC-20 Transfer событий на USDT контракт
TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t - Суммы хранятся в bigint (избегайте float — потеря точности)
- Подтверждение:
confirmed: trueили 20+ блоков - Тест с реальной транзакцией на small amount перед продакшном







