// SPDX-License-Identifier: MIT pragma solidity ^0.8.20; import {Script, console} from "forge-std/Script.sol"; import "../../../contracts/bridge/atomic/AtomicBridgeCoordinator.sol"; import "../../../contracts/bridge/atomic/AtomicFeePolicy.sol"; import "../../../contracts/bridge/atomic/AtomicSettlementRouter.sol"; import "../../../contracts/bridge/atomic/AtomicTypes.sol"; contract ConfigureAtomicX402PolygonIntent is Script { uint64 internal constant SOURCE_CHAIN_138 = 138; uint64 internal constant POLYGON_SELECTOR = 4051577828743386545; address internal constant CUSDC_V2_CHAIN138 = 0x219522c60e83dEe01FC5b0329d6fA8fD84b9D13d; address internal constant CWUSDC_V2_POLYGON = 0x7476a64B37732698b9f729fdB373a7B65e9677e9; bytes32 internal constant SETTLEMENT_MODE = keccak256("CW_POLYGON_CUSDCV2_X402"); function run() external { uint256 pk = vm.envUint("PRIVATE_KEY"); AtomicBridgeCoordinator coordinator = AtomicBridgeCoordinator(vm.envAddress("ATOMIC_BRIDGE_COORDINATOR")); AtomicFeePolicy feePolicy = AtomicFeePolicy(vm.envAddress("ATOMIC_FEE_POLICY")); AtomicSettlementRouter settlementRouter = AtomicSettlementRouter(vm.envAddress("ATOMIC_SETTLEMENT_ROUTER")); address sourceAdapter = vm.envAddress("ATOMIC_X402_SOURCE_ADAPTER"); address settlementAdapter = vm.envAddress("ATOMIC_CW_SETTLEMENT_ADAPTER"); uint256 maxNotional = vm.envOr("ATOMIC_X402_MAX_NOTIONAL", uint256(110_000e6)); uint16 maxReservedBps = uint16(vm.envOr("ATOMIC_X402_MAX_RESERVED_BPS", uint256(8_000))); uint256 targetBuffer = vm.envOr("ATOMIC_X402_TARGET_BUFFER", uint256(10_000e6)); uint256 maxSettlementBacklog = vm.envOr("ATOMIC_X402_MAX_SETTLEMENT_BACKLOG", uint256(250_000e6)); uint16 maxOracleDriftBps = uint16(vm.envOr("ATOMIC_X402_MAX_ORACLE_DRIFT_BPS", uint256(100))); uint256 fulfilmentTimeout = vm.envOr("ATOMIC_X402_FULFILMENT_TIMEOUT", uint256(30 minutes)); uint256 settlementTimeout = vm.envOr("ATOMIC_X402_SETTLEMENT_TIMEOUT", uint256(2 days)); uint16 fulfillerFeeBps = uint16(vm.envOr("ATOMIC_X402_FILLER_FEE_BPS", uint256(100))); uint16 protocolFeeBps = uint16(vm.envOr("ATOMIC_X402_PROTOCOL_FEE_BPS", uint256(50))); uint16 bondBps = uint16(vm.envOr("ATOMIC_X402_BOND_BPS", uint256(12_000))); uint16 slashPenaltyBps = uint16(vm.envOr("ATOMIC_X402_SLASH_PENALTY_BPS", uint256(1_000))); bytes32 corridorId = coordinator.getCorridorId(SOURCE_CHAIN_138, POLYGON_SELECTOR, CUSDC_V2_CHAIN138, CWUSDC_V2_POLYGON); vm.startBroadcast(pk); coordinator.configureCorridor( AtomicTypes.CorridorConfig({ enabled: true, degraded: false, sourceChain: SOURCE_CHAIN_138, destinationChain: POLYGON_SELECTOR, assetIn: CUSDC_V2_CHAIN138, assetOut: CWUSDC_V2_POLYGON, maxNotional: maxNotional, maxReservedBps: maxReservedBps, targetBuffer: targetBuffer, maxSettlementBacklog: maxSettlementBacklog, maxOracleDriftBps: maxOracleDriftBps, fulfilmentTimeout: fulfilmentTimeout, settlementTimeout: settlementTimeout, defaultSettlementMode: SETTLEMENT_MODE }) ); coordinator.setAsyncDestinationCorridor(corridorId, true); coordinator.grantRole(coordinator.INTENT_ADAPTER_ROLE(), sourceAdapter); settlementRouter.setAdapter(SETTLEMENT_MODE, settlementAdapter); feePolicy.setCorridorPolicy( corridorId, fulfillerFeeBps, protocolFeeBps, bondBps, slashPenaltyBps, fulfilmentTimeout, settlementTimeout ); vm.stopBroadcast(); console.log("corridorId"); console.logBytes32(corridorId); console.log("settlementMode"); console.logBytes32(SETTLEMENT_MODE); } }