欢迎订阅专栏:3分钟Solidity--智能合约--Web3区块链技术必学
Foundry事件
要获取此内容的最新版本,请访问 Cyfrin.io 上的 Foundry事件(代码示例)。
// SPDX-License-Identifier: MIT
pragma solidity 0.8.26;
import "forge-std/Test.sol";
contract Event {
event Transfer(address indexed from, address indexed to, uint256 amount);
function transfer(address from, address to, uint256 amount) external {
emit Transfer(from, to, amount);
}
function transferMany(
address from,
address[] calldata to,
uint256[] calldata amounts
) external {
for (uint256 i = 0; i < to.length; i++) {
emit Transfer(from, to[i], amounts[i]);
}
}
}
contract EventTest is Test {
Event public e;
event Transfer(address indexed from, address indexed to, uint256 amount);
function setUp() public {
e = new Event();
}
function testEmitTransferEvent() public {
// function expectEmit(
// bool checkTopic1,
// bool checkTopic2,
// bool checkTopic3,
// bool checkData
// ) external;
// 1. 告诉Foundry要检查哪些数据
// 检查索引1、索引2和数据
vm.expectEmit(true, true, false, true);
// 2. 发出预期事件
emit Transfer(address(this), address(123), 456);
// 3. 调用应发出事件的函数
e.transfer(address(this), address(123), 456);
// 仅检查索引1
vm.expectEmit(true, false, false, false);
emit Transfer(address(this), address(123), 456);
// 注意:索引2和数据(数量)不匹配
// 但测试仍将通过
e.transfer(address(this), address(111), 222);
}
function testEmitManyTransferEvent() public {
address[] memory to = new address[](2);
to[0] = address(111);
to[1] = address(222);
uint256[] memory amounts = new uint256[](2);
amounts[0] = 1;
amounts[1] = 2;
for (uint256 i = 0; i < to.length; i++) {
// 1. 告诉Foundry要检查哪些数据
vm.expectEmit(true, true, false, true);
// 2. 发出预期事件
emit Transfer(address(this), to[i], amounts[i]);
}
// 3. 调用应发出事件的函数
e.transferMany(address(this), to, amounts);
}
}