使用以太坊节点获取所有新创建的 ERC721 合约

Getting all newly minted ERC721 contracts with an ethereum node

我想记录所有新铸造的 ERC712 代币。我已经连接了一个节点,可以获取当前区块号

async function init() {
  const customHttpProvider = new ethers.providers.JsonRpcProvider(url)
  customHttpProvider.getBlockNumber().then((result) => {
    console.log("Current block number: " + result)
  })
}

现在我的问题是,如何筛选合约的代币类型?我是否需要遍历区块中的每笔交易并监听合约交易?

非常感谢您的帮助,这是我的第一个post。

您可以通过 Contract.on() 函数来完成。 here is the doc.

要过滤合约,首先你必须声明一个合约对象。

要声明合约对象,您必须有合约地址和合约 ABI。

任何人都知道合约地址,您可以从 etherscan(或其他类似网站,取决于网络扫描器)获取它。

当您使用 ethers.js 时,您不必像在 etherscan 中那样在 JavaScript 中等于合同的合同 ABI!您可以简单地使用ERC721标准接口!你可以找到它here

因此,如果我们看一下 ERC721 标准合约 (here) 中的 _mint() 函数,它会发出 Transfer 事件,如果您只想获取铸币代币日志,则此接口够了

如果您查看 mint emit,您还会注意到它总是使用 address(0) 作为发件人,即 0x0000000000000000000000000000000000000000

所以你可以这样编码:

//making contract object!

const smallContractABI  = ['event Transfer(address indexed from, address indexed to, uint256 value)']
const contractAddress = CONTRACT_ADDRESS_YOU_ARE_LOOKING_AFTER;
const contract = new ethers.Contract(contractAddress, smallContractABI, customHttpProvider);

//here I can show you 2 ways.
//First way:
//Filtering

let filter = contract.filters.Transfer('0x0000000000000000000000000000000000000000', null, null) 

//Note that null is not necessary if you are just filtering first argument, but if you want
//just filter second argument, you have to set first argument null.
//For example when you want to specify transfer events when
//a transfer has been reached a specific address. then you filter like this:
//let filter = contract.filters.Transfer(null, ADDRESS, null) 

//Listening to events

contract.on(filter, (from, to, amount, event) =>{
   //code here
}

//Second way:
//You do not have to filter
contract.on("Transfer", (from, to, amount, event) => {
   if (from == '0x0000000000000000000000000000000000000000'){
      //code here
   }
}

两种方式做一件事,但推荐第一种方式!