// SPDX-License-Identifier: MIT pragma solidity ^0.8.20; import {CheckpointExtensionBase} from "./CheckpointExtensionBase.sol"; import {CheckpointStorage} from "../storage/CheckpointStorage.sol"; /// @notice Records L2 oracle feed snapshots alongside batches (extensible to Chainlink streams). contract L2OracleAdapterExtension is CheckpointExtensionBase { struct OracleSnapshot { bytes32 feedId; int256 answer; uint256 updatedAt; } mapping(uint64 => OracleSnapshot[]) public batchOracles; event OracleSnapshotRecorded(uint64 indexed batchId, bytes32 feedId, int256 answer); function HOOK_BEFORE_SUBMIT() external pure override returns (uint32) { return 0; } function HOOK_AFTER_SUBMIT() external pure override returns (uint32) { return 1 << 1; } function HOOK_ON_CCIP() external pure override returns (uint32) { return 0; } function beforeSubmit(CheckpointStorage.CheckpointHeader calldata, bytes calldata) external pure override {} function afterSubmit(CheckpointStorage.CheckpointHeader calldata header, bytes calldata data) external { if (data.length == 0) return; OracleSnapshot[] memory snaps = abi.decode(data, (OracleSnapshot[])); for (uint256 i = 0; i < snaps.length; i++) { batchOracles[header.batchId].push(snaps[i]); emit OracleSnapshotRecorded(header.batchId, snaps[i].feedId, snaps[i].answer); } } function onCCIPReceive(bytes calldata) external pure override {} }