Разработка TRC-20 токена (Tron)

Проектируем и разрабатываем блокчейн-решения полного цикла: от архитектуры смарт-контрактов до запуска DeFi-протоколов, NFT-маркетплейсов и криптобирж. Аудит безопасности, токеномика, интеграция с существующей инфраструктурой.
Показано 1 из 1Все 1306 услуг
Разработка TRC-20 токена (Tron)
Простой
~2-3 дня
Часто задаваемые вопросы

Направления блокчейн-разработки

Этапы блокчейн-разработки

Последние работы

  • image_website-b2b-advance_0.webp
    Разработка сайта компании B2B ADVANCE
    1306
  • image_web-applications_feedme_466_0.webp
    Разработка веб-приложения для компании FEEDME
    1217
  • image_websites_belfingroup_462_0.webp
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    919
  • image_ecommerce_furnoro_435_0.webp
    Разработка интернет магазина для компании FURNORO
    1146
  • image_logo-advance_0.webp
    Разработка логотипа компании B2B Advance
    609
  • image_crm_enviok_479_0.webp
    Разработка веб-приложения для компании Enviok
    884

Разработка TRC-20 токена (Tron)

TRC-20 — стандарт токенов на Tron, намеренно скопированный с ERC-20. Если вы знакомы с Solidity и OpenZeppelin, TRC-20 разработка занимает дни, не недели. Основная причина выбирать Tron — там живёт огромный объём USDT (крупнейший в мире на конец 2024), транзакционные издержки ниже чем в Ethereum, и аудитория из азиатского региона.

Что отличается от ERC-20

Tron использует Solidity-совместимый компилятор — большинство ERC-20 кода переносится без изменений. Но есть принципиальные различия:

Energy и Bandwidth вместо Gas — в Tron два ресурса:

  • Bandwidth — для обычных переводов TRX. Каждый аккаунт получает ~600 bandwidth бесплатно в день
  • Energy — для выполнения смарт-контрактов. Можно заморозить TRX чтобы получить Energy, или платить TRX напрямую

Типичная транзакция TRC-20 transfer стоит ~10–30 energy. Деплой контракта — несколько тысяч. При дефиците Energy транзакция всё равно выполнится, но пользователь платит TRX по рыночному курсу Energy.

TRC-20 vs TRC-10 — TRC-10 это native token без смарт-контракта (как TRX, только custom). TRC-20 — смарт-контракт с ERC-20 интерфейсом. Для большинства use cases нужен TRC-20.

Адреса — Tron адреса начинаются с T (Base58Check encoding), не hex как Ethereum. В коде смарт-контракта адреса те же 20 байт, просто представление разное.

Написание TRC-20 контракта

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.6;

// На Tron используется tronide.io или TronBox
// Импорты OpenZeppelin работают через TronBox

contract MyTRC20 {
    string public name;
    string public symbol;
    uint8 public decimals = 6;  // 6 decimals — норма для Tron (как USDT TRC-20)
    uint256 public totalSupply;
    
    mapping(address => uint256) public balanceOf;
    mapping(address => mapping(address => uint256)) public allowance;
    
    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);
    
    constructor(
        string memory _name,
        string memory _symbol,
        uint256 _initialSupply
    ) {
        name = _name;
        symbol = _symbol;
        totalSupply = _initialSupply * 10 ** decimals;
        balanceOf[msg.sender] = totalSupply;
        emit Transfer(address(0), msg.sender, totalSupply);
    }
    
    function transfer(address to, uint256 value) external returns (bool) {
        require(balanceOf[msg.sender] >= value, "Insufficient balance");
        balanceOf[msg.sender] -= value;
        balanceOf[to] += value;
        emit Transfer(msg.sender, to, value);
        return true;
    }
    
    function approve(address spender, uint256 value) external returns (bool) {
        allowance[msg.sender][spender] = value;
        emit Approval(msg.sender, spender, value);
        return true;
    }
    
    function transferFrom(address from, address to, uint256 value) external returns (bool) {
        require(balanceOf[from] >= value, "Insufficient balance");
        require(allowance[from][msg.sender] >= value, "Insufficient allowance");
        balanceOf[from] -= value;
        balanceOf[to] += value;
        allowance[from][msg.sender] -= value;
        emit Transfer(from, to, value);
        return true;
    }
}

Деплой через TronBox

// migrations/2_deploy_token.js
const MyTRC20 = artifacts.require("MyTRC20");

module.exports = function(deployer, network, accounts) {
    deployer.deploy(
        MyTRC20,
        "My Token",
        "MTK",
        1000000  // 1 млн токенов
    );
};
# tronbox-config.js — конфигурация сети
module.exports = {
    networks: {
        shasta: {  // тестнет
            privateKey: process.env.PRIVATE_KEY,
            userFeePercentage: 100,
            feeLimit: 1000000000,  // 1000 TRX max fee
            fullHost: "https://api.shasta.trongrid.io",
            network_id: "2"
        },
        mainnet: {
            privateKey: process.env.PRIVATE_KEY_MAINNET,
            userFeePercentage: 100,
            feeLimit: 1000000000,
            fullHost: "https://api.trongrid.io",
            network_id: "1"
        }
    }
};

# Деплой
tronbox migrate --network shasta

Интеграция с TronWeb (frontend/backend)

import TronWeb from "tronweb";

const tronWeb = new TronWeb({
    fullHost: "https://api.trongrid.io",
    headers: { "TRON-PRO-API-KEY": process.env.TRONGRID_API_KEY },
    privateKey: process.env.PRIVATE_KEY  // только на бэкенде
});

// Получить баланс
const contract = await tronWeb.contract().at("TContractAddress...");
const balance = await contract.balanceOf("TUserAddress...").call();
console.log("Balance:", tronWeb.fromSun(balance));  // конвертация decimals

// Transfer
const tx = await contract.transfer(
    "TRecipientAddress...",
    tronWeb.toSun(100)  // 100 токенов с учётом decimals
).send({
    feeLimit: 100_000_000,  // 100 TRX fee limit
    callValue: 0,
    shouldPollResponse: true
});

Листинг на биржах и JustSwap

Для листинга на JustSwap (DEX на Tron, аналог Uniswap v2):

// Добавление ликвидности
const routerAddress = "TXF8e7cL5..."; // JustSwap Router
const router = await tronWeb.contract(JUSTSWAP_ROUTER_ABI).at(routerAddress);

// Сначала approve токена для router
await tokenContract.approve(routerAddress, ethers.MaxUint256).send();

// Добавить ликвидность TOKEN/TRX
await router.addLiquidityTRX(
    tokenContractAddress,
    tokenAmount,    // количество токенов
    tokenAmountMin, // slippage tolerance
    trxAmountMin,
    Math.floor(Date.now() / 1000) + 600  // deadline
).send({ callValue: trxAmount });  // TRX отправляется как callValue

Верификация контракта после деплоя обязательна — через Tronscan (аналог Etherscan для Tron). Без верификации пользователи не видят исходный код и не доверяют токену.

Срок разработки стандартного TRC-20 токена: 3–7 рабочих дней включая тестирование на Shasta testnet и деплой с верификацией.