[ethers.js] Contract를 특정 블록 넘버 기준으로 호출

import { ethers } from 'ethers';
import contract_ABI from './abi/contract_ABI.json';
const provider = new ethers.JsonRpcProvider("http://mainnet.dasomoli.org:8545");
const contract_address = "0x1234567890123456789012345678901234567890";
const contract = new ethers.Contract(contract_address, contract_ABI, provider);

const balanceOf = contract.balanceOf(account_address, { blockTag: 12345678 });

위처럼 호출 시 blockTag: 와 함께 blockNumber를 주면 된다.

[ethers.js] bytecode(=creationCode) 얻기

contract 컴파일 후 bytecode(creationCode)를 얻으려면:

(await ethers.getContractFactory("DasomOLIContract")).bytecode

이걸 keccak256()으로 돌리면(ethersV5 기준)

> ethers.utils.keccak256((await ethers.getContractFactory("DasomOLIContract")).bytecode)

위는 solidity에서 다음을 하는 것과 동일하다.

keccak256(abi.encodePacked(type(DasomOLIContract).creationCode));

[ethers.js] Transaction details 얻기 및 ERC20 Transfer 정보 얻기

hardhat task로 만든 txHash로 transaction details 얻어서 ERC20 Transfer() 이면 정보 출력.

task("trasactionDetails", "Get the transaction deatils")
  .addPositionalParam("txHash", "Transaction Hash")
  .setAction(async (taskArgs, hre) => {
    const provider = ethers.provider;
    const transaction = await provider.getTransaction(taskArgs.txHash);
    console.log(transaction);
    if (transaction.value === 0n) {
      if (transaction.data.slice(0, 10) === "0xa9059cbb") {
        console.log("---- ERC20 Transfer -------------------------");
        await hre.run("parseERC20TransferData", { data: transaction.data });
      }
    }
  });

task("parseERC20TransferData", "Parsing")
  .addPositionalParam("data", "Transacton Data")
  .setAction(async (taskArgs) => {
    const abiCoder = new ethers.AbiCoder();
    const decodedData = abiCoder.decode(['address', 'uint256'], "0x" + taskArgs.data.slice(10));
    const to = decodedData[0];
    const value = decodedData[1].toString();

    console.log('To Address:', to);
    console.log('Token Amount:', ethers.formatEther(value));
  });

[ethers.js] Contract 시그니처와 hash 확인

const ca = await ethers.getContractFactory("DasomToken");
const cabi = ca.interface;
cabi.format() // Fragments 확인
cabi.forEachFunction((func, index) => { console.log(func.format()); }); // 각 함수의 시그니처 확인
cabi.forEachFunction((func, index) => { console.log(func.format(), ethers.keccak256(ethers.toUtf8Bytes(func.format()))); }); // 시그니처와 해시 값 확인.