Skip to content
Logo

Example: trc10_issue

To run this example:

  • Clone the examples repository: git clone https://github.com/throgxyz/examples.git
  • Run: cargo run -p examples-trc10 --example trc10_issue
//! Issue (create) a new TRC10 native token on the Nile testnet.
//!
//! TRC10 tokens are issued directly by the TRON protocol — no smart contract
//! needed. After the transaction is confirmed, the network assigns a numeric
//! token ID that you can use with `transfer_trc10` / `trc10_balance`.
//!
//! Required env:
//!   TRON_PRIVATE_KEY — hex private key of the issuer (needs TRX for fee)
//!
//! Optional env:
//!   TRON_API_KEY     — TronGrid API key
//!   TRON_TOKEN_NAME  — full token name      (default: "TronzTestToken")
//!   TRON_TOKEN_ABBR  — token symbol         (default: "TZT")
//!   TRON_TOKEN_SUPPLY — total supply (raw)  (default: 1_000_000_000_000 = 1M with 6 decimals)
//!   TRON_TOKEN_URL   — project URL          (default: "https://github.com/throgxyz/tronz")
//!
//! ```bash
//! TRON_PRIVATE_KEY=<key> cargo run -p examples-trc10 --example trc10_issue
//! ```
 
use tronz::{
    LocalSigner, ProviderBuilder, TRONGRID_NILE, TronProvider, TronSigner,
    providers::ext::Trc10Api as _,
};
 
#[tokio::main]
async fn main() -> anyhow::Result<()> {
    let key_hex = std::env::var("TRON_PRIVATE_KEY").expect("TRON_PRIVATE_KEY env var required");
    let api_key = std::env::var("TRON_API_KEY").ok();
    let token_name =
        std::env::var("TRON_TOKEN_NAME").unwrap_or_else(|_| "TronzTestToken".to_owned());
    let token_abbr = std::env::var("TRON_TOKEN_ABBR").unwrap_or_else(|_| "TZT".to_owned());
    let total_supply: i64 = std::env::var("TRON_TOKEN_SUPPLY")
        .ok()
        .and_then(|s| s.parse().ok())
        .unwrap_or(1_000_000_000_000); // 1,000,000 TZT with 6 decimals
    let url = std::env::var("TRON_TOKEN_URL")
        .unwrap_or_else(|_| "https://github.com/throgxyz/tronz".to_owned());
 
    let signer = LocalSigner::from_hex(&key_hex)?;
    let issuer = signer.address();
 
    let provider = ProviderBuilder::new()
        .with_recommended_fillers()
        .with_signer(signer)
        .maybe_api_key(api_key)
        .on_grpc(TRONGRID_NILE)
        .await?;
 
    let balance = provider.get_account(issuer).await?.balance;
    println!("=== Issuer {} ===", issuer);
    println!("  balance : {} TRX", balance);
 
    // ── Issue token ───────────────────────────────────────────────────────────
    //
    // Key parameters:
    //   precision   — decimal places (6 = same as USDT)
    //   exchange_rate(1, 1) — ICO rate: 1 TRX = 1 token
    //   start_offset_ms — ICO opens 5 minutes from now (required to be future)
    //   duration_ms — ICO lasts 30 days
 
    println!("\n=== Issuing TRC10 token ===");
    println!("  name         : {token_name}");
    println!("  symbol       : {token_abbr}");
    println!(
        "  total supply : {total_supply} (raw, 6 decimals → {} tokens)",
        total_supply / 1_000_000
    );
    println!("  url          : {url}");
 
    let pending = provider
        .issue_trc10()
        .name(&token_name)
        .abbr(&token_abbr)
        .description("Issued by the tronz SDK example")
        .url(&url)
        .total_supply(total_supply)
        .precision(6)
        .exchange_rate(1, 1)
        .send()
        .await?;
 
    println!("\n  tx_id  : 0x{}", hex::encode(pending.tx_id()));
    println!("  waiting for confirmation…");
    let info = pending.get_receipt().await?;
 
    println!("\n=== Receipt ===");
    println!("  status      : {:?}", info.status);
    println!("  energy used : {}", info.energy_usage);
    println!("  energy fee  : {} sun", info.energy_fee.as_sun());
 
    // ── Look up the assigned token ID ─────────────────────────────────────────
 
    let issued = provider.get_asset_issue_by_account(issuer).await?;
    if let Some(token) = issued.iter().find(|t| t.name == token_name) {
        println!("\n=== Token issued ===");
        println!("  id      : {}", token.id);
        println!("  name    : {}", token.name);
        println!("  symbol  : {}", token.abbr);
        println!("  supply  : {}", token.total_supply);
        println!("\n  Transfer with:");
        println!(
            "  TRON_PRIVATE_KEY=<key> TRON_TOKEN_ID={} TRON_TO=<addr> TRON_AMOUNT=1000000 \\",
            token.id
        );
        println!("    cargo run -p examples-trc10 --example trc10_transfer");
    } else {
        println!("\n  (token confirmed but ID not yet indexed — query shortly)");
        println!(
            "  Run: TRON_ADDRESS={issuer} cargo run -p examples-trc10 --example trc10_balance"
        );
    }
 
    Ok(())
}

Find the source code on GitHub here.