feat(x402): add Cronos facilitator adapter and atomic purchase flow
This commit is contained in:
@@ -58,6 +58,7 @@ contract ConfigureAtomicX402PolygonIntent is Script {
|
||||
defaultSettlementMode: SETTLEMENT_MODE
|
||||
})
|
||||
);
|
||||
coordinator.setAsyncDestinationCorridor(corridorId, true);
|
||||
coordinator.grantRole(coordinator.INTENT_ADAPTER_ROLE(), sourceAdapter);
|
||||
settlementRouter.setAdapter(SETTLEMENT_MODE, settlementAdapter);
|
||||
feePolicy.setCorridorPolicy(
|
||||
|
||||
138
script/bridge/atomic/DeployAtomicX402PolygonIntentStack.s.sol
Normal file
138
script/bridge/atomic/DeployAtomicX402PolygonIntentStack.s.sol
Normal file
@@ -0,0 +1,138 @@
|
||||
// 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);
|
||||
}
|
||||
}
|
||||
30
script/x402/DeployAtomicCwUsdcUsdcPurchase.s.sol
Normal file
30
script/x402/DeployAtomicCwUsdcUsdcPurchase.s.sol
Normal file
@@ -0,0 +1,30 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
pragma solidity ^0.8.20;
|
||||
|
||||
import {Script, console} from "forge-std/Script.sol";
|
||||
import {AtomicCwUsdcUsdcPurchase} from "../../contracts/x402/AtomicCwUsdcUsdcPurchase.sol";
|
||||
|
||||
contract DeployAtomicCwUsdcUsdcPurchase is Script {
|
||||
address internal constant POLYGON_CWUSDC_V2 = 0x7476a64B37732698b9f729fdB373a7B65e9677e9;
|
||||
address internal constant POLYGON_USDC = 0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359;
|
||||
|
||||
function run() external returns (AtomicCwUsdcUsdcPurchase purchase) {
|
||||
uint256 pk = vm.envUint("PRIVATE_KEY");
|
||||
address deployer = vm.addr(pk);
|
||||
address treasury = vm.envOr("X402_POLYGON_ATOMIC_TREASURY", vm.envOr("SERVER_WALLET_ADDRESS", deployer));
|
||||
address owner = vm.envOr("X402_POLYGON_ATOMIC_OWNER", deployer);
|
||||
|
||||
console.log("Deployer:", deployer);
|
||||
console.log("cWUSDC_V2:", POLYGON_CWUSDC_V2);
|
||||
console.log("USDC:", POLYGON_USDC);
|
||||
console.log("Treasury:", treasury);
|
||||
console.log("Owner:", owner);
|
||||
|
||||
vm.startBroadcast(pk);
|
||||
purchase = new AtomicCwUsdcUsdcPurchase(POLYGON_CWUSDC_V2, POLYGON_USDC, treasury, owner);
|
||||
vm.stopBroadcast();
|
||||
|
||||
console.log("AtomicCwUsdcUsdcPurchase:", address(purchase));
|
||||
console.log("Contract treasury:", purchase.treasury());
|
||||
}
|
||||
}
|
||||
30
script/x402/DeployAtomicCwUsdcUsdcPurchaseV2.s.sol
Normal file
30
script/x402/DeployAtomicCwUsdcUsdcPurchaseV2.s.sol
Normal file
@@ -0,0 +1,30 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
pragma solidity ^0.8.20;
|
||||
|
||||
import {Script, console} from "forge-std/Script.sol";
|
||||
import {AtomicCwUsdcUsdcPurchaseV2} from "../../contracts/x402/AtomicCwUsdcUsdcPurchaseV2.sol";
|
||||
|
||||
contract DeployAtomicCwUsdcUsdcPurchaseV2 is Script {
|
||||
address internal constant POLYGON_CWUSDC_V2 = 0x7476a64B37732698b9f729fdB373a7B65e9677e9;
|
||||
address internal constant POLYGON_USDC = 0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359;
|
||||
|
||||
function run() external returns (AtomicCwUsdcUsdcPurchaseV2 purchase) {
|
||||
uint256 pk = vm.envUint("PRIVATE_KEY");
|
||||
address deployer = vm.addr(pk);
|
||||
address treasury = vm.envOr("X402_POLYGON_ATOMIC_TREASURY", vm.envOr("SERVER_WALLET_ADDRESS", deployer));
|
||||
address owner = vm.envOr("X402_POLYGON_ATOMIC_OWNER", deployer);
|
||||
|
||||
console.log("Deployer:", deployer);
|
||||
console.log("cWUSDC_V2:", POLYGON_CWUSDC_V2);
|
||||
console.log("USDC:", POLYGON_USDC);
|
||||
console.log("Treasury:", treasury);
|
||||
console.log("Owner:", owner);
|
||||
|
||||
vm.startBroadcast(pk);
|
||||
purchase = new AtomicCwUsdcUsdcPurchaseV2(POLYGON_CWUSDC_V2, POLYGON_USDC, treasury, owner);
|
||||
vm.stopBroadcast();
|
||||
|
||||
console.log("AtomicCwUsdcUsdcPurchaseV2:", address(purchase));
|
||||
console.log("Contract treasury:", purchase.treasury());
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user