From f904297506841773d63f482e06e627677ad3ef8a Mon Sep 17 00:00:00 2001 From: xiaoch05 Date: Mon, 13 May 2024 15:19:25 +0800 Subject: [PATCH 1/9] init --- script/common/Base.sol | 27 ++ script/common/LnBridgeV3.sol | 8 + script/common/LnBridgeV3Base.s.sol | 380 +++++++++++++++++++++++++++++ 3 files changed, 415 insertions(+) create mode 100644 script/common/LnBridgeV3.sol create mode 100644 script/common/LnBridgeV3Base.s.sol diff --git a/script/common/Base.sol b/script/common/Base.sol index 5fd1f08..c9bafc7 100644 --- a/script/common/Base.sol +++ b/script/common/Base.sol @@ -4,6 +4,10 @@ pragma solidity ^0.8.0; import {Script} from "forge-std/Script.sol"; import "@sphinx-labs/contracts/SphinxPlugin.sol"; +interface Create2Deploy { + function deploy(bytes memory code, uint256 salt) external; +} + contract Base is Sphinx, Script { function configureSphinx() public override { sphinxConfig.owners = [ @@ -19,4 +23,27 @@ contract Base is Sphinx, Script { // sphinxConfig.mainnets = ["polygon", "arbitrum", "optimism", "mantle"]; sphinxConfig.mainnets = ["arbitrum", "optimism"]; } + + function create2deployAddress() internal returns(address) { + return address(0); + } + + function create2deploy(uint256 salt, bytes memory initCode) internal returns (address) { + address deployer = create2deployAddress[block.chainid]; + require(deployer != address(0), "deployer not exist"); + Create2Deploy(deployer).deploy(initCode, salt); + } + + function create2address(bytes32 salt, bytes32 bytecodeHash) internal view returns (address addr) { + address deployer = create2deployAddress[block.chainid]; + assembly { + let ptr := mload(0x40) + mstore(add(ptr, 0x40), bytecodeHash) + mstore(add(ptr, 0x20), salt) + mstore(ptr, deployer) + let start := add(ptr, 0x0b) + mstore8(start, 0xff) + addr := and(keccak256(start, 85), 0xffffffffffffffffffffffffffffffffffffffff) + } + } } diff --git a/script/common/LnBridgeV3.sol b/script/common/LnBridgeV3.sol new file mode 100644 index 0000000..a266e27 --- /dev/null +++ b/script/common/LnBridgeV3.sol @@ -0,0 +1,8 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.17; + +import "@helix/contracts/helix-contract/contracts/messagers/MsgportMessager.sol"; +import "@helix/contracts/helix-contract/contracts/tool/WToken.sol"; +import "@helix/contracts/helix-contract/contracts/tool/Erc20.sol"; +import "@helix/contracts/helix-contract/contracts/tool/Create2Deployer.sol"; +import "@helix/contracts/helix-contract/contracts/tool/TransparentUpgradeableProxy.sol"; diff --git a/script/common/LnBridgeV3Base.s.sol b/script/common/LnBridgeV3Base.s.sol new file mode 100644 index 0000000..d22ab91 --- /dev/null +++ b/script/common/LnBridgeV3Base.s.sol @@ -0,0 +1,380 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {Base} from "./Base.sol"; + +interface ILnv3Bridge { + struct MessagerService { + address sendService; + address receiveService; + } + struct TokenConfigure { + uint112 protocolFee; + uint112 penalty; + uint8 sourceDecimals; + uint8 targetDecimals; + } + struct TokenInfo { + TokenConfigure config; + uint32 index; + address sourceToken; + address targetToken; + uint256 protocolFeeIncome; + } + function messagers(uint256 remoteChainId) view external returns(MessagerService memory); + function setSendService(uint256 remoteChainId, address remoteBridge, address service) external; + function setReceiveService(uint256 remoteChainId, address remoteBridge, address service) external; + function getTokenKey(uint256 remoteChainId, address sourceToken, address targetToken) pure public returns(bytes32); + function tokenInfos(bytes32 key) view external returns(TokenInfo memory); + function tokenIndexer(uint32 index) view external returns(bytes32); + function registerTokenInfo( + uint256 remoteChainId, + address sourceToken, + address targetToken, + uint112 protocolFee, + uint112 penalty, + uint8 sourceDecimals, + uint8 targetDecimals, + uint32 index + ) external; +} + +interface IErc20 { + function decimals() view external returns(uint8); + function symbol() view external returns(string); +} + +interface IMsgportMessager { + struct RemoteMessager { + uint256 msgportRemoteChainId; + address messager; + } + function remoteMessagers(uint256 remoteChainId) view external returns(RemoteMessager memory); + function setRemoteMessager(uint256 appRemoteChainId, uint256 msgportRemoteChainId, address remoteMessager) external; +} + +interface ILayerZeroMessager { + struct RemoteMessager { + uint16 lzRemoteChainId; + address messager; + } + function remoteMessagers(uint256 remoteChainId) view external returns(RemoteMessager memory); + function setRemoteMessager(uint256 appRemoteChainId, uint16 lzRemoteChainId, address remoteMessager) external; +} + +contract LnBridgeV3Base is Base { + uint256 constant CHAINID_ETHEREUM = 1; + uint256 constant CHAINID_ARBITRUM = 42161; + uint256 constant CHAINID_POLYGON_POS = 137; + uint256 constant CHAINID_BSC = 56; + uint256 constant CHAINID_LINEA = 59144; + uint256 constant CHAINID_BASE = 8453; + uint256 constant CHAINID_OP = 10; + uint256 constant CHAINID_GNOSIS = 100; + uint256 constant CHAINID_MANTLE = 5000; + uint256 constant CHAINID_SCROLL = 534352; + uint256 constant CHAINID_DARWINIA = 46; + uint256 constant CHAINID_POLYGON_ZKEVM = 1101; + uint256 constant CHAINID_BLAST = 81457; + uint256 constant CHAINID_ASTAR_ZKEVM = 3776; + // helix-lnbridge-v3.0.0 + uint256 constant salt = 0x68656c69782d6c6e6272696467652d76332e302e30; + + enum MessagerType { + LayerzeroType, + MsgportType, + Eth2ArbType + } + + struct TokenInfo { + address token; + uint8 decimals; + bool configured; + } + + // the address on each chain + mapping(uint256=>address) public lnBridgeAddresses; + mapping(uint256=>uint256) public lzChainIds; + mapping(uint256=>address) public deployers; + mapping(bytes32=>address) private messagers; + mapping(bytes32=>TokenInfo) private tokens; + + function initLnBridgeAddress() public { + address commonAddress = 0xbA5D580B18b6436411562981e02c8A9aA1776D10; + lnBridgeAddresses[CHAINID_ETHEREUM] = commonAddress; + lnBridgeAddresses[CHAINID_ARBITRUM] = commonAddress; + lnBridgeAddresses[CHAINID_POLYGON_POS] = commonAddress; + lnBridgeAddresses[CHAINID_BSC] = commonAddress; + lnBridgeAddresses[CHAINID_LINEA] = commonAddress; + lnBridgeAddresses[CHAINID_BASE] = commonAddress; + lnBridgeAddresses[CHAINID_OP] = commonAddress; + lnBridgeAddresses[CHAINID_GNOSIS] = commonAddress; + lnBridgeAddresses[CHAINID_MANTLE] = commonAddress; + lnBridgeAddresses[CHAINID_SCROLL] = commonAddress; + lnBridgeAddresses[CHAINID_POLYGON_ZKEVM] = commonAddress; + lnBridgeAddresses[CHAINID_BLAST] = 0xB180D7DcB5CC161C862aD60442FA37527546cAFC; + lnBridgeAddresses[CHAINID_ASTAR_ZKEVM] = 0xD476650e03a45E70202b0bcAfa04E1513920f83a; + + address commonDeployer = 0x80D4c766C5142D1313D531Afe7384D0D5E108Db3; + deployers[CHAINID_ETHEREUM] = commonDeployer; + deployers[CHAINID_ARBITRUM] = commonDeployer; + deployers[CHAINID_POLYGON_POS] = commonDeployer; + deployers[CHAINID_BSC] = commonDeployer; + deployers[CHAINID_LINEA] = commonDeployer; + deployers[CHAINID_BASE] = commonDeployer; + deployers[CHAINID_OP] = commonDeployer; + deployers[CHAINID_GNOSIS] = commonDeployer; + deployers[CHAINID_MANTLE] = commonDeployer; + deployers[CHAINID_SCROLL] = commonDeployer; + deployers[CHAINID_POLYGON_ZKEVM] = commonDeployer; + deployers[CHAINID_BLAST] = 0x9bc1C7567DDBcaF2212185b6665D755d842d01E4; + deployers[CHAINID_ASTAR_ZKEVM] = 0x9bc1C7567DDBcaF2212185b6665D755d842d01E4; + + lzChainIds[CHAINID_ETHEREUM] = 101; + lzChainIds[CHAINID_ARBITRUM] = 110; + lzChainIds[CHAINID_POLYGON_POS] = 109; + lzChainIds[CHAINID_BSC] = 102; + lzChainIds[CHAINID_LINEA] = 183; + lzChainIds[CHAINID_BASE] = 184; + lzChainIds[CHAINID_OP] = 111; + lzChainIds[CHAINID_GNOSIS] = 145; + lzChainIds[CHAINID_MANTLE] = 181; + lzChainIds[CHAINID_SCROLL] = 214; + lzChainIds[CHAINID_POLYGON_ZKEVM] = 158; + lzChainIds[CHAINID_BLAST] = 243; + lzChainIds[CHAINID_ASTAR_ZKEVM] = 257; + + configureMessager(CHAINID_ETHEREUM, MessagerType.MsgportType, 0x65Be094765731F394bc6d9DF53bDF3376F1Fc8B0); + configureMessager(CHAINID_ETHEREUM, MessagerType.Eth2ArbType, 0x78a6831Da2293fbEFd0d8aFB4D1f7CBB751e0119); + configureMessager(CHAINID_ARBITRUM, MessagerType.LayerzeroType, 0x509354A4ebf98aCC7a65d2264694A65a2938cac9); + configureMessager(CHAINID_ARBITRUM, MessagerType.MsgportType, 0x65Be094765731F394bc6d9DF53bDF3376F1Fc8B0); + configureMessager(CHAINID_ARBITRUM, MessagerType.Eth2ArbType, 0xc95D939Da72ECe8Bd794d42EaEd28974CDb0ADa2); + configureMessager(CHAINID_POLYGON_POS, MessagerType.LayerzeroType, 0x463D1730a8527CA58d48EF70C7460B9920346567); + configureMessager(CHAINID_BSC, MessagerType.LayerzeroType, 0x61B6B8c7C00aA7F060a2BEDeE6b11927CC9c3eF1); + configureMessager(CHAINID_LINEA, MessagerType.LayerzeroType, 0x61B6B8c7C00aA7F060a2BEDeE6b11927CC9c3eF1); + configureMessager(CHAINID_BASE, MessagerType.LayerzeroType, 0x61B6B8c7C00aA7F060a2BEDeE6b11927CC9c3eF1); + configureMessager(CHAINID_OP, MessagerType.LayerzeroType, 0x61B6B8c7C00aA7F060a2BEDeE6b11927CC9c3eF1); + configureMessager(CHAINID_GNOSIS, MessagerType.LayerzeroType, 0x3F7DF5866591e7E48D18C8EbeAE61Bc343a63283); + configureMessager(CHAINID_MANTLE, MessagerType.LayerzeroType, 0x61B6B8c7C00aA7F060a2BEDeE6b11927CC9c3eF1); + configureMessager(CHAINID_SCROLL, MessagerType.LayerzeroType, 0x463d1730a8527ca58d48ef70c7460b9920346567); + configureMessager(CHAINID_POLYGON_ZKEVM, MessagerType.LayerzeroType, 0x61B6B8c7C00aA7F060a2BEDeE6b11927CC9c3eF1); + configureMessager(CHAINID_BLAST, MessagerType.LayerzeroType, 0x8A87497488073307E1a17e8A12475a94Afcb413f); + configureMessager(CHAINID_BLAST, MessagerType.MsgportType, 0x98982b1685a63596834a05C1288dA7fbF27d684E); + configureMessager(CHAINID_ASTAR_ZKEVM, MessagerType.LayerzeroType, 0x61B6B8c7C00aA7F060a2BEDeE6b11927CC9c3eF1); + + + configureTokenInfo(CHAINID_ETHEREUM, "ring", 0x9469D013805bFfB7D3DEBe5E7839237e535ec483, 18); + configureTokenInfo(CHAINID_ARBITRUM, "usdt", 0xFd086bC7CD5C481DCC9C85ebE478A1C0b69FCbb9, 6); + configureTokenInfo(CHAINID_ARBITRUM, "usdc", 0xFF970A61A04b1cA14834A43f5dE4533eBDDB5CC8, 6); + configureTokenInfo(CHAINID_ARBITRUM, "ring", 0x9e523234D36973f9e38642886197D023C88e307e, 18); + configureTokenInfo(CHAINID_POLYGON_POS, "usdt", 0xc2132D05D31c914a87C6611C10748AEb04B58e8F, 6); + configureTokenInfo(CHAINID_POLYGON_POS, "ring", 0x9C1C23E60B72Bc88a043bf64aFdb16A02540Ae8f, 18); + configureTokenInfo(CHAINID_BSC, "usdt", 0x55d398326f99059fF775485246999027B3197955, 18); + configureTokenInfo(CHAINID_BSC, "usdc", 0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d, 18); + configureTokenInfo(CHAINID_LINEA, "usdt", 0xA219439258ca9da29E9Cc4cE5596924745e12B93, 6); + configureTokenInfo(CHAINID_BASE, "usdc", 0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913, 6); + configureTokenInfo(CHAINID_OP, "usdt", 0x94b008aA00579c1307B0EF2c499aD98a8ce58e58, 6); + configureTokenInfo(CHAINID_GNOSIS, "usdt", 0x4ECaBa5870353805a9F068101A40E0f32ed605C6, 6); + configureTokenInfo(CHAINID_MANTLE, "usdt", 0x201EBa5CC46D216Ce6DC03F6a759e8E766e956aE, 6); + configureTokenInfo(CHAINID_MANTLE, "usdc", 0x09Bc4E0D864854c6aFB6eB9A9cdF58aC190D0dF9, 6); + configureTokenInfo(CHAINID_SCROLL, "usdt", 0xf55BEC9cafDbE8730f096Aa55dad6D22d44099Df, 6); + configureTokenInfo(CHAINID_SCROLL, "usdc", 0x06eFdBFf2a14a7c8E15944D1F4A48F9F95F663A4, 6); + configureTokenInfo(CHAINID_POLYGON_ZKEVM, "usdt", 0x1E4a5963aBFD975d8c9021ce480b42188849D41d, 6); + configureTokenInfo(CHAINID_BLAST, "usdb", 0x4300000000000000000000000000000000000003, 6); + configureTokenInfo(CHAINID_ASTAR_ZKEVM, "usdt", 0x493257fD37EDB34451f62EDf8D2a0C418852bA4C, 6); + configureTokenInfo(CHAINID_ASTAR_ZKEVM, "usdc", 0x3355df6D4c9C3035724Fd0e3914dE96A5a83aaf4, 6); + } + + function configureMessager(uint256 chainId, uint256 messagerType, address messagerAddress) internal { + bytes32 key = keccak256(abi.encodePacked(chainId, messagerType)); + messagers[key] = messagerAddress; + } + + function configureTokenInfo(uint256 chainId, string symbol, address token, uint8 decimals) internal { + bytes32 key = keccak256(abi.encodePacked(chainId, symbol)); + tokens[key] = TokenInfo(token, decimals, true); + } + + function getMessagerFromConfigure(uint256 chainId, uint256 messagerType) public view returns(address messager) { + bytes32 key = keccak256(abi.encodePacked(chainId, messagerType)); + messager = messagers[key]; + } + + function getTokenFromConfigure(uint256 chainId, string symbol) public view returns(TokenInfo memory) { + bytes32 key = keccak256(abi.encodePacked(chainId, symbol)); + return tokens[key]; + } + + function getMessager(uint256 fromChain, uint256 toChain) public view returns(address sender, address receiver) { + address lnv3BridgeAddress = lnBridgeAddresses[fromChain]; + require(lnv3BridgeAddress != address(0), "the chain has no lnv3bridge"); + ILnv3Bridge.MessagerService memory service = ILnv3Bridge(lnv3BridgeAddress).messagers(toChain); + sender = service.sendService; + receiver = service.receiveService; + } + + function checkTokenAddressOnChain(string symbol) public view { + TokenInfo memory tokenInfo = getTokenFromConfigure(block.chainid, symbol); + // ignore unconfigured token + if (!tokenInfo.configured) { + return; + } + require(IErc20(tokenInfo.token).decimals() == tokenInfo.decimals, "decimals not match"); + require(IErc20(tokenInfo.token).symbol() == tokenInfo.symbol, "symbol not match"); + } + + // the proposol method + // connect messager to remote chain + function connectMessager(uint256 remoteChainId, MessagerType messagerType) public { + uint256 localChainId = block.chainid; + address localMessager = getMessagerFromConfigure(localChainId, messagerType); + require(localMessager != address(0), "local message not exist"); + address remoteMessager = getMessagerFromConfigure(remoteChainId, messagerType); + require(remoteMessager != address(0), "remote message not exist"); + + if (messagerType == MessagerType.LayerzeroType) { + uint256 lzRemoteChainId = lzChainIds[remoteChainId]; + require(lzRemoteChainId != 0, "invalid lzchainid"); + ILayerZeroMessager.RemoteMessager memory oldMessager = ILayerZeroMessager(localMessager).remoteMessagers(remoteChainId); + // if the same configure, don't send tx + if (oldMessager.lzRemoteChainId == lzRemoteChainId && oldMessager.messager == remoteMessager) { + return; + } + ILayerZeroMessager(localMessager).setRemoteMessager(remoteChainId, lzRemoteChainId, remoteMessager); + } else if(messagerType == MessagerType.MsgportType) { + IMsgportMessager.RemoteMessager memory oldMessager = IMsgportMessager(localMessager).remoteMessagers(remoteChainId); + // if the same configure, don't send tx + if (oldMessager.messager == remoteMessager) { + return; + } + IMsgportMessager(localMessager).setRemoteMessager(remoteChainId, remoteChainId, remoteMessager); + } + } + + // connect lnbridge + function connectBridge(uint256 remoteChainId, MessagerType messagerType) public { + uint256 localChainId = block.chainid; + address localBridge = lnBridgeAddresses[localChainId]; + require(localBridge != address(0), "invalid local bridge"); + address remoteBridge = lnBridgeAddresses[remoteChainId]; + require(remoteBridge != address(0), "invalid remote bridge"); + + address localMessager = getMessagerFromConfigure(localChainId, messagerType); + require(localMessager != address(0), "local message not exist"); + + (address sender, address receiver) = getMessager(localChainId, remoteChainId); + if (sender != localMessager) { + ILnv3Bridge(localBridge).setSendService(remoteChainId, remoteBridge, localMessager); + } + if (receiver != localMessager) { + ILnv3Bridge(localBridge).setReceiveService(remoteChainId, remoteBridge, localMessager); + } + } + + // register token + function registerToken( + uint256 remoteChainId, + string localSymbol, + string remoteSymbol, + uint112 protocolFee, + uint112 penalty + ) public { + uint256 localChainId = block.chainid; + TokenInfo localInfo = getTokenFromConfigure(localChainId, localSymbol); + require(localInfo.configured, "local token not exist"); + TokenInfo remoteInfo = getTokenFromConfigure(remoteChainId, remoteSymbol); + require(remoteInfo.configured, "remote token not exist"); + + address localBridge = lnBridgeAddresses[localChainId]; + require(localBridge != address(0), "invalid local bridge"); + bytes32 key = ILnv3Bridge(localBridge).getTokenKey(remoteChainId, localInfo.token, remoteInfo.token); + ILnv3Bridge.TokenInfo memory tokenInfo = ILnv3Bridge(localBridge).tokenInfos(key); + // has been registered + if (tokenInfo.index > 0) { + return; + } + uint32 index = 1; + while (ILnv3Bridge(localBridge).tokenIndexer(index) != bytes32(0)) { + index += 1; + } + ILnv3Bridge(localBridge).registerTokenInfo( + remoteChainId, + localInfo.token, + remoteInfo.token, + protocolFee, + penalty, + localInfo.decimals, + remoteInfo.decimals, + index + ); + } + + // deploy proxy admin + function deployProxyAdmin() external returns(address) { + bytes memory byteCode = type(HelixProxyAdmin).creationCode; + address dao = safeAddress(); + bytes memory initCode = bytes.concat(byteCode, abi.encode(dao)); + address expectedAddress = create2address(byteCode, keccak256(initCode)); + if (expectedAddress.code.length == 0) { + create2deploy(salt, initCode); + } + require(expectedAddress.code.length > 0, "proxy admin deployed failed"); + return expectedAddress; + } + + // deploy msgport messager + function deployMsgportMessager(address msgport) external returns(address) { + bytes memory byteCode = type(MsgportMessager).creationCode; + address dao = safeAddress(); + bytes memory initCode = bytes.concat(byteCode, abi.encode(dao, msgport)); + address expectedAddress = create2address(byteCode, keccak256(initCode)); + if (expectedAddress.code.length == 0) { + create2deploy(salt, initCode); + } + require(expectedAddress.code.length > 0, "msgport messager deployed failed"); + return expectedAddress; + } + + // deploy layerzero messager + function deployMsgportMessager(address endpoint) external returns(address) { + bytes memory byteCode = type(LayerZeroMessager).creationCode; + address dao = safeAddress(); + bytes memory initCode = bytes.concat(byteCode, abi.encode(dao, endpoint)); + address expectedAddress = create2address(byteCode, keccak256(initCode)); + if (expectedAddress.code.length == 0) { + create2deploy(salt, initCode); + } + require(expectedAddress.code.length > 0, "layerzero messager deployed failed"); + return expectedAddress; + } + + // deploy lnv3 logic + function deployLnBridgeV3Logic() external returns(address) { + bytes memory byteCode = type(HelixLnBridgeV3).creationCode; + address expectedAddress = create2address(byteCode, keccak256(byteCode)); + if (expectedAddress.code.length == 0) { + create2deploy(salt, byteCode); + } + require(expectedAddress.code.length > 0, "lnbridgev3 deployed failed"); + return expectedAddress; + } + + // deploy lnv3 proxy + function deployLnBridgeV3Proxy(address logicAddress, address proxyAdminAddress) external returns(address) { + bytes memory byteCode = type(TransparentUpgradeableProxy).creationCode; + address dao = safeAddress(); + bytes memory data = abi.encodeWithSelector( + HelixLnBridgeV3.initialize.selector, + dao, + bytes(0) + ); + bytes memory initCode = bytes.concat(byteCode, abi.encode(logicAddress, proxyAdminAddress, data)); + address expectedAddress = create2address(byteCode, keccak256(initCode)); + if (expectedAddress.code.length == 0) { + create2deploy(salt, initCode); + } + require(expectedAddress.code.length > 0, "lnbridgev3 proxy deployed failed"); + return expectedAddress; + } +} + From ae0ea28b36875fac03f396945951a367f31ff6ec Mon Sep 17 00:00:00 2001 From: xiaoch05 Date: Mon, 13 May 2024 15:25:42 +0800 Subject: [PATCH 2/9] forge install: @helix/contracts v1.6.1 --- .gitmodules | 3 +++ lib/@helix/contracts | 1 + 2 files changed, 4 insertions(+) create mode 160000 lib/@helix/contracts diff --git a/.gitmodules b/.gitmodules index 1767b45..6ce3c8e 100644 --- a/.gitmodules +++ b/.gitmodules @@ -7,3 +7,6 @@ [submodule "lib/openzeppelin-contracts"] path = lib/openzeppelin-contracts url = https://github.com/OpenZeppelin/openzeppelin-contracts +[submodule "lib/@helix/contracts"] + path = lib/@helix/contracts + url = https://github.com/helix-bridge/contracts.git diff --git a/lib/@helix/contracts b/lib/@helix/contracts new file mode 160000 index 0000000..036054c --- /dev/null +++ b/lib/@helix/contracts @@ -0,0 +1 @@ +Subproject commit 036054c8f010a4dc892a8e8e9d46b4210e5f7fcf From fd0ad8c82494a208a50e56b152a97663abf054d0 Mon Sep 17 00:00:00 2001 From: xiaoch05 Date: Mon, 13 May 2024 15:42:40 +0800 Subject: [PATCH 3/9] forge install: @zeppelin-solidity/contracts v4.7.1 --- .gitmodules | 3 +++ lib/@zeppelin-solidity/contracts | 1 + 2 files changed, 4 insertions(+) create mode 160000 lib/@zeppelin-solidity/contracts diff --git a/.gitmodules b/.gitmodules index 6ce3c8e..28fb57a 100644 --- a/.gitmodules +++ b/.gitmodules @@ -10,3 +10,6 @@ [submodule "lib/@helix/contracts"] path = lib/@helix/contracts url = https://github.com/helix-bridge/contracts.git +[submodule "lib/@zeppelin-solidity/contracts"] + path = lib/@zeppelin-solidity/contracts + url = https://github.com/OpenZeppelin/openzeppelin-contracts.git diff --git a/lib/@zeppelin-solidity/contracts b/lib/@zeppelin-solidity/contracts new file mode 160000 index 0000000..3b8b4ba --- /dev/null +++ b/lib/@zeppelin-solidity/contracts @@ -0,0 +1 @@ +Subproject commit 3b8b4ba82c880c31cd3b96dd5e15741d7e26658e From 27635252a1556a6eb2cd245b33bd0153a0a035b8 Mon Sep 17 00:00:00 2001 From: xiaoch05 Date: Mon, 13 May 2024 17:10:09 +0800 Subject: [PATCH 4/9] connect base network --- remappings.txt | 2 + script/5_ConnectBaseNetwork.s.sol | 25 ++++++++ script/common/Base.sol | 29 +--------- script/common/LnBridgeV3.sol | 3 + script/common/LnBridgeV3Base.s.sol | 93 ++++++++++++++++++++++-------- script/common/Proposal.s.sol | 4 +- 6 files changed, 101 insertions(+), 55 deletions(-) create mode 100644 script/5_ConnectBaseNetwork.s.sol diff --git a/remappings.txt b/remappings.txt index 0ea39d0..ef01fd1 100644 --- a/remappings.txt +++ b/remappings.txt @@ -2,3 +2,5 @@ @openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/ forge-std/=lib/forge-std/src/ ds-test/=lib/forge-std/lib/ds-test/src/ +@helix/contracts/=lib/@helix/contracts/ +@zeppelin-solidity/contracts=lib/@zeppelin-solidity/contracts/contracts/ diff --git a/script/5_ConnectBaseNetwork.s.sol b/script/5_ConnectBaseNetwork.s.sol new file mode 100644 index 0000000..d419c7b --- /dev/null +++ b/script/5_ConnectBaseNetwork.s.sol @@ -0,0 +1,25 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {LnBridgeV3Base} from "./common/LnBridgeV3Base.s.sol"; +import {safeconsole} from "forge-std/safeconsole.sol"; + +contract ConnectBaseNetwork is LnBridgeV3Base { + function run() public sphinx { + initLnBridgeAddress(); + uint256 localChainId = block.chainid; + if (localChainId == CHAINID_BASE) { + for (uint idx = 0; idx < allChainIds.length; idx++) { + uint256 remoteChainId = allChainIds[idx]; + if (remoteChainId == CHAINID_ETHEREUM) { + continue; + } + connectMessager(remoteChainId, MessagerType.LayerzeroType); + connectBridge(remoteChainId, MessagerType.LayerzeroType); + } + } else { + connectMessager(CHAINID_BASE, MessagerType.LayerzeroType); + connectBridge(CHAINID_BASE, MessagerType.LayerzeroType); + } + } +} diff --git a/script/common/Base.sol b/script/common/Base.sol index c9bafc7..3095d36 100644 --- a/script/common/Base.sol +++ b/script/common/Base.sol @@ -4,10 +4,6 @@ pragma solidity ^0.8.0; import {Script} from "forge-std/Script.sol"; import "@sphinx-labs/contracts/SphinxPlugin.sol"; -interface Create2Deploy { - function deploy(bytes memory code, uint256 salt) external; -} - contract Base is Sphinx, Script { function configureSphinx() public override { sphinxConfig.owners = [ @@ -21,29 +17,6 @@ contract Base is Sphinx, Script { sphinxConfig.threshold = 3; sphinxConfig.projectName = "Helix-DAO"; // sphinxConfig.mainnets = ["polygon", "arbitrum", "optimism", "mantle"]; - sphinxConfig.mainnets = ["arbitrum", "optimism"]; - } - - function create2deployAddress() internal returns(address) { - return address(0); - } - - function create2deploy(uint256 salt, bytes memory initCode) internal returns (address) { - address deployer = create2deployAddress[block.chainid]; - require(deployer != address(0), "deployer not exist"); - Create2Deploy(deployer).deploy(initCode, salt); - } - - function create2address(bytes32 salt, bytes32 bytecodeHash) internal view returns (address addr) { - address deployer = create2deployAddress[block.chainid]; - assembly { - let ptr := mload(0x40) - mstore(add(ptr, 0x40), bytecodeHash) - mstore(add(ptr, 0x20), salt) - mstore(ptr, deployer) - let start := add(ptr, 0x0b) - mstore8(start, 0xff) - addr := and(keccak256(start, 85), 0xffffffffffffffffffffffffffffffffffffffff) - } + sphinxConfig.mainnets = ["linea", "polygon", "arbitrum", "optimism", "blast"]; } } diff --git a/script/common/LnBridgeV3.sol b/script/common/LnBridgeV3.sol index a266e27..aa0b181 100644 --- a/script/common/LnBridgeV3.sol +++ b/script/common/LnBridgeV3.sol @@ -2,7 +2,10 @@ pragma solidity ^0.8.17; import "@helix/contracts/helix-contract/contracts/messagers/MsgportMessager.sol"; +import "@helix/contracts/helix-contract/contracts/messagers/LayerZeroMessager.sol"; +import "@helix/contracts/helix-contract/contracts/ln/lnv3/HelixLnBridgeV3.sol"; import "@helix/contracts/helix-contract/contracts/tool/WToken.sol"; import "@helix/contracts/helix-contract/contracts/tool/Erc20.sol"; import "@helix/contracts/helix-contract/contracts/tool/Create2Deployer.sol"; +import "@helix/contracts/helix-contract/contracts/tool/ProxyAdmin.sol"; import "@helix/contracts/helix-contract/contracts/tool/TransparentUpgradeableProxy.sol"; diff --git a/script/common/LnBridgeV3Base.s.sol b/script/common/LnBridgeV3Base.s.sol index d22ab91..70a637c 100644 --- a/script/common/LnBridgeV3Base.s.sol +++ b/script/common/LnBridgeV3Base.s.sol @@ -2,6 +2,11 @@ pragma solidity ^0.8.0; import {Base} from "./Base.sol"; +import "./LnBridgeV3.sol"; + +interface Create2Deploy { + function deploy(bytes memory code, uint256 salt) external; +} interface ILnv3Bridge { struct MessagerService { @@ -24,7 +29,7 @@ interface ILnv3Bridge { function messagers(uint256 remoteChainId) view external returns(MessagerService memory); function setSendService(uint256 remoteChainId, address remoteBridge, address service) external; function setReceiveService(uint256 remoteChainId, address remoteBridge, address service) external; - function getTokenKey(uint256 remoteChainId, address sourceToken, address targetToken) pure public returns(bytes32); + function getTokenKey(uint256 remoteChainId, address sourceToken, address targetToken) pure external returns(bytes32); function tokenInfos(bytes32 key) view external returns(TokenInfo memory); function tokenIndexer(uint32 index) view external returns(bytes32); function registerTokenInfo( @@ -41,7 +46,7 @@ interface ILnv3Bridge { interface IErc20 { function decimals() view external returns(uint8); - function symbol() view external returns(string); + function symbol() view external returns(string memory); } interface IMsgportMessager { @@ -79,6 +84,7 @@ contract LnBridgeV3Base is Base { uint256 constant CHAINID_ASTAR_ZKEVM = 3776; // helix-lnbridge-v3.0.0 uint256 constant salt = 0x68656c69782d6c6e6272696467652d76332e302e30; + uint256[] public allChainIds; enum MessagerType { LayerzeroType, @@ -89,18 +95,56 @@ contract LnBridgeV3Base is Base { struct TokenInfo { address token; uint8 decimals; + string symbol; bool configured; } // the address on each chain mapping(uint256=>address) public lnBridgeAddresses; - mapping(uint256=>uint256) public lzChainIds; + mapping(uint256=>uint16) public lzChainIds; mapping(uint256=>address) public deployers; mapping(bytes32=>address) private messagers; mapping(bytes32=>TokenInfo) private tokens; + function create2deployAddress() internal view returns(address) { + return address(0); + } + + function create2deploy(uint256 _salt, bytes memory initCode) internal { + address deployer = create2deployAddress(); + require(deployer != address(0), "deployer not exist"); + Create2Deploy(deployer).deploy(initCode, _salt); + } + + function create2address(uint256 _salt, bytes32 bytecodeHash) internal view returns (address addr) { + address deployer = create2deployAddress(); + assembly { + let ptr := mload(0x40) + mstore(add(ptr, 0x40), bytecodeHash) + mstore(add(ptr, 0x20), _salt) + mstore(ptr, deployer) + let start := add(ptr, 0x0b) + mstore8(start, 0xff) + addr := and(keccak256(start, 85), 0xffffffffffffffffffffffffffffffffffffffff) + } + } + function initLnBridgeAddress() public { address commonAddress = 0xbA5D580B18b6436411562981e02c8A9aA1776D10; + allChainIds.push(CHAINID_ETHEREUM); + allChainIds.push(CHAINID_ARBITRUM); + allChainIds.push(CHAINID_POLYGON_POS); + allChainIds.push(CHAINID_BSC); + allChainIds.push(CHAINID_LINEA); + allChainIds.push(CHAINID_BASE); + allChainIds.push(CHAINID_OP); + allChainIds.push(CHAINID_GNOSIS); + allChainIds.push(CHAINID_MANTLE); + allChainIds.push(CHAINID_SCROLL); + allChainIds.push(CHAINID_POLYGON_ZKEVM); + allChainIds.push(CHAINID_BLAST); + allChainIds.push(CHAINID_ASTAR_ZKEVM); + lnBridgeAddresses[CHAINID_ETHEREUM] = commonAddress; lnBridgeAddresses[CHAINID_ARBITRUM] = commonAddress; lnBridgeAddresses[CHAINID_POLYGON_POS] = commonAddress; @@ -156,7 +200,7 @@ contract LnBridgeV3Base is Base { configureMessager(CHAINID_OP, MessagerType.LayerzeroType, 0x61B6B8c7C00aA7F060a2BEDeE6b11927CC9c3eF1); configureMessager(CHAINID_GNOSIS, MessagerType.LayerzeroType, 0x3F7DF5866591e7E48D18C8EbeAE61Bc343a63283); configureMessager(CHAINID_MANTLE, MessagerType.LayerzeroType, 0x61B6B8c7C00aA7F060a2BEDeE6b11927CC9c3eF1); - configureMessager(CHAINID_SCROLL, MessagerType.LayerzeroType, 0x463d1730a8527ca58d48ef70c7460b9920346567); + configureMessager(CHAINID_SCROLL, MessagerType.LayerzeroType, 0x463D1730a8527CA58d48EF70C7460B9920346567); configureMessager(CHAINID_POLYGON_ZKEVM, MessagerType.LayerzeroType, 0x61B6B8c7C00aA7F060a2BEDeE6b11927CC9c3eF1); configureMessager(CHAINID_BLAST, MessagerType.LayerzeroType, 0x8A87497488073307E1a17e8A12475a94Afcb413f); configureMessager(CHAINID_BLAST, MessagerType.MsgportType, 0x98982b1685a63596834a05C1288dA7fbF27d684E); @@ -185,22 +229,22 @@ contract LnBridgeV3Base is Base { configureTokenInfo(CHAINID_ASTAR_ZKEVM, "usdc", 0x3355df6D4c9C3035724Fd0e3914dE96A5a83aaf4, 6); } - function configureMessager(uint256 chainId, uint256 messagerType, address messagerAddress) internal { + function configureMessager(uint256 chainId, MessagerType messagerType, address messagerAddress) internal { bytes32 key = keccak256(abi.encodePacked(chainId, messagerType)); messagers[key] = messagerAddress; } - function configureTokenInfo(uint256 chainId, string symbol, address token, uint8 decimals) internal { + function configureTokenInfo(uint256 chainId, string memory symbol, address token, uint8 decimals) internal { bytes32 key = keccak256(abi.encodePacked(chainId, symbol)); - tokens[key] = TokenInfo(token, decimals, true); + tokens[key] = TokenInfo(token, decimals, symbol, true); } - function getMessagerFromConfigure(uint256 chainId, uint256 messagerType) public view returns(address messager) { + function getMessagerFromConfigure(uint256 chainId, MessagerType messagerType) public view returns(address messager) { bytes32 key = keccak256(abi.encodePacked(chainId, messagerType)); messager = messagers[key]; } - function getTokenFromConfigure(uint256 chainId, string symbol) public view returns(TokenInfo memory) { + function getTokenFromConfigure(uint256 chainId, string memory symbol) public view returns(TokenInfo memory) { bytes32 key = keccak256(abi.encodePacked(chainId, symbol)); return tokens[key]; } @@ -213,14 +257,13 @@ contract LnBridgeV3Base is Base { receiver = service.receiveService; } - function checkTokenAddressOnChain(string symbol) public view { + function checkTokenAddressOnChain(string memory symbol) public view { TokenInfo memory tokenInfo = getTokenFromConfigure(block.chainid, symbol); // ignore unconfigured token if (!tokenInfo.configured) { return; } require(IErc20(tokenInfo.token).decimals() == tokenInfo.decimals, "decimals not match"); - require(IErc20(tokenInfo.token).symbol() == tokenInfo.symbol, "symbol not match"); } // the proposol method @@ -228,12 +271,12 @@ contract LnBridgeV3Base is Base { function connectMessager(uint256 remoteChainId, MessagerType messagerType) public { uint256 localChainId = block.chainid; address localMessager = getMessagerFromConfigure(localChainId, messagerType); - require(localMessager != address(0), "local message not exist"); + require(localMessager != address(0), "local messager not exist"); address remoteMessager = getMessagerFromConfigure(remoteChainId, messagerType); - require(remoteMessager != address(0), "remote message not exist"); + require(remoteMessager != address(0), "remote messager not exist"); if (messagerType == MessagerType.LayerzeroType) { - uint256 lzRemoteChainId = lzChainIds[remoteChainId]; + uint16 lzRemoteChainId = lzChainIds[remoteChainId]; require(lzRemoteChainId != 0, "invalid lzchainid"); ILayerZeroMessager.RemoteMessager memory oldMessager = ILayerZeroMessager(localMessager).remoteMessagers(remoteChainId); // if the same configure, don't send tx @@ -274,15 +317,15 @@ contract LnBridgeV3Base is Base { // register token function registerToken( uint256 remoteChainId, - string localSymbol, - string remoteSymbol, + string memory localSymbol, + string memory remoteSymbol, uint112 protocolFee, uint112 penalty ) public { uint256 localChainId = block.chainid; - TokenInfo localInfo = getTokenFromConfigure(localChainId, localSymbol); + TokenInfo memory localInfo = getTokenFromConfigure(localChainId, localSymbol); require(localInfo.configured, "local token not exist"); - TokenInfo remoteInfo = getTokenFromConfigure(remoteChainId, remoteSymbol); + TokenInfo memory remoteInfo = getTokenFromConfigure(remoteChainId, remoteSymbol); require(remoteInfo.configured, "remote token not exist"); address localBridge = lnBridgeAddresses[localChainId]; @@ -314,7 +357,7 @@ contract LnBridgeV3Base is Base { bytes memory byteCode = type(HelixProxyAdmin).creationCode; address dao = safeAddress(); bytes memory initCode = bytes.concat(byteCode, abi.encode(dao)); - address expectedAddress = create2address(byteCode, keccak256(initCode)); + address expectedAddress = create2address(salt, keccak256(initCode)); if (expectedAddress.code.length == 0) { create2deploy(salt, initCode); } @@ -327,7 +370,7 @@ contract LnBridgeV3Base is Base { bytes memory byteCode = type(MsgportMessager).creationCode; address dao = safeAddress(); bytes memory initCode = bytes.concat(byteCode, abi.encode(dao, msgport)); - address expectedAddress = create2address(byteCode, keccak256(initCode)); + address expectedAddress = create2address(salt, keccak256(initCode)); if (expectedAddress.code.length == 0) { create2deploy(salt, initCode); } @@ -336,11 +379,11 @@ contract LnBridgeV3Base is Base { } // deploy layerzero messager - function deployMsgportMessager(address endpoint) external returns(address) { + function deployLayerzeroMessager(address endpoint) external returns(address) { bytes memory byteCode = type(LayerZeroMessager).creationCode; address dao = safeAddress(); bytes memory initCode = bytes.concat(byteCode, abi.encode(dao, endpoint)); - address expectedAddress = create2address(byteCode, keccak256(initCode)); + address expectedAddress = create2address(salt, keccak256(initCode)); if (expectedAddress.code.length == 0) { create2deploy(salt, initCode); } @@ -351,7 +394,7 @@ contract LnBridgeV3Base is Base { // deploy lnv3 logic function deployLnBridgeV3Logic() external returns(address) { bytes memory byteCode = type(HelixLnBridgeV3).creationCode; - address expectedAddress = create2address(byteCode, keccak256(byteCode)); + address expectedAddress = create2address(salt, keccak256(byteCode)); if (expectedAddress.code.length == 0) { create2deploy(salt, byteCode); } @@ -366,10 +409,10 @@ contract LnBridgeV3Base is Base { bytes memory data = abi.encodeWithSelector( HelixLnBridgeV3.initialize.selector, dao, - bytes(0) + bytes("0x") ); bytes memory initCode = bytes.concat(byteCode, abi.encode(logicAddress, proxyAdminAddress, data)); - address expectedAddress = create2address(byteCode, keccak256(initCode)); + address expectedAddress = create2address(salt, keccak256(initCode)); if (expectedAddress.code.length == 0) { create2deploy(salt, initCode); } diff --git a/script/common/Proposal.s.sol b/script/common/Proposal.s.sol index 89195b7..ad5b89c 100644 --- a/script/common/Proposal.s.sol +++ b/script/common/Proposal.s.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; -import {UpdateArbOpEthProtocolFee4} from "../4_UpdateArbOpEthProtocolFee.s.sol"; +import {ConnectBaseNetwork} from "../5_ConnectBaseNetwork.s.sol"; -contract Proposal is UpdateArbOpEthProtocolFee4 {} +contract Proposal is ConnectBaseNetwork {} From ec069aba3236291579f2a6a28d5598b894ca729e Mon Sep 17 00:00:00 2001 From: xiaoch05 Date: Tue, 14 May 2024 11:40:49 +0800 Subject: [PATCH 5/9] update configure --- foundry.toml | 7 +- lib/forge-std | 2 +- script/5_ConnectBaseNetwork.s.sol | 15 +- script/common/LnBridgeV3Base.s.sol | 255 +++++++++++------------------ script/config/arbitrum.toml | 37 +++++ script/config/astar-zkevm.toml | 25 +++ script/config/base.toml | 21 +++ script/config/blast.toml | 26 +++ script/config/bsc.toml | 25 +++ script/config/ethereum.toml | 25 +++ script/config/gnosis.toml | 25 +++ script/config/linea.toml | 21 +++ script/config/mantle.toml | 25 +++ script/config/optimistic.toml | 21 +++ script/config/polygon-pos.toml | 25 +++ script/config/polygon-zkevm.toml | 21 +++ script/config/scroll.toml | 25 +++ 17 files changed, 436 insertions(+), 165 deletions(-) create mode 100644 script/config/arbitrum.toml create mode 100644 script/config/astar-zkevm.toml create mode 100644 script/config/base.toml create mode 100644 script/config/blast.toml create mode 100644 script/config/bsc.toml create mode 100644 script/config/ethereum.toml create mode 100644 script/config/gnosis.toml create mode 100644 script/config/linea.toml create mode 100644 script/config/mantle.toml create mode 100644 script/config/optimistic.toml create mode 100644 script/config/polygon-pos.toml create mode 100644 script/config/polygon-zkevm.toml create mode 100644 script/config/scroll.toml diff --git a/foundry.toml b/foundry.toml index d3497e1..2cca130 100644 --- a/foundry.toml +++ b/foundry.toml @@ -3,7 +3,12 @@ solc_version = "0.8.17" script = 'script' test = 'test' extra_output = ['storageLayout'] -fs_permissions=[{access="read", path="./out"}, {access="read-write", path="./cache"}] +evm_version = "london" +fs_permissions=[ + {access="read", path="./out"}, + {access="read", path= "./script/config" }, + {access="read-write", path="./cache"}, +] allow_paths = ["../.."] auto_detect_remappings = false libs = ["lib"] diff --git a/lib/forge-std b/lib/forge-std index f73c73d..978ac6f 160000 --- a/lib/forge-std +++ b/lib/forge-std @@ -1 +1 @@ -Subproject commit f73c73d2018eb6a111f35e4dae7b4f27401e9421 +Subproject commit 978ac6fadb62f5f0b723c996f64be52eddba6801 diff --git a/script/5_ConnectBaseNetwork.s.sol b/script/5_ConnectBaseNetwork.s.sol index d419c7b..fa2dc3e 100644 --- a/script/5_ConnectBaseNetwork.s.sol +++ b/script/5_ConnectBaseNetwork.s.sol @@ -8,18 +8,21 @@ contract ConnectBaseNetwork is LnBridgeV3Base { function run() public sphinx { initLnBridgeAddress(); uint256 localChainId = block.chainid; + uint256 CHAINID_BASE = chainName2chainId["base"]; + uint256 CHAINID_ETHEREUM = chainName2chainId["ethereum"]; if (localChainId == CHAINID_BASE) { - for (uint idx = 0; idx < allChainIds.length; idx++) { - uint256 remoteChainId = allChainIds[idx]; + for (uint idx = 0; idx < allChainNames.length; idx++) { + string memory remoteChainName = allChainNames[idx]; + uint256 remoteChainId = chainName2chainId[remoteChainName]; if (remoteChainId == CHAINID_ETHEREUM) { continue; } - connectMessager(remoteChainId, MessagerType.LayerzeroType); - connectBridge(remoteChainId, MessagerType.LayerzeroType); + connectMessager(remoteChainName, "layerzero"); + connectBridge(remoteChainName, "layerzero"); } } else { - connectMessager(CHAINID_BASE, MessagerType.LayerzeroType); - connectBridge(CHAINID_BASE, MessagerType.LayerzeroType); + connectMessager("base", "layerzero"); + connectBridge("base", "layerzero"); } } } diff --git a/script/common/LnBridgeV3Base.s.sol b/script/common/LnBridgeV3Base.s.sol index 70a637c..910401c 100644 --- a/script/common/LnBridgeV3Base.s.sol +++ b/script/common/LnBridgeV3Base.s.sol @@ -2,6 +2,7 @@ pragma solidity ^0.8.0; import {Base} from "./Base.sol"; +import {stdToml} from "forge-std/StdToml.sol"; import "./LnBridgeV3.sol"; interface Create2Deploy { @@ -68,23 +69,11 @@ interface ILayerZeroMessager { } contract LnBridgeV3Base is Base { - uint256 constant CHAINID_ETHEREUM = 1; - uint256 constant CHAINID_ARBITRUM = 42161; - uint256 constant CHAINID_POLYGON_POS = 137; - uint256 constant CHAINID_BSC = 56; - uint256 constant CHAINID_LINEA = 59144; - uint256 constant CHAINID_BASE = 8453; - uint256 constant CHAINID_OP = 10; - uint256 constant CHAINID_GNOSIS = 100; - uint256 constant CHAINID_MANTLE = 5000; - uint256 constant CHAINID_SCROLL = 534352; - uint256 constant CHAINID_DARWINIA = 46; - uint256 constant CHAINID_POLYGON_ZKEVM = 1101; - uint256 constant CHAINID_BLAST = 81457; - uint256 constant CHAINID_ASTAR_ZKEVM = 3776; + using stdToml for string; + // helix-lnbridge-v3.0.0 uint256 constant salt = 0x68656c69782d6c6e6272696467652d76332e302e30; - uint256[] public allChainIds; + string[] public allChainNames; enum MessagerType { LayerzeroType, @@ -99,25 +88,35 @@ contract LnBridgeV3Base is Base { bool configured; } - // the address on each chain - mapping(uint256=>address) public lnBridgeAddresses; - mapping(uint256=>uint16) public lzChainIds; - mapping(uint256=>address) public deployers; - mapping(bytes32=>address) private messagers; - mapping(bytes32=>TokenInfo) private tokens; + struct BridgeInfo { + string chainName; + uint256 chainId; + address deployer; + address bridger; + } - function create2deployAddress() internal view returns(address) { - return address(0); + struct MessagerInfo { + address messager; + uint256 chainId; } + mapping(uint256=>BridgeInfo) public bridgerInfos; + mapping(string=>uint256) public chainName2chainId; + mapping(string=>MessagerType) public messagerName2messagerType; + + mapping(bytes32=>MessagerInfo) private messagers; + mapping(bytes32=>TokenInfo) private tokens; + function create2deploy(uint256 _salt, bytes memory initCode) internal { - address deployer = create2deployAddress(); + BridgeInfo memory bridgeInfo = bridgerInfos[block.chainid]; + address deployer = bridgeInfo.deployer; require(deployer != address(0), "deployer not exist"); Create2Deploy(deployer).deploy(initCode, _salt); } function create2address(uint256 _salt, bytes32 bytecodeHash) internal view returns (address addr) { - address deployer = create2deployAddress(); + BridgeInfo memory bridgeInfo = bridgerInfos[block.chainid]; + address deployer = bridgeInfo.deployer; assembly { let ptr := mload(0x40) mstore(add(ptr, 0x40), bytecodeHash) @@ -130,108 +129,45 @@ contract LnBridgeV3Base is Base { } function initLnBridgeAddress() public { - address commonAddress = 0xbA5D580B18b6436411562981e02c8A9aA1776D10; - allChainIds.push(CHAINID_ETHEREUM); - allChainIds.push(CHAINID_ARBITRUM); - allChainIds.push(CHAINID_POLYGON_POS); - allChainIds.push(CHAINID_BSC); - allChainIds.push(CHAINID_LINEA); - allChainIds.push(CHAINID_BASE); - allChainIds.push(CHAINID_OP); - allChainIds.push(CHAINID_GNOSIS); - allChainIds.push(CHAINID_MANTLE); - allChainIds.push(CHAINID_SCROLL); - allChainIds.push(CHAINID_POLYGON_ZKEVM); - allChainIds.push(CHAINID_BLAST); - allChainIds.push(CHAINID_ASTAR_ZKEVM); - - lnBridgeAddresses[CHAINID_ETHEREUM] = commonAddress; - lnBridgeAddresses[CHAINID_ARBITRUM] = commonAddress; - lnBridgeAddresses[CHAINID_POLYGON_POS] = commonAddress; - lnBridgeAddresses[CHAINID_BSC] = commonAddress; - lnBridgeAddresses[CHAINID_LINEA] = commonAddress; - lnBridgeAddresses[CHAINID_BASE] = commonAddress; - lnBridgeAddresses[CHAINID_OP] = commonAddress; - lnBridgeAddresses[CHAINID_GNOSIS] = commonAddress; - lnBridgeAddresses[CHAINID_MANTLE] = commonAddress; - lnBridgeAddresses[CHAINID_SCROLL] = commonAddress; - lnBridgeAddresses[CHAINID_POLYGON_ZKEVM] = commonAddress; - lnBridgeAddresses[CHAINID_BLAST] = 0xB180D7DcB5CC161C862aD60442FA37527546cAFC; - lnBridgeAddresses[CHAINID_ASTAR_ZKEVM] = 0xD476650e03a45E70202b0bcAfa04E1513920f83a; - - address commonDeployer = 0x80D4c766C5142D1313D531Afe7384D0D5E108Db3; - deployers[CHAINID_ETHEREUM] = commonDeployer; - deployers[CHAINID_ARBITRUM] = commonDeployer; - deployers[CHAINID_POLYGON_POS] = commonDeployer; - deployers[CHAINID_BSC] = commonDeployer; - deployers[CHAINID_LINEA] = commonDeployer; - deployers[CHAINID_BASE] = commonDeployer; - deployers[CHAINID_OP] = commonDeployer; - deployers[CHAINID_GNOSIS] = commonDeployer; - deployers[CHAINID_MANTLE] = commonDeployer; - deployers[CHAINID_SCROLL] = commonDeployer; - deployers[CHAINID_POLYGON_ZKEVM] = commonDeployer; - deployers[CHAINID_BLAST] = 0x9bc1C7567DDBcaF2212185b6665D755d842d01E4; - deployers[CHAINID_ASTAR_ZKEVM] = 0x9bc1C7567DDBcaF2212185b6665D755d842d01E4; - - lzChainIds[CHAINID_ETHEREUM] = 101; - lzChainIds[CHAINID_ARBITRUM] = 110; - lzChainIds[CHAINID_POLYGON_POS] = 109; - lzChainIds[CHAINID_BSC] = 102; - lzChainIds[CHAINID_LINEA] = 183; - lzChainIds[CHAINID_BASE] = 184; - lzChainIds[CHAINID_OP] = 111; - lzChainIds[CHAINID_GNOSIS] = 145; - lzChainIds[CHAINID_MANTLE] = 181; - lzChainIds[CHAINID_SCROLL] = 214; - lzChainIds[CHAINID_POLYGON_ZKEVM] = 158; - lzChainIds[CHAINID_BLAST] = 243; - lzChainIds[CHAINID_ASTAR_ZKEVM] = 257; - - configureMessager(CHAINID_ETHEREUM, MessagerType.MsgportType, 0x65Be094765731F394bc6d9DF53bDF3376F1Fc8B0); - configureMessager(CHAINID_ETHEREUM, MessagerType.Eth2ArbType, 0x78a6831Da2293fbEFd0d8aFB4D1f7CBB751e0119); - configureMessager(CHAINID_ARBITRUM, MessagerType.LayerzeroType, 0x509354A4ebf98aCC7a65d2264694A65a2938cac9); - configureMessager(CHAINID_ARBITRUM, MessagerType.MsgportType, 0x65Be094765731F394bc6d9DF53bDF3376F1Fc8B0); - configureMessager(CHAINID_ARBITRUM, MessagerType.Eth2ArbType, 0xc95D939Da72ECe8Bd794d42EaEd28974CDb0ADa2); - configureMessager(CHAINID_POLYGON_POS, MessagerType.LayerzeroType, 0x463D1730a8527CA58d48EF70C7460B9920346567); - configureMessager(CHAINID_BSC, MessagerType.LayerzeroType, 0x61B6B8c7C00aA7F060a2BEDeE6b11927CC9c3eF1); - configureMessager(CHAINID_LINEA, MessagerType.LayerzeroType, 0x61B6B8c7C00aA7F060a2BEDeE6b11927CC9c3eF1); - configureMessager(CHAINID_BASE, MessagerType.LayerzeroType, 0x61B6B8c7C00aA7F060a2BEDeE6b11927CC9c3eF1); - configureMessager(CHAINID_OP, MessagerType.LayerzeroType, 0x61B6B8c7C00aA7F060a2BEDeE6b11927CC9c3eF1); - configureMessager(CHAINID_GNOSIS, MessagerType.LayerzeroType, 0x3F7DF5866591e7E48D18C8EbeAE61Bc343a63283); - configureMessager(CHAINID_MANTLE, MessagerType.LayerzeroType, 0x61B6B8c7C00aA7F060a2BEDeE6b11927CC9c3eF1); - configureMessager(CHAINID_SCROLL, MessagerType.LayerzeroType, 0x463D1730a8527CA58d48EF70C7460B9920346567); - configureMessager(CHAINID_POLYGON_ZKEVM, MessagerType.LayerzeroType, 0x61B6B8c7C00aA7F060a2BEDeE6b11927CC9c3eF1); - configureMessager(CHAINID_BLAST, MessagerType.LayerzeroType, 0x8A87497488073307E1a17e8A12475a94Afcb413f); - configureMessager(CHAINID_BLAST, MessagerType.MsgportType, 0x98982b1685a63596834a05C1288dA7fbF27d684E); - configureMessager(CHAINID_ASTAR_ZKEVM, MessagerType.LayerzeroType, 0x61B6B8c7C00aA7F060a2BEDeE6b11927CC9c3eF1); - - - configureTokenInfo(CHAINID_ETHEREUM, "ring", 0x9469D013805bFfB7D3DEBe5E7839237e535ec483, 18); - configureTokenInfo(CHAINID_ARBITRUM, "usdt", 0xFd086bC7CD5C481DCC9C85ebE478A1C0b69FCbb9, 6); - configureTokenInfo(CHAINID_ARBITRUM, "usdc", 0xFF970A61A04b1cA14834A43f5dE4533eBDDB5CC8, 6); - configureTokenInfo(CHAINID_ARBITRUM, "ring", 0x9e523234D36973f9e38642886197D023C88e307e, 18); - configureTokenInfo(CHAINID_POLYGON_POS, "usdt", 0xc2132D05D31c914a87C6611C10748AEb04B58e8F, 6); - configureTokenInfo(CHAINID_POLYGON_POS, "ring", 0x9C1C23E60B72Bc88a043bf64aFdb16A02540Ae8f, 18); - configureTokenInfo(CHAINID_BSC, "usdt", 0x55d398326f99059fF775485246999027B3197955, 18); - configureTokenInfo(CHAINID_BSC, "usdc", 0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d, 18); - configureTokenInfo(CHAINID_LINEA, "usdt", 0xA219439258ca9da29E9Cc4cE5596924745e12B93, 6); - configureTokenInfo(CHAINID_BASE, "usdc", 0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913, 6); - configureTokenInfo(CHAINID_OP, "usdt", 0x94b008aA00579c1307B0EF2c499aD98a8ce58e58, 6); - configureTokenInfo(CHAINID_GNOSIS, "usdt", 0x4ECaBa5870353805a9F068101A40E0f32ed605C6, 6); - configureTokenInfo(CHAINID_MANTLE, "usdt", 0x201EBa5CC46D216Ce6DC03F6a759e8E766e956aE, 6); - configureTokenInfo(CHAINID_MANTLE, "usdc", 0x09Bc4E0D864854c6aFB6eB9A9cdF58aC190D0dF9, 6); - configureTokenInfo(CHAINID_SCROLL, "usdt", 0xf55BEC9cafDbE8730f096Aa55dad6D22d44099Df, 6); - configureTokenInfo(CHAINID_SCROLL, "usdc", 0x06eFdBFf2a14a7c8E15944D1F4A48F9F95F663A4, 6); - configureTokenInfo(CHAINID_POLYGON_ZKEVM, "usdt", 0x1E4a5963aBFD975d8c9021ce480b42188849D41d, 6); - configureTokenInfo(CHAINID_BLAST, "usdb", 0x4300000000000000000000000000000000000003, 6); - configureTokenInfo(CHAINID_ASTAR_ZKEVM, "usdt", 0x493257fD37EDB34451f62EDf8D2a0C418852bA4C, 6); - configureTokenInfo(CHAINID_ASTAR_ZKEVM, "usdc", 0x3355df6D4c9C3035724Fd0e3914dE96A5a83aaf4, 6); + string[2] memory chains = ["arbitrum", "astar-zkevm"]; + for (uint i = 0; i < chains.length; i++) { + readConfig(chains[i]); + } + } + + function readConfig(string memory chainName) public { + allChainNames.push(chainName); + string memory root = vm.projectRoot(); + string memory config = vm.readFile(string.concat(root, "/script/config/", chainName, ".toml")); + uint256 chainId = config.readUint(".base.chainId"); + address deployer = config.readAddress(".base.deployer"); + address bridger = config.readAddress(".base.bridgev3"); + bridgerInfos[chainId] = BridgeInfo(chainName, chainId, deployer, bridger); + + string[] memory messagerNames = config.readStringArray(".messager.messagers.types"); + for (uint i = 0; i < messagerNames.length; i++) { + string memory messagerName = messagerNames[i]; + MessagerType messagerType = messagerName2messagerType[messagerName]; + string memory channelIdKey = string.concat(".messager.", messagerName, ".id"); + string memory channelAddressKey = string.concat(".messager.", messagerName, ".messager"); + uint256 lzChainId = config.readUint(channelIdKey); + address messager = config.readAddress(channelAddressKey); + configureMessager(chainId, lzChainId, messagerType, messager); + } + string[] memory tokenSymbols = config.readStringArray(".token.symbols.symbols"); + for (uint i = 0; i < tokenSymbols.length; i++) { + string memory symbol = tokenSymbols[i]; + string memory tokenAddressKey = string.concat(".token.", symbol, ".address"); + string memory tokenDecimalsKey = string.concat(".token.", symbol, ".decimals"); + address tokenAddress = config.readAddress(tokenAddressKey); + uint8 tokenDecimals = uint8(config.readUint(tokenDecimalsKey)); + configureTokenInfo(chainId, symbol, tokenAddress, tokenDecimals); + } } - function configureMessager(uint256 chainId, MessagerType messagerType, address messagerAddress) internal { + function configureMessager(uint256 chainId, uint256 lzChainId, MessagerType messagerType, address messagerAddress) internal { bytes32 key = keccak256(abi.encodePacked(chainId, messagerType)); - messagers[key] = messagerAddress; + messagers[key] = MessagerInfo(messagerAddress, lzChainId); } function configureTokenInfo(uint256 chainId, string memory symbol, address token, uint8 decimals) internal { @@ -239,7 +175,7 @@ contract LnBridgeV3Base is Base { tokens[key] = TokenInfo(token, decimals, symbol, true); } - function getMessagerFromConfigure(uint256 chainId, MessagerType messagerType) public view returns(address messager) { + function getMessagerFromConfigure(uint256 chainId, MessagerType messagerType) public view returns(MessagerInfo memory messager) { bytes32 key = keccak256(abi.encodePacked(chainId, messagerType)); messager = messagers[key]; } @@ -250,9 +186,9 @@ contract LnBridgeV3Base is Base { } function getMessager(uint256 fromChain, uint256 toChain) public view returns(address sender, address receiver) { - address lnv3BridgeAddress = lnBridgeAddresses[fromChain]; - require(lnv3BridgeAddress != address(0), "the chain has no lnv3bridge"); - ILnv3Bridge.MessagerService memory service = ILnv3Bridge(lnv3BridgeAddress).messagers(toChain); + BridgeInfo memory bridgeInfo = bridgerInfos[fromChain]; + require(bridgeInfo.bridger != address(0), "the chain has no lnv3bridge"); + ILnv3Bridge.MessagerService memory service = ILnv3Bridge(bridgeInfo.bridger).messagers(toChain); sender = service.sendService; receiver = service.receiveService; } @@ -268,49 +204,54 @@ contract LnBridgeV3Base is Base { // the proposol method // connect messager to remote chain - function connectMessager(uint256 remoteChainId, MessagerType messagerType) public { + function connectMessager(string memory remoteName, string memory messagerName) public { + uint256 remoteChainId = chainName2chainId[remoteName]; uint256 localChainId = block.chainid; - address localMessager = getMessagerFromConfigure(localChainId, messagerType); - require(localMessager != address(0), "local messager not exist"); - address remoteMessager = getMessagerFromConfigure(remoteChainId, messagerType); - require(remoteMessager != address(0), "remote messager not exist"); + MessagerType messagerType = messagerName2messagerType[messagerName]; + + MessagerInfo memory localMessager = getMessagerFromConfigure(localChainId, messagerType); + require(localMessager.messager != address(0), "local messager not exist"); + MessagerInfo memory remoteMessager = getMessagerFromConfigure(remoteChainId, messagerType); + require(remoteMessager.messager != address(0), "remote messager not exist"); if (messagerType == MessagerType.LayerzeroType) { - uint16 lzRemoteChainId = lzChainIds[remoteChainId]; + uint16 lzRemoteChainId = uint16(remoteMessager.chainId); require(lzRemoteChainId != 0, "invalid lzchainid"); - ILayerZeroMessager.RemoteMessager memory oldMessager = ILayerZeroMessager(localMessager).remoteMessagers(remoteChainId); + ILayerZeroMessager.RemoteMessager memory oldMessager = ILayerZeroMessager(localMessager.messager).remoteMessagers(remoteChainId); // if the same configure, don't send tx - if (oldMessager.lzRemoteChainId == lzRemoteChainId && oldMessager.messager == remoteMessager) { + if (oldMessager.lzRemoteChainId == lzRemoteChainId && oldMessager.messager == remoteMessager.messager) { return; } - ILayerZeroMessager(localMessager).setRemoteMessager(remoteChainId, lzRemoteChainId, remoteMessager); + ILayerZeroMessager(localMessager.messager).setRemoteMessager(remoteChainId, lzRemoteChainId, remoteMessager.messager); } else if(messagerType == MessagerType.MsgportType) { - IMsgportMessager.RemoteMessager memory oldMessager = IMsgportMessager(localMessager).remoteMessagers(remoteChainId); + IMsgportMessager.RemoteMessager memory oldMessager = IMsgportMessager(localMessager.messager).remoteMessagers(remoteChainId); // if the same configure, don't send tx - if (oldMessager.messager == remoteMessager) { + if (oldMessager.messager == remoteMessager.messager) { return; } - IMsgportMessager(localMessager).setRemoteMessager(remoteChainId, remoteChainId, remoteMessager); + IMsgportMessager(localMessager.messager).setRemoteMessager(remoteChainId, remoteChainId, remoteMessager.messager); } } // connect lnbridge - function connectBridge(uint256 remoteChainId, MessagerType messagerType) public { + function connectBridge(string memory remoteName, string memory messagerName) public { + uint256 remoteChainId = chainName2chainId[remoteName]; + MessagerType messagerType = messagerName2messagerType[messagerName]; uint256 localChainId = block.chainid; - address localBridge = lnBridgeAddresses[localChainId]; - require(localBridge != address(0), "invalid local bridge"); - address remoteBridge = lnBridgeAddresses[remoteChainId]; - require(remoteBridge != address(0), "invalid remote bridge"); + BridgeInfo memory localBridge = bridgerInfos[localChainId]; + require(localBridge.bridger != address(0), "invalid local bridge"); + BridgeInfo memory remoteBridge = bridgerInfos[remoteChainId]; + require(remoteBridge.bridger != address(0), "invalid remote bridge"); - address localMessager = getMessagerFromConfigure(localChainId, messagerType); - require(localMessager != address(0), "local message not exist"); + MessagerInfo memory localMessager = getMessagerFromConfigure(localChainId, messagerType); + require(localMessager.messager != address(0), "local message not exist"); (address sender, address receiver) = getMessager(localChainId, remoteChainId); - if (sender != localMessager) { - ILnv3Bridge(localBridge).setSendService(remoteChainId, remoteBridge, localMessager); + if (sender != localMessager.messager) { + ILnv3Bridge(localBridge.bridger).setSendService(remoteChainId, remoteBridge.bridger, localMessager.messager); } - if (receiver != localMessager) { - ILnv3Bridge(localBridge).setReceiveService(remoteChainId, remoteBridge, localMessager); + if (receiver != localMessager.messager) { + ILnv3Bridge(localBridge.bridger).setReceiveService(remoteChainId, remoteBridge.bridger, localMessager.messager); } } @@ -328,19 +269,19 @@ contract LnBridgeV3Base is Base { TokenInfo memory remoteInfo = getTokenFromConfigure(remoteChainId, remoteSymbol); require(remoteInfo.configured, "remote token not exist"); - address localBridge = lnBridgeAddresses[localChainId]; - require(localBridge != address(0), "invalid local bridge"); - bytes32 key = ILnv3Bridge(localBridge).getTokenKey(remoteChainId, localInfo.token, remoteInfo.token); - ILnv3Bridge.TokenInfo memory tokenInfo = ILnv3Bridge(localBridge).tokenInfos(key); + BridgeInfo memory localBridge = bridgerInfos[localChainId]; + require(localBridge.bridger != address(0), "invalid local bridge"); + bytes32 key = ILnv3Bridge(localBridge.bridger).getTokenKey(remoteChainId, localInfo.token, remoteInfo.token); + ILnv3Bridge.TokenInfo memory tokenInfo = ILnv3Bridge(localBridge.bridger).tokenInfos(key); // has been registered if (tokenInfo.index > 0) { return; } uint32 index = 1; - while (ILnv3Bridge(localBridge).tokenIndexer(index) != bytes32(0)) { + while (ILnv3Bridge(localBridge.bridger).tokenIndexer(index) != bytes32(0)) { index += 1; } - ILnv3Bridge(localBridge).registerTokenInfo( + ILnv3Bridge(localBridge.bridger).registerTokenInfo( remoteChainId, localInfo.token, remoteInfo.token, diff --git a/script/config/arbitrum.toml b/script/config/arbitrum.toml new file mode 100644 index 0000000..f601ca9 --- /dev/null +++ b/script/config/arbitrum.toml @@ -0,0 +1,37 @@ +[base] +name = "arbitrum" +chainId = 42161 +deployer = "0x80D4c766C5142D1313D531Afe7384D0D5E108Db3" +bridgev3 = "0xbA5D580B18b6436411562981e02c8A9aA1776D10" + +[messager] +[messager.messagers] +types = ["layerzero", "eth2arb", "msgport"] + +[messager.layerzero] +id = 110 +messager = "0x509354A4ebf98aCC7a65d2264694A65a2938cac9" + +[messager.eth2arb] +id = 42161 +messager = "0xc95D939Da72ECe8Bd794d42EaEd28974CDb0ADa2" + +[messager.msgport] +id = 42161 +messager = "0x65Be094765731F394bc6d9DF53bDF3376F1Fc8B0" + +[token] +[token.symbols] +symbols = ["ring", "usdt", "usdc"] + +[token.ring] +address = "0x9e523234D36973f9e38642886197D023C88e307e" +decimals = 18 + +[token.usdt] +address = "0xFd086bC7CD5C481DCC9C85ebE478A1C0b69FCbb9" +decimals = 6 + +[token.usdc] +address = "0xFF970A61A04b1cA14834A43f5dE4533eBDDB5CC8" +decimals = 6 diff --git a/script/config/astar-zkevm.toml b/script/config/astar-zkevm.toml new file mode 100644 index 0000000..925b9d0 --- /dev/null +++ b/script/config/astar-zkevm.toml @@ -0,0 +1,25 @@ +[base] +name = "astar-zkevm" +chainId = 3776 +deployer = "0x9bc1C7567DDBcaF2212185b6665D755d842d01E4" +bridgev3 = "0xD476650e03a45E70202b0bcAfa04E1513920f83a" + +[messager] +[messager.messagers] +types = ["layerzero"] + +[messager.layerzero] +id = 257 +messager = "0x61B6B8c7C00aA7F060a2BEDeE6b11927CC9c3eF1" + +[token] +[token.symbols] +symbols = ["usdt", "usdc"] + +[token.usdt] +address = "0x493257fD37EDB34451f62EDf8D2a0C418852bA4C" +decimals = 6 + +[token.usdc] +address = "0x3355df6D4c9C3035724Fd0e3914dE96A5a83aaf4" +decimals = 6 diff --git a/script/config/base.toml b/script/config/base.toml new file mode 100644 index 0000000..b47e7c8 --- /dev/null +++ b/script/config/base.toml @@ -0,0 +1,21 @@ +[base] +name = "base" +chainId = 8453 +deployer = "0x80D4c766C5142D1313D531Afe7384D0D5E108Db3" +bridgev3 = "0xbA5D580B18b6436411562981e02c8A9aA1776D10" + +[messager] +[messager.messagers] +types = ["layerzero"] + +[messager.layerzero] +id = 184 +messager = "0x61B6B8c7C00aA7F060a2BEDeE6b11927CC9c3eF1" + +[token] +[token.symbols] +symbols = ["usdc"] + +[token.usdc] +address = "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913" +decimals = 6 diff --git a/script/config/blast.toml b/script/config/blast.toml new file mode 100644 index 0000000..4b5f7cc --- /dev/null +++ b/script/config/blast.toml @@ -0,0 +1,26 @@ +[base] +name = "blast" +chainId = 81457 +deployer = "0x9bc1C7567DDBcaF2212185b6665D755d842d01E4" +bridgev3 = "0xB180D7DcB5CC161C862aD60442FA37527546cAFC" + +[messager] +[messager.messagers] +types = ["layerzero", "msgport"] + +[messager.layerzero] +id = 243 +messager = "0x8A87497488073307E1a17e8A12475a94Afcb413f" + +[messager.msgport] +id = 81457 +messager = "0x98982b1685a63596834a05C1288dA7fbF27d684E" + +[token] +[token.symbols] +symbols = ["usdb"] + +[token.usdb] +address = "0x4300000000000000000000000000000000000003" +decimals = 6 + diff --git a/script/config/bsc.toml b/script/config/bsc.toml new file mode 100644 index 0000000..3bdebed --- /dev/null +++ b/script/config/bsc.toml @@ -0,0 +1,25 @@ +[base] +name = "bsc" +chainId = 56 +deployer = "0x80D4c766C5142D1313D531Afe7384D0D5E108Db3" +bridgev3 = "0xbA5D580B18b6436411562981e02c8A9aA1776D10" + +[messager] +[messager.messagers] +types = ["layerzero"] + +[messager.layerzero] +id = 102 +messager = "0x61B6B8c7C00aA7F060a2BEDeE6b11927CC9c3eF1" + +[token] +[token.symbols] +symbols = ["usdt", "usdc"] + +[token.usdt] +address = "0x55d398326f99059fF775485246999027B3197955" +decimals = 18 + +[token.usdc] +address = "0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d" +decimals = 18 diff --git a/script/config/ethereum.toml b/script/config/ethereum.toml new file mode 100644 index 0000000..e79c399 --- /dev/null +++ b/script/config/ethereum.toml @@ -0,0 +1,25 @@ +[base] +name = "ethereum" +chainId = 1 +deployer = "0x80D4c766C5142D1313D531Afe7384D0D5E108Db3" +bridgev3 = "0xbA5D580B18b6436411562981e02c8A9aA1776D10" + +[messager] +[messager.messagers] +types = ["layerzero", "eth2arb"] + +[messager.layerzero] +id = 101 +messager = "0x65Be094765731F394bc6d9DF53bDF3376F1Fc8B0" + +[messager.eth2arb] +id = 1 +messager = "0x78a6831Da2293fbEFd0d8aFB4D1f7CBB751e0119" + +[token] +[token.symbols] +symbols = ["ring"] + +[token.ring] +address = "0x9469D013805bFfB7D3DEBe5E7839237e535ec483" +decimals = 18 diff --git a/script/config/gnosis.toml b/script/config/gnosis.toml new file mode 100644 index 0000000..32fdb99 --- /dev/null +++ b/script/config/gnosis.toml @@ -0,0 +1,25 @@ +[base] +name = "gnosis" +chainId = 100 +deployer = "0x80D4c766C5142D1313D531Afe7384D0D5E108Db3" +bridgev3 = "0xbA5D580B18b6436411562981e02c8A9aA1776D10" + +[messager] +[messager.messagers] +types = ["layerzero"] + +[messager.layerzero] +id = 145 +messager = "0x3F7DF5866591e7E48D18C8EbeAE61Bc343a63283" + +[token] +[token.symbols] +symbols = ["usdt", "usdc"] + +[token.usdt] +address = "0x4ECaBa5870353805a9F068101A40E0f32ed605C6" +decimals = 6 + +[token.usdc] +address = "0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d" +decimals = 6 diff --git a/script/config/linea.toml b/script/config/linea.toml new file mode 100644 index 0000000..6cea25b --- /dev/null +++ b/script/config/linea.toml @@ -0,0 +1,21 @@ +[base] +name = "linea" +chainId = 59144 +deployer = "0x80D4c766C5142D1313D531Afe7384D0D5E108Db3" +bridgev3 = "0xbA5D580B18b6436411562981e02c8A9aA1776D10" + +[messager] +[messager.messagers] +types = ["layerzero"] + +[messager.layerzero] +id = 183 +messager = "0x61B6B8c7C00aA7F060a2BEDeE6b11927CC9c3eF1" + +[token] +[token.symbols] +symbols = ["usdt"] + +[token.usdt] +address = "0xA219439258ca9da29E9Cc4cE5596924745e12B93" +decimals = 6 diff --git a/script/config/mantle.toml b/script/config/mantle.toml new file mode 100644 index 0000000..a423bcd --- /dev/null +++ b/script/config/mantle.toml @@ -0,0 +1,25 @@ +[base] +name = "mantle" +chainId = 5000 +deployer = "0x80D4c766C5142D1313D531Afe7384D0D5E108Db3" +bridgev3 = "0xbA5D580B18b6436411562981e02c8A9aA1776D10" + +[messager] +[messager.messagers] +types = ["layerzero"] + +[messager.layerzero] +id = 181 +messager = "0x61B6B8c7C00aA7F060a2BEDeE6b11927CC9c3eF1" + +[token] +[token.symbols] +symbols = ["usdt", "usdc"] + +[token.usdt] +address = "0x201EBa5CC46D216Ce6DC03F6a759e8E766e956aE" +decimals = 6 + +[token.usdc] +address = "0x09Bc4E0D864854c6aFB6eB9A9cdF58aC190D0dF9" +decimals = 6 diff --git a/script/config/optimistic.toml b/script/config/optimistic.toml new file mode 100644 index 0000000..e409cb4 --- /dev/null +++ b/script/config/optimistic.toml @@ -0,0 +1,21 @@ +[base] +name = "optimistic" +chainId = 10 +deployer = "0x80D4c766C5142D1313D531Afe7384D0D5E108Db3" +bridgev3 = "0xbA5D580B18b6436411562981e02c8A9aA1776D10" + +[messager] +[messager.messagers] +types = ["layerzero"] + +[messager.layerzero] +id = 111 +messager = "0x61B6B8c7C00aA7F060a2BEDeE6b11927CC9c3eF1" + +[token] +[token.symbols] +symbols = ["usdt"] + +[token.usdt] +address = "0x94b008aA00579c1307B0EF2c499aD98a8ce58e58" +decimals = 6 diff --git a/script/config/polygon-pos.toml b/script/config/polygon-pos.toml new file mode 100644 index 0000000..bc19762 --- /dev/null +++ b/script/config/polygon-pos.toml @@ -0,0 +1,25 @@ +[base] +name = "polygon-pos" +chainId = 137 +deployer = "0x80D4c766C5142D1313D531Afe7384D0D5E108Db3" +bridgev3 = "0xbA5D580B18b6436411562981e02c8A9aA1776D10" + +[messager] +[messager.messagers] +types = ["layerzero"] + +[messager.layerzero] +id = 109 +messager = "0x463D1730a8527CA58d48EF70C7460B9920346567" + +[token] +[token.symbols] +symbols = ["usdt", "ring"] + +[token.usdt] +address = "0xc2132D05D31c914a87C6611C10748AEb04B58e8F" +decimals = 6 + +[token.ring] +address = "0x9C1C23E60B72Bc88a043bf64aFdb16A02540Ae8f" +decimals = 18 diff --git a/script/config/polygon-zkevm.toml b/script/config/polygon-zkevm.toml new file mode 100644 index 0000000..431c87d --- /dev/null +++ b/script/config/polygon-zkevm.toml @@ -0,0 +1,21 @@ +[base] +name = "polygon-zkevm" +chainId = 1101 +deployer = "0x80D4c766C5142D1313D531Afe7384D0D5E108Db3" +bridgev3 = "0xbA5D580B18b6436411562981e02c8A9aA1776D10" + +[messager] +[messager.messagers] +types = ["layerzero"] + +[messager.layerzero] +id = 158 +messager = "0x61B6B8c7C00aA7F060a2BEDeE6b11927CC9c3eF1" + +[token] +[token.symbols] +symbols = ["usdt"] + +[token.usdt] +address = "0x1E4a5963aBFD975d8c9021ce480b42188849D41d" +decimals = 6 diff --git a/script/config/scroll.toml b/script/config/scroll.toml new file mode 100644 index 0000000..15e9b4c --- /dev/null +++ b/script/config/scroll.toml @@ -0,0 +1,25 @@ +[base] +name = "scroll" +chainId = 534352 +deployer = "0x80D4c766C5142D1313D531Afe7384D0D5E108Db3" +bridgev3 = "0xbA5D580B18b6436411562981e02c8A9aA1776D10" + +[messager] +[messager.messagers] +types = ["layerzero"] + +[messager.layerzero] +id = 214 +messager = "0x463D1730a8527CA58d48EF70C7460B9920346567" + +[token] +[token.symbols] +symbols = ["usdt"] + +[token.usdt] +address = "0xf55BEC9cafDbE8730f096Aa55dad6D22d44099Df" +decimals = 6 + +[token.usdc] +address = "0x06eFdBFf2a14a7c8E15944D1F4A48F9F95F663A4" +decimals = 6 From ed03009e40c2da49704562d48d7c19f375081852 Mon Sep 17 00:00:00 2001 From: xiaoch05 Date: Tue, 14 May 2024 11:45:51 +0800 Subject: [PATCH 6/9] update helix --- lib/@helix/contracts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/@helix/contracts b/lib/@helix/contracts index 036054c..77d89f5 160000 --- a/lib/@helix/contracts +++ b/lib/@helix/contracts @@ -1 +1 @@ -Subproject commit 036054c8f010a4dc892a8e8e9d46b4210e5f7fcf +Subproject commit 77d89f5ea107213ca8f44f01f5545ec7fb9e6561 From 7cae12d8027d6654fc42f14d363575ad6df59612 Mon Sep 17 00:00:00 2001 From: xiaoch05 Date: Tue, 14 May 2024 11:56:23 +0800 Subject: [PATCH 7/9] restore forge-std --- lib/forge-std | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/forge-std b/lib/forge-std index 978ac6f..f73c73d 160000 --- a/lib/forge-std +++ b/lib/forge-std @@ -1 +1 @@ -Subproject commit 978ac6fadb62f5f0b723c996f64be52eddba6801 +Subproject commit f73c73d2018eb6a111f35e4dae7b4f27401e9421 From 775d0c727b07ff90b6cfd72b1e765ad0b7c0afa2 Mon Sep 17 00:00:00 2001 From: xiaoch05 Date: Tue, 14 May 2024 12:37:20 +0800 Subject: [PATCH 8/9] upgrade forge-std --- lib/forge-std | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/forge-std b/lib/forge-std index f73c73d..978ac6f 160000 --- a/lib/forge-std +++ b/lib/forge-std @@ -1 +1 @@ -Subproject commit f73c73d2018eb6a111f35e4dae7b4f27401e9421 +Subproject commit 978ac6fadb62f5f0b723c996f64be52eddba6801 From 433b4273bab9753b0ba407fea56f2476fb980992 Mon Sep 17 00:00:00 2001 From: xiaoch05 Date: Tue, 14 May 2024 16:16:26 +0800 Subject: [PATCH 9/9] accept ownership --- foundry.toml | 9 +++++ lib/sphinx | 2 +- package.json | 2 +- script/5_AcceptOwnership.s.sol | 12 ++++++ script/5_ConnectBaseNetwork.s.sol | 28 ------------- script/common/Base.sol | 12 +----- script/common/LnBridgeV3Base.s.sol | 35 ++++++++++++---- script/common/Proposal.s.sol | 4 +- script/config/darwinia.toml | 17 ++++++++ script/config/polygon-pos.toml | 4 ++ sphinx.lock | 65 ++++++++++++++++++++++++++++++ yarn.lock | 30 +++++++------- 12 files changed, 154 insertions(+), 66 deletions(-) create mode 100644 script/5_AcceptOwnership.s.sol delete mode 100644 script/5_ConnectBaseNetwork.s.sol create mode 100644 script/config/darwinia.toml create mode 100644 sphinx.lock diff --git a/foundry.toml b/foundry.toml index 2cca130..2623b55 100644 --- a/foundry.toml +++ b/foundry.toml @@ -7,6 +7,7 @@ evm_version = "london" fs_permissions=[ {access="read", path="./out"}, {access="read", path= "./script/config" }, + {access="read", path= "./sphinx.lock" }, {access="read-write", path="./cache"}, ] allow_paths = ["../.."] @@ -21,3 +22,11 @@ arbitrum = "https://arb1.arbitrum.io/rpc" linea = "https://rpc.linea.build" ethereum = "https://rpc.ankr.com/eth" blast = "https://rpc.blast.io" +polygon-zkevm = "https://zkevm-rpc.com" +darwinia = "https://rpc.darwinia.network" +bsc = "https://rpc.ankr.com/bsc" +base = "https://mainnet.base.org" +gnosis = "https://rpc.gnosischain.com" +mantle = "https://rpc.mantle.xyz" +scroll = "https://rpc.scroll.io" +astar-zkevm = "https://rpc.startale.com/astar-zkevm" diff --git a/lib/sphinx b/lib/sphinx index a247bb2..07e7ada 160000 --- a/lib/sphinx +++ b/lib/sphinx @@ -1 +1 @@ -Subproject commit a247bb2df88fa6a245b8f3e595049342107be743 +Subproject commit 07e7adab18e297458b58d02ba4d894c8b481f939 diff --git a/package.json b/package.json index 286f7ad..3d85075 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,5 @@ { "devDependencies": { - "@sphinx-labs/plugins": "0.31.8" + "@sphinx-labs/plugins": "0.32.2" } } diff --git a/script/5_AcceptOwnership.s.sol b/script/5_AcceptOwnership.s.sol new file mode 100644 index 0000000..9b24160 --- /dev/null +++ b/script/5_AcceptOwnership.s.sol @@ -0,0 +1,12 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {LnBridgeV3Base} from "./common/LnBridgeV3Base.s.sol"; +import {safeconsole} from "forge-std/safeconsole.sol"; + +contract AcceptOwnership5 is LnBridgeV3Base { + function run() public sphinx { + initLnBridgeAddress(); + acceptOwnership(); + } +} diff --git a/script/5_ConnectBaseNetwork.s.sol b/script/5_ConnectBaseNetwork.s.sol deleted file mode 100644 index fa2dc3e..0000000 --- a/script/5_ConnectBaseNetwork.s.sol +++ /dev/null @@ -1,28 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {LnBridgeV3Base} from "./common/LnBridgeV3Base.s.sol"; -import {safeconsole} from "forge-std/safeconsole.sol"; - -contract ConnectBaseNetwork is LnBridgeV3Base { - function run() public sphinx { - initLnBridgeAddress(); - uint256 localChainId = block.chainid; - uint256 CHAINID_BASE = chainName2chainId["base"]; - uint256 CHAINID_ETHEREUM = chainName2chainId["ethereum"]; - if (localChainId == CHAINID_BASE) { - for (uint idx = 0; idx < allChainNames.length; idx++) { - string memory remoteChainName = allChainNames[idx]; - uint256 remoteChainId = chainName2chainId[remoteChainName]; - if (remoteChainId == CHAINID_ETHEREUM) { - continue; - } - connectMessager(remoteChainName, "layerzero"); - connectBridge(remoteChainName, "layerzero"); - } - } else { - connectMessager("base", "layerzero"); - connectBridge("base", "layerzero"); - } - } -} diff --git a/script/common/Base.sol b/script/common/Base.sol index 3095d36..c8386f8 100644 --- a/script/common/Base.sol +++ b/script/common/Base.sol @@ -6,17 +6,7 @@ import "@sphinx-labs/contracts/SphinxPlugin.sol"; contract Base is Sphinx, Script { function configureSphinx() public override { - sphinxConfig.owners = [ - 0x0f14341A7f464320319025540E8Fe48Ad0fe5aec, // Echo - 0x00E3993566b34e5367d1C602439997BD08c11FF7, // Alex - 0x52386BE2397e8EAc26298F733b390684203fB580, // Denny - 0xe59261f6D4088BcD69985A3D369Ff14cC54EF1E5, // Ranji - 0x88a39B052d477CfdE47600a7C9950a441Ce61cb4 // Xiaoch - ]; - sphinxConfig.orgId = "cluanacaw000111jik4xs4wkl"; - sphinxConfig.threshold = 3; sphinxConfig.projectName = "Helix-DAO"; - // sphinxConfig.mainnets = ["polygon", "arbitrum", "optimism", "mantle"]; - sphinxConfig.mainnets = ["linea", "polygon", "arbitrum", "optimism", "blast"]; + sphinxConfig.mainnets = ["darwinia", "bsc", "base", "gnosis", "mantle", "scroll", "astar-zkevm", "polygon-zkevm"]; } } diff --git a/script/common/LnBridgeV3Base.s.sol b/script/common/LnBridgeV3Base.s.sol index 910401c..d38a611 100644 --- a/script/common/LnBridgeV3Base.s.sol +++ b/script/common/LnBridgeV3Base.s.sol @@ -3,6 +3,7 @@ pragma solidity ^0.8.0; import {Base} from "./Base.sol"; import {stdToml} from "forge-std/StdToml.sol"; +import {console} from "forge-std/console.sol"; import "./LnBridgeV3.sol"; interface Create2Deploy { @@ -43,6 +44,9 @@ interface ILnv3Bridge { uint8 targetDecimals, uint32 index ) external; + function dao() view external returns(address); + function pendingDao() view external returns(address); + function acceptOwnership() external; } interface IErc20 { @@ -129,7 +133,11 @@ contract LnBridgeV3Base is Base { } function initLnBridgeAddress() public { - string[2] memory chains = ["arbitrum", "astar-zkevm"]; + messagerName2messagerType['layerzero'] = MessagerType.LayerzeroType; + messagerName2messagerType['msgport'] = MessagerType.MsgportType; + messagerName2messagerType['eth2arb'] = MessagerType.Eth2ArbType; + + string[14] memory chains = ["arbitrum", "astar-zkevm", "base", "blast", "bsc", "ethereum", "gnosis", "linea", "mantle", "optimistic", "polygon-pos", "polygon-zkevm", "scroll", "darwinia"]; for (uint i = 0; i < chains.length; i++) { readConfig(chains[i]); } @@ -140,6 +148,7 @@ contract LnBridgeV3Base is Base { string memory root = vm.projectRoot(); string memory config = vm.readFile(string.concat(root, "/script/config/", chainName, ".toml")); uint256 chainId = config.readUint(".base.chainId"); + chainName2chainId[chainName] = chainId; address deployer = config.readAddress(".base.deployer"); address bridger = config.readAddress(".base.bridgev3"); bridgerInfos[chainId] = BridgeInfo(chainName, chainId, deployer, bridger); @@ -150,9 +159,9 @@ contract LnBridgeV3Base is Base { MessagerType messagerType = messagerName2messagerType[messagerName]; string memory channelIdKey = string.concat(".messager.", messagerName, ".id"); string memory channelAddressKey = string.concat(".messager.", messagerName, ".messager"); - uint256 lzChainId = config.readUint(channelIdKey); + uint256 msgChainId = config.readUint(channelIdKey); address messager = config.readAddress(channelAddressKey); - configureMessager(chainId, lzChainId, messagerType, messager); + configureMessager(chainId, msgChainId, messagerType, messager); } string[] memory tokenSymbols = config.readStringArray(".token.symbols.symbols"); for (uint i = 0; i < tokenSymbols.length; i++) { @@ -293,8 +302,18 @@ contract LnBridgeV3Base is Base { ); } + function acceptOwnership() public { + address dao = safeAddress(); + uint256 localChainId = block.chainid; + BridgeInfo memory localBridge = bridgerInfos[localChainId]; + if (dao == ILnv3Bridge(localBridge.bridger).pendingDao()) { + ILnv3Bridge(localBridge.bridger).acceptOwnership(); + } + require(ILnv3Bridge(localBridge.bridger).dao() == dao, "failed"); + } + // deploy proxy admin - function deployProxyAdmin() external returns(address) { + function deployProxyAdmin() public returns(address) { bytes memory byteCode = type(HelixProxyAdmin).creationCode; address dao = safeAddress(); bytes memory initCode = bytes.concat(byteCode, abi.encode(dao)); @@ -307,7 +326,7 @@ contract LnBridgeV3Base is Base { } // deploy msgport messager - function deployMsgportMessager(address msgport) external returns(address) { + function deployMsgportMessager(address msgport) public returns(address) { bytes memory byteCode = type(MsgportMessager).creationCode; address dao = safeAddress(); bytes memory initCode = bytes.concat(byteCode, abi.encode(dao, msgport)); @@ -320,7 +339,7 @@ contract LnBridgeV3Base is Base { } // deploy layerzero messager - function deployLayerzeroMessager(address endpoint) external returns(address) { + function deployLayerzeroMessager(address endpoint) public returns(address) { bytes memory byteCode = type(LayerZeroMessager).creationCode; address dao = safeAddress(); bytes memory initCode = bytes.concat(byteCode, abi.encode(dao, endpoint)); @@ -333,7 +352,7 @@ contract LnBridgeV3Base is Base { } // deploy lnv3 logic - function deployLnBridgeV3Logic() external returns(address) { + function deployLnBridgeV3Logic() public returns(address) { bytes memory byteCode = type(HelixLnBridgeV3).creationCode; address expectedAddress = create2address(salt, keccak256(byteCode)); if (expectedAddress.code.length == 0) { @@ -344,7 +363,7 @@ contract LnBridgeV3Base is Base { } // deploy lnv3 proxy - function deployLnBridgeV3Proxy(address logicAddress, address proxyAdminAddress) external returns(address) { + function deployLnBridgeV3Proxy(address logicAddress, address proxyAdminAddress) public returns(address) { bytes memory byteCode = type(TransparentUpgradeableProxy).creationCode; address dao = safeAddress(); bytes memory data = abi.encodeWithSelector( diff --git a/script/common/Proposal.s.sol b/script/common/Proposal.s.sol index ad5b89c..c11d237 100644 --- a/script/common/Proposal.s.sol +++ b/script/common/Proposal.s.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; -import {ConnectBaseNetwork} from "../5_ConnectBaseNetwork.s.sol"; +import {AcceptOwnership5} from "../5_AcceptOwnership.s.sol"; -contract Proposal is ConnectBaseNetwork {} +contract Proposal is AcceptOwnership5 {} diff --git a/script/config/darwinia.toml b/script/config/darwinia.toml new file mode 100644 index 0000000..3eb1170 --- /dev/null +++ b/script/config/darwinia.toml @@ -0,0 +1,17 @@ +[base] +name = "darwinia" +chainId = 46 +deployer = "0x80D4c766C5142D1313D531Afe7384D0D5E108Db3" +bridgev3 = "0xbA5D580B18b6436411562981e02c8A9aA1776D10" + +[messager] +[messager.messagers] +types = ["msgport"] + +[messager.msgport] +id = 46 +messager = "0x65Be094765731F394bc6d9DF53bDF3376F1Fc8B0" + +[token] +[token.symbols] +symbols = [] diff --git a/script/config/polygon-pos.toml b/script/config/polygon-pos.toml index bc19762..e053461 100644 --- a/script/config/polygon-pos.toml +++ b/script/config/polygon-pos.toml @@ -12,6 +12,10 @@ types = ["layerzero"] id = 109 messager = "0x463D1730a8527CA58d48EF70C7460B9920346567" +[messager.msgport] +id = 137 +messager = "0x65Be094765731F394bc6d9DF53bDF3376F1Fc8B0" + [token] [token.symbols] symbols = ["usdt", "ring"] diff --git a/sphinx.lock b/sphinx.lock new file mode 100644 index 0000000..17abe87 --- /dev/null +++ b/sphinx.lock @@ -0,0 +1,65 @@ +{ + "warning": "THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.", + "format": "sphinx-lock-1.0.0", + "orgId": "cluanacaw000111jik4xs4wkl", + "projects": { + "Msgport": { + "projectId": "cluaylqlf0002k5kx6pmfhahk", + "projectName": "Msgport", + "defaultSafe": { + "safeName": "Msgport", + "owners": [ + "0xD70A2e6eACbdeDA77a5d4bBAE3bC70239A0e088f" + ], + "threshold": "1", + "saltNonce": "0" + } + }, + "Msgport0": { + "projectId": "clujilj0600024qgyxlo4azcz", + "projectName": "Msgport0", + "defaultSafe": { + "safeName": "Msgport0", + "owners": [ + "0xD70A2e6eACbdeDA77a5d4bBAE3bC70239A0e088f", + "0x53405FB4d71591E33fe07bFbC90bD82E65720ad0", + "0x9F33a4809aA708d7a399fedBa514e0A0d15EfA85" + ], + "threshold": "2", + "saltNonce": "0" + } + }, + "Helix-DAO": { + "projectId": "cluuq5qnk00aq11u0jtehn9h2", + "projectName": "Helix-DAO", + "defaultSafe": { + "safeName": "Helix-DAO", + "owners": [ + "0x0f14341A7f464320319025540E8Fe48Ad0fe5aec", + "0x00E3993566b34e5367d1C602439997BD08c11FF7", + "0x52386BE2397e8EAc26298F733b390684203fB580", + "0xe59261f6D4088BcD69985A3D369Ff14cC54EF1E5", + "0x88a39B052d477CfdE47600a7C9950a441Ce61cb4" + ], + "threshold": "3", + "saltNonce": "0" + } + }, + "RING-DAO": { + "projectId": "clvxejg2i00000dlc6ozpfo9b", + "projectName": "RING-DAO", + "defaultSafe": { + "safeName": "RING-DAO", + "owners": [ + "0x0f14341A7f464320319025540E8Fe48Ad0fe5aec", + "0x53405FB4d71591E33fe07bFbC90bD82E65720ad0", + "0x00E3993566b34e5367d1C602439997BD08c11FF7", + "0x52386BE2397e8EAc26298F733b390684203fB580", + "0x9F33a4809aA708d7a399fedBa514e0A0d15EfA85" + ], + "threshold": "3", + "saltNonce": "0" + } + } + } +} \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index 9103d46..9544803 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1058,19 +1058,19 @@ dependencies: tslib "^2.6.2" -"@sphinx-labs/contracts@^0.21.7", "@sphinx-labs/contracts@^0.21.8": - version "0.21.8" - resolved "https://registry.yarnpkg.com/@sphinx-labs/contracts/-/contracts-0.21.8.tgz#04542167d7073f5906395edf145b0021ad8dbb53" - integrity sha512-aGVhVHezNFh+NOhnRiCI4DJiLmP8Q4OLku43ZVFTtBVFObb72rsTPfHohW1ip42KoLuqA+eHtPOu+/tal3tssw== +"@sphinx-labs/contracts@^0.22.0": + version "0.22.0" + resolved "https://registry.yarnpkg.com/@sphinx-labs/contracts/-/contracts-0.22.0.tgz#4c7a4cf5fa4d35cb95148017c701b2f944a5e6cc" + integrity sha512-P5fL9FLDAwA7z5WryU+oBZ7P9FZB38AY8QIP+o/hQJRRrWGavTCxXKVInGUTSUOdTNMVLFaO5DkZSHNUZ/pNvg== dependencies: "@openzeppelin/contracts" "4.9.3" ethers "^6.7.0" solmate "6.2.0" -"@sphinx-labs/core@^0.24.5": - version "0.24.6" - resolved "https://registry.yarnpkg.com/@sphinx-labs/core/-/core-0.24.6.tgz#361b2cb5789e504c2b91abbe9a9311de6f0f1dd8" - integrity sha512-CEXKclJdm03mXI8a1JN9RnPMYDNTaJaFdZbNznEFBk+tc/x55uFfvk1+YVVc7MGltW+tNrPzQ++mKtNBIkjwOg== +"@sphinx-labs/core@^0.25.2": + version "0.25.2" + resolved "https://registry.yarnpkg.com/@sphinx-labs/core/-/core-0.25.2.tgz#9f3da68951d3306e3b79ce82c153ecc13e959fce" + integrity sha512-MqgUonE5WdwLAbAOlMU5LJSioXfITi6Rdor+qihHCdTXuVI4yA2VuyiaJDz2L3Vho42WB5Ol0pow43rcr830dA== dependencies: "@amplitude/node" "^1.10.2" "@eth-optimism/common-ts" "^0.7.1" @@ -1079,7 +1079,7 @@ "@nomicfoundation/hardhat-verify" "^2.0.2" "@openzeppelin/hardhat-upgrades" "^1.22.1" "@openzeppelin/merkle-tree" "1.0.5" - "@sphinx-labs/contracts" "^0.21.8" + "@sphinx-labs/contracts" "^0.22.0" axios "^1.4.0" chalk "^4.1.2" core-js "^3.27.1" @@ -1095,18 +1095,18 @@ undici "^5.21.1" yesno "^0.4.0" -"@sphinx-labs/plugins@0.31.8": - version "0.31.8" - resolved "https://registry.yarnpkg.com/@sphinx-labs/plugins/-/plugins-0.31.8.tgz#0e206ef536c670c09250d746f7bb2539431d9f71" - integrity sha512-Xdi7wLv5BVCeP8DpGZaUQqeWZOfXzyE5o6XTU0JsHklm2oMYCjly30JrMe/sNIsE+W48UQvPoJVV/Q0TKIx69A== +"@sphinx-labs/plugins@0.32.2": + version "0.32.2" + resolved "https://registry.yarnpkg.com/@sphinx-labs/plugins/-/plugins-0.32.2.tgz#498e2eea2d8e1143faedf87b8399e31ca97c23f7" + integrity sha512-qP85//nIAxjlITcvggJiKBJYpoTDV78axDLQ1AOrcUzdRAXxUSuX1FtS0O2UkOf5Z6trDNIdxQTr/9AYXe+OGw== dependencies: "@eth-optimism/contracts" "^0.5.40" "@ethersproject/bignumber" "^5.7.0" "@nomicfoundation/hardhat-ethers" "^3.0.5" "@openzeppelin/contracts" "^4.8.1" "@openzeppelin/hardhat-upgrades" "^1.22.1" - "@sphinx-labs/contracts" "^0.21.7" - "@sphinx-labs/core" "^0.24.5" + "@sphinx-labs/contracts" "^0.22.0" + "@sphinx-labs/core" "^0.25.2" "@swc/core" "1.3.75" chalk "^4.1.2" core-js "^3.31.1"