Events

在我使用 ethers.js 時獲取事件參數

  • April 7, 2021

我是一個三個月大的程序員。因此,如果我所說的含糊不清,請讓我知道並幫助我成為一個更好的程序員。

現在我正在使用 hardhat 和 ether.js 編寫測試程式碼。

我的 Solidity 合約是關於訂單簿代幣交換的。當人們下訂單時,合約會發出名為“Make”的特定事件。


event Make(
   bytes32 indexed orderId, 
   address indexed maker,
   address makerToken, 
   address takerToken,
   uint256 amountSell,
   uint256 amountBuy
);

orderId 是通過散列一些數據而得到的。

我想檢查事件是否正確發出。在編寫測試程式碼時,我花了很長時間來了解如何獲取發出的事件。

最後我可以使用下面的程式碼獲取事件。但我真正想要的是

  1. 獲取事件的第一個參數並將其放入 var。(如果是 bytes32 雜湊)看起來像, const hash = await events.args

$$ 0 $$; 2. 比較事件的第二個參數並將其與值進行比較。(以防萬一,地址製造商)看起來像,期望(等待 events.args

$$ 1 $$).to.equal(add1.address);

實際上這不是一個兩個問題。只有一個。

這是我的測試程式碼。

const { expect } = require("chai");
const { ethers } = require("hardhat");

describe("EX contract", function () {
   let EX, ex, token, Token, add0, add1, add2, add3;

   before(async function () {
     EX = await ethers.getContractFactory("EX");
     Token = await ethers.getContractFactory("Token");
     ex = await EX.deploy(1000);
     token = await Token.deploy();
     [add0, add1, add2, add3] = await ethers.getSigners();
   });
 
   beforeEach(async function () {
     await token.mint(add1.address, 200000);
   });

   describe("Make / Take order", function () {
       await ex.connect(add1).makeOrder(token.address, 100, {value : 100});
       await ex.connect(add1).makeOrder(token.address, 100, {value : 200});
       
       let eventFilter = ex.filters.Make();
       let events = await ex.queryFilter(eventFilter, "latest");

       console.log(events);            //"events" contains too many information.
   });
});

請幫幫我,伙計們!

我建議嘗試OpenZeppelin 測試助手。他們有一張expectEvent從交易收據中讀取事件的支票。

在你的情況下,它應該看起來像

it("Make / Take order", async function () {
 const receipt = await ex.connect(add1).makeOrder(token.address, 100, {value : 100});

 expectEvent(receipt, 'Make', {
   orderId: '<EXPECTED_ORDER_ID>',
   maker: '<EXPECTED_MAKER>',
 });
});

謝謝伊斯梅爾!

我以兩種不同的方式解決了它。一個來自我的程式碼,一個來自你的幫助。

從我的程式碼

   await ex.makeOrder(token.address, 100, {value : 200});

   const eventFilter = ex.filters.Make();
   const events = await ex.queryFilter(eventFilter, "latest");
   const hash = events[0].args[0];

在你的幫助下

   const tx = await ex.makeOrder(token.address, 100, {value : 200});
   const res = await tx.wait();
   const hash = res.events[0].args[0];

對此,我真的非常感激!:)

引用自:https://ethereum.stackexchange.com/questions/96488