You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Anchor Solana中如何获取指定token地址的供应量,等同web3.js getTokenSupply的实现?

Anchor Rust 获取Token供应量的实现方案

分两种常见场景实现,对应你不同的使用需求:

1. 链上程序内部获取(对应你说的在Solana程序函数中接收token地址入参的场景)

链上程序无法主动发起RPC请求,需要先把两个Token的Mint账户作为交易账户传入,再反序列化Mint结构读取供应量字段即可:
首先在Cargo.toml中引入依赖:

spl-token = { version = "~3.5.0", features = ["no-entrypoint"] }

程序代码示例:

use anchor_lang::prelude::*;
use spl_token::state::Mint;

declare_id!("你的程序ID");

#[program]
pub mod your_program {
    use super::*;

    pub fn get_two_token_supply(ctx: Context<GetTwoTokenSupply>) -> Result<(u64, u64)> {
        // 反序列化第一个Token Mint账户获取供应量
        let mint_a_data = ctx.accounts.mint_a.try_borrow_data()?;
        let mint_a = Mint::unpack(&mint_a_data)?;
        let supply_a = mint_a.supply;

        // 反序列化第二个Token Mint账户获取供应量
        let mint_b_data = ctx.accounts.mint_b.try_borrow_data()?;
        let mint_b = Mint::unpack(&mint_b_data)?;
        let supply_b = mint_b.supply;

        msg!("Token A 供应量: {}", supply_a);
        msg!("Token B 供应量: {}", supply_b);

        Ok((supply_a, supply_b))
    }
}

#[derive(Accounts)]
pub struct GetTwoTokenSupply<'info> {
    /// 校验账户属于SPL Token程序,避免传入非法账户
    #[account(owner = spl_token::id())]
    pub mint_a: AccountInfo<'info>,
    #[account(owner = spl_token::id())]
    pub mint_b: AccountInfo<'info>,
}

2. Anchor Rust 客户端获取(和JS端getTokenSupply完全等价的实现)

如果是在客户端侧查询数据,直接调用封装好的RPC方法即可:

use anchor_client::Client;
use solana_sdk::pubkey::Pubkey;
use std::str::FromStr;

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    // 初始化RPC客户端
    let client = Client::new(solana_client::rpc_client::RpcClient::new("RPC节点地址"), /* 你的签名者配置 */);
    
    let mint_a_pubkey = Pubkey::from_str("第一个Token Mint地址")?;
    let mint_b_pubkey = Pubkey::from_str("第二个Token Mint地址")?;

    // 等价于JS的getTokenSupply方法
    let supply_a = client.rpc().get_token_supply(&mint_a_pubkey)?;
    let supply_b = client.rpc().get_token_supply(&mint_b_pubkey)?;

    println!("Token A 供应量: {:?}", supply_a);
    println!("Token B 供应量: {:?}", supply_b);

    Ok(())
}

内容的提问来源于stack exchange,提问作者mohan A

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 05:39:04