Solana SPL 代币接口
SPL-Token 接口可以查询 Solana 区块链上的 Token 的账户信息,包括令牌持有者、余额等。
这些接口提供了对 Solana 区块链上 Token 账户的灵活查询和管理,可以帮助开发者和投资者更好地了解和操作 Token 账户信息。
1. 查询账户信息
使用 getTokenAccountsByOwner 方法可以查询特定 Token 的所有者为指定地址的账户信息。
我们知道 SPL-Token 的结构为:
pub struct Account {
/// The mint associated with this account
pub mint: Pubkey,
/// The owner of this account.
pub owner: Pubkey,
/// The amount of tokens this account holds.
pub amount: u64,
/// If `delegate` is `Some` then `delegated_amount` represents
/// the amount authorized by the delegate
pub delegate: COption,
/// The account's state
pub state: AccountState,
/// If is_native.is_some, this is a native token, and the value logs the rent-exempt reserve. An
/// Account is required to be rent-exempt, so the value is used by the Processor to ensure that
/// wrapped SOL accounts do not drop below this threshold.
pub is_native: COption,
/// The amount delegated
pub delegated_amount: u64,
/// Optional authority to close the account.
pub close_authority: COption,
}
我们可以查询某个 Token 下,所有 owner 为某人的 Token 账号,或者 delegate 为某人的所有账号。
我们在命令行中,通过 curl 命令发送 POST 请求到 Solana 的 RPC 接口。
curl https://api.devnet.solana.com -X POST -H "Content-Type: application/json" -d '
{
"jsonrpc": "2.0",
"id": 1,
"method": "getTokenAccountsByOwner",
"params": [
"Czorr4y9oFvE3VdfCLVFuKDYxaNUG1iyQomR7kMZUuzi",
{
"mint": "7vtXvye2ECB1T5Se8E1KebNfmV7t4VkaULDjf2v1xpA9"
},
{
"encoding": "jsonParsed"
}
]
}
'
上线的示例中的请求中包含了 Token 地址和所有者地址,返回了所有符合条件的账户信息列表。
这里查询到这个token:7vtXvye2ECB1T5Se8E1KebNfmV7t4VkaULDjf2v1xpA9 的 owner 为 CnjrCefFBHmWnKcwH5T8DFUQuVEmUJwfBL3Goqj6YhKw 的所有账号。
{
"jsonrpc": "2.0",
"result": {
"context": {
"apiVersion": "1.16.5",
"slot": 234689258
},
"value": [
{
"account": {
"data": {
"parsed": {
"info": {
"isNative": false,
"mint": "7vtXvye2ECB1T5Se8E1KebNfmV7t4VkaULDjf2v1xpA9",
"owner": "Czorr4y9oFvE3VdfCLVFuKDYxaNUG1iyQomR7kMZUuzi",
"state": "initialized",
"tokenAmount": {
"amount": "99000000000",
"decimals": 9,
"uiAmount": 99.0,
"uiAmountString": "99"
}
},
"type": "account"
},
"program": "spl-token",
"space": 165
},
"executable": false,
"lamports": 2039280,
"owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
"rentEpoch": 0,
"space": 165
},
"pubkey": "EZhhUANUMKsRhRMArczio1kLc9axefTUAh5xofGX35AK"
}
]
},
"id": 1
}
而通过查询命令:
curl https://api.devnet.solana.com -X POST -H "Content-Type: application/json" -d '
{
"jsonrpc": "2.0",
"id": 1,
"method": "getTokenAccountsByDelegate",
"params": [
"Czorr4y9oFvE3VdfCLVFuKDYxaNUG1iyQomR7kMZUuzi",
{
"mint": "7vtXvye2ECB1T5Se8E1KebNfmV7t4VkaULDjf2v1xpA9"
},
{
"encoding": "jsonParsed"
}
]
}
'
因为我们没有设置代理操作,所以这里得到的结果为空。
2. 查询账户余额
通过 getTokenAccountBalance 方法可以直接查询指定 Token 账户的余额信息。
我们在命令行中,通过 curl 命令发送 POST 请求到 Solana 的 RPC 接口。
curl https://api.devnet.solana.com -X POST -H "Content-Type: application/json" -d '
{
"jsonrpc": "2.0", "id": 1,
"method": "getTokenAccountBalance",
"params": [
"EZhhUANUMKsRhRMArczio1kLc9axefTUAh5xofGX35AK"
]
}
'
示例请求中通过指定账户地址来查询账户的余额信息。
返回结果:
{
"jsonrpc": "2.0",
"result": {
"context": {
"apiVersion": "1.16.3",
"slot": 209132550
},
"value": {
"amount": "99000000000",
"decimals": 9,
"uiAmount": 99.0,
"uiAmountString": "99"
}
},
"id": 1
}
这里可以看到,uiAmount 是显示的数量,是做了精度转换的,精度和真实的 amount 都包含在查询结果中。