Open3

Tips for Ethers.js

linnefromicelinnefromice

Transaction

Return value of a non-constant function (neither pure nor view)

  • pure や view でない function (= non-constant function) の return value はオンチェーンが利用できる
  • オフチェーンからこれらの値を取得するには、その function を実行したトランザクションを確認する必要がある
  • non-constant function を利用したときに、その return value を取得するために、その return value を含む event を発行できる
    • event の内容は transaction hash を介して取得することができ、transaction receipt に含まれる

example

const tx = await GreetContractFactory__factory.connect(
  merkleAirdropFactoryAddress,
  signer,
).createContract("Hello")
const rc = await tx.wait()
const name = rc.events?.find(
  (event) => event.event === 'Created',
)?.args.?name
console.log(name) // -> "Hello"

https://ethereum.stackexchange.com/questions/88119/i-see-no-way-to-obtain-the-return-value-of-a-non-view-function-ethers-js/88122#88122?newreg=4a30b381fa9649e88b2fdfd2ef2d8cd0

linnefromicelinnefromice

TransactionReceipt

(若干 ethereum そのものの話も含まれているけど)

const tx = await Stake__factory.connect(addr, signer).deposit(amount)
const tr = await tx.wait()
console.log(tr) // -> ?

events

Contract で event を発行しておくことで、わざわざ tx 実行後に view function などで確認しなくても、tx 実行/確定後の Transaction Receipt から処理に利用した値/処理結果などを取得することができる

TransactionReceipt.events から取得するが、実際の event が含まれていない log の data もあるのでピンポイントで指定するには下記のように filter する

const tr = await tx.wait()
const name = tr.events?.find((v) => v.event === 'Deposited')

各種 field

  • transactionIndex ... block 内の transaction index
  • blockNumber ... 確定した block number
  • topics
      1. signature (event なら event の signature らしい)
      1. address の値
    • 3以降 -> event の index
  • logIndex ... この transaction での log の index
  • blockHash ... block のハッシュ
  • (event の場合の付加情報)
    • args ... event の引数
    • event ... event 名
    • event signature ... event の interface

ex) 実際の例

// console.log(tr.events[N]
  {
    transactionIndex: 0,
    blockNumber: 34,
    transactionHash: '0x77f0db5cf89bf047f824ff5c2bb20e72f7f87ab7a779e9f898c8baf01ff85857',
    address: '0x0165878A594ca255338adfa4d48449f69242Eb8F',
    topics: [
      '0x9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d',
      '0x000000000000000000000000f39fd6e51aad88f6f4ce6ab8827279cfffb92266'
    ],
    data: '0x0000000000000000000000000000000000000000000000022b1c8c1227a00000',
    logIndex: 4,
    blockHash: '0x2e45df3a4ab797ebbb4e1ef08777779dac463c108f62b403c0f49f3c045897b1',
    args: [
      '0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266',
      BigNumber { value: "40000000000000000000" },
      user: '0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266',
      amount: BigNumber { value: "40000000000000000000" }
    ],
    decode: [Function (anonymous)],
    event: 'Staked',
    eventSignature: 'Staked(address,uint256)',
    removeListener: [Function (anonymous)],
    getBlock: [Function (anonymous)],
    getTransaction: [Function (anonymous)],
    getTransactionReceipt: [Function (anonymous)]
  }

references