如何获取Solana钱包内代币列表及余额?修复失效Python代码
Solana钱包代币列表及余额查询修复方案
原代码问题分析
- Solana RPC返回结果处理错误:
get_token_accounts_by_owner返回的是RpcResponse对象,直接通过['result']取值会触发类型错误,需通过.value属性获取账户列表。 - 元数据获取端点无效:原代码使用的元数据API不存在,需通过Metaplex元数据协议获取代币名称等信息。
- 余额计算逻辑错误:代币余额是字符串类型,需先转为整数再进行小数转换;同时原代码中
decimals的取值路径错误。
可运行Python代码
import requests import base58 from solana.rpc.api import Client from solana.rpc.types import TokenAccountOpts SOLANA_RPC_ENDPOINT = "https://api.mainnet-beta.solana.com" METAPLEX_METADATA_PROGRAM_ID = "metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s" def get_metadata_account(mint_address): # 根据Metaplex协议计算元数据账户地址 seed = bytes("metadata", "utf-8") + bytes(base58.b58decode(METAPLEX_METADATA_PROGRAM_ID)) + bytes(base58.b58decode(mint_address)) metadata_account = base58.b58encode_check(seed[:32]).decode() return metadata_account def parse_token_metadata(metadata_data): # 解析元数据账户数据,提取代币名称和符号 if len(metadata_data) < 100: return {"name": "(Unknown)"} # 跳过固定前缀,读取并清理名称字段 name = metadata_data[32:32+32].decode("utf-8").strip("\x00") return {"name": name} def get_wallet_tokens(wallet_address): client = Client(SOLANA_RPC_ENDPOINT) tokens = [] try: # 指定Token程序ID,获取钱包所有代币账户 opts = TokenAccountOpts(program_id="TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA") token_accounts = client.get_token_accounts_by_owner(wallet_address, opts) accounts = token_accounts.value except Exception as e: print(f"获取代币账户失败: {e}") return tokens for account in accounts: try: # 解析代币账户核心信息 account_data = account.account.data.parsed["info"] mint_address = account_data["mint"] amount = int(account_data["tokenAmount"]["amount"]) decimals = account_data["tokenAmount"]["decimals"] balance = amount / (10 ** decimals) # 获取并解析元数据 metadata_account = get_metadata_account(mint_address) metadata_response = client.get_account_info(metadata_account) if metadata_response.value: metadata_data = base58.b58decode(metadata_response.value.data[0]) metadata = parse_token_metadata(metadata_data) token_name = metadata["name"] if metadata["name"] else mint_address else: token_name = mint_address except Exception as e: print(f"处理代币{mint_address}出错: {e}") token_name = mint_address balance = 0 tokens.append({ "mint_address": mint_address, "name": token_name, "balance": round(balance, 6) }) return tokens if __name__ == "__main__": wallet_address = "AJuo8yxM9rFg9x767r3ArDCarUgBPe276K61zjfWuEcN" tokens = get_wallet_tokens(wallet_address) if tokens: print("钱包内代币列表:") for token in tokens: print(f"- {token['name']} ({token['mint_address']}): {token['balance']}") else: print("钱包内未找到代币")
依赖安装
运行前需安装所需依赖:
pip install solana requests base58
内容的提问来源于stack exchange,提问作者First voyager
相关产品推荐
相关产品推荐

