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
相关产品推荐
相关产品推荐

