Open3
Tips for Ethers.js
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"
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
-
- signature (event なら event の signature らしい)
-
- 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
- event の indexed の話など詳しい
https://y-nakajo.hatenablog.com/entry/2017/12/08/144643