ERC-721:如何获取所有代币 ID?

ERC-721: How to get all token ids?

我想遍历以太坊 ERC-721 合约的所有代币 ID。 有些合约有计数 ids (0, 1, 2, 3, ...) 这很容易,但有些有随机 ids,例如https://etherscan.io/token/0xf87e31492faf9a91b02ee0deaad50d51d56d5d4d#inventory

遗憾的是,etherscan 只显示最后使用的 10000 个令牌 ID,但我想遍历所有 79490 个。 有没有办法做到这一点?对我来说,一切都很好。使用一些 API.

设置我自己的以太坊节点

您可以遍历收集合约发出的所有 Transfer() 事件。

您正在寻找转账 from 地址 0x0(铸造的代币)。并从列表中排除转账 to 地址 0x0 (销毁的代币)。

实现此目的的方法之一是使用 Web3 合约 getPastEvents() 函数 (docs)。

const myContract = new web3.eth.Contract(abiJson, contractAddress);
myContract.getPastEvents('Transfer', {
    filter: {
        _from: '0x0000000000000000000000000000000000000000'
    },
    fromBlock: 0
}).then((events) => {
    for (let event of events) {
        console.log(event.returnValues._tokenId);
    }
});

没有简单的方法可以以与合约无关的方式使用以太坊节点来完成它...ERC-712 没有指定任何允许查询所有代币 ID 的接口方法,所以除非你的合约是查看使用顺序令牌 ID,无法从简单的节点查询中猜测所有令牌 ID。

除非您想遍历合约的整个交易历史以获取每个铸造的 NFT 的 ID(为此您需要一个存档节点,因为完整节点不会有完整的交易历史)您应该使用索引所有 NFT activity.

的服务中的 API

您可以使用来自 CovalentHQ 的 API: https://www.covalenthq.com/docs/api/#/0/Class-A/Get-NFT-Token-IDs-for-contract/lng=en

或者来自 Morallis 的这个: https://docs.moralis.io/moralis-server/web3-sdk/token#getalltokenids