Core contracts:

AutomationRegistry.sol

struct Task {
    address owner;
    bytes conditionData;
    bytes actionData;
    uint256 createdAt;
    bool active;
}

mapping(uint256 => Task) public tasks;

function registerTask(bytes calldata condition, bytes calldata action) external returns (uint256) {
    uint256 taskId = nextTaskId++;
    tasks[taskId] = Task(msg.sender, condition, action, block.timestamp, true);
    emit TaskCreated(taskId, msg.sender);
    return taskId;
}

StrategyExecutor.sol

function execute(uint256 taskId) external {
    Task memory task = registry.getTask(taskId);
    require(conditionChecker.check(task.conditionData), "Condition not met");
    (bool ok, ) = address(this).call(task.actionData);
    require(ok, "Execution failed");
    emit TaskExecuted(taskId);
}

ConditionChecker.sol

function check(bytes calldata data) external view returns (bool) {
    (uint256 currentPrice, uint256 triggerBelow) = abi.decode(data, (uint256, uint256));
    return currentPrice < triggerBelow;
}

Last updated