使用以太坊节点获取所有新创建的 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
}
}
两种方式做一件事,但推荐第一种方式!
我想记录所有新铸造的 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
}
}
两种方式做一件事,但推荐第一种方式!