Example: trc10_transfer
To run this example:
- Clone the examples repository:
git clone https://github.com/throgxyz/examples.git - Run:
cargo run -p examples-trc10 --example trc10_transfer
//! Transfer a TRC10 token to another address on the Nile testnet.
//!
//! TRC10 transfers are native protocol operations — no smart contract
//! execution, very low bandwidth cost. Get test TRC10 tokens from the
//! Nile faucet or by issuing your own asset.
//!
//! Required env:
//! TRON_PRIVATE_KEY — hex private key
//! TRON_TO — recipient address
//! TRON_TOKEN_ID — numeric token ID to transfer (e.g. "1000001" for BTT)
//!
//! Optional env:
//! TRON_API_KEY — TronGrid API key
//! TRON_AMOUNT — raw amount to send (default: 1)
//!
//! ```bash
//! TRON_PRIVATE_KEY=<key> TRON_TO=<addr> TRON_TOKEN_ID=<id> \
//! cargo run -p examples-trc10 --example trc10_transfer
//! ```
use tronz::{
LocalSigner, ProviderBuilder, TRONGRID_NILE, 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 to_str = std::env::var("TRON_TO").expect("TRON_TO env var required");
let token_id = std::env::var("TRON_TOKEN_ID").expect("TRON_TOKEN_ID env var required");
let api_key = std::env::var("TRON_API_KEY").ok();
let amount: i64 = std::env::var("TRON_AMOUNT").ok().and_then(|s| s.parse().ok()).unwrap_or(1);
let signer = LocalSigner::from_hex(&key_hex)?;
let from = signer.address();
let to: tronz::Address = to_str.parse()?;
let provider = ProviderBuilder::new()
.with_recommended_fillers()
.with_signer(signer)
.maybe_api_key(api_key)
.on_grpc(TRONGRID_NILE)
.await?;
// ── Token info + balance check ────────────────────────────────────────────
let token_info = provider
.get_asset_info(&token_id)
.await?
.ok_or_else(|| anyhow::anyhow!("token #{token_id} not found"))?;
let balance_before = provider.trc10_balance(from, &token_id).await?;
println!("=== TRC10 Transfer ===");
println!(" token : #{} ({})", token_info.id, token_info.abbr);
println!(" from : {from}");
println!(" to : {to}");
println!(" amount : {amount} (raw)");
println!(" balance : {balance_before} (raw, before)");
if balance_before < amount {
anyhow::bail!("insufficient balance: have {balance_before}, need {amount}");
}
// ── Send ──────────────────────────────────────────────────────────────────
println!("\n broadcasting…");
let pending =
provider.transfer_trc10().to(to).token_id(&token_id).amount(amount).send().await?;
println!(" tx_id : 0x{}", hex::encode(pending.tx_id()));
println!(" waiting for confirmation…");
let info = pending.get_receipt().await?;
println!(" status : {:?}", info.status);
println!(" net fee: {} sun", info.net_fee.as_sun());
// ── After ─────────────────────────────────────────────────────────────────
let balance_after = provider.trc10_balance(from, &token_id).await?;
println!("\n=== After ===");
println!(" balance : {balance_after} (raw)");
Ok(())
}Find the source code on GitHub here.
