diff --git a/contracts/Arbitrator.sol b/contracts/Arbitrator.sol index 8ed929f..37cc837 100644 --- a/contracts/Arbitrator.sol +++ b/contracts/Arbitrator.sol @@ -185,23 +185,15 @@ contract Arbitrator is IArbitrator, OwnableUpgradeable, UUPSUpgradeable, Reentra bytes calldata _adapterParams ) external payable nonReentrant onlyRelayer { bytes32 _finalizeMessageHash = keccak256(abi.encode(_value, _callData)); - if (_gateway == primaryChainGateway) { - require(_finalizeMessageHash == primaryChainMessageHashQueue.popFront(), "Invalid finalize message hash"); - // Unpack destination chain and final callData - (IL1Gateway secondaryChainGateway, bytes memory finalCallData) = abi.decode(_callData, (IL1Gateway, bytes)); - require(secondaryChainGateways[secondaryChainGateway], "Invalid secondary chain gateway"); - // Forward fee to send message - secondaryChainGateway.sendMessage{value: msg.value + _value}(_value, finalCallData, _adapterParams); - } else { - require(secondaryChainGateways[_gateway], "Not secondary chain gateway"); - require( - _finalizeMessageHash == secondaryChainMessageHashQueues[_gateway].popFront(), - "Invalid finalize message hash" - ); - // Forward fee to send message - primaryChainGateway.sendMessage{value: msg.value + _value}(_value, _callData, _adapterParams); - } - emit MessageForwarded(_gateway, _value, _callData); + require(secondaryChainGateways[_gateway], "Not secondary chain gateway"); + require( + _finalizeMessageHash == secondaryChainMessageHashQueues[_gateway].popFront(), + "Invalid finalize message hash" + ); + // Forward fee to send message + IL1Gateway targetGateway = primaryChainGateway; + targetGateway.sendMessage{value: msg.value + _value}(_value, _callData, _adapterParams); + emit MessageForwarded(targetGateway, _value, _callData); } function claimMessage( diff --git a/examples/optimism/package-lock.json b/examples/optimism/package-lock.json index 364876b..93fc8b5 100644 --- a/examples/optimism/package-lock.json +++ b/examples/optimism/package-lock.json @@ -13,7 +13,7 @@ "dotenv": "^16.4.1" }, "devDependencies": { - "@eth-optimism/sdk": "0.0.0-sc-sdk-fps-mainnet-20240610215134", + "@eth-optimism/sdk": "^3.3.2", "@nomiclabs/hardhat-ethers": "^2.0.2", "ethers": "^5.7.2", "hardhat": "^2.9.1" @@ -79,9 +79,9 @@ } }, "node_modules/@eth-optimism/sdk": { - "version": "0.0.0-sc-sdk-fps-mainnet-20240610215134", - "resolved": "https://registry.npmjs.org/@eth-optimism/sdk/-/sdk-0.0.0-sc-sdk-fps-mainnet-20240610215134.tgz", - "integrity": "sha512-bDEKdHT5elid9blYBC1ISU5polQpK80+qHXRuh9q/s/oqxND3XDpW4cToqqG68VD+XFJs5jw5DY5eHeSOkHRJQ==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/@eth-optimism/sdk/-/sdk-3.3.2.tgz", + "integrity": "sha512-+zhxT0YkBIEzHsuIayQGjr8g9NawZo6/HYfzg1NSEFsE2Yt0NyCWqVDFTuuak0T6AvIa2kNcl3r0Z8drdb2QmQ==", "dev": true, "dependencies": { "@eth-optimism/contracts": "0.6.0", diff --git a/examples/optimism/package.json b/examples/optimism/package.json index ad7d0d6..ca6760c 100644 --- a/examples/optimism/package.json +++ b/examples/optimism/package.json @@ -4,7 +4,7 @@ "version": "1.0.0", "scripts": {}, "devDependencies": { - "@eth-optimism/sdk": "0.0.0-sc-sdk-fps-mainnet-20240610215134", + "@eth-optimism/sdk": "^3.3.2", "@nomiclabs/hardhat-ethers": "^2.0.2", "ethers": "^5.7.2", "hardhat": "^2.9.1" diff --git a/examples/zklinkNova/.env-sample b/examples/zklinkNova/.env-sample index ae3ef53..bc0912b 100644 --- a/examples/zklinkNova/.env-sample +++ b/examples/zklinkNova/.env-sample @@ -2,6 +2,10 @@ # Duplicate this file as .env here +# Your Private key + +DEVNET_PRIVKEY="0x your key here" + # This is zkLink Sepolia Testnet ZKLINK_NOVA_RPC="https://sepolia.rpc.zklink.io" diff --git a/examples/zklinkNova/hardhat.config.js b/examples/zklinkNova/hardhat.config.js index 290f0b6..513ed89 100644 --- a/examples/zklinkNova/hardhat.config.js +++ b/examples/zklinkNova/hardhat.config.js @@ -2,6 +2,7 @@ require('@nomicfoundation/hardhat-toolbox'); require('./scripts/getTxStatus'); require('./scripts/decodeRawTx'); require('./scripts/printGovernanceCall'); +require('./scripts/sendRawTx'); const BaseConfig = require('../../hardhat.base.config'); diff --git a/examples/zklinkNova/scripts/sendRawTx.js b/examples/zklinkNova/scripts/sendRawTx.js new file mode 100644 index 0000000..d4813d5 --- /dev/null +++ b/examples/zklinkNova/scripts/sendRawTx.js @@ -0,0 +1,28 @@ +const { ethers } = require('ethers'); +const { task, types } = require('hardhat/config'); + +require('dotenv').config(); + +task('sendRawTx', 'Send raw tx to nova') + .addParam('to', 'The to address', undefined, types.string) + .addParam('data', 'The call data', undefined, types.string) + .addOptionalParam('value', 'The call value(unit: ether)', '0', types.string) + .addOptionalParam('gasPrice', 'The gas price(unit: gwei)', '0', types.string) + .setAction(async taskArgs => { + const to = taskArgs.to; + const data = taskArgs.data; + const value = ethers.parseEther(taskArgs.value); + const gasPrice = ethers.parseUnits(taskArgs.gasPrice, 'gwei'); + + const provider = new ethers.JsonRpcProvider(process.env.ZKLINK_NOVA_RPC); + const wallet = new ethers.Wallet(process.env.DEVNET_PRIVKEY, provider); + const tx = await wallet.sendTransaction({ + to, + data, + value, + gasPrice, + }); + console.log(`The tx hash: ${tx.hash}`); + const txReceipt = await tx.wait(1); + console.log(`The tx status: ${txReceipt.status}`); + });