Настройка приема платежей в Tron (TRX)

Проектируем и разрабатываем блокчейн-решения полного цикла: от архитектуры смарт-контрактов до запуска DeFi-протоколов, NFT-маркетплейсов и криптобирж. Аудит безопасности, токеномика, интеграция с существующей инфраструктурой.
Показано 1 из 1 услугВсе 1306 услуг
Настройка приема платежей в Tron (TRX)
Простая
~2-3 рабочих дня
Часто задаваемые вопросы
Направления блокчейн-разработки
Этапы блокчейн-разработки
Последние работы
  • image_website-b2b-advance_0.png
    Разработка сайта компании B2B ADVANCE
    1221
  • image_web-applications_feedme_466_0.webp
    Разработка веб-приложения для компании FEEDME
    1163
  • image_websites_belfingroup_462_0.webp
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    855
  • image_ecommerce_furnoro_435_0.webp
    Разработка интернет магазина для компании FURNORO
    1062
  • image_logo-advance_0.png
    Разработка логотипа компании B2B Advance
    561
  • image_crm_enviok_479_0.webp
    Разработка веб-приложения для компании Enviok
    829

Настройка приёма платежей в 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 перед продакшном