diff --git a/.env.template b/.env.template index cb33900c..620f1512 100644 --- a/.env.template +++ b/.env.template @@ -1,6 +1,10 @@ +# CreateX Factory Address +CREATE_X_FACTORY_ADDRESS=0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed +SALT=0x + # Account to be used for script execution. # Account name in Foundry keystore -# ACCOUNT= +ACCOUNT= # Ethereum Sepolia Configuration # SEPOLIA_RPC_URL is added to Github env "ci". diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index cd26c16d..97c05a26 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -10,6 +10,7 @@ concurrency: env: FOUNDRY_PROFILE: ci SEPOLIA_RPC_URL: secrets.SEPOLIA_RPC_URL + ARBITRUM_SEPOLIA_RPC_URL: secrets.ARBITRUM_SEPOLIA_RPC_URL jobs: build-and-test: @@ -32,5 +33,8 @@ jobs: - name: Run Forge build run: forge build --sizes && cp .env.template .env - - name: Run Forge tests - run: make utest + - name: Run Forge unit tests + run: make unit-test + + - name: Run Forge e2e tests + run: make e2e-test diff --git a/.gitignore b/.gitignore index 6900c85d..326f6714 100644 --- a/.gitignore +++ b/.gitignore @@ -19,3 +19,4 @@ docs/ .last_deploy.json .idea +.DS_Store diff --git a/.gitmodules b/.gitmodules index aa66dc61..240cc0b3 100644 --- a/.gitmodules +++ b/.gitmodules @@ -25,3 +25,6 @@ [submodule "lib/layerzero-v1"] path = lib/layerzero-v1 url = https://github.com/layerzero-labs/layerzero-v1 +[submodule "lib/createx"] + path = lib/createx + url = https://github.com/pcaversaccio/createx diff --git a/Makefile b/Makefile index 6394081d..d2f12e5b 100644 --- a/Makefile +++ b/Makefile @@ -14,8 +14,11 @@ fork-sepolia: fork-arbitrum-sepolia: anvil --fork-url $(ARBITRUM_SEPOLIA_RPC_URL) --port 8546 -utest: - FOUNDRY_PROFILE=test forge test -vvvv +unit-test: + FOUNDRY_PROFILE=test forge test -vvvv --match-path "./test/units/**" --fail-fast + +e2e-test: + FOUNDRY_PROFILE=test forge test -vvvv --match-path "./test/e2e/**" --fail-fast clean: forge clean diff --git a/foundry.toml b/foundry.toml index 9b6ec5a8..7aff88ea 100644 --- a/foundry.toml +++ b/foundry.toml @@ -6,7 +6,7 @@ fs_permissions = [{ access = "read-write", path = "./" }] optimizer = true optimizer_runs = 200 optimizer_details = { yul = true } -via_ir = true +# TODO: Add via_ir = true and solve issues when building with it ## Needed by openzepplin upgrade plugin ffi = true @@ -23,6 +23,7 @@ remappings = [ '@layerzerolabs/test-devtools-evm-foundry/=lib/devtools/packages/test-devtools-evm-foundry/', '@openzeppelin/foundry-upgrades/=lib/openzeppelin-foundry-upgrades/src/', '@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/', + '@createx/contracts/=lib/createx/src/', # Used internally by contracts within library dependencies '@layerzerolabs/lz-evm-protocol-v2/=lib/layerzero-v2/packages/layerzero-v2/evm/protocol/', @@ -36,4 +37,3 @@ remappings = [ [profile.test] optimizer = false -via_ir = false diff --git a/lib/createx b/lib/createx new file mode 160000 index 00000000..cbac8032 --- /dev/null +++ b/lib/createx @@ -0,0 +1 @@ +Subproject commit cbac803268835138f86a69bfe01fcf05a50e0447 diff --git a/script/RLCAdapter.s.sol b/script/RLCAdapter.s.sol index 946e21df..215ff266 100644 --- a/script/RLCAdapter.s.sol +++ b/script/RLCAdapter.s.sol @@ -2,10 +2,11 @@ // SPDX-License-Identifier: Apache-2.0 pragma solidity ^0.8.22; -import {Script, console} from "forge-std/Script.sol"; -import {ERC1967Proxy} from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol"; +import {Script} from "forge-std/Script.sol"; +import {ICreateX} from "@createx/contracts/ICreateX.sol"; import {RLCAdapter} from "../src/RLCAdapter.sol"; import {EnvUtils} from "./UpdateEnvUtils.sol"; +import {UUPSProxyDeployer} from "./lib/UUPSProxyDeployer.sol"; contract Deploy is Script { function run() external returns (address) { @@ -14,23 +15,24 @@ contract Deploy is Script { address rlcToken = vm.envAddress("RLC_SEPOLIA_ADDRESS"); // RLC token address on sepolia testnet address lzEndpoint = vm.envAddress("LAYER_ZERO_SEPOLIA_ENDPOINT_ADDRESS"); // LayerZero sepolia endpoint address owner = vm.envAddress("OWNER_ADDRESS"); // Your actual wallet address - - // Deploy the RLCAdapter contract - RLCAdapter rlcAdapterImplementation = new RLCAdapter(rlcToken, lzEndpoint); - console.log("RLCAdapter implementation deployed at:", address(rlcAdapterImplementation)); + bytes32 salt = vm.envBytes32("SALT"); // Deploy the proxy contract - address rlcAdapterProxyAddress = address( - new ERC1967Proxy( - address(rlcAdapterImplementation), - abi.encodeWithSelector(rlcAdapterImplementation.initialize.selector, owner) - ) - ); - console.log("RLCAdapter proxy deployed at:", rlcAdapterProxyAddress); + address rlcAdapterProxy = deploy(lzEndpoint, owner, salt, rlcToken); + vm.stopBroadcast(); - EnvUtils.updateEnvVariable("RLC_SEPOLIA_ADAPTER_ADDRESS", rlcAdapterProxyAddress); - return rlcAdapterProxyAddress; + EnvUtils.updateEnvVariable("RLC_SEPOLIA_ADAPTER_ADDRESS", rlcAdapterProxy); + return rlcAdapterProxy; + } + + function deploy(address lzEndpoint, address owner, bytes32 salt, address rlcToken) public returns (address) { + address createXFactory = vm.envAddress("CREATE_X_FACTORY_ADDRESS"); + bytes memory constructorData = abi.encode(rlcToken, lzEndpoint); + bytes memory initializeData = abi.encodeWithSelector(RLCAdapter.initialize.selector, owner); + return UUPSProxyDeployer.deployUUPSProxyWithCreateX( + "RLCAdapter", constructorData, initializeData, createXFactory, salt + ); } } diff --git a/script/RLCOFT.s.sol b/script/RLCOFT.s.sol index 390e9dce..bf9dea10 100644 --- a/script/RLCOFT.s.sol +++ b/script/RLCOFT.s.sol @@ -2,9 +2,10 @@ // SPDX-License-Identifier: Apache-2.0 pragma solidity ^0.8.22; -import {Script, console} from "forge-std/Script.sol"; -import {ERC1967Proxy} from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol"; +import {Script} from "forge-std/Script.sol"; +import {ICreateX} from "@createx/contracts/ICreateX.sol"; import {RLCOFT} from "../src/RLCOFT.sol"; +import {UUPSProxyDeployer} from "./lib/UUPSProxyDeployer.sol"; import {EnvUtils} from "./UpdateEnvUtils.sol"; contract Deploy is Script { @@ -16,23 +17,31 @@ contract Deploy is Script { address lzEndpoint = vm.envAddress("LAYER_ZERO_ARBITRUM_SEPOLIA_ENDPOINT_ADDRESS"); address owner = vm.envAddress("OWNER_ADDRESS"); address pauser = vm.envAddress("PAUSER_ADDRESS"); + bytes32 salt = vm.envBytes32("SALT"); - RLCOFT rlcOFTImplementation = new RLCOFT(lzEndpoint); - console.log("RLCOFT implementation deployed at:", address(rlcOFTImplementation)); - - // Deploy the proxy contract - address rlcOFTProxyAddress = address( - new ERC1967Proxy( - address(rlcOFTImplementation), - abi.encodeWithSelector(rlcOFTImplementation.initialize.selector, name, symbol, owner, pauser) - ) - ); - console.log("RLCOFT proxy deployed at:", rlcOFTProxyAddress); + address rlcOFTProxy = deploy(lzEndpoint, name, symbol, owner, pauser, salt); vm.stopBroadcast(); - EnvUtils.updateEnvVariable("RLC_ARBITRUM_SEPOLIA_OFT_ADDRESS", rlcOFTProxyAddress); - return rlcOFTProxyAddress; + EnvUtils.updateEnvVariable("RLC_ARBITRUM_SEPOLIA_OFT_ADDRESS", rlcOFTProxy); + return rlcOFTProxy; + } + + function deploy( + address lzEndpoint, + string memory name, + string memory symbol, + address owner, + address pauser, + bytes32 salt + ) public returns (address) { + address createXFactory = vm.envAddress("CREATE_X_FACTORY_ADDRESS"); + + bytes memory constructorData = abi.encode(lzEndpoint); + bytes memory initializeData = abi.encodeWithSelector(RLCOFT.initialize.selector, name, symbol, owner, pauser); + return UUPSProxyDeployer.deployUUPSProxyWithCreateX( + "RLCOFT", constructorData, initializeData, createXFactory, salt + ); } } diff --git a/script/lib/UUPSProxyDeployer.sol b/script/lib/UUPSProxyDeployer.sol new file mode 100644 index 00000000..798852e3 --- /dev/null +++ b/script/lib/UUPSProxyDeployer.sol @@ -0,0 +1,65 @@ +// SPDX-FileCopyrightText: 2025 IEXEC BLOCKCHAIN TECH +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.22; + +import {console} from "forge-std/console.sol"; +import {Vm} from "forge-std/Vm.sol"; +import {StdConstants} from "forge-std/StdConstants.sol"; +import {ERC1967Proxy} from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol"; +import {ICreateX} from "@createx/contracts/ICreateX.sol"; + +/// @notice Utility library for deploying UUPS proxy contracts and their implementations using the CreateX Factory +library UUPSProxyDeployer { + /// @dev Reference to the VM cheat codes from forge-std + Vm private constant vm = StdConstants.VM; + + /// @notice Deploys a UUPS proxy contract and its implementation using the CreateX Factory + /// @param contractName The name of the contract to deploy (used to fetch creation code) + /// @param constructorData The constructor arguments for the implementation contract + /// @param initializeData The initialization data for the proxy contract + /// @param createXFactory The address of the CreateX factory + /// @param salt The salt for deterministic deployment + /// @return The address of the deployed proxy + function deployUUPSProxyWithCreateX( + string memory contractName, + bytes memory constructorData, + bytes memory initializeData, + address createXFactory, + bytes32 salt + ) internal returns (address) { + // CreateX Factory instance + ICreateX createX = ICreateX(createXFactory); + address implementation = deployImplementationWithCreateX(contractName, constructorData, createX, salt); + + // Deploy the proxy contract using CreateX Factory + address proxy = createX.deployCreate2AndInit( + salt, // salt + abi.encodePacked(type(ERC1967Proxy).creationCode, abi.encode(implementation, "")), // initCode + initializeData, // data for initialize + ICreateX.Values({constructorAmount: 0, initCallAmount: 0}) // values for CreateX + ); + console.log("UUPS Proxy deployed at:", proxy); + + return proxy; + } + + /// @notice Deploys the implementation contract using the CreateX Factory + /// @param contractName The name of the contract to deploy (used to fetch creation code) + /// @param constructorData The constructor arguments for the implementation contract + /// @param createXFactory The address of the CreateX factory + /// @param salt The salt for deterministic deployment + /// @return The address of the deployed implementation contract + function deployImplementationWithCreateX( + string memory contractName, + bytes memory constructorData, + ICreateX createXFactory, + bytes32 salt + ) internal returns (address) { + // Deploy the implementation contract using CreateX Factory + bytes memory creationCode = StdConstants.VM.getCode(contractName); + address implementation = createXFactory.deployCreate2(salt, abi.encodePacked(creationCode, constructorData)); + console.log("Implementation deployed at:", implementation); + + return implementation; + } +} diff --git a/test/e2e/RLCAdapterScript.t.sol b/test/e2e/RLCAdapterScript.t.sol index 890df0bb..17ec75de 100644 --- a/test/e2e/RLCAdapterScript.t.sol +++ b/test/e2e/RLCAdapterScript.t.sol @@ -2,33 +2,52 @@ pragma solidity ^0.8.13; import {Test} from "forge-std/Test.sol"; -import {Deploy as RLCAdapterDeploy, Configure as RLCAdapterConfigure} from "../../script/RLCAdapter.s.sol"; +import {Deploy as RLCAdapterDeploy} from "../../script/RLCAdapter.s.sol"; import {RLCAdapter} from "../../src/RLCAdapter.sol"; contract RLCAdapterScriptTest is Test { - RLCAdapter public rlcAdapter; - + // Unique instance of the deployment script + address lzEndpoint = 0x6EDCE65403992e310A62460808c4b910D972f10f; // LayerZero Arbitrum Sepolia endpoint address owner = makeAddr("OWNER_ADDRESS"); - address pauser = makeAddr("PAUSER_ADDRESS"); + address RLC_TOKEN = 0x26A738b6D33EF4D94FF084D3552961b8f00639Cd; + + RLCAdapterDeploy public deployer; function setUp() public { - vm.createSelectFork("https://ethereum-sepolia-rpc.publicnode.com"); // use public node + vm.createSelectFork(vm.envString("SEPOLIA_RPC_URL")); + deployer = new RLCAdapterDeploy(); + vm.setEnv("CREATE_X_FACTORY", "0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed"); + } + + // ============ Deployment Tests ============ + function testFork_CheckDeployment() public { + bytes32 salt = keccak256("RLCOFT_SALT"); + RLCAdapter rlcAdapter = RLCAdapter(deployer.deploy(lzEndpoint, owner, salt, RLC_TOKEN)); - vm.setEnv("RLC_OFT_TOKEN_NAME", "RLC OFT Token"); - vm.setEnv("RLC_TOKEN_SYMBOL", "RLC"); - vm.setEnv("LAYER_ZERO_ARBITRUM_SEPOLIA_ENDPOINT_ADDRESS", "0x6EDCE65403992e310A62460808c4b910D972f10f"); - vm.setEnv("OWNER_ADDRESS", vm.toString(owner)); - vm.setEnv("PAUSER_ADDRESS", vm.toString(pauser)); + assertEq(rlcAdapter.owner(), owner); + assertEq(rlcAdapter.token(), RLC_TOKEN); + //TODO: check roles + } + + function testForkFuzz_DifferentSaltsProduceDifferentAddresses(bytes32 salt1, bytes32 salt2) public { + vm.assume(salt1 != salt2); // ensure they are different - rlcAdapter = RLCAdapter(new RLCAdapterDeploy().run()); + address addr1 = deployer.deploy(lzEndpoint, owner, salt1, RLC_TOKEN); + address addr2 = deployer.deploy(lzEndpoint, owner, salt2, RLC_TOKEN); + + assertTrue(addr1 != addr2, "Fuzz test failed: different salts produced same address"); } - /** - * Deployment - */ - function test_CheckDeployment() public view { - assertEq(rlcAdapter.owner(), vm.envAddress("OWNER_ADDRESS")); - assertEq(rlcAdapter.token(), vm.envAddress("RLC_SEPOLIA_ADDRESS")); - // TODO check roles + function testForkFuzz_RevertIfSecondDeploymentWithSameSalt(bytes32 salt) public { + // First deployment + address addr = deployer.deploy(lzEndpoint, owner, salt, RLC_TOKEN); + assertTrue(addr != address(0), "First deployment should succeed"); + + // Attempt redeployment with the same salt + try deployer.deploy(lzEndpoint, owner, salt, RLC_TOKEN) returns (address) { + revert("Expected revert on redeployment with same salt but no revert occurred"); + } catch { + // Expected: revert due to CREATE2 address collision + } } } diff --git a/test/e2e/RLCOFTScript.t.sol b/test/e2e/RLCOFTScript.t.sol index 287bad12..826c1885 100644 --- a/test/e2e/RLCOFTScript.t.sol +++ b/test/e2e/RLCOFTScript.t.sol @@ -2,32 +2,53 @@ pragma solidity ^0.8.13; import {Test} from "forge-std/Test.sol"; -import {Deploy as RLCOFTDeploy, Configure as RLCOFTConfigure} from "../../script/RLCOFT.s.sol"; +import {Deploy as RLCOFTDeploy} from "../../script/RLCOFT.s.sol"; import {RLCOFT} from "../../src/RLCOFT.sol"; contract RLCOFTScriptTest is Test { - RLCOFT public rlcOft; - + // Unique instance of the deployment script + string name = "RLC OFT Token"; + string symbol = "RLC"; address owner = makeAddr("OWNER_ADDRESS"); address pauser = makeAddr("PAUSER_ADDRESS"); + address LAYERZERO_ENDPOINT = 0x6EDCE65403992e310A62460808c4b910D972f10f; // LayerZero Arbitrum Sepolia endpoint + + RLCOFTDeploy public deployer; function setUp() public { - vm.createSelectFork("https://arbitrum-sepolia-rpc.publicnode.com"); // use public node + vm.createSelectFork(vm.envString("ARBITRUM_SEPOLIA_RPC_URL")); // use public node + deployer = new RLCOFTDeploy(); + vm.setEnv("CREATE_X_FACTORY", "0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed"); + } + + // ============ Deployment Tests ============ + function testFork_CheckDeployment() public { + bytes32 salt = keccak256("RLCOFT_SALT"); + RLCOFT rlcoft = RLCOFT(deployer.deploy(LAYERZERO_ENDPOINT, name, symbol, owner, pauser, salt)); - vm.setEnv("RLC_OFT_TOKEN_NAME", "RLC OFT Token"); - vm.setEnv("RLC_TOKEN_SYMBOL", "RLC"); - vm.setEnv("LAYER_ZERO_ARBITRUM_SEPOLIA_ENDPOINT_ADDRESS", "0x6EDCE65403992e310A62460808c4b910D972f10f"); - vm.setEnv("OWNER_ADDRESS", vm.toString(owner)); - vm.setEnv("PAUSER_ADDRESS", vm.toString(pauser)); + assertEq(rlcoft.owner(), owner); + assertEq(rlcoft.token(), address(rlcoft)); + } + + function testForkFuzz_DifferentSaltsProduceDifferentAddresses(bytes32 salt1, bytes32 salt2) public { + vm.assume(salt1 != salt2); // ensure they are different - rlcOft = RLCOFT(new RLCOFTDeploy().run()); + address addr1 = deployer.deploy(LAYERZERO_ENDPOINT, name, symbol, owner, pauser, salt1); + address addr2 = deployer.deploy(LAYERZERO_ENDPOINT, name, symbol, owner, pauser, salt2); + + assertTrue(addr1 != addr2, "Fuzz test failed: different salts produced same address"); } - /** - * Deployment - */ - function test_CheckDeployment() public view { - assertEq(rlcOft.owner(), vm.envAddress("OWNER_ADDRESS")); - assertEq(rlcOft.token(), address(rlcOft)); + function testForkFuzz_RevertIfSecondDeploymentWithSameSalt(bytes32 salt) public { + // First deployment + address addr = deployer.deploy(LAYERZERO_ENDPOINT, name, symbol, owner, pauser, salt); + assertTrue(addr != address(0), "First deployment should succeed"); + + // Attempt redeployment with the same salt + try deployer.deploy(LAYERZERO_ENDPOINT, name, symbol, owner, pauser, salt) returns (address) { + revert("Expected revert on redeployment with same salt but no revert occurred"); + } catch { + // Expected: revert due to CREATE2 address collision + } } } diff --git a/test/units/RLCOFT.t.sol b/test/units/RLCOFT.t.sol index c0871db6..d61973e5 100644 --- a/test/units/RLCOFT.t.sol +++ b/test/units/RLCOFT.t.sol @@ -5,48 +5,60 @@ import {OptionsBuilder} from "@layerzerolabs/oapp-evm/contracts/oapp/libs/Option import {MessagingFee, SendParam} from "@layerzerolabs/oft-evm/contracts/interfaces/IOFT.sol"; import {PausableUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/PausableUpgradeable.sol"; import {TestHelperOz5} from "@layerzerolabs/test-devtools-evm-foundry/contracts/TestHelperOz5.sol"; -import {RLCOFTMock, Deploy as RLCOFTDeploy} from "../units/mocks/RLCOFTMock.sol"; -import {Deploy as RLCAdapterDeploy} from "./mocks/RLCAdapterMock.sol"; -import {RLCAdapter} from "../../src/RLCAdapter.sol"; +import {CreateX} from "@createx/contracts/CreateX.sol"; +import {RLCOFTMock} from "./mocks/RLCOFTMock.sol"; import {RLCMock} from "./mocks/RLCMock.sol"; import {RLCOFT} from "../../src/RLCOFT.sol"; +import {UUPSProxyDeployer} from "../../script/lib/UUPSProxyDeployer.sol"; import {TestUtils} from "./utils/TestUtils.sol"; +import {Deploy as RLCAdapterDeploy} from "../../script/RLCAdapter.s.sol"; +import {RLCAdapter} from "../../src/RLCAdapter.sol"; -contract RLCOFTE2ETest is TestHelperOz5 { +contract RLCOFTTest is TestHelperOz5 { using OptionsBuilder for bytes; using TestUtils for *; - RLCOFTMock internal sourceOFT; - RLCAdapter internal destAdapterMock; - RLCMock internal rlcToken; + RLCOFTMock private sourceOFT; + RLCAdapter private destAdapterMock; - uint32 internal constant SOURCE_EID = 1; - uint32 internal constant DEST_EID = 2; + uint32 private constant SOURCE_EID = 1; + uint32 private constant DEST_EID = 2; - address public owner = makeAddr("owner"); - address public pauser = makeAddr("pauser"); - address public user1 = makeAddr("user1"); - address public user2 = makeAddr("user2"); + address private owner = makeAddr("owner"); + address private pauser = makeAddr("pauser"); + address private user1 = makeAddr("user1"); + address private user2 = makeAddr("user2"); - uint256 public constant INITIAL_BALANCE = 100 ether; - uint256 public constant TRANSFER_AMOUNT = 1 ether; + uint256 private constant INITIAL_BALANCE = 100 ether; + uint256 private constant TRANSFER_AMOUNT = 1 ether; + string private name = "RLC OFT Token"; + string private symbol = "RLC"; function setUp() public virtual override { super.setUp(); setUpEndpoints(2, LibraryType.UltraLightNode); + address createXFactory = address(new CreateX()); // Deploy RLC token mock - rlcToken = new RLCMock("RLC OFT Test", "RLCT"); + address rlcToken = address(new RLCMock(name, symbol)); // Set up endpoints for the deployment address lzEndpointOFT = address(endpoints[SOURCE_EID]); - - // Deploy source RLCOFT - sourceOFT = RLCOFTMock(new RLCOFTDeploy().run(lzEndpointOFT, owner, pauser)); + address lzEndpoint = address(endpoints[DEST_EID]); + + // Deploy source RLCOFTMock + bytes32 salt = keccak256("RLCOFT_SALT"); + bytes memory constructorData = abi.encode(lzEndpointOFT); + bytes memory initializeData = abi.encodeWithSelector(RLCOFT.initialize.selector, name, symbol, owner, pauser); + sourceOFT = RLCOFTMock( + UUPSProxyDeployer.deployUUPSProxyWithCreateX( + "RLCOFTMock", constructorData, initializeData, createXFactory, salt + ) + ); // Deploy destination RLCAdapter - destAdapterMock = - RLCAdapter(new RLCAdapterDeploy().run(address(rlcToken), address(endpoints[DEST_EID]), owner, pauser)); + vm.setEnv("CREATE_X_FACTORY_ADDRESS", vm.toString(createXFactory)); + destAdapterMock = RLCAdapter(new RLCAdapterDeploy().deploy(lzEndpoint, owner, salt, rlcToken)); // Wire the contracts address[] memory contracts = new address[](2); diff --git a/test/units/mocks/RLCAdapterMock.sol b/test/units/mocks/RLCAdapterMock.sol deleted file mode 100644 index b1a3b648..00000000 --- a/test/units/mocks/RLCAdapterMock.sol +++ /dev/null @@ -1,26 +0,0 @@ -// SPDX-FileCopyrightText: 2025 IEXEC BLOCKCHAIN TECH -// SPDX-License-Identifier: Apache-2.0 -pragma solidity ^0.8.22; - -import {Test} from "forge-std/Test.sol"; -import {console} from "forge-std/console.sol"; -import {ERC1967Proxy} from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol"; -import {RLCAdapter} from "../../../src/RLCAdapter.sol"; - -contract Deploy is Test { - function run(address rlcToken, address lzEndpoint, address owner, address pauser) external returns (address) { - // Deploy the RLCAdapter contract - RLCAdapter rlcAdapterImplementation = new RLCAdapter(rlcToken, lzEndpoint); - console.log("RLCAdapter implementation deployed at:", address(rlcAdapterImplementation)); - - // Deploy the proxy contract - address rlcAdapterProxyAddress = address( - new ERC1967Proxy( - address(rlcAdapterImplementation), - abi.encodeWithSelector(rlcAdapterImplementation.initialize.selector, owner, pauser) - ) - ); - console.log("RLCAdapter proxy deployed at:", rlcAdapterProxyAddress); - return rlcAdapterProxyAddress; - } -} diff --git a/test/units/mocks/RLCOFTMock.sol b/test/units/mocks/RLCOFTMock.sol index e13c72cc..7711f35b 100644 --- a/test/units/mocks/RLCOFTMock.sol +++ b/test/units/mocks/RLCOFTMock.sol @@ -3,9 +3,7 @@ pragma solidity ^0.8.22; import {Test} from "forge-std/Test.sol"; -import {console} from "forge-std/console.sol"; -import {ERC1967Proxy} from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol"; -import "../../../src/RLCOFT.sol"; +import {RLCOFT} from "../../../src/RLCOFT.sol"; /// @notice Mock contract that extends RLCOFT with mint/burn functions for testing contract RLCOFTMock is RLCOFT { @@ -19,23 +17,3 @@ contract RLCOFTMock is RLCOFT { _mint(_to, _amount); } } - -contract Deploy is Test { - function run(address lzEndpoint, address owner, address pauser) external returns (address) { - string memory name = "RLC_OFT_TOKEN_NAME"; - string memory symbol = "RLC_TOKEN_SYMBOL"; - - RLCOFTMock rlcOFTMockImplementation = new RLCOFTMock(lzEndpoint); - console.log("RLCOFTMock implementation deployed at:", address(rlcOFTMockImplementation)); - - // Deploy the proxy contract - address rlcOFTProxyAddress = address( - new ERC1967Proxy( - address(rlcOFTMockImplementation), - abi.encodeWithSelector(rlcOFTMockImplementation.initialize.selector, name, symbol, owner, pauser) - ) - ); - console.log("RLCOFTMock proxy deployed at:", rlcOFTProxyAddress); - return rlcOFTProxyAddress; - } -} diff --git a/test/units/utils/TestUtils.sol b/test/units/utils/TestUtils.sol index 69cdc673..16cac56c 100644 --- a/test/units/utils/TestUtils.sol +++ b/test/units/utils/TestUtils.sol @@ -4,8 +4,6 @@ pragma solidity ^0.8.22; import {OptionsBuilder} from "@layerzerolabs/oapp-evm/contracts/oapp/libs/OptionsBuilder.sol"; import {MessagingFee, SendParam} from "@layerzerolabs/oft-evm/contracts/interfaces/IOFT.sol"; import {IOFT} from "@layerzerolabs/oft-evm/contracts/interfaces/IOFT.sol"; -import {Vm} from "forge-std/Vm.sol"; -import {TestHelperOz5} from "@layerzerolabs/test-devtools-evm-foundry/contracts/TestHelperOz5.sol"; library TestUtils { using OptionsBuilder for bytes;