我想遍历以太坊 ERC-721 合约的所有代币 ID。有些合约有计数 id (0, 1, 2, 3, ...),这很容易,但有些合约有随机 id,例如https://etherscan.io/token/0xf87e31492faf9a91b02ee0deaad50d51d56d5d4d#inventory
遗憾的是 etherscan 只显示最后使用的 10000 个令牌 ID,但我想遍历所有 79490。有没有办法做到这一点?对我来说,一切都很好。使用一些 API 设置我自己的以太坊节点。
我想遍历以太坊 ERC-721 合约的所有代币 ID。有些合约有计数 id (0, 1, 2, 3, ...),这很容易,但有些合约有随机 id,例如https://etherscan.io/token/0xf87e31492faf9a91b02ee0deaad50d51d56d5d4d#inventory
遗憾的是 etherscan 只显示最后使用的 10000 个令牌 ID,但我想遍历所有 79490。有没有办法做到这一点?对我来说,一切都很好。使用一些 API 设置我自己的以太坊节点。
以与合约无关的方式使用以太坊节点并没有简单的方法...... 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
您可以遍历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);
}
});