diff --git a/src/Event.sol b/src/Event.sol new file mode 100644 index 0000000..69e4be0 --- /dev/null +++ b/src/Event.sol @@ -0,0 +1,16 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity 0.8.20; + +contract Event { + event Transfer(address indexed from, address indexed to, uint amount); + + function transfer(address from, address to, uint amount) external { + emit Transfer(from, to, amount); + } + + function transferMany(address from, address[] calldata to, uint[] calldata amounts) external { + for(uint i = 0; i < to.length; i++) { + emit Transfer(from, to[i], amounts[i]); + } + } +} diff --git a/test/Event.t.sol b/test/Event.t.sol new file mode 100644 index 0000000..eabef50 --- /dev/null +++ b/test/Event.t.sol @@ -0,0 +1,55 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.20; + +import "forge-std/Test.sol"; +import {Event} from "../src/Event.sol"; + +contract EventTest is Test { + Event public e; + + event Transfer(address indexed from, address indexed to, uint amount); + + function setUp() public { + e = new Event(); + } + + // Notice vm.extectEmit takes 4 parameters, considering first 3 checktopick + // Notice and the 4th parameter is checkData + function testEmitTransferEvent() public { + // 1. Tell Foundry which data to check + // Check index 1, index 2 and data + vm.expectEmit(true, true, false, true); + + // 2. Emit the expected event + emit Transfer(address(this), address(123), 456); + + // 3. Call the function that should emit the event + e.transfer(address(this), address(123), 456); + + // Check index 1 + vm.expectEmit(true, false, false, false); + emit Transfer(address(this), address(123), 456); + e.transfer(address(this), address(777), 999); + } + + function testEmitManyTransferEvent() public { + address[] memory to = new address [](2); + to[0] = address(123); + to[1] = address(456); + + uint[] memory amounts = new uint[](2); + amounts[0] = 777; + amounts[1] = 888; + + for(uint i = 0; i < to.length; i++) { + // 1. Tell Foundry which data to check + // 2. Emit the expected event + vm.expectEmit(true, true, false, true); + emit Transfer(address(this), to[i], amounts[i]); + } + + // 3. Call the function that should emit the event + + e.transferMany(address(this), to, amounts); + } +}