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

Ala*_*lai 3 blockchain ethereum smartcontracts nft

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

遗憾的是 etherscan 只显示最后使用的 10000 个令牌 id,但我想迭代所有 79490 个。有没有办法实现这一点?对我来说,一切都很好。使用一些 API 设置我自己的以太坊节点。

Pet*_*jda 11

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

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

实现此目的的一种方法是使用 Web3 ContractgetPastEvents()函数(文档)。

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);
    }
});
Run Code Online (Sandbox Code Playgroud)

  • @Alai 确实,这个 10k 限制是 Infura 施加的,您可以使用自己的节点绕过它。 (2认同)
  • 非常感谢。我是否需要为此使用存档节点,或者完整节点就足够了? (2认同)
  • 我通过指定 fromBlock: x, toBlock: y 使其与 infura 一起使用上面的代码。并在循环中递增 x 和 y,其中 x 和 y 的范围小到足以返回少于 10,000 个结果。@阿来 (2认同)

bWo*_*owk 5

没有简单的方法可以以与合约无关的方式使用以太坊节点来做到这一点...ERC-721 没有指定任何允许查询所有代币 ID 的接口方法,因此除非您正在查看的合约使用顺序代币ids,无法通过简单的节点查询猜测所有令牌 id。

除非你想迭代合约的整个交易历史记录来获取每个铸造的 NFT 的 ID(你需要一个存档节点,因为完整节点不会有完整的交易历史记录),否则你应该使用来自索引所有 NFT 活动的服务。

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

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