TRC-10

TRC-10 is a native token standard supported by the TRON protocol. For new token projects, use TRC-20 — it offers better DeFi integration and cross-chain compatibility.

📘

Prerequisites

TRC-10 is a native token standard supported by the TRON network. Unlike TRC-20 tokens, it does not rely on the TRON Virtual Machine (TVM) but is implemented directly at the blockchain protocol level. Any account can issue a TRC-10 token — limited to one issuance per account — with a creation fee of 1,024 TRX.

Issue a TRC-10 token

Issuance pays a 1,024 TRX fee and each account can only ever issue one TRC-10 token. For new token projects, TRC-20 is recommended instead. A TRC-10 issuance uses an AssetIssueContract transaction. The example below shows both the HTTP API and TronWeb SDK approaches.

Using the HTTP API

The Fullnode HTTP endpoint wallet/createassetissue creates an unsigned TRC-10 issuance transaction. When calling the HTTP API directly, the string fields (name, abbr, description, url) must be hex-encoded.

BASE_URL=https://api.shasta.trongrid.io   # example — replace with any TRON node (TronGrid, third-party, or self-hosted)
curl -X POST ${BASE_URL}/wallet/createassetissue -d '{
  "owner_address": "417946F66D0FC67924DA0AC9936183AB3B07C81126",
  "name": "0x6173736574497373756531353330383934333132313538",
  "abbr": "0x6162627231353330383934333132313538",
  "total_supply": 100000000,
  "trx_num": 1,
  "num": 1,
  "precision": 1,
  "start_time": 1581928489000,
  "end_time": 1581938187000,
  "description": "007570646174654e616d6531353330363038383733343633",
  "url": "007570646174654e616d6531353330363038383733343633",
  "free_asset_net_limit": 10000,
  "public_free_asset_net_limit": 10000,
  "frozen_supply": {"frozen_amount": 1, "frozen_days": 2}
}'

After receiving the unsigned transaction, sign it with the owner's private key and broadcast it. See Transactions for the sign-and-broadcast flow.

Using the TronWeb SDK

const privateKey = "...";
const createAssetAddress = "TM2TmqauSEiRf16CyFgzHV2BVxBejY9iyR";

const trc_options = {
    name: "test",
    abbreviation: "tt",
    description: "fortest",
    url: "https://example.com",
    totalSupply: 10000000,
    trxRatio: 1,
    tokenRatio: 1,
    saleStart: 1581929489000,
    saleEnd: 1581938187000,
    freeBandwidth: 0,
    freeBandwidthLimit: 0,
    frozenAmount: 0,
    frozenDuration: 0,
    precision: 6
};

// Create an unsigned TRC-10 issuance transaction
const tradeobj = await tronWeb.transactionBuilder.createAsset(
    trc_options,
    createAssetAddress
);

// Sign
const signedtxn = await tronWeb.trx.sign(tradeobj, privateKey);

// Broadcast
const receipt = await tronWeb.trx.sendRawTransaction(signedtxn);
console.log('Receipt:', receipt);

Transfer a TRC-10 token

Use the TransferAssetContract transaction type — this is different from TRX transfers (which use TransferContract) and from TRC-20 transfers (which call the smart contract's transfer function).

Using the HTTP API

The Fullnode HTTP endpoint wallet/transferasset creates an unsigned TRC-10 transfer:

BASE_URL=https://api.shasta.trongrid.io   # example — replace with any TRON node (TronGrid, third-party, or self-hosted)
curl -X POST ${BASE_URL}/wallet/transferasset -d '{
  "owner_address": "41d1e7a6bc354106cb410e65ff8b181c600ff14292",
  "to_address": "41e552f6487585c2b58bc2c9bb4492bc1f17132cd0",
  "asset_name": "0x6173736574497373756531353330383934333132313538",
  "amount": 100
}'

After creating the unsigned transaction, sign and broadcast it. See Transactions for details.

Using the TronWeb SDK

const privateKey = "...";
const fromAddress = "TVDGpn4hCSzJ5nkHPLetk8KQBtwaTppnkr";
const toAddress = "TM2TmqauSEiRf16CyFgzHV2BVxBejY9iyR";
const tokenID = "1000088";
const amount = 1000;

// Create an unsigned TRC-10 transfer transaction
const tradeobj = await tronWeb.transactionBuilder.sendToken(
    toAddress,
    amount,
    tokenID,
    fromAddress
);

// Sign
const signedtxn = await tronWeb.trx.sign(tradeobj, privateKey);

// Broadcast
const receipt = await tronWeb.trx.sendRawTransaction(signedtxn);
console.log('Receipt:', receipt);

Check TRC-10 balance

Using the HTTP API

The Fullnode HTTP endpoint wallet/getaccount returns account information; TRC-10 balances appear in the assetV2 array of the response:

BASE_URL=https://api.shasta.trongrid.io   # example — replace with any TRON node (TronGrid, third-party, or self-hosted)
curl -X POST ${BASE_URL}/wallet/getaccount -d '{
  "address": "TM2TmqauSEiRf16CyFgzHV2BVxBejY9iyR",
  "visible": true
}'

Using the TronWeb SDK

const address = "TM2TmqauSEiRf16CyFgzHV2BVxBejY9iyR";

// TRC-10 balances are in the assetV2 array of the returned account
const account = await tronWeb.trx.getAccount(address);
console.log('TRC-10 balances:', account.assetV2);

Reference

For the complete list of TRC-10 API endpoints (query by account / ID / name, update token info, participate in issuance, and more), see the TRON HTTP API reference.

Related resources