// SPDX-License-Identifier: MIT pragma solidity ^0.8.20; import {Test} from "forge-std/Test.sol"; import {ERC1967Proxy} from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol"; import {Chain138MainnetCheckpoint} from "../../contracts/mainnet-checkpoint/Chain138MainnetCheckpoint.sol"; import {CheckpointStorage} from "../../contracts/mainnet-checkpoint/storage/CheckpointStorage.sol"; import {CheckpointLeaf} from "../../contracts/mainnet-checkpoint/libraries/CheckpointLeaf.sol"; import {CheckpointFlags} from "../../contracts/mainnet-checkpoint/libraries/CheckpointFlags.sol"; import {CheckpointHubConfig} from "../../contracts/mainnet-checkpoint/libraries/CheckpointHubConfig.sol"; import {CheckpointErrors} from "../../contracts/mainnet-checkpoint/libraries/CheckpointErrors.sol"; contract MinPaymentValueTest is Test { Chain138MainnetCheckpoint hub; address admin = address(0xA11CE); address submitter = address(0xB0B); function setUp() public { Chain138MainnetCheckpoint impl = new Chain138MainnetCheckpoint(); hub = Chain138MainnetCheckpoint( address(new ERC1967Proxy(address(impl), abi.encodeCall(Chain138MainnetCheckpoint.initialize, (admin, address(1), uint64(1), address(0))))) ); vm.startPrank(admin); hub.grantRole(hub.SUBMITTER_ROLE(), submitter); CheckpointHubConfig.HubConfig memory cfg = CheckpointHubConfig.mainnetDefaults(); cfg.enforcePreviousBatchId = false; cfg.requireValidatorSigs = false; cfg.minPaymentValueWei = 1 ether; hub.applyConfig(cfg); vm.stopPrank(); } function testRevertsBelowMinInExtensionData() public { CheckpointLeaf.PaymentLeafV1[] memory leaves = new CheckpointLeaf.PaymentLeafV1[](1); leaves[0] = CheckpointLeaf.PaymentLeafV1({ txHash: keccak256("low"), from: address(1), to: address(2), value: 1, blockNumber: 1, blockTimestamp: 1, gasUsed: 1, success: true }); bytes32 root = CheckpointLeaf.paymentLeafV1(138, leaves[0]); CheckpointStorage.CheckpointHeader memory header = CheckpointStorage.CheckpointHeader({ batchId: 1, previousBatchId: 0, chainId: 138, checkpointBlock: 1, startBlock: 1, endBlock: 1, blockHash: keccak256("h"), stateRoot: keccak256("s"), paymentsRoot: root, receiptsRoot: bytes32(0), txCount: 1, flags: CheckpointFlags.PARTIAL_BATCH, submittedAt: 0, submitter: address(0), contentURI: bytes32(0) }); vm.prank(submitter); vm.expectRevert(CheckpointErrors.BelowMinPayment.selector); hub.submitCheckpointCommitment(header, hex"01", bytes32(0), abi.encode(leaves)); } }