如何获取NEAR协议中特定账户持有的全部NEP-171标准NFT?
获取NEAR账户所有NFT的解决方案
目前NEAR原生RPC没有提供直接查询某一账户跨合约所有NFT的接口,你可以通过以下两种思路实现需求:
1. 先获取账户持有NFT的所有合约列表
要拿到目标账户关联的NFT合约,最可靠的方式是通过NEAR索引器(比如基于NEAR Lake构建的自定义索引服务),查询所有与该账户相关的NFT转移事件:
- 筛选事件类型为
nft_transfer、接收方为目标账户的记录 - 提取记录中的
contract_id字段并去重,得到该账户持有NFT的所有合约地址
如果不想自行搭建索引器,也可以借助第三方索引服务的聚合查询能力,直接获取账户对应的NFT合约列表。
注意:通过
view_access_key_list查询账户授权的方式不可靠——持有NFT不需要对合约授权,会遗漏大量合约。
2. 批量查询每个合约下的NFT
拿到合约列表后,循环调用你现有的nft_tokens_for_owner方法,收集所有NFT数据。如果合约下NFT数量较多,需要处理分页参数(多数NFT合约支持from_index和limit参数实现分页查询)。
示例代码(基于你提供的逻辑扩展):
async function fetchAllNFTsForAccount(targetAccount) { // 假设已通过索引器获取到合约列表 const nftContracts = ["contract1.near", "contract2.near", "..."]; const allNFTs = []; for (const contract of nftContracts) { const params = { request_type: 'call_function', method_name: 'nft_tokens_for_owner', account_id: contract, args_base64: encodeArgs({ account_id: targetAccount, // 可选:添加分页参数处理大量NFT from_index: "0", limit: 100 }), finality: 'final' }; // 调用NEAR RPC接口 const rpcResponse = await fetch('https://rpc.mainnet.near.org', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(params) }); const result = await rpcResponse.json(); // 解码base64结果并解析NFT数据 const contractNFTs = JSON.parse(atob(result.result)); allNFTs.push(...contractNFTs); } return allNFTs; }
关键注意事项
- 部分NFT合约可能未实现标准的
nft_tokens_for_owner方法,需提前判断合约是否兼容NEAR NFT标准 - 处理分页时,需循环调用直到返回的NFT数量小于
limit,确保获取完整数据
内容的提问来源于stack exchange,提问作者ms8
相关产品推荐
相关产品推荐

