getRecordedLogs
Signature
struct Log {
bytes32[] topics;
bytes data;
}
function getRecordedLogs()
external
returns (
Log[] memory
);
Description
Gets the emitted events recorded by recordLogs
.
This function will consume the recorded logs when called.
Examples
/// event LogTopic1(
/// uint256 indexed topic1,
/// bytes data
/// );
/// event LogTopic12(
/// uint256 indexed topic1,
/// uint256 indexed topic2,
/// bytes data
/// );
/// bytes memory testData0 = "Some data";
/// bytes memory testData1 = "Other data";
// Start the recorder
vm.recordLogs();
emit LogTopic1(10, testData0);
emit LogTopic12(20, 30, testData1);
// Notice that your entries are <Interface>.Log[]
// as opposed to <instance>.Log[]
Vm.Log[] memory entries = vm.getRecordedLogs();
assertEq(entries.length, 2);
// Recall that topics[0] is the event signature
assertEq(entries[0].topics.length, 2);
assertEq(entries[0].topics[0], keccak256("LogTopic1(uint256,bytes)"));
assertEq(entries[0].topics[1], bytes32(uint256(10)));
// assertEq won't compare bytes variables. Try with strings instead.
assertEq(abi.decode(entries[0].data, (string)), string(testData0));
assertEq(entries[1].topics.length, 3);
assertEq(entries[1].topics[0], keccak256("LogTopic12(uint256,uint256,bytes)"));
assertEq(entries[1].topics[1], bytes32(uint256(20)));
assertEq(entries[1].topics[2], bytes32(uint256(30)));
assertEq(abi.decode(entries[1].data, (string)), string(testData1));
// Emit another event
emit LogTopic1(40, testData0);
// Your last read consumed the recorded logs,
// you will only get the latest emitted even after that call
entries = vm.getRecordedLogs();
assertEq(entries.length, 1);
assertEq(entries[0].topics.length, 2);
assertEq(entries[0].topics[0], keccak256("LogTopic1(uint256,bytes)"));
assertEq(entries[0].topics[1], bytes32(uint256(40)));
assertEq(abi.decode(entries[0].data, (string)), string(testData0));