簡體   English   中英

ERC-721:如何獲取所有代幣 ID?

[英]ERC-721: How to get all token ids?

我想遍歷以太坊 ERC-721 合約的所有代幣 ID。 有些合約有計數 ID(0、1、2、3,...),這很容易,但有些合約有隨機 ID,例如https://etherscan.io/token/0xf87e31492faf9a91b02ee0deaad50d51d56d5d4d#inventory

遺憾的是 etherscan 只顯示最后使用的 10000 個令牌 ID,但我想遍歷所有 79490 個。有沒有辦法實現這個? 對我來說,一切都很好。 使用一些 API 設置我自己的以太坊節點。

您可以遍歷收集合約發出的所有Transfer()事件。

您正在尋找from地址0x0 (鑄造代幣)的轉賬。 並且從列表中排除to地址0x0 (銷毀的代幣)的傳輸。

實現此目的的方法之一是使用 Web3 Contract 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 的接口方法,因此除非您正在查看的合約使用順序代幣ids,沒有辦法從一個簡單的節點查詢中猜測所有的 token id。

除非您想遍歷合約的整個交易歷史以獲取每個鑄造的 NFT 的 ID(您需要一個存檔節點,因為完整節點沒有完整的交易歷史),您應該使用來自的 API索引所有 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

我需要 Ethers 而不是 Web3,這里是 ethers.js 的代碼片段:

const getTransferEvents = async () => { 
    const provider = new ethers.providers.Web3Provider(window.ethereum)
    const contract = new ethers.Contract("address", "abi", provider);

    const events = await contract.queryFilter('Transfer', 0);

    console.log(events);
};

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM