Events
在我使用 ethers.js 時獲取事件參數
我是一個三個月大的程序員。因此,如果我所說的含糊不清,請讓我知道並幫助我成為一個更好的程序員。
現在我正在使用 hardhat 和 ether.js 編寫測試程式碼。
我的 Solidity 合約是關於訂單簿代幣交換的。當人們下訂單時,合約會發出名為“Make”的特定事件。
event Make( bytes32 indexed orderId, address indexed maker, address makerToken, address takerToken, uint256 amountSell, uint256 amountBuy );
orderId 是通過散列一些數據而得到的。
我想檢查事件是否正確發出。在編寫測試程式碼時,我花了很長時間來了解如何獲取發出的事件。
最後我可以使用下面的程式碼獲取事件。但我真正想要的是
- 獲取事件的第一個參數並將其放入 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];
對此,我真的非常感激!:)