mint 或 programId (例如,SPL 代币程序或 Token-2022 程序)来过滤查询。
对于拥有大量代币组合的钱包,考虑使用 /api-reference/rpc/http/gettokenaccountsbyownerv2) 提供支持可配置页面大小的游标分页,每个请求最多 10,000 个账户。
常见用例
- 显示用户投资组合: 获取给定用户钱包地址的所有代币账户(以及余额),以显示其完整的代币投资组合。
- 应用逻辑: 在发起转账或其他交互之前,识别用户特定代币的账户。
- 验证: 检查某个所有者拥有的特定类型代币的账户。
- 索引代币持有者: 虽然对于全局索引效率较低,但可以用于查找已知所有者集合的账户。
请求参数
-
ownerPubkey(string, required): 要检索其代币账户的账户所有者的 base-58 编码公钥。 -
filter(object, required): 一个 JSON 对象,必须指定 /* INLINE_CODE_PLACEHOLDER_a4fd5a3d8817d1fb3b3b2abedaceb3fe / 或 / INLINE_CODE_PLACEHOLDER_d0e7ff6d24268cce4eba6844d37f400f */:mint(string): 特定代币铸币的 base-58 编码公钥。如果提供,将仅返回由ownerPubkey拥有的此铸币的代币账户。programId(string): 管理账户的代币程序的 base-58 编码公钥。常见值有:- SPL 代币程序:
TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA - Token-2022 程序:
TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb
- SPL 代币程序:
-
options(object, optional): 一个可选的配置对象,可以包括:commitment(string, optional): 指定 承诺级别。encoding(string, optional): 账户数据的编码。建议使用"jsonParsed"。其他选项:"base64","base64+zstd"。默认为"base64"。dataSlice(object, optional): 要检索账户数据的特定切片(offset: usize,length: usize)。仅适用于base58,base64, 或base64+zstd编码。minContextSlot(u64, optional): 查询的最低槽位。
响应结构
JSON-RPC 响应中的result.value 字段是一个对象数组。每个对象对应于一个由 ownerPubkey 拥有的 SPL Token 账户,并与 filter 匹配。
value 数组中的每个对象包含:
pubkey(字符串): 令牌账户本身的 base-58 编码公钥。account(对象): 令牌账户的详细信息:lamports(u64): 免租金的 Lamport 余额。owner(字符串): 所有程序(例如,Token Program 公钥)。data: 账户数据。如果使用"jsonParsed"编码,则包含:program(字符串): 例如,"spl-token"。parsed: 包含结构化信息的对象:info: 详细信息如:mint(字符串): 令牌的铸造地址。owner(字符串): 令牌账户的所有者(应与请求中的ownerPubkey匹配)。tokenAmount(对象): 令牌余额(amount,decimals,uiAmount,uiAmountString)。state(字符串): 令牌账户的状态(例如,"initialized")。isNative(布尔值): 如果账户持有包装的 SOL。delegate(字符串, 可选): 如果设置了委托,委托地址。delegatedAmount(对象, 可选): 如果设置了委托,委托的金额。
type(字符串): 例如,"account"。
executable(布尔值): 账户是否可执行。rentEpoch(u64): 下个时代租金到期时间。space(u64, 如果不是jsonParsed): 原始账户数据的字节长度。
jsonParsed 编码,按 programId 过滤):
代码示例
开发者提示
- 过滤要求: 您必须在过滤器中提供
mint或programId。如果没有其中一个主要过滤器,不可能查询所有令牌类型的所有所有者令牌账户。 - 关联令牌账户: 此方法将返回由公钥拥有的所有令牌账户,包括标准的关联令牌账户(ATAs)和他们可能拥有的任何其他 SPL 令牌账户(例如,来自旧的钱包实现或自定义设置)。
- 编码: 强烈推荐为
encoding选项使用"jsonParsed"。它将二进制账户数据解码为更可用的 JSON 结构。 - 性能: 如果所有者拥有大量令牌账户(尤其是仅按
programId过滤时),响应可能会很大。对于这种情况,使用getTokenAccountsByOwnerV2提供内置分页支持。 - Token-2022(令牌扩展): 如果您使用 Token-2022 程序(支持传输费用、利息等扩展)创建的令牌,请确保使用正确的
programId:TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb。
getTokenAccountsByOwner RPC 方法的全面理解,使您能够高效地检索任何 Solana 地址的令牌账户信息。
大型代币组合的分页
对于持有大量令牌的钱包,请使用getTokenAccountsByOwnerV2 提供:
- 基于游标的分页:设置
limit(1-10,000)并使用paginationKey导航结果 - 增量更新:使用
changedSinceSlot仅获取自某个特定槽位以来修改的令牌账户 - 更好的性能:防止超时并实现实时投资组合跟踪
- 分页行为:只有在不返回令牌账户时才表示分页结束。由于过滤器,返回的账户可能少于限制 - 继续分页直到
paginationKey为 null