Проектируем и деплоим TRC-20 токены на Tron
Вы разработали прототип DeFi-протокола на Ethereum, но транзакционные издержки съедают бюджет? Или нужно сделать массовую раздачу токенов пользователям из Азии? В обоих случаях стоит присмотреться к Tron — блокчейну, где живёт крупнейший пул USDT, а комиссии в десятки раз ниже эфириумных. Мы специализируемся на разработке смарт-контрактов для Tron и выпустили более 50 TRC-20 токенов — от DeFi до NFT. TRC-20 — стандарт токенов на Tron, намеренно скопированный с ERC-20 (см. Протокол Tron). Если вы знакомы с Solidity и OpenZeppelin, разработка TRC-20 занимает дни, не недели.
Когда Tron выгоднее Ethereum?
Tron предлагает в 10 раз более низкие комиссии по сравнению с Ethereum, что критично для высокочастотных транзакций или массовых выплат. Кроме того, аудитория в Азии активно использует Tron-кошельки (TronLink). Выбор Tron оправдан, когда ваш проект ориентирован на розничных пользователей с низким бюджетом на газ. Например, игра с тысячами ежедневных транзакций: на Ethereum вы заплатите $1-5 за каждую, на Tron — $0.01-0.05. Экономия более 90% на комиссиях — это не маркетинг, а расчёт.
В чём отличия TRC-20 от 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 и ERC-20
| Характеристика | TRC-20 (Tron) | ERC-20 (Ethereum) |
|---|---|---|
| Ресурсы | Energy/Bandwidth | Gas |
| Стоимость транзакции | ~$0.01-0.05 (Energy) | ~$1-5+ (Gas) |
| Скорость блоков | ~3 секунды | ~12 секунд |
| Поддержка кошельков | TronLink, TronWallet | MetaMask, WalletConnect |
Сравнение стоимости деплоя и перевода
| Операция | Tron | Ethereum |
|---|---|---|
| Деплой контракта | ~$5-10 | ~$100-500 |
| Простой перевод | ~$0.01-0.05 | ~$1-5 |
| Вызов смарт-контракта | ~$0.01 | ~$2-10 |
Как мы разрабатываем токены
Наш процесс включает:
- Анализ требований — определение функционала (mint/burn, pausable, snapshot).
- Написание контракта — используем Solidity 0.8.x с OpenZeppelin или пишем с нуля.
- Тестирование на Shasta testnet — покрываем основные сценарии transfer, approve, и edge cases.
- Деплой и верификация — публикуем код на Tronscan, верифицируем контракт.
- Интеграция — подключаем TronWeb к вашему frontend/backend.
- Документация — предоставляем описание методов и адреса.
Техническая реализация: пример контракта и деплой
Пример контракта
// 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
Как защитить контракт от атак?
Используйте статический анализатор Slither и фаззинг тестирование (Echidna). Мы включаем аудит кода в каждую поставку. После аудита вы получаете отчёт о найденных уязвимостях и их исправлении. Типичные проблемы: reentrancy, переполнение uint, неправильный расчёт decimals. Мы гарантируем отсутствие критических уязвимостей перед релизом.
Чек-лист перед деплоем
- Проверить decimals: обычно 6 или 18.
- Убедиться, что totalSupply не превышает лимит.
- Протестировать approve + transferFrom на тестнете.
- Проверить, что owner имеет право mint (если применимо).
- Заморозить достаточно TRX для покрытия Energy.
Интеграция с TronWeb и листинг на JustSwap
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 (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 и деплой с верификацией. Для сложных контрактов (с дополнительными механиками) сроки увеличиваются до 10–14 дней. Стоимость рассчитывается индивидуально — зависит от сложности контракта и необходимости аудита.
Закажите разработку TRC-20 токена уже сегодня — обсудим детали на консультации.







