// SPDX-License-Identifier: MIT pragma solidity 0.8.23; import {IAereMessageHandlerV2} from "./AereOutboundVerifierV2.sol"; /// @title AereOutboundDeliveryRecorder /// @notice A minimal, permanent delivery target for `AereOutboundVerifierV2`: it /// records every message the verifier delivers so the outbound loop can be /// demonstrated (and audited) end-to-end on chain. /// /// @dev Deliberately trivial and permissionless: no owner, no funds, no /// authorisation. It records what it is told and nothing else. /// /// IT DOES NOT AUTHENTICATE THE CALLER — anyone can call /// `handleAereMessage` directly and record an arbitrary entry. That is /// intentional for a recorder: it is a passive log, and treating its /// contents as proven would be a mistake. The trust-minimised guarantee /// lives in `AereOutboundVerifierV2` (SP1 proof + immutable validator-set /// anchor + exactly-once replay guard), NOT here. /// /// A REAL application handler MUST gate on `msg.sender == `. /// This contract is the demonstration sink, so it is left open rather than /// pretending to a security property it does not have. contract AereOutboundDeliveryRecorder { struct Delivery { uint256 srcChainId; address sender; address caller; bytes payload; } /// @notice Every delivery ever recorded, in order. Delivery[] public deliveries; event MessageRecorded(uint256 indexed srcChainId, address indexed sender, address indexed caller, bytes payload); /// @notice Called by `AereOutboundVerifierV2` once per proven, unused message. function handleAereMessage(uint256 srcChainId, address sender, bytes calldata payload) external { deliveries.push(Delivery({srcChainId: srcChainId, sender: sender, caller: msg.sender, payload: payload})); emit MessageRecorded(srcChainId, sender, msg.sender, payload); } function deliveryCount() external view returns (uint256) { return deliveries.length; } /// @notice The payload of delivery `i` (the array getter omits dynamic bytes). function payloadAt(uint256 i) external view returns (bytes memory) { return deliveries[i].payload; } }