Skip to content
Logo

Exchange and Market

TRON exposes two native TRC10 trading systems:

SystemModelPrimary operations
ExchangeLegacy Bancor-style liquidity poolCreate, inject, withdraw, trade
MarketNative order-book DEXPlace, query, and cancel limit orders

Both APIs are provider extension traits:

use tronz::providers::ext::{ExchangeApi as _, MarketApi as _};

Exchange pools

Create a TRX/TRC10 pool:

let receipt = provider
    .exchange_create()
    .first_token_id("_")
    .first_token_balance(1_000_000)
    .second_token_id(asset_id)
    .second_token_balance(1_000)
    .send()
    .await?
    .require_success()
    .get_receipt()
    .await?;

Once you know the exchange ID, liquidity and trades use the same lazy-builder pattern:

provider
    .exchange_inject()
    .exchange_id(exchange_id)
    .token_id("_")
    .quant(100_000)
    .send()
    .await?;
 
provider
    .exchange_withdraw()
    .exchange_id(exchange_id)
    .token_id("_")
    .quant(10_000)
    .send()
    .await?;
 
provider
    .exchange_trade()
    .exchange_id(exchange_id)
    .token_id("_")
    .quant(10_000)
    .expected(1)
    .send()
    .await?;

Query pools with:

let all = provider.list_exchanges().await?;
let page = provider.get_paginated_exchange_list(0, 20).await?;
let exchange = provider.get_exchange_by_id(exchange_id).await?;

get_exchange_by_id returns None when the ID does not exist.

See the runnable exchange lifecycle example.

Market orders

Place and cancel an order:

let pending = provider
    .market_sell()
    .sell_token_id(asset_id)
    .sell_token_quantity(10)
    .buy_token_id("_")
    .buy_token_quantity(1_000)
    .send()
    .await?;
 
provider
    .market_cancel()
    .order_id(order_id)
    .send()
    .await?;

The read API covers individual orders, account orders, pair order books, price levels, and active pairs:

let order = provider.get_market_order_by_id(order_id).await?;
let account_orders = provider.get_market_order_by_account(owner).await?;
let prices = provider.get_market_price_by_pair(asset_id, "_").await?;
let orders = provider.get_market_order_list_by_pair(asset_id, "_").await?;
let pairs = provider.get_market_pair_list().await?;

get_market_order_by_id returns None for a missing order. This includes java-tron nodes that report "order not found in store" as an internal gRPC status; tronz normalizes that response into the same Option semantics.

See the runnable market query example.