chore: sync submodule state (parent ref update)
Made-with: Cursor
This commit is contained in:
@@ -0,0 +1,67 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
pragma solidity ^0.8.19;
|
||||
|
||||
import {Script, console} from "forge-std/Script.sol";
|
||||
import "../../../contracts/bridge/trustless/DualRouterBridgeSwapCoordinator.sol";
|
||||
import "../../../contracts/bridge/trustless/LiquidityPoolETH.sol";
|
||||
import "../../../contracts/bridge/trustless/EnhancedSwapRouter.sol";
|
||||
|
||||
/**
|
||||
* @title DeployDualRouterBridgeSwapCoordinator
|
||||
* @notice Deploys DualRouterBridgeSwapCoordinator on Ethereum Mainnet and wires LP + EnhancedSwapRouter
|
||||
* @dev Env: PRIVATE_KEY, ETHEREUM_MAINNET_RPC; INBOX_ETH_MAINNET (or INBOX_ETH), LIQUIDITY_POOL_ETH_MAINNET (or LIQUIDITY_POOL),
|
||||
* SWAP_ROUTER_MAINNET (or SWAP_ROUTER), ENHANCED_SWAP_ROUTER, CHALLENGE_MANAGER_MAINNET (or CHALLENGE_MANAGER).
|
||||
*/
|
||||
contract DeployDualRouterBridgeSwapCoordinator is Script {
|
||||
function run() external {
|
||||
require(block.chainid == 1, "DeployDualRouterBridgeSwapCoordinator: Ethereum Mainnet only");
|
||||
|
||||
uint256 deployerPrivateKey = vm.envUint("PRIVATE_KEY");
|
||||
address deployer = vm.addr(deployerPrivateKey);
|
||||
|
||||
address inbox = vm.envOr("INBOX_ETH_MAINNET", vm.envOr("INBOX_ETH", address(0)));
|
||||
address liquidityPool = vm.envOr("LIQUIDITY_POOL_ETH_MAINNET", vm.envOr("LIQUIDITY_POOL", address(0)));
|
||||
address swapRouter = vm.envOr("SWAP_ROUTER_MAINNET", vm.envOr("SWAP_ROUTER", address(0)));
|
||||
address enhancedSwapRouter = vm.envOr("ENHANCED_SWAP_ROUTER", address(0));
|
||||
address challengeManager = vm.envOr("CHALLENGE_MANAGER_MAINNET", vm.envOr("CHALLENGE_MANAGER", address(0)));
|
||||
|
||||
require(inbox != address(0), "Set INBOX_ETH_MAINNET or INBOX_ETH");
|
||||
require(liquidityPool != address(0), "Set LIQUIDITY_POOL_ETH_MAINNET or LIQUIDITY_POOL");
|
||||
require(swapRouter != address(0), "Set SWAP_ROUTER_MAINNET or SWAP_ROUTER");
|
||||
require(enhancedSwapRouter != address(0), "Set ENHANCED_SWAP_ROUTER");
|
||||
require(challengeManager != address(0), "Set CHALLENGE_MANAGER_MAINNET or CHALLENGE_MANAGER");
|
||||
|
||||
console.log("=== Deploy DualRouterBridgeSwapCoordinator (Ethereum Mainnet) ===");
|
||||
console.log("Inbox:", inbox);
|
||||
console.log("LiquidityPool:", liquidityPool);
|
||||
console.log("SwapRouter:", swapRouter);
|
||||
console.log("EnhancedSwapRouter:", enhancedSwapRouter);
|
||||
console.log("ChallengeManager:", challengeManager);
|
||||
|
||||
vm.startBroadcast(deployerPrivateKey);
|
||||
|
||||
DualRouterBridgeSwapCoordinator coordinator = new DualRouterBridgeSwapCoordinator(
|
||||
inbox,
|
||||
liquidityPool,
|
||||
swapRouter,
|
||||
enhancedSwapRouter,
|
||||
challengeManager
|
||||
);
|
||||
|
||||
console.log("DualRouterBridgeSwapCoordinator deployed at:", address(coordinator));
|
||||
|
||||
// Authorize the new coordinator to release from LiquidityPoolETH
|
||||
LiquidityPoolETH(payable(liquidityPool)).authorizeRelease(address(coordinator));
|
||||
console.log("LiquidityPoolETH.authorizeRelease(coordinator) done");
|
||||
|
||||
// Grant COORDINATOR_ROLE on EnhancedSwapRouter to the new coordinator
|
||||
bytes32 COORDINATOR_ROLE = keccak256("COORDINATOR_ROLE");
|
||||
EnhancedSwapRouter(payable(enhancedSwapRouter)).grantRole(COORDINATOR_ROLE, address(coordinator));
|
||||
console.log("EnhancedSwapRouter.grantRole(COORDINATOR_ROLE, coordinator) done");
|
||||
|
||||
vm.stopBroadcast();
|
||||
|
||||
console.log("\n=== Export to .env ===");
|
||||
console.log("DUAL_ROUTER_BRIDGE_SWAP_COORDINATOR=", vm.toString(address(coordinator)));
|
||||
}
|
||||
}
|
||||
@@ -58,6 +58,9 @@ contract DeployEnhancedSwapRouter is Script {
|
||||
|
||||
console.log("\nEnhancedSwapRouter deployed at:", address(router));
|
||||
|
||||
// Grant ROUTING_MANAGER_ROLE to deployer so setRoutingConfig can be called
|
||||
router.grantRole(router.ROUTING_MANAGER_ROLE(), deployer);
|
||||
|
||||
// Configure default routing
|
||||
_configureDefaultRouting(router, deployer);
|
||||
|
||||
|
||||
@@ -0,0 +1,35 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
pragma solidity ^0.8.19;
|
||||
|
||||
import {Script, console} from "forge-std/Script.sol";
|
||||
import "../../../contracts/bridge/trustless/SwapBridgeSwapCoordinator.sol";
|
||||
|
||||
/**
|
||||
* @title DeploySwapBridgeSwapCoordinator
|
||||
* @notice Deploys SwapBridgeSwapCoordinator for atomic swap-then-bridge flow
|
||||
* @dev Requires ENHANCED_SWAP_ROUTER and UNIVERSAL_CCIP_BRIDGE (or BRIDGE_ORCHESTRATOR) in env
|
||||
*/
|
||||
contract DeploySwapBridgeSwapCoordinator is Script {
|
||||
function run() external {
|
||||
uint256 deployerPrivateKey = vm.envOr("PRIVATE_KEY", uint256(0));
|
||||
require(deployerPrivateKey != 0, "PRIVATE_KEY not set");
|
||||
address deployer = vm.addr(deployerPrivateKey);
|
||||
|
||||
address swapRouter = vm.envAddress("ENHANCED_SWAP_ROUTER");
|
||||
address bridge = vm.envOr("UNIVERSAL_CCIP_BRIDGE", address(0));
|
||||
if (bridge == address(0)) {
|
||||
bridge = vm.envOr("BRIDGE_ORCHESTRATOR", address(0));
|
||||
}
|
||||
require(swapRouter != address(0), "ENHANCED_SWAP_ROUTER not set");
|
||||
require(bridge != address(0), "UNIVERSAL_CCIP_BRIDGE or BRIDGE_ORCHESTRATOR not set");
|
||||
|
||||
vm.startBroadcast(deployerPrivateKey);
|
||||
|
||||
SwapBridgeSwapCoordinator coordinator = new SwapBridgeSwapCoordinator(swapRouter, bridge);
|
||||
|
||||
vm.stopBroadcast();
|
||||
|
||||
console.log("SwapBridgeSwapCoordinator deployed at:", address(coordinator));
|
||||
console.log("Export: SWAP_BRIDGE_SWAP_COORDINATOR=%s", vm.toString(address(coordinator)));
|
||||
}
|
||||
}
|
||||
@@ -52,12 +52,14 @@ contract DeployTrustlessBridge is Script {
|
||||
console.log("Deployer:", deployer);
|
||||
console.log("Chain ID:", block.chainid);
|
||||
|
||||
// Detect which chain we're on
|
||||
// Detect which chain we're on (138, 1, or L2 with TRUSTLESS_WETH_ADDRESS)
|
||||
bool isChain138 = block.chainid == 138;
|
||||
bool isEthereum = block.chainid == 1;
|
||||
address l2Weth = vm.envOr("TRUSTLESS_WETH_ADDRESS", address(0));
|
||||
bool isL2 = !isChain138 && !isEthereum && l2Weth != address(0);
|
||||
|
||||
if (!isChain138 && !isEthereum) {
|
||||
revert("DeployTrustlessBridge: unsupported chain");
|
||||
if (!isChain138 && !isEthereum && !isL2) {
|
||||
revert("DeployTrustlessBridge: unsupported chain (set TRUSTLESS_WETH_ADDRESS for L2)");
|
||||
}
|
||||
|
||||
vm.startBroadcast(deployerPrivateKey);
|
||||
@@ -100,6 +102,30 @@ contract DeployTrustlessBridge is Script {
|
||||
_authorizeInbox(addresses.liquidityPool, addresses.inbox);
|
||||
}
|
||||
|
||||
if (isL2) {
|
||||
console.log("\n--- Deploying Trustless stack on L2 (chain id ", block.chainid, ") ---");
|
||||
uint256 bondMultiplier = vm.envOr("BOND_MULTIPLIER_BPS", DEFAULT_BOND_MULTIPLIER);
|
||||
uint256 minBond = vm.envOr("MIN_BOND", DEFAULT_MIN_BOND);
|
||||
uint256 challengeWindow = vm.envOr("CHALLENGE_WINDOW_SECONDS", DEFAULT_CHALLENGE_WINDOW);
|
||||
uint256 lpFeeBps = vm.envOr("LP_FEE_BPS", DEFAULT_LP_FEE_BPS);
|
||||
uint256 minLiquidityRatioBps = vm.envOr("MIN_LIQUIDITY_RATIO_BPS", DEFAULT_MIN_LIQUIDITY_RATIO_BPS);
|
||||
|
||||
addresses.bondManager = _deployBondManager(bondMultiplier, minBond);
|
||||
addresses.challengeManager = _deployChallengeManager(addresses.bondManager, challengeWindow);
|
||||
addresses.liquidityPool = _deployLiquidityPool(l2Weth, lpFeeBps, minLiquidityRatioBps);
|
||||
addresses.inbox = _deployInboxETH(
|
||||
addresses.bondManager,
|
||||
addresses.challengeManager,
|
||||
addresses.liquidityPool
|
||||
);
|
||||
_authorizeInbox(addresses.liquidityPool, addresses.inbox);
|
||||
|
||||
string memory deployLb = vm.envOr("TRUSTLESS_DEPLOY_LOCKBOX", string("0"));
|
||||
if (keccak256(bytes(deployLb)) == keccak256("1") || keccak256(bytes(deployLb)) == keccak256("true")) {
|
||||
addresses.lockbox138 = _deployLockbox138();
|
||||
}
|
||||
}
|
||||
|
||||
vm.stopBroadcast();
|
||||
|
||||
// Print deployment summary
|
||||
@@ -115,6 +141,13 @@ contract DeployTrustlessBridge is Script {
|
||||
console.log("SwapRouter:", addresses.swapRouter);
|
||||
console.log("BridgeSwapCoordinator:", addresses.coordinator);
|
||||
}
|
||||
if (isL2) {
|
||||
console.log("BondManager:", addresses.bondManager);
|
||||
console.log("ChallengeManager:", addresses.challengeManager);
|
||||
console.log("LiquidityPoolETH:", addresses.liquidityPool);
|
||||
console.log("InboxETH:", addresses.inbox);
|
||||
if (addresses.lockbox138 != address(0)) console.log("Lockbox:", addresses.lockbox138);
|
||||
}
|
||||
}
|
||||
|
||||
function _deployLockbox138() internal returns (address) {
|
||||
|
||||
49
script/bridge/trustless/FundMainnetLP.s.sol
Normal file
49
script/bridge/trustless/FundMainnetLP.s.sol
Normal file
@@ -0,0 +1,49 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
pragma solidity ^0.8.19;
|
||||
|
||||
import {Script, console} from "forge-std/Script.sol";
|
||||
import {LiquidityPoolETH} from "../../../contracts/bridge/trustless/LiquidityPoolETH.sol";
|
||||
|
||||
/**
|
||||
* @title FundMainnetLP
|
||||
* @notice Add ETH and/or WETH liquidity to the mainnet LiquidityPoolETH (G4).
|
||||
* @dev Env: PRIVATE_KEY, LIQUIDITY_POOL_ETH_MAINNET (or LIQUIDITY_POOL), ETHEREUM_MAINNET_RPC.
|
||||
* Optional: FUND_ETH_AMOUNT_WEI (native ETH), FUND_WETH_AMOUNT_WEI (WETH to deposit).
|
||||
* If both zero/unset, script exits without error (dry run).
|
||||
*/
|
||||
contract FundMainnetLP is Script {
|
||||
function run() external {
|
||||
address poolAddr = vm.envOr("LIQUIDITY_POOL_ETH_MAINNET", vm.envOr("LIQUIDITY_POOL", address(0)));
|
||||
if (poolAddr == address(0)) {
|
||||
console.log("Set LIQUIDITY_POOL_ETH_MAINNET (or LIQUIDITY_POOL) in .env");
|
||||
return;
|
||||
}
|
||||
uint256 ethAmount = vm.envOr("FUND_ETH_AMOUNT_WEI", uint256(0));
|
||||
uint256 wethAmount = vm.envOr("FUND_WETH_AMOUNT_WEI", uint256(0));
|
||||
if (ethAmount == 0 && wethAmount == 0) {
|
||||
console.log("Set FUND_ETH_AMOUNT_WEI and/or FUND_WETH_AMOUNT_WEI to fund the LP");
|
||||
return;
|
||||
}
|
||||
|
||||
uint256 deployerPrivateKey = vm.envUint("PRIVATE_KEY");
|
||||
LiquidityPoolETH pool = LiquidityPoolETH(payable(poolAddr));
|
||||
|
||||
vm.startBroadcast(deployerPrivateKey);
|
||||
|
||||
if (ethAmount > 0) {
|
||||
pool.provideLiquidity{value: ethAmount}(LiquidityPoolETH.AssetType.ETH);
|
||||
console.log("Provided ETH liquidity:", ethAmount);
|
||||
}
|
||||
if (wethAmount > 0) {
|
||||
address weth = pool.weth();
|
||||
// Approve and deposit WETH
|
||||
(bool ok,) = weth.call(abi.encodeWithSignature("approve(address,uint256)", poolAddr, wethAmount));
|
||||
require(ok, "WETH approve failed");
|
||||
pool.depositWETH(wethAmount);
|
||||
console.log("Provided WETH liquidity:", wethAmount);
|
||||
}
|
||||
|
||||
vm.stopBroadcast();
|
||||
console.log("LP funding done.");
|
||||
}
|
||||
}
|
||||
@@ -7,7 +7,7 @@ import "../../../contracts/bridge/trustless/ChallengeManager.sol";
|
||||
import "../../../contracts/bridge/trustless/InboxETH.sol";
|
||||
import "../../../contracts/bridge/trustless/LiquidityPoolETH.sol";
|
||||
import "../../../contracts/bridge/trustless/EnhancedSwapRouter.sol";
|
||||
import "../../../contracts/bridge/trustless/BridgeSwapCoordinator.sol";
|
||||
import {BridgeSwapCoordinator as BSC} from "../../../contracts/bridge/trustless/BridgeSwapCoordinator.sol";
|
||||
import "../../../contracts/bridge/trustless/integration/BridgeReserveCoordinator.sol";
|
||||
|
||||
/**
|
||||
@@ -44,7 +44,7 @@ contract InitializeBridgeSystem is Script {
|
||||
|
||||
// 2. Configure BridgeSwapCoordinator
|
||||
if (bridgeSwapCoordinator != address(0)) {
|
||||
_configureCoordinator(BridgeSwapCoordinator(payable(bridgeSwapCoordinator)), enhancedSwapRouter);
|
||||
_configureCoordinator(BSC(payable(bridgeSwapCoordinator)), enhancedSwapRouter);
|
||||
}
|
||||
|
||||
// 3. Configure BridgeReserveCoordinator (if deployed)
|
||||
@@ -81,7 +81,7 @@ contract InitializeBridgeSystem is Script {
|
||||
console.log("EnhancedSwapRouter configured");
|
||||
}
|
||||
|
||||
function _configureCoordinator(BridgeSwapCoordinator coordinator, address enhancedRouter) internal {
|
||||
function _configureCoordinator(BSC coordinator, address enhancedRouter) internal {
|
||||
console.log("\n--- Configuring BridgeSwapCoordinator ---");
|
||||
|
||||
// If using EnhancedSwapRouter, update the coordinator
|
||||
|
||||
Reference in New Issue
Block a user