Solana调用getTokenAccountBalance报错“Invalid param: not a Token account”排查
问题分析:Solana调用
getTokenAccountBalance提示“not a Token account” 问题重现
你调用Solana公共网关的请求示例:
curl --request POST \ --url https://solana-mainnet.g.alchemy.com/v2/demo \ --header 'accept: application/json' \ --header 'content-type: application/json' \ --data ' { "id": 1, "jsonrpc": "2.0", "method": "getTokenAccountBalance", "params": [ "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" ] } '
返回结果:
{"jsonrpc":"2.0","error":{"code":-32602,"message":"Invalid param: not a Token account"},"id":1}
后续使用地址5Xm6nU1Bi6UewCrhJQFk1CAV97ZJaRiFw4tFNhUbXy3u请求,仍返回相同错误。
核心原因
- 第一个地址是Token程序账户:
TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA是Solana官方的Token标准程序账户,负责处理所有代币的创建、转账等核心逻辑,本身并不存储用户的代币余额,不符合getTokenAccountBalance方法要求的代币账户类型。 - 第二个地址是原生SOL账户:
5Xm6nU1Bi6UewCrhJQFk1CAV97ZJaRiFw4tFNhUbXy3u是普通的Solana原生SOL账户,仅用于存储SOL代币,不是关联USDT的专属代币账户。Solana体系中,用户的每种代币都对应独立的代币账户,和原生SOL账户是完全分开的。
解决方案
要获取USDT余额,你需要使用用户的USDT专属代币账户地址,具体步骤如下:
- 先通过用户的原生SOL账户地址,调用
getTokenAccountsByOwner方法,指定USDT的Mint地址(Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB),获取该用户对应的USDT代币账户:curl --request POST \ --url https://solana-mainnet.g.alchemy.com/v2/demo \ --header 'accept: application/json' \ --header 'content-type: application/json' \ --data ' { "id": 1, "jsonrpc": "2.0", "method": "getTokenAccountsByOwner", "params": [ "用户的原生SOL账户地址", { "mint": "Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB" } ] } ' - 从返回结果中提取代币账户地址,再用这个地址调用
getTokenAccountBalance,即可获取目标用户的USDT余额。
内容的提问来源于stack exchange,提问作者tutushka
相关产品推荐
相关产品推荐

