From 2ea8f564077e07b77b58dbeb3d451ab40aca6f43 Mon Sep 17 00:00:00 2001 From: skosito Date: Tue, 30 Jul 2024 12:11:57 +0100 Subject: [PATCH 1/2] fix: fix localnet issues (#265) Co-authored-by: Lucas Bertrand --- scripts/worker.ts | 73 ++++++++++++++++++++++++++++++----------------- tasks/localnet.ts | 28 +++++++++++------- 2 files changed, 64 insertions(+), 37 deletions(-) diff --git a/scripts/worker.ts b/scripts/worker.ts index ddea9189..1afce2c9 100644 --- a/scripts/worker.ts +++ b/scripts/worker.ts @@ -8,33 +8,53 @@ const hre = require("hardhat"); export const FUNGIBLE_MODULE_ADDRESS = "0x735b14BB79463307AAcBED86DAf3322B1e6226aB"; -const deploySystemContracts = async (tss: SignerWithAddress) => { +const deployProtocolContracts = async ( + tss: SignerWithAddress, + ownerEVM: SignerWithAddress, + ownerZEVM: SignerWithAddress, + fungibleModuleSigner: SignerWithAddress +) => { // Prepare EVM // Deploy system contracts (gateway and custody) + const TestERC20 = await ethers.getContractFactory("TestERC20"); + + const zetaToken = await TestERC20.deploy("Zeta Token", "ZETA"); const GatewayEVM = await ethers.getContractFactory("GatewayEVM"); const Custody = await ethers.getContractFactory("ERC20CustodyNew"); + const ZetaConnector = await ethers.getContractFactory("ZetaConnectorNonNative"); - const gatewayEVM = await upgrades.deployProxy(GatewayEVM, [tss.address], { + const gatewayEVM = await upgrades.deployProxy(GatewayEVM, [tss.address, zetaToken.address], { initializer: "initialize", kind: "uups", }); console.log("GatewayEVM:", gatewayEVM.address); - const custody = await Custody.deploy(gatewayEVM.address); - await gatewayEVM.setCustody(custody.address); + const custody = await Custody.deploy(gatewayEVM.address, tss.address); + await gatewayEVM.connect(tss).setCustody(custody.address); + + const zetaConnector = await ZetaConnector.deploy(gatewayEVM.address, zetaToken.address, tss.address); + await gatewayEVM.connect(tss).setConnector(zetaConnector.address); // Prepare ZEVM // Deploy system contracts (gateway and system) const SystemContractFactory = await ethers.getContractFactory("SystemContractMock"); const systemContract = (await SystemContractFactory.deploy(AddressZero, AddressZero, AddressZero)) as SystemContract; + const WZETAFactory = await ethers.getContractFactory("contracts/zevm/WZETA.sol:WETH9"); + const wzeta = await WZETAFactory.deploy(); + const GatewayZEVM = await ethers.getContractFactory("GatewayZEVM"); - const gatewayZEVM = await upgrades.deployProxy(GatewayZEVM, [], { + const gatewayZEVM = await upgrades.deployProxy(GatewayZEVM, [wzeta.address], { initializer: "initialize", kind: "uups", }); console.log("GatewayZEVM:", gatewayZEVM.address); + await wzeta.connect(fungibleModuleSigner).deposit({ value: ethers.utils.parseEther("10") }); + await wzeta.connect(fungibleModuleSigner).approve(gatewayZEVM.address, ethers.utils.parseEther("10")); + await wzeta.connect(ownerZEVM).deposit({ value: ethers.utils.parseEther("10") }); + await wzeta.connect(ownerZEVM).approve(gatewayZEVM.address, ethers.utils.parseEther("10")); + return { custody, gatewayEVM, @@ -44,7 +64,7 @@ const deploySystemContracts = async (tss: SignerWithAddress) => { }; const deployTestContracts = async ( - systemContracts, + protocolContracts, ownerEVM: SignerWithAddress, ownerZEVM: SignerWithAddress, fungibleModuleSigner: SignerWithAddress @@ -56,10 +76,11 @@ const deployTestContracts = async ( const token = await TestERC20.deploy("Test Token", "TTK"); const receiverEVM = await ReceiverEVM.deploy(); + await token.mint(ownerEVM.address, ethers.utils.parseEther("1000")); // Transfer some tokens to the custody contract - await token.transfer(systemContracts.custody.address, ethers.utils.parseEther("500")); + await token.transfer(protocolContracts.custody.address, ethers.utils.parseEther("500")); // Prepare ZEVM // Deploy test contracts (test zContract, zrc20, sender) and mint funds to test accounts @@ -74,14 +95,14 @@ const deployTestContracts = async ( 1, 1, 0, - systemContracts.systemContract.address, - systemContracts.gatewayZEVM.address + protocolContracts.systemContract.address, + protocolContracts.gatewayZEVM.address )) as ZRC20; - await systemContracts.systemContract.setGasCoinZRC20(1, ZRC20Contract.address); - await systemContracts.systemContract.setGasPrice(1, ZRC20Contract.address); + await protocolContracts.systemContract.setGasCoinZRC20(1, ZRC20Contract.address); + await protocolContracts.systemContract.setGasPrice(1, ZRC20Contract.address); await ZRC20Contract.connect(fungibleModuleSigner).deposit(ownerZEVM.address, parseEther("100")); - await ZRC20Contract.connect(ownerZEVM).approve(systemContracts.gatewayZEVM.address, parseEther("100")); + await ZRC20Contract.connect(ownerZEVM).approve(protocolContracts.gatewayZEVM.address, parseEther("100")); // Include abi of gatewayZEVM events, so hardhat can decode them automatically const senderArtifact = await hre.artifacts.readArtifact("SenderZEVM"); @@ -92,7 +113,7 @@ const deployTestContracts = async ( ]; const SenderZEVM = new ethers.ContractFactory(senderABI, senderArtifact.bytecode, ownerZEVM); - const senderZEVM = await SenderZEVM.deploy(systemContracts.gatewayZEVM.address); + const senderZEVM = await SenderZEVM.deploy(protocolContracts.gatewayZEVM.address); await ZRC20Contract.connect(fungibleModuleSigner).deposit(senderZEVM.address, parseEther("100")); return { @@ -117,28 +138,28 @@ export const startWorker = async () => { hre.network.provider.send("hardhat_setBalance", [FUNGIBLE_MODULE_ADDRESS, parseEther("1000000").toHexString()]); // Deploy system and test contracts - const systemContracts = await deploySystemContracts(tss); - const testContracts = await deployTestContracts(systemContracts, ownerEVM, ownerZEVM, fungibleModuleSigner); + const protocolContracts = await deployProtocolContracts(tss, ownerEVM, ownerZEVM, fungibleModuleSigner); + const testContracts = await deployTestContracts(protocolContracts, ownerEVM, ownerZEVM, fungibleModuleSigner); // Listen to contracts events // event Call(address indexed sender, bytes receiver, bytes message); - systemContracts.gatewayZEVM.on("Call", async (...args: Array) => { + protocolContracts.gatewayZEVM.on("Call", async (...args: Array) => { console.log("Worker: Call event on GatewayZEVM."); console.log("Worker: Calling ReceiverEVM through GatewayEVM..."); const receiver = args[1]; const message = args[2]; - const executeTx = await systemContracts.gatewayEVM.execute(receiver, message, { value: 0 }); + const executeTx = await protocolContracts.gatewayEVM.connect(tss).execute(receiver, message, { value: 0 }); await executeTx.wait(); }); // event Withdrawal(address indexed from, address zrc20, bytes to, uint256 value, uint256 gasfee, uint256 protocolFlatFee, bytes message); - systemContracts.gatewayZEVM.on("Withdrawal", async (...args: Array) => { + protocolContracts.gatewayZEVM.on("Withdrawal", async (...args: Array) => { console.log("Worker: Withdrawal event on GatewayZEVM."); - const receiver = args[1]; + const receiver = args[2]; const message = args[6]; if (message != "0x") { console.log("Worker: Calling ReceiverEVM through GatewayEVM..."); - const executeTx = await systemContracts.gatewayEVM.execute(receiver, message, { value: 0 }); + const executeTx = await protocolContracts.gatewayEVM.connect(tss).execute(receiver, message, { value: 0 }); await executeTx.wait(); } }); @@ -148,13 +169,13 @@ export const startWorker = async () => { }); // event Call(address indexed sender, address indexed receiver, bytes payload); - systemContracts.gatewayEVM.on("Call", async (...args: Array) => { + protocolContracts.gatewayEVM.on("Call", async (...args: Array) => { console.log("Worker: Call event on GatewayEVM."); console.log("Worker: Calling TestZContract through GatewayZEVM..."); const zContract = args[1]; const payload = args[2]; - const executeTx = await systemContracts.gatewayZEVM.connect(fungibleModuleSigner).execute( - [systemContracts.gatewayZEVM.address, fungibleModuleSigner.address, 1], + const executeTx = await protocolContracts.gatewayZEVM.connect(fungibleModuleSigner).execute( + [protocolContracts.gatewayZEVM.address, fungibleModuleSigner.address, 1], // onCrosschainCall contains zrc20 and amount which is not available in Call event testContracts.ZRC20Contract.address, parseEther("0"), @@ -165,17 +186,17 @@ export const startWorker = async () => { }); // event Deposit(address indexed sender, address indexed receiver, uint256 amount, address asset, bytes payload); - systemContracts.gatewayEVM.on("Deposit", async (...args: Array) => { + protocolContracts.gatewayEVM.on("Deposit", async (...args: Array) => { console.log("Worker: Deposit event on GatewayEVM."); const receiver = args[1]; const asset = args[3]; const payload = args[4]; if (payload != "0x") { console.log("Worker: Calling TestZContract through GatewayZEVM..."); - const executeTx = await systemContracts.gatewayZEVM + const executeTx = await protocolContracts.gatewayZEVM .connect(fungibleModuleSigner) .execute( - [systemContracts.gatewayZEVM.address, fungibleModuleSigner.address, 1], + [protocolContracts.gatewayZEVM.address, fungibleModuleSigner.address, 1], asset, parseEther("0"), receiver, diff --git a/tasks/localnet.ts b/tasks/localnet.ts index 48d7001f..9af9b7eb 100644 --- a/tasks/localnet.ts +++ b/tasks/localnet.ts @@ -7,8 +7,8 @@ declare const hre: any; // Otherwise, provide custom addresses as parameters. task("zevm-call", "calls evm contract from zevm account") - .addOptionalParam("gatewayZEVM", "contract address of gateway on ZEVM", "0x0165878A594ca255338adfa4d48449f69242Eb8F") - .addOptionalParam("receiverEVM", "contract address of receiver on EVM", "0x2279B7A0a67DB372996a5FaB50D91eAA73d2eBe6") + .addOptionalParam("gatewayZEVM", "contract address of gateway on ZEVM", "0x2279B7A0a67DB372996a5FaB50D91eAA73d2eBe6") + .addOptionalParam("receiverEVM", "contract address of receiver on EVM", "0x610178dA211FEF7D417bC0e6FeD39F05609AD788") .setAction(async (taskArgs) => { const gatewayZEVM = await hre.ethers.getContractAt("GatewayZEVM", taskArgs.gatewayZEVM); const receiverEVM = await hre.ethers.getContractAt("ReceiverEVM", taskArgs.receiverEVM); @@ -22,15 +22,16 @@ task("zevm-call", "calls evm contract from zevm account") try { const callTx = await gatewayZEVM.call(receiverEVM.address, message); await callTx.wait(); + console.log("ReceiverEVM called from ZEVM"); } catch (e) { console.error("Error calling ReceiverEVM:", e); } }); task("zevm-withdraw-and-call", "withdraws zrc20 and calls evm contract from zevm account") - .addOptionalParam("gatewayZEVM", "contract address of gateway on ZEVM", "0x0165878A594ca255338adfa4d48449f69242Eb8F") - .addOptionalParam("receiverEVM", "contract address of receiver on EVM", "0x2279B7A0a67DB372996a5FaB50D91eAA73d2eBe6") - .addOptionalParam("zrc20", "contract address of zrc20", "0x9fd96203f7b22bCF72d9DCb40ff98302376cE09c") + .addOptionalParam("gatewayZEVM", "contract address of gateway on ZEVM", "0x2279B7A0a67DB372996a5FaB50D91eAA73d2eBe6") + .addOptionalParam("receiverEVM", "contract address of receiver on EVM", "0x610178dA211FEF7D417bC0e6FeD39F05609AD788") + .addOptionalParam("zrc20", "contract address of zrc20", "0x2ca7d64A7EFE2D62A725E2B35Cf7230D6677FfEe") .addOptionalParam("amount", "amount to withdraw", "1") .setAction(async (taskArgs) => { const gatewayZEVM = await hre.ethers.getContractAt("GatewayZEVM", taskArgs.gatewayZEVM); @@ -48,7 +49,12 @@ task("zevm-withdraw-and-call", "withdraws zrc20 and calls evm contract from zevm try { const callTx = await gatewayZEVM .connect(ownerZEVM) - .withdrawAndCall(receiverEVM.address, hre.ethers.utils.parseEther(taskArgs.amount), zrc20.address, message); + ["withdrawAndCall(bytes,uint256,address,bytes)"]( + receiverEVM.address, + hre.ethers.utils.parseEther(taskArgs.amount), + zrc20.address, + message + ); await callTx.wait(); console.log("ReceiverEVM called from ZEVM"); } catch (e) { @@ -57,8 +63,8 @@ task("zevm-withdraw-and-call", "withdraws zrc20 and calls evm contract from zevm }); task("evm-call", "calls zevm zcontract from evm account") - .addOptionalParam("gatewayEVM", "contract address of gateway on EVM", "0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512") - .addOptionalParam("zContract", "contract address of zContract on ZEVM", "0xB7f8BC63BbcaD18155201308C8f3540b07f84F5e") + .addOptionalParam("gatewayEVM", "contract address of gateway on EVM", "0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0") + .addOptionalParam("zContract", "contract address of zContract on ZEVM", "0x0DCd1Bf9A1b36cE34237eEaFef220932846BCD82") .setAction(async (taskArgs) => { const gatewayEVM = await hre.ethers.getContractAt("GatewayEVM", taskArgs.gatewayEVM); const zContract = await hre.ethers.getContractAt("TestZContract", taskArgs.zContract); @@ -75,9 +81,9 @@ task("evm-call", "calls zevm zcontract from evm account") }); task("evm-deposit-and-call", "deposits erc20 and calls zevm zcontract from evm account") - .addOptionalParam("gatewayEVM", "contract address of gateway on EVM", "0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512") - .addOptionalParam("zContract", "contract address of zContract on ZEVM", "0xB7f8BC63BbcaD18155201308C8f3540b07f84F5e") - .addOptionalParam("erc20", "contract address of erc20", "0xa513e6e4b8f2a923d98304ec87f64353c4d5c853") + .addOptionalParam("gatewayEVM", "contract address of gateway on EVM", "0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0") + .addOptionalParam("zContract", "contract address of zContract on ZEVM", "0x0DCd1Bf9A1b36cE34237eEaFef220932846BCD82") + .addOptionalParam("erc20", "contract address of erc20", "0x8A791620dd6260079BF849Dc5567aDC3F2FdC318") .addOptionalParam("amount", "amount to deposit", "1") .setAction(async (taskArgs) => { const gatewayEVM = await hre.ethers.getContractAt("GatewayEVM", taskArgs.gatewayEVM); From 5231707ea704df357cd86da58fbea23706fe1521 Mon Sep 17 00:00:00 2001 From: skosito Date: Tue, 30 Jul 2024 16:17:19 +0200 Subject: [PATCH 2/2] fix PR comments --- README.md | 4 ++-- v1/package.json | 1 - v1/yarn.lock | 7 ------- v2/README.md | 6 +++--- 4 files changed, 5 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index 72fd47bd..f993d82e 100644 --- a/README.md +++ b/README.md @@ -9,5 +9,5 @@ Contracts of official protocol contracts deployed by the core ZetaChain team. ## Packages -- [v1 legacy contracts](v1) -- [v2 new contracts (currently in development)](v2) \ No newline at end of file +* [v1 legacy contracts](v1) +* [v2 new contracts (currently in development)](v2) \ No newline at end of file diff --git a/v1/package.json b/v1/package.json index 28395579..f028cded 100644 --- a/v1/package.json +++ b/v1/package.json @@ -5,7 +5,6 @@ "@ethersproject/abi": "^5.4.7", "@ethersproject/providers": "^5.4.7", "@nomicfoundation/hardhat-chai-matchers": "^1.0.6", - "@nomicfoundation/hardhat-foundry": "^1.1.2", "@nomicfoundation/hardhat-network-helpers": "^1.0.0", "@nomicfoundation/hardhat-toolbox": "^2.0.0", "@nomicfoundation/hardhat-verify": "2.0.3", diff --git a/v1/yarn.lock b/v1/yarn.lock index c4ed4e16..2777ab0d 100644 --- a/v1/yarn.lock +++ b/v1/yarn.lock @@ -1359,13 +1359,6 @@ deep-eql "^4.0.1" ordinal "^1.0.3" -"@nomicfoundation/hardhat-foundry@^1.1.2": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@nomicfoundation/hardhat-foundry/-/hardhat-foundry-1.1.2.tgz#4f5aaa1803b8f5d974dcbc361beb72d49c815562" - integrity sha512-f5Vhj3m2qvKGpr6NAINYwNgILDsai8dVCsFb1rAVLkJxOmD2pAtfCmOH5SBVr9yUI5B1z9rbTwPBJVrqnb+PXQ== - dependencies: - chalk "^2.4.2" - "@nomicfoundation/hardhat-network-helpers@^1.0.0": version "1.0.8" resolved "https://registry.npmjs.org/@nomicfoundation/hardhat-network-helpers/-/hardhat-network-helpers-1.0.8.tgz" diff --git a/v2/README.md b/v2/README.md index cef47d16..d5f72b3d 100644 --- a/v2/README.md +++ b/v2/README.md @@ -2,7 +2,7 @@ We are currently developing Version 2 (V2) of our smart contract architecture. This new version will significantly enhance the developer experience for building Universal Apps. -Developers can already begin testing the new interface by referring to [the V2 Localnet guide](/v2_localnet.md). +Developers can already begin testing the new interface by referring to [the V2 Localnet guide](./scripts/localnet//v2_localnet.md). ### Build @@ -34,10 +34,10 @@ $ forge snapshot $ anvil ``` -### Deploy +### Deploy using script ```shell -$ forge script script/Counter.s.sol:CounterScript --rpc-url --private-key +$ forge script script/.s.sol: --rpc-url --private-key ``` ### Cast