// 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/AtomicFulfillerRegistry.sol"; import "../../../contracts/bridge/atomic/AtomicLiquidityVault.sol"; import "../../../contracts/bridge/atomic/AtomicObligationEscrow.sol"; import "../../../contracts/bridge/atomic/AtomicQuoteEngine.sol"; import "../../../contracts/bridge/atomic/AtomicSettlementRouter.sol"; import "../../../contracts/bridge/atomic/AtomicSlashingManager.sol"; import "../../../contracts/bridge/atomic/AtomicTypes.sol"; import "../../../contracts/bridge/atomic/AtomicX402SourceAdapter.sol"; import "../../../contracts/bridge/atomic/CWMultiTokenBridgeSettlementAdapter.sol"; interface IRoleManagedToken { function grantRole(bytes32 role, address account) external; } contract DeployAtomicX402PolygonIntentStack is Script { uint64 internal constant SOURCE_CHAIN_138 = 138; uint64 internal constant POLYGON_SELECTOR = 4051577828743386545; address internal constant CUSDC_CHAIN138 = 0xf22258f57794CC8E06237084b353Ab30fFfa640b; address internal constant CUSDC_V2_CHAIN138 = 0x219522c60e83dEe01FC5b0329d6fA8fD84b9D13d; address internal constant CWUSDC_V2_POLYGON = 0x7476a64B37732698b9f729fdB373a7B65e9677e9; address internal constant CW_MULTI_TOKEN_BRIDGE_L1 = 0x152eD3e9912161b76BDFd368D0C84B7C31C10dE7; bytes32 internal constant SETTLEMENT_MODE = keccak256("CW_POLYGON_CUSDCV2_X402"); bytes32 internal constant MINTER_ROLE = keccak256("MINTER_ROLE"); function run() external { uint256 pk = vm.envUint("PRIVATE_KEY"); address deployer = vm.addr(pk); address protocolTreasury = vm.envOr("ATOMIC_PROTOCOL_TREASURY", deployer); address fulfiller = vm.envOr("ATOMIC_X402_FILLER", deployer); 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(0)); 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))); vm.startBroadcast(pk); AtomicLiquidityVault vault = new AtomicLiquidityVault(deployer); AtomicFulfillerRegistry registry = new AtomicFulfillerRegistry(CUSDC_V2_CHAIN138, deployer); AtomicFeePolicy feePolicy = new AtomicFeePolicy(deployer); AtomicObligationEscrow escrow = new AtomicObligationEscrow(deployer); AtomicSettlementRouter router = new AtomicSettlementRouter(deployer); AtomicSlashingManager slashingManager = new AtomicSlashingManager(address(registry), deployer); AtomicBridgeCoordinator coordinator = new AtomicBridgeCoordinator( address(vault), address(registry), address(escrow), address(router), address(feePolicy), address(slashingManager), protocolTreasury, deployer ); AtomicQuoteEngine quoteEngine = new AtomicQuoteEngine(address(coordinator), address(vault), address(registry), address(feePolicy)); AtomicX402SourceAdapter sourceAdapter = new AtomicX402SourceAdapter( CUSDC_CHAIN138, CUSDC_V2_CHAIN138, CWUSDC_V2_POLYGON, address(coordinator), SOURCE_CHAIN_138, POLYGON_SELECTOR ); CWMultiTokenBridgeSettlementAdapter settlementAdapter = new CWMultiTokenBridgeSettlementAdapter(CW_MULTI_TOKEN_BRIDGE_L1, POLYGON_SELECTOR); vault.grantRole(vault.COORDINATOR_ROLE(), address(coordinator)); vault.grantRole(vault.RECONCILER_ROLE(), address(coordinator)); registry.grantRole(registry.COORDINATOR_ROLE(), address(coordinator)); registry.grantRole(registry.SLASHER_ROLE(), address(slashingManager)); escrow.grantRole(escrow.COORDINATOR_ROLE(), address(coordinator)); router.grantRole(router.COORDINATOR_ROLE(), address(coordinator)); slashingManager.grantRole(slashingManager.COORDINATOR_ROLE(), address(coordinator)); coordinator.grantRole(coordinator.INTENT_ADAPTER_ROLE(), address(sourceAdapter)); IRoleManagedToken(CUSDC_V2_CHAIN138).grantRole(MINTER_ROLE, address(sourceAdapter)); bytes32 corridorId = coordinator.getCorridorId(SOURCE_CHAIN_138, POLYGON_SELECTOR, CUSDC_V2_CHAIN138, CWUSDC_V2_POLYGON); 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); feePolicy.setCorridorPolicy( corridorId, fulfillerFeeBps, protocolFeeBps, bondBps, slashPenaltyBps, fulfilmentTimeout, settlementTimeout ); router.setAdapter(SETTLEMENT_MODE, address(settlementAdapter)); registry.setFulfillerActive(fulfiller, true); registry.setCorridorAuthorization(fulfiller, corridorId, true); vm.stopBroadcast(); console.log("AtomicLiquidityVault:", address(vault)); console.log("AtomicFulfillerRegistry:", address(registry)); console.log("AtomicFeePolicy:", address(feePolicy)); console.log("AtomicObligationEscrow:", address(escrow)); console.log("AtomicSettlementRouter:", address(router)); console.log("AtomicSlashingManager:", address(slashingManager)); console.log("AtomicBridgeCoordinator:", address(coordinator)); console.log("AtomicQuoteEngine:", address(quoteEngine)); console.log("AtomicX402SourceAdapter:", address(sourceAdapter)); console.log("CWMultiTokenBridgeSettlementAdapter:", address(settlementAdapter)); console.log("CorridorId:"); console.logBytes32(corridorId); console.log("SettlementMode:"); console.logBytes32(SETTLEMENT_MODE); } }