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

如何获取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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 00:45:14