2

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

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

4

2 回答 2

4

以与合约无关的方式使用以太坊节点并没有简单的方法...... ERC-712 没有指定任何允许查询所有令牌 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

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

于 2021-12-20T13:29:53.327 回答
3

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

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

实现此目的的方法之一是使用 Web3 ContractgetPastEvents()函数 ( 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);
    }
});
于 2021-09-26T08:35:58.940 回答