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. The example uses visible: true, so addresses and string fields can use Base58Check and plain-text formats. The start time must be later than the current head-block time; this example opens the issuance window one hour from now for 24 hours.
BASE_URL=https://api.shasta.trongrid.io # example — replace with any TRON node (TronGrid, third-party, or self-hosted)
OWNER_ADDRESS="YOUR_SHASTA_ADDRESS"
START_TIME=$(($(date +%s) * 1000 + 3600000))
END_TIME=$((START_TIME + 86400000))
curl -X POST ${BASE_URL}/wallet/createassetissue \
-H 'Content-Type: application/json' \
--data-binary @- <<JSON
{
"owner_address": "${OWNER_ADDRESS}",
"name": "ExampleToken",
"abbr": "EXT",
"total_supply": 100000000,
"trx_num": 1,
"num": 1,
"precision": 6,
"start_time": ${START_TIME},
"end_time": ${END_TIME},
"description": "Example TRC-10 token",
"url": "https://example.com",
"free_asset_net_limit": 0,
"public_free_asset_net_limit": 0,
"visible": true
}
JSONAfter 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 { TronWeb } = require('tronweb');
const privateKey = process.env.PRIVATE_KEY;
if (!/^[0-9a-fA-F]{64}$/.test(privateKey || '')) {
throw new Error('Set PRIVATE_KEY to a 64-character Shasta test private key');
}
const tronWeb = new TronWeb({
fullHost: 'https://api.shasta.trongrid.io',
privateKey
});
async function main() {
const createAssetAddress = tronWeb.defaultAddress.base58;
const saleStart = Date.now() + 60 * 60 * 1000;
const saleEnd = saleStart + 24 * 60 * 60 * 1000;
const trcOptions = {
name: 'ExampleToken',
abbreviation: 'EXT',
description: 'Example TRC-10 token',
url: 'https://example.com',
totalSupply: 100000000,
trxRatio: 1,
tokenRatio: 1,
saleStart,
saleEnd,
freeBandwidth: 0,
freeBandwidthLimit: 0,
frozenAmount: 0,
frozenDuration: 0,
precision: 6
};
const unsignedTransaction = await tronWeb.transactionBuilder.createAsset(
trcOptions,
createAssetAddress
);
const signedTransaction = await tronWeb.trx.sign(unsignedTransaction, privateKey);
const result = await tronWeb.trx.sendRawTransaction(signedTransaction);
console.log('Broadcast result:', result);
}
main().catch(error => {
console.error(error);
process.exitCode = 1;
});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
- TRC-20 — recommended fungible token standard for new projects (TVM-based, ERC-20 compatible)
- Transferring TRC-10 in smart contracts — interact with TRC-10 tokens from Solidity
- Token standards overview
- Transactions — sign and broadcast flow used by TRC-10 operations
Updated 15 days ago