Skip to content
Logo

Example: governance_list

To run this example:

  • Clone the examples repository: git clone https://github.com/throgxyz/examples.git
  • Run: cargo run -p examples-queries --example governance_list
//! List on-chain governance proposals and fetch one by ID.
//!
//! On TRON, SR-level governance proposals change chain parameters (e.g. block
//! rewards, energy prices). Only SRs and SR partners may submit or vote on
//! them; anyone may query them.
//!
//! No private key required (read-only).
//!
//! Optional env:
//!   TRON_PROPOSAL_ID — numeric proposal ID to fetch individually (default: 1)
//!   TRON_API_KEY     — TronGrid API key
//!
//! ```bash
//! cargo run -p examples-queries --example governance_list
//! TRON_PROPOSAL_ID=3 cargo run -p examples-queries --example governance_list
//! ```
 
use tronz::{ProviderBuilder, TRONGRID_NILE, providers::ext::GovernanceApi as _};
 
#[tokio::main]
async fn main() -> anyhow::Result<()> {
    let proposal_id: i64 =
        std::env::var("TRON_PROPOSAL_ID").ok().and_then(|s| s.parse().ok()).unwrap_or(1);
    let api_key = std::env::var("TRON_API_KEY").ok();
 
    let provider = ProviderBuilder::new().maybe_api_key(api_key).on_grpc(TRONGRID_NILE).await?;
 
    // ── List all proposals ────────────────────────────────────────────────────
 
    let proposals = provider.list_proposals().await?;
 
    println!("=== Governance Proposals ({} total) ===", proposals.len());
    for p in &proposals {
        let proposer =
            p.proposer_address.map(|a| a.to_string()).unwrap_or_else(|| "<unknown>".into());
        println!(
            "  #{:<4}  state={:?}  params={}  proposer={}",
            p.proposal_id,
            p.state,
            p.parameters.len(),
            proposer
        );
    }
 
    // ── Paginated fetch (first 5) ─────────────────────────────────────────────
 
    println!("\n=== First 5 proposals (paginated) ===");
    let page = provider.get_paginated_proposal_list(0, 5).await?;
    for p in &page {
        println!(
            "  #{:<4}  expires={}  approvals={}",
            p.proposal_id,
            p.expiration_time,
            p.approvals.len()
        );
    }
 
    // ── Fetch individual proposal ─────────────────────────────────────────────
 
    println!("\n=== Proposal #{proposal_id} ===");
    match provider.get_proposal_by_id(proposal_id).await {
        Ok(p) => {
            println!("  state        : {:?}", p.state);
            println!("  proposer     : {:?}", p.proposer_address);
            println!("  create_time  : {}", p.create_time);
            println!("  expiry       : {}", p.expiration_time);
            println!("  approvals    : {}", p.approvals.len());
            println!("  parameters   :");
            let mut params: Vec<_> = p.parameters.iter().collect();
            params.sort_by_key(|(k, _)| *k);
            for (id, val) in params {
                println!("    param[{id}] = {val}");
            }
        }
        Err(e) => println!("  not found: {e}"),
    }
 
    Ok(())
}

Find the source code on GitHub here.