From 54a363eb2d435782f6107ed3bef4fdbec6ff52c1 Mon Sep 17 00:00:00 2001 From: sendra Date: Wed, 12 Feb 2025 12:58:30 +0100 Subject: [PATCH] feat: Mantle a.DI activation path --- Makefile | 9 +- ...di_add_mantle_path_to_adiethereum_after.md | 14 +++ scripts/helpers/UpdateCCCPermissions.s.sol | 10 +- ...tivate_Mantle_Bridge_Adapter_Payload.s.sol | 34 +++++++ .../ethereum/Network_Deployments.s.sol | 17 +++- tests/adi/ADITestBase.sol | 7 +- .../payloads/ethereum/AddMantlePathTest.t.sol | 92 +++++++++++++++++++ .../payloads/ethereum/AddSonicPathTest.t.sol | 2 +- 8 files changed, 173 insertions(+), 12 deletions(-) create mode 100644 diffs/adi_add_mantle_path_to_adiethereum_before_adi_add_mantle_path_to_adiethereum_after.md create mode 100644 scripts/payloads/adapters/ethereum/Ethereum_Activate_Mantle_Bridge_Adapter_Payload.s.sol create mode 100644 tests/payloads/ethereum/AddMantlePathTest.t.sol diff --git a/Makefile b/Makefile index f7420de..0aef035 100644 --- a/Makefile +++ b/Makefile @@ -17,7 +17,7 @@ BASE_KEY = --private-key ${PRIVATE_KEY} -custom_ethereum := --with-gas-price 3000000000 # 53 gwei +custom_ethereum := --with-gas-price 1000000000 # 53 gwei #custom_polygon := --with-gas-price 190000000000 # 560 gwei #custom_avalanche := --with-gas-price 27000000000 # 27 gwei #custom_metis-testnet := --legacy --verifier-url https://goerli.explorer.metisdevops.link/api/ @@ -286,8 +286,11 @@ deploy-zksync-path-payload: deploy-sonic-path-payload: $(call deploy_fn,payloads/adapters/ethereum/Network_Deployments,ethereum) +deploy-mantle-path-payload: + $(call deploy_fn,payloads/adapters/ethereum/Network_Deployments,ethereum) + update-owners-and-guardians: $(call deploy_fn,helpers/Update_Ownership,zksync) -update-sonic-permissions: - $(call deploy_fn,helpers/UpdateCCCPermissions,sonic) +update-ccc-permissions: + $(call deploy_fn,helpers/UpdateCCCPermissions,mantle) diff --git a/diffs/adi_add_mantle_path_to_adiethereum_before_adi_add_mantle_path_to_adiethereum_after.md b/diffs/adi_add_mantle_path_to_adiethereum_before_adi_add_mantle_path_to_adiethereum_after.md new file mode 100644 index 0000000..8509589 --- /dev/null +++ b/diffs/adi_add_mantle_path_to_adiethereum_before_adi_add_mantle_path_to_adiethereum_after.md @@ -0,0 +1,14 @@ +## Raw diff + +```json +{ + "forwarderAdaptersByChain": { + "5000": { + "from": "", + "to": { + "0xb66FA987fa7975Cac3d12B629c9c44e459e50990": "0x4E740ac02b866b429738a9e225e92A15F4452521" + } + } + } +} +``` \ No newline at end of file diff --git a/scripts/helpers/UpdateCCCPermissions.s.sol b/scripts/helpers/UpdateCCCPermissions.s.sol index 45505ce..3a55b7a 100644 --- a/scripts/helpers/UpdateCCCPermissions.s.sol +++ b/scripts/helpers/UpdateCCCPermissions.s.sol @@ -39,24 +39,24 @@ abstract contract UpdateCCCPermissions { -contract UpdateCCCPermissionsSonic is UpdateCCCPermissions { +contract UpdateCCCPermissionsMantle is UpdateCCCPermissions { function targetOwner() public pure override returns (address) { - return 0x7b62461a3570c6AC8a9f8330421576e417B71EE7; // executor + return 0x70884634D0098782592111A2A6B8d223be31CB7b; // executor } function targetADIGuardian() public pure override returns (address) { - return 0x10078c1D8E46dd1ed5D8df2C42d5ABb969b11566; // Granular Guardian + return 0xb26670d2800DBB9cfCe2f2660FfDcA48C799c86d; // Granular Guardian } function aDIContractsToUpdate() public pure override returns (address[] memory) { address[] memory contracts = new address[](1); - contracts[0] = 0x58e003a3C6f2Aeed6a2a6Bc77B504566523cb15c; // CCC + contracts[0] = 0x1283C5015B1Fb5616FA3aCb0C18e6879a02869cB; // CCC return contracts; } } -contract Sonic is Script, UpdateCCCPermissionsSonic { +contract Mantle is Script, UpdateCCCPermissionsMantle { function run() external { vm.startBroadcast(); diff --git a/scripts/payloads/adapters/ethereum/Ethereum_Activate_Mantle_Bridge_Adapter_Payload.s.sol b/scripts/payloads/adapters/ethereum/Ethereum_Activate_Mantle_Bridge_Adapter_Payload.s.sol new file mode 100644 index 0000000..40d037b --- /dev/null +++ b/scripts/payloads/adapters/ethereum/Ethereum_Activate_Mantle_Bridge_Adapter_Payload.s.sol @@ -0,0 +1,34 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import '../../../BaseDeployerScript.sol'; +import '../../../../src/templates/SimpleAddForwarderAdapter.sol'; + +abstract contract Ethereum_Activate_Mantle_Bridge_Adapter_Payload is BaseDeployerScript { + function _getPayloadByteCode() internal virtual returns (bytes memory); + + function PAYLOAD_SALT() internal pure virtual returns (string memory) { + return 'Add Mantle path to a.DI'; + } + + function DESTINATION_CHAIN_ID() internal pure virtual returns (uint256); + + function _deployPayload(AddForwarderAdapterArgs memory args) internal returns (address) { + bytes memory payloadCode = abi.encodePacked(_getPayloadByteCode(), abi.encode(args)); + + return _deployByteCode(payloadCode, PAYLOAD_SALT()); + } + + function _execute(Addresses memory addresses) internal virtual override { + Addresses memory destinationAddresses = _getAddresses(DESTINATION_CHAIN_ID()); + + _deployPayload( + AddForwarderAdapterArgs({ + crossChainController: addresses.crossChainController, + currentChainBridgeAdapter: addresses.mantleAdapter, + destinationChainBridgeAdapter: destinationAddresses.mantleAdapter, + destinationChainId: DESTINATION_CHAIN_ID() + }) + ); + } +} diff --git a/scripts/payloads/adapters/ethereum/Network_Deployments.s.sol b/scripts/payloads/adapters/ethereum/Network_Deployments.s.sol index 797fcd0..5946fe6 100644 --- a/scripts/payloads/adapters/ethereum/Network_Deployments.s.sol +++ b/scripts/payloads/adapters/ethereum/Network_Deployments.s.sol @@ -5,11 +5,26 @@ import '../../../BaseDeployerScript.sol'; import {Ethereum_Activate_Celo_Bridge_Adapter_Payload} from './Ethereum_Activate_Celo_Bridge_Adapter_Payload.s.sol'; import {Ethereum_Activate_Lina_Bridge_Adapter_Payload} from './Ethereum_Activate_Lina_Bridge_Adapter_Payload.s.sol'; import {Ethereum_Activate_Sonic_Bridge_Adapter_Payload} from './Ethereum_Activate_Sonic_Bridge_Adapter_Payload.s.sol'; +import {Ethereum_Activate_Mantle_Bridge_Adapter_Payload} from './Ethereum_Activate_Mantle_Bridge_Adapter_Payload.s.sol'; import {Ethereum_Celo_Path_Payload} from '../../../../src/adapter_payloads/Ethereum_Celo_Path_Payload.sol'; import {Ethereum_Sonic_Path_Payload} from '../../../../src/adapter_payloads/Ethereum_Sonic_Path_Payload.sol'; import {SimpleAddForwarderAdapter} from '../../../../src/templates/SimpleAddForwarderAdapter.sol'; -contract Ethereum is Ethereum_Activate_Sonic_Bridge_Adapter_Payload { +contract Ethereum is Ethereum_Activate_Mantle_Bridge_Adapter_Payload { + function TRANSACTION_NETWORK() internal pure override returns (uint256) { + return ChainIds.ETHEREUM; + } + + function _getPayloadByteCode() internal pure override returns (bytes memory) { + return type(SimpleAddForwarderAdapter).creationCode; + } + + function DESTINATION_CHAIN_ID() internal pure override returns (uint256) { + return ChainIds.MANTLE; + } +} + +contract Ethereum_Sonic is Ethereum_Activate_Sonic_Bridge_Adapter_Payload { function TRANSACTION_NETWORK() internal pure override returns (uint256) { return ChainIds.ETHEREUM; } diff --git a/tests/adi/ADITestBase.sol b/tests/adi/ADITestBase.sol index 3cdaed1..166aa30 100644 --- a/tests/adi/ADITestBase.sol +++ b/tests/adi/ADITestBase.sol @@ -630,7 +630,7 @@ contract ADITestBase is Test { uint256 chainId ) internal pure returns (uint256[] memory) { if (chainId == ChainIds.MAINNET) { - uint256[] memory chainIds = new uint256[](13); + uint256[] memory chainIds = new uint256[](14); chainIds[0] = ChainIds.MAINNET; chainIds[1] = ChainIds.POLYGON; chainIds[2] = ChainIds.AVALANCHE; @@ -644,7 +644,8 @@ contract ADITestBase is Test { chainIds[10] = ChainIds.LINEA; chainIds[11] = ChainIds.CELO; chainIds[12] = ChainIds.SONIC; - + chainIds[13] = ChainIds.MANTLE; + return chainIds; } else if (chainId == ChainIds.POLYGON) { uint256[] memory chainIds = new uint256[](1); @@ -725,6 +726,8 @@ contract ADITestBase is Test { return 0x50F4dAA86F3c747ce15C3C38bD0383200B61d6Dd; } else if (chainId == ChainIds.SONIC) { return 0x58e003a3C6f2Aeed6a2a6Bc77B504566523cb15c; + } else if (chainId == ChainIds.MANTLE) { + return 0x1283C5015B1Fb5616FA3aCb0C18e6879a02869cB; } revert(); } diff --git a/tests/payloads/ethereum/AddMantlePathTest.t.sol b/tests/payloads/ethereum/AddMantlePathTest.t.sol new file mode 100644 index 0000000..095378a --- /dev/null +++ b/tests/payloads/ethereum/AddMantlePathTest.t.sol @@ -0,0 +1,92 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.0; + +import 'forge-std/console.sol'; +import {ADITestBase} from '../../adi/ADITestBase.sol'; +import {Addresses, Ethereum as PayloadEthereumScript} from '../../../scripts/payloads/adapters/ethereum/Network_Deployments.s.sol'; +import {SimpleAddForwarderAdapter, AddForwarderAdapterArgs} from '../../../src/templates/SimpleAddForwarderAdapter.sol'; + +abstract contract BaseAddMantlePathPayloadTest is ADITestBase { + address internal _payload; + address internal _crossChainController; + + string internal NETWORK; + uint256 internal immutable BLOCK_NUMBER; + + constructor(string memory network, uint256 blockNumber) { + NETWORK = network; + BLOCK_NUMBER = blockNumber; + } + + function _getDeployedPayload() internal virtual returns (address); + + function _getPayload() internal virtual returns (address); + + function _getCurrentNetworkAddresses() internal virtual returns (Addresses memory); + + function setUp() public { + vm.createSelectFork(vm.rpcUrl(NETWORK), BLOCK_NUMBER); + + Addresses memory addresses = _getCurrentNetworkAddresses(); + _crossChainController = addresses.crossChainController; + + _payload = _getPayload(); + } + + function test_defaultTest() public { + defaultTest( + string.concat('add_mantle_path_to_adi', NETWORK), + _crossChainController, + address(_payload), + false, + vm + ); + } + + function test_samePayloadAddress( + address currentChainAdapter, + address destinationChainAdapter, + address crossChainController, + uint256 destinationChainId + ) public { + SimpleAddForwarderAdapter deployedPayload = SimpleAddForwarderAdapter(_getDeployedPayload()); + SimpleAddForwarderAdapter predictedPayload = SimpleAddForwarderAdapter(_getPayload()); + + assertEq(predictedPayload.DESTINATION_CHAIN_ID(), deployedPayload.DESTINATION_CHAIN_ID()); + assertEq(predictedPayload.CROSS_CHAIN_CONTROLLER(), deployedPayload.CROSS_CHAIN_CONTROLLER()); + assertEq( + predictedPayload.CURRENT_CHAIN_BRIDGE_ADAPTER(), + deployedPayload.CURRENT_CHAIN_BRIDGE_ADAPTER() + ); + assertEq( + predictedPayload.DESTINATION_CHAIN_BRIDGE_ADAPTER(), + deployedPayload.DESTINATION_CHAIN_BRIDGE_ADAPTER() + ); + } +} + +contract EthereumAddMantlePathPayloadTest is + PayloadEthereumScript, + BaseAddMantlePathPayloadTest('ethereum', 21830243) +{ + function _getDeployedPayload() internal pure override returns (address) { + return 0x184CA99Cd89313c00a69b9A8E1649D84FBD8D86D; + } + + function _getCurrentNetworkAddresses() internal view override returns (Addresses memory) { + return _getAddresses(TRANSACTION_NETWORK()); + } + + function _getPayload() internal override returns (address) { + Addresses memory currentAddresses = _getCurrentNetworkAddresses(); + Addresses memory destinationAddresses = _getAddresses(DESTINATION_CHAIN_ID()); + + AddForwarderAdapterArgs memory args = AddForwarderAdapterArgs({ + crossChainController: currentAddresses.crossChainController, + currentChainBridgeAdapter: currentAddresses.mantleAdapter, // ethereum -> mantle bridge adapter + destinationChainBridgeAdapter: destinationAddresses.mantleAdapter, // mantle bridge adapter + destinationChainId: DESTINATION_CHAIN_ID() + }); + return _deployPayload(args); + } +} diff --git a/tests/payloads/ethereum/AddSonicPathTest.t.sol b/tests/payloads/ethereum/AddSonicPathTest.t.sol index 3f7cd35..c3f67f3 100644 --- a/tests/payloads/ethereum/AddSonicPathTest.t.sol +++ b/tests/payloads/ethereum/AddSonicPathTest.t.sol @@ -3,7 +3,7 @@ pragma solidity ^0.8.0; import 'forge-std/console.sol'; import {ADITestBase} from '../../adi/ADITestBase.sol'; -import { Addresses, Ethereum as PayloadEthereumScript} from '../../../scripts/payloads/adapters/ethereum/Network_Deployments.s.sol'; +import { Addresses, Ethereum_Sonic as PayloadEthereumScript} from '../../../scripts/payloads/adapters/ethereum/Network_Deployments.s.sol'; import {Ethereum_Sonic_Path_Payload, AddForwarderAdapterArgs} from '../../../src/adapter_payloads/Ethereum_Sonic_Path_Payload.sol'; abstract contract BaseAddSonicPathPayloadTest is ADITestBase {