Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions contracts/scripts/native_solc_compile_all_workflow
Original file line number Diff line number Diff line change
Expand Up @@ -32,5 +32,6 @@ compileContract workflow-v1 v1/WorkflowRegistry
compileContract workflow-v2 v2/WorkflowRegistry
compileContract workflow-v2 v2/CapabilitiesRegistry
compileContract message-emitter dev/MessageEmitter
compileContract message-emitter dev/LoggerTester
compileContract mock-forwarder dev/MockKeystoneForwarder
compileContract reserve-manager dev/ReserveManager
78 changes: 78 additions & 0 deletions contracts/src/v0.8/workflow/dev/LoggerTester.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
// SPDX-License-Identifier: MIT
pragma solidity 0.8.24;

import {IReceiver} from "../../keystone/interfaces/IReceiver.sol";
import {IERC165} from "@openzeppelin/[email protected]/interfaces/IERC165.sol";

// This contract is used to trigger log trigger for testing evm chain capabilities
contract LoggerTester is IReceiver {
// --- Roles ---
address public immutable deployer;
mapping(address => bool) public owners;
mapping(address => bool) public allowedEmitters;

// --- State ---
uint256 public logCounter;

// --- Events ---
// id = shared incremental id; manual = true if via emitLog(), false if via onReport()
event LogEmitted(uint256 id, bool manual);

// --- Errors ---
error NotOwner(address caller);
error UnauthorizedEmitter(address caller);

modifier onlyOwner() {
if (!owners[msg.sender]) revert NotOwner(msg.sender);
_;
}

constructor() {
deployer = msg.sender;
owners[msg.sender] = true;
}

// --- ERC165 ---
function supportsInterface(
bytes4 interfaceId
) public pure override returns (bool) {
return interfaceId == type(IReceiver).interfaceId ||
interfaceId == type(IERC165).interfaceId;
}

// --- Owner Management ---
function setOwner(address user, bool isOwner) external onlyOwner {
owners[user] = isOwner;
}

function setOwners(address[] calldata users, bool isOwner) external onlyOwner {
for (uint256 i = 0; i < users.length; ++i) {
owners[users[i]] = isOwner;
}
}

// --- Emitters ---
function setAllowedEmitter(address user, bool isAllowed) external onlyOwner {
allowedEmitters[user] = isAllowed;
}

function setAllowedEmitters(address[] calldata users, bool isAllowed) external onlyOwner {
for (uint256 i = 0; i < users.length; ++i) {
allowedEmitters[users[i]] = isAllowed;
}
}

// --- User Functions ---
function emitLog() external {
if (!allowedEmitters[msg.sender]) revert UnauthorizedEmitter(msg.sender);
logCounter++;
emit LogEmitted(logCounter, true); // manual
}

// IReceiver
function onReport(bytes calldata /*metadata*/, bytes calldata /*report*/) external override {
if (!allowedEmitters[msg.sender]) revert UnauthorizedEmitter(msg.sender);
logCounter++;
emit LogEmitted(logCounter, false); // via onReport
}
}
Loading
Loading