// SPDX-License-Identifier: MIT pragma solidity ^0.8.20; import {CheckpointExtensionBase} from "./CheckpointExtensionBase.sol"; import {CheckpointStorage} from "../storage/CheckpointStorage.sol"; /// @notice Limits batches per rolling hour window. contract SubmitRateLimitExtension is CheckpointExtensionBase { uint256 public maxBatchesPerHour = 120; uint256 public windowStart; uint256 public batchesInWindow; function HOOK_BEFORE_SUBMIT() external pure override returns (uint32) { return 1 << 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 setMaxBatchesPerHour(uint256 max_) external { maxBatchesPerHour = max_; } function beforeSubmit(CheckpointStorage.CheckpointHeader calldata, bytes calldata) external { if (block.timestamp >= windowStart + 3600) { windowStart = block.timestamp; batchesInWindow = 0; } require(batchesInWindow < maxBatchesPerHour, "rate limit"); } function afterSubmit(CheckpointStorage.CheckpointHeader calldata, bytes calldata) external { batchesInWindow++; } function onCCIPReceive(bytes calldata) external pure override {} }