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)
没有简单的方法可以以与合约无关的方式使用以太坊节点来做到这一点...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