0

すべての新しく作成された ERC712 トークンをログに記録したい。すでにノードを接続しており、現在のブロック番号を取得できます。

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

ここで私の質問は、コントラクトのトークン タイプをフィルター処理するにはどうすればよいですか? ブロック内のすべてのトランザクションをループして、コントラクト トランザクションをリッスンする必要がありますか?

助けてくれてありがとう、これは私の最初の投稿です。

4

1 に答える 1

0

関数を介してそれを行うことができますContract.on()これがドキュメントです。

コントラクトのフィルターを作成するには、まずコントラクト オブジェクトを宣言する必要があります。

コントラクト オブジェクトを宣言するには、コントラクト アドレスとコントラクト ABI が必要です。

コントラクト アドレスは誰でも知っているので、etherscan (またはネットワーク スキャナーに依存する他のサイト) から取得できます。

ethers.js を使っているので、etherscan のように JavaScript のコントラクトの ABI を等しくする必要はありません! ERC721標準インターフェースがそのまま使える!あなたはここでそれを見つけることができます

したがって_mint()、ERC721 標準コントラクト (ここ)の関数を見る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
   }
}

どちらの方法でも 1 つのことしかできませんが、最初の方法をお勧めします。

于 2021-08-28T10:51:23.103 に答える