Skip to content
Logo

Transferring TRX

The send_trx() builder transfers native TRX from the signer to a recipient.

use tronz::Trx;
 
let pending = provider
    .send_trx()
    .to(to)
    .amount(Trx::from_sun(1_000_000)?)  // 1 TRX
    .send()
    .await?;
 
let info = pending.get_receipt().await?;
println!("status: {:?}", info.status);

Builder methods

MethodRequired?Description
.to(Address)yesRecipient
.amount(Trx)yesAmount to send
.from(Address)noSender; defaults to the signer's address
.memo(impl Into<Vec<u8>>)noAttach an on-chain memo
.send()Fill, sign, broadcast

to and amount are mandatory; omitting either returns a "missing field" error from .send().

Adding a memo

let pending = provider
    .send_trx()
    .to(to)
    .amount("2.5".parse()?)
    .memo("gm")
    .send()
    .await?;

A complete program

use tronz::{Address, LocalSigner, ProviderBuilder, TronProvider, TronSigner, Trx, TRONGRID_NILE};
 
#[tokio::main]
async fn main() -> anyhow::Result<()> {
    let signer = LocalSigner::from_hex(&std::env::var("TRON_PRIVATE_KEY")?)?;
    let from = signer.address();
    let to: Address = std::env::var("TRON_TO")?.parse()?;
 
    let provider = ProviderBuilder::new()
        .with_signer(signer)
        .connect_grpc(TRONGRID_NILE)
        .await?;
 
    // Check the balance before sending.
    let before = provider.get_account(from).await?.balance;
    println!("balance: {} (before)", before);
 
    let pending = provider
        .send_trx()
        .to(to)                            // TRON does not allow self-transfers
        .amount(Trx::from_sun(1_000_000)?) // 1 TRX
        .send()
        .await?;
 
    println!("tx_id: {:#x}", pending.tx_id());
 
    let info = pending.get_receipt().await?;
    println!("confirmed in block {}: {:?}", info.block_number, info.status);
 
    Ok(())
}

See the full runnable version in Examples → Transfers.