Розробка 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
    1218
  • image_websites_belfingroup_462_0.webp
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    919
  • image_ecommerce_furnoro_435_0.webp
    Розробка інтернет магазину для компанії FURNORO
    1147
  • 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 токен без смарт-контракту (як TRX, тільки custom). TRC-20 — смарт-контракт з ERC-20 інтерфейсом. Для більшості випадків потрібен TRC-20.

Адреси — Tron адреси починаються з T (Base58Check кодування), не 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  // 1M токенів
    );
};
# tronbox-config.js — конфігурація мережі
module.exports = {
    networks: {
        shasta: {  // тестнет
            privateKey: process.env.PRIVATE_KEY,
            userFeePercentage: 100,
            feeLimit: 1000000000,  // 1000 TRX макс комісія
            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  // тільки backend
});

// Отримати баланс
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 ліміт комісії
    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 та розгортання з верифікацією.