From a6ab29571035b40dd1d7ecddb2bc3e4bff5279c2 Mon Sep 17 00:00:00 2001 From: Aleksandr Kuperman Date: Thu, 22 Feb 2024 18:30:05 +0000 Subject: [PATCH] chore: adding base L1 to L2 deployment scripts --- scripts/deployment/bridges/base/README.md | 47 +++++ .../base/deploy_01_optimism_messenger.js | 59 +++++++ .../bridges/base/globals_base_mainnet.json | 1 + .../bridges/base/globals_base_sepolia.json | 1 + .../base/test/deploy_00_mock_timelock.js | 57 ++++++ .../base/test/deploy_02_child_mock_erc20.js | 63 +++++++ .../deployment/bridges/base/test/globals.json | 1 + .../messenger_sepolia_sepolia_governor.js | 166 ++++++++++++++++++ .../base/test/verify_00_mock_timelock.js | 8 + .../bridges/base/verify_01_home_mediator.js | 9 + .../globals_optimistic_mainnet.json | 2 +- .../globals_optimistic_sepolia.json | 2 +- 12 files changed, 414 insertions(+), 2 deletions(-) create mode 100644 scripts/deployment/bridges/base/README.md create mode 100644 scripts/deployment/bridges/base/deploy_01_optimism_messenger.js create mode 100644 scripts/deployment/bridges/base/globals_base_mainnet.json create mode 100644 scripts/deployment/bridges/base/globals_base_sepolia.json create mode 100644 scripts/deployment/bridges/base/test/deploy_00_mock_timelock.js create mode 100644 scripts/deployment/bridges/base/test/deploy_02_child_mock_erc20.js create mode 100644 scripts/deployment/bridges/base/test/globals.json create mode 100644 scripts/deployment/bridges/base/test/messenger_sepolia_sepolia_governor.js create mode 100644 scripts/deployment/bridges/base/test/verify_00_mock_timelock.js create mode 100644 scripts/deployment/bridges/base/verify_01_home_mediator.js diff --git a/scripts/deployment/bridges/base/README.md b/scripts/deployment/bridges/base/README.md new file mode 100644 index 0000000..2046f40 --- /dev/null +++ b/scripts/deployment/bridges/base/README.md @@ -0,0 +1,47 @@ +# Bridge-related deployment scripts +This process is the same as described in the original deployment procedure: [deployment](https://github.com/valory-xyz/autonolas-governance/blob/main/scripts/deployment). + +## Steps to engage +The project has submodules to get the dependencies. Make sure you run `git clone --recursive` or init the submodules yourself. +The dependency list is managed by the `package.json` file, and the setup parameters are stored in the `hardhat.config.js` file. +Simply run the following command to install the project: +``` +yarn install +``` +command and compiled with the +``` +npx hardhat compile +``` + +Create a `globals.json` file in the root folder, or copy it from the file with pre-defined parameters (i.e., `scripts/deployment/bridges/base/globals_base_sepolia.json` for the chiado testnet). + +Parameters of the `globals.json` file: +- `contractVerification`: flag for verifying contracts in deployment scripts (`true`) or skipping it (`false`); +- `useLedger`: flag whether to use the hardware wallet (`true`) or proceed with the seed-phrase accounts (`false`); +- `derivationPath`: string with the derivation path; +- `gasPriceInGwei`: gas price in Gwei; +- `L2CrossDomainMessengerAddress`: (Base) CFM Contract Proxy address serving as a system processor of inbound calls across the bridge; +- `timelockAddress`: Timelock address on the root L1 network; + +The script file name identifies the number of deployment steps taken up to the number in the file name. + +Export network-related API keys defined in `hardhat.config.js` file that correspond to the required network. + +To run the script, use the following command: +`npx hardhat run scripts/deployment/bridges/script_name --network network_type`, +where `script_number_and_name` is a script number and name, i.e. `deploy_01_home_mediator.js`, `network_type` is a network type corresponding to the `hardhat.config.js` network configuration. + +## Validity checks and contract verification +Each script controls the obtained values by checking them against the expected ones. Also, each script has a contract verification procedure. +If a contract is deployed with arguments, these arguments are taken from the corresponding `verify_number_and_name` file, where `number_and_name` corresponds to the deployment script number and name. + +## Data packing for cross-bridge transactions +In order to correctly pack the data and supply it to the Timelock such that it is correctly processed across the bridge, +use the following script: [cross-bridge data packing](https://github.com/valory-xyz/autonolas-governance/blob/main/scripts/deployment/bridges/pack-data.js). + + + + + + + diff --git a/scripts/deployment/bridges/base/deploy_01_optimism_messenger.js b/scripts/deployment/bridges/base/deploy_01_optimism_messenger.js new file mode 100644 index 0000000..9aa8d3e --- /dev/null +++ b/scripts/deployment/bridges/base/deploy_01_optimism_messenger.js @@ -0,0 +1,59 @@ +/*global process*/ + +const { ethers } = require("hardhat"); +const { LedgerSigner } = require("@anders-t/ethers-ledger"); + +async function main() { + const fs = require("fs"); + const globalsFile = "globals.json"; + const dataFromJSON = fs.readFileSync(globalsFile, "utf8"); + let parsedData = JSON.parse(dataFromJSON); + const useLedger = parsedData.useLedger; + const derivationPath = parsedData.derivationPath; + const providerName = parsedData.providerName; + const gasPriceInGwei = parsedData.gasPriceInGwei; + + const networkURL = parsedData.networkURL; + const provider = new ethers.providers.JsonRpcProvider(networkURL); + const signers = await ethers.getSigners(); + + let EOA; + if (useLedger) { + EOA = new LedgerSigner(provider, derivationPath); + } else { + EOA = signers[0]; + } + // EOA address + const deployer = await EOA.getAddress(); + console.log("EOA is:", deployer); + + // Transaction signing and execution + console.log("1. EOA to deploy home mediator contract"); + const OptimismMessenger = await ethers.getContractFactory("OptimismMessenger"); + console.log("You are signing the following transaction: OptimismMessenger.connect(EOA).deploy(L2CrossDomainMessengerAddress, timelockAddress)"); + const gasPrice = ethers.utils.parseUnits(gasPriceInGwei, "gwei"); + const optimismMessenger = await OptimismMessenger.connect(EOA).deploy(parsedData.L2CrossDomainMessengerAddress, parsedData.timelockAddress, { gasPrice }); + const result = await optimismMessenger.deployed(); + + // Transaction details + console.log("Contract deployment: OptimismMessenger"); + console.log("Contract address:", optimismMessenger.address); + console.log("Transaction:", result.deployTransaction.hash); + + // Writing updated parameters back to the JSON file + parsedData.optimismMessengerAddress = optimismMessenger.address; + fs.writeFileSync(globalsFile, JSON.stringify(parsedData)); + + // Contract verification + if (parsedData.contractVerification) { + const execSync = require("child_process").execSync; + execSync("npx hardhat verify --constructor-args scripts/deployment/bridges/base/verify_01_home_mediator.js --network " + providerName + " " + optimismMessenger.address, { encoding: "utf-8" }); + } +} + +main() + .then(() => process.exit(0)) + .catch((error) => { + console.error(error); + process.exit(1); + }); diff --git a/scripts/deployment/bridges/base/globals_base_mainnet.json b/scripts/deployment/bridges/base/globals_base_mainnet.json new file mode 100644 index 0000000..92fdbd0 --- /dev/null +++ b/scripts/deployment/bridges/base/globals_base_mainnet.json @@ -0,0 +1 @@ +{"contractVerification":true,"useLedger":true,"derivationPath":"m/44'/60'/2'/0/0","providerName":"base","gasPriceInGwei":"2","networkURL":"https://mainnet.base.org","L1CrossDomainMessengerProxyAddress":"0x866E82a600A1414e583f7F13623F1aC5d58b0Afa","timelockAddress":"0x3C1fF68f5aa342D296d4DEe4Bb1cACCA912D95fE","optimismMessengerAddress":""} \ No newline at end of file diff --git a/scripts/deployment/bridges/base/globals_base_sepolia.json b/scripts/deployment/bridges/base/globals_base_sepolia.json new file mode 100644 index 0000000..df247a3 --- /dev/null +++ b/scripts/deployment/bridges/base/globals_base_sepolia.json @@ -0,0 +1 @@ +{"contractVerification":true,"useLedger":false,"derivationPath":"m/44'/60'/2'/0/0","providerName":"baseSepolia","gasPriceInGwei":"2","networkURL":"https://sepolia.base.org","L1CrossDomainMessengerProxyAddress":"0xC34855F4De64F1840e5686e64278da901e261f20","timelockAddress":"0x04A0afD079F14D539B17253Ea93563934A024165","L2CrossDomainMessengerAddress":"0x4200000000000000000000000000000000000007","optimismMessengerAddress":"0xeDd71796B90eaCc56B074C39BAC90ED2Ca6D93Ee"} \ No newline at end of file diff --git a/scripts/deployment/bridges/base/test/deploy_00_mock_timelock.js b/scripts/deployment/bridges/base/test/deploy_00_mock_timelock.js new file mode 100644 index 0000000..6d4299b --- /dev/null +++ b/scripts/deployment/bridges/base/test/deploy_00_mock_timelock.js @@ -0,0 +1,57 @@ +/*global process*/ + +const { ethers } = require("hardhat"); +const { LedgerSigner } = require("@anders-t/ethers-ledger"); + +async function main() { + const fs = require("fs"); + const globalsFile = "globals.json"; + const dataFromJSON = fs.readFileSync(globalsFile, "utf8"); + let parsedData = JSON.parse(dataFromJSON); + const useLedger = parsedData.useLedger; + const derivationPath = parsedData.derivationPath; + const providerName = "sepolia"; + const gasPriceInGwei = parsedData.gasPriceInGwei; + let EOA; + + const provider = await ethers.providers.getDefaultProvider(providerName); + const signers = await ethers.getSigners(); + + if (useLedger) { + EOA = new LedgerSigner(provider, derivationPath); + } else { + EOA = signers[0]; + } + // EOA address + const deployer = await EOA.getAddress(); + console.log("EOA is:", deployer); + + // Transaction signing and execution + console.log("1. EOA to deploy mock timelock contract"); + const Timelock = await ethers.getContractFactory("MockTimelock"); + console.log("You are signing the following transaction: Timelock.connect(EOA).deploy(L1CrossDomainMessengerProxy)"); + const timelock = await Timelock.connect(EOA).deploy(parsedData.L1CrossDomainMessengerProxyAddress); + const result = await timelock.deployed(); + + // Transaction details + console.log("Contract deployment: MockTimelock"); + console.log("Contract address:", timelock.address); + console.log("Transaction:", result.deployTransaction.hash); + + // Writing updated parameters back to the JSON file + parsedData.timelockAddress = timelock.address; + fs.writeFileSync(globalsFile, JSON.stringify(parsedData)); + + // Contract verification + if (parsedData.contractVerification) { + const execSync = require("child_process").execSync; + execSync("npx hardhat verify --constructor-args scripts/deployment/bridges/base/test/verify_00_mock_timelock.js --network " + providerName + " " + timelock.address, { encoding: "utf-8" }); + } +} + +main() + .then(() => process.exit(0)) + .catch((error) => { + console.error(error); + process.exit(1); + }); diff --git a/scripts/deployment/bridges/base/test/deploy_02_child_mock_erc20.js b/scripts/deployment/bridges/base/test/deploy_02_child_mock_erc20.js new file mode 100644 index 0000000..1137090 --- /dev/null +++ b/scripts/deployment/bridges/base/test/deploy_02_child_mock_erc20.js @@ -0,0 +1,63 @@ +/*global process*/ + +const { ethers } = require("hardhat"); +const { LedgerSigner } = require("@anders-t/ethers-ledger"); + +async function main() { + const fs = require("fs"); + const globalsFile = "globals.json"; + const dataFromJSON = fs.readFileSync(globalsFile, "utf8"); + let parsedData = JSON.parse(dataFromJSON); + const useLedger = parsedData.useLedger; + const derivationPath = parsedData.derivationPath; + const providerName = parsedData.providerName; + const gasPriceInGwei = parsedData.gasPriceInGwei; + + const networkURL = parsedData.networkURL; + const provider = new ethers.providers.JsonRpcProvider(networkURL); + const signers = await ethers.getSigners(); + + let EOA; + if (useLedger) { + EOA = new LedgerSigner(provider, derivationPath); + } else { + EOA = signers[0]; + } + // EOA address + const deployer = await EOA.getAddress(); + console.log("EOA is:", deployer); + + // Transaction signing and execution + console.log("2. EOA to deploy child mock ERC20 contract and change its owner to the FxGovernorTunnel"); + const ChildMockERC20 = await ethers.getContractFactory("ChildMockERC20"); + console.log("You are signing the following transaction: ChildMockERC20.connect(EOA).deploy()"); + const gasPrice = ethers.utils.parseUnits(gasPriceInGwei, "gwei"); + const childMockERC20 = await ChildMockERC20.connect(EOA).deploy({ gasPrice }); + let result = await childMockERC20.deployed(); + + // Transaction details + console.log("Contract deployment: ChildMockERC20"); + console.log("Contract address:", childMockERC20.address); + console.log("Transaction:", result.deployTransaction.hash); + + // Writing updated parameters back to the JSON file + parsedData.childMockERC20Address = childMockERC20.address; + fs.writeFileSync(globalsFile, JSON.stringify(parsedData)); + + // Change the owner of the contract + result = await childMockERC20.changeOwner(parsedData.optimismMessengerAddress, { gasPrice }); + console.log("Transaction:", result.hash); + + // Contract verification + if (parsedData.contractVerification) { + const execSync = require("child_process").execSync; + execSync("npx hardhat verify --network " + providerName + " " + childMockERC20.address, { encoding: "utf-8" }); + } +} + +main() + .then(() => process.exit(0)) + .catch((error) => { + console.error(error); + process.exit(1); + }); diff --git a/scripts/deployment/bridges/base/test/globals.json b/scripts/deployment/bridges/base/test/globals.json new file mode 100644 index 0000000..89c7b61 --- /dev/null +++ b/scripts/deployment/bridges/base/test/globals.json @@ -0,0 +1 @@ +{"contractVerification":true,"useLedger":false,"derivationPath":"m/44'/60'/2'/0/0","providerName":"baseSepolia","gasPriceInGwei":"2","networkURL":"https://sepolia.base.org","L1CrossDomainMessengerProxyAddress":"0xC34855F4De64F1840e5686e64278da901e261f20","timelockAddress":"0x04A0afD079F14D539B17253Ea93563934A024165","L2CrossDomainMessengerAddress":"0x4200000000000000000000000000000000000007","optimismMessengerAddress":"0xeDd71796B90eaCc56B074C39BAC90ED2Ca6D93Ee","childMockERC20Address":"0x17806E2a12d5E0F48C9803cd397DB3F044DA3b77"} \ No newline at end of file diff --git a/scripts/deployment/bridges/base/test/messenger_sepolia_sepolia_governor.js b/scripts/deployment/bridges/base/test/messenger_sepolia_sepolia_governor.js new file mode 100644 index 0000000..442bf20 --- /dev/null +++ b/scripts/deployment/bridges/base/test/messenger_sepolia_sepolia_governor.js @@ -0,0 +1,166 @@ +/*global process*/ + +const { ethers } = require("ethers"); + +const sendFundsFromL1 = true; + +async function main() { + const ALCHEMY_API_KEY_SEPOLIA = process.env.ALCHEMY_API_KEY_SEPOLIA; + const sepoliaURL = "https://eth-sepolia.g.alchemy.com/v2/" + ALCHEMY_API_KEY_SEPOLIA; + const sepoliaProvider = new ethers.providers.JsonRpcProvider(sepoliaURL); + await sepoliaProvider.getBlockNumber().then((result) => { + console.log("Current block number sepolia: " + result); + }); + + const baseSepoliaURL = "https://sepolia.base.org"; + const baseSepoliaProvider = new ethers.providers.JsonRpcProvider(baseSepoliaURL); + await baseSepoliaProvider.getBlockNumber().then((result) => { + console.log("Current block number baseSepolia: " + result); + }); + + const fs = require("fs"); + // CDMProxy address on sepolia + const CDMProxyAddress = "0xC34855F4De64F1840e5686e64278da901e261f20"; + const CDMProxyJSON = "abis/test/L1CrossDomainMessenger.json"; + let contractFromJSON = fs.readFileSync(CDMProxyJSON, "utf8"); + const CDMProxyABI = JSON.parse(contractFromJSON); + const CDMProxy = new ethers.Contract(CDMProxyAddress, CDMProxyABI, sepoliaProvider); + + // Test deployed OptimismMessenger address on baseSepolia + const optimismMessengerAddress = "0xeDd71796B90eaCc56B074C39BAC90ED2Ca6D93Ee"; // payable process on L2 + const optimismMessengerJSON = "artifacts/contracts/bridges/OptimismMessenger.sol/OptimismMessenger.json"; + contractFromJSON = fs.readFileSync(optimismMessengerJSON, "utf8"); + let parsedFile = JSON.parse(contractFromJSON); + const optimismMessengerABI = parsedFile["abi"]; + const optimismMessenger = new ethers.Contract(optimismMessengerAddress, optimismMessengerABI, baseSepoliaProvider); + + // Mock Timelock contract address on sepolia (has CDMProxy address in it already) + const mockTimelockAddress = "0x04A0afD079F14D539B17253Ea93563934A024165"; // payable + const mockTimelockJSON = "artifacts/contracts/bridges/test/MockTimelock.sol/MockTimelock.json"; + contractFromJSON = fs.readFileSync(mockTimelockJSON, "utf8"); + parsedFile = JSON.parse(contractFromJSON); + const mockTimelockABI = parsedFile["abi"]; + const mockTimelock = new ethers.Contract(mockTimelockAddress, mockTimelockABI, sepoliaProvider); + + // ChildMockERC20 address on baseSepolia + const mockChildERC20Address = "0x17806E2a12d5E0F48C9803cd397DB3F044DA3b77"; + const mockChildERC20JSON = "artifacts/contracts/bridges/test/ChildMockERC20.sol/ChildMockERC20.json"; + contractFromJSON = fs.readFileSync(mockChildERC20JSON, "utf8"); + parsedFile = JSON.parse(contractFromJSON); + const mockChildERC20ABI = parsedFile["abi"]; + const mockChildERC20 = new ethers.Contract(mockChildERC20Address, mockChildERC20ABI, baseSepoliaProvider); + + // Get the EOA + const account = ethers.utils.HDNode.fromMnemonic(process.env.TESTNET_MNEMONIC).derivePath("m/44'/60'/0'/0/0"); + const EOAsepolia = new ethers.Wallet(account, sepoliaProvider); + const EOAbaseSepolia = new ethers.Wallet(account, baseSepoliaProvider); + console.log("EOA address",EOAsepolia.address); + if (EOAbaseSepolia.address == EOAsepolia.address) { + console.log("Correct wallet setup"); + } + + // Amount of xETH to send + const amountToSend = ethers.utils.parseEther("0.0001"); + // Amount of ERC20 token to mint + const amountToMint = 100; + + // Send funds to the OptimismMessenger contract + let tx; + if (!sendFundsFromL1) { + // Feed the contract with funds on the L2 side + tx = await EOAbaseSepolia.sendTransaction({to: optimismMessenger.address, value: amountToSend}); + console.log("Send xETH hash", tx.hash); + await tx.wait(); + } + + // Pack the first part of with the zero payload + let target = EOAbaseSepolia.address; + let value = amountToSend; + const payloadLength = 0; + let data = ethers.utils.solidityPack( + ["address", "uint96", "uint32"], + [target, value, payloadLength] + ); + + // Mock Token contract across the bridge must mint 100 OLAS for the deployer + const rawPayload = mockChildERC20.interface.encodeFunctionData("mint", [EOAbaseSepolia.address, amountToMint]); + // Pack the second part of data + target = mockChildERC20Address; + value = 0; + const payload = ethers.utils.arrayify(rawPayload); + data += ethers.utils.solidityPack( + ["address", "uint96", "uint32", "bytes"], + [target, value, payload.length, payload] + ).slice(2); + + // Balance of mock tokens before the cross-bridge transaction + const balanceERC20Before = Number(await mockChildERC20.balanceOf(EOAbaseSepolia.address)); + // Balance of xETH of the OptimismMessenger before the cross-bridge transaction + const balanceETHBefore = await baseSepoliaProvider.getBalance(EOAbaseSepolia.address); + + // Build the final payload to be passed from the imaginary Timelock + const messengerPayload = await optimismMessenger.interface.encodeFunctionData("processMessageFromForeign", [data]); + const minGasLimit = "2000000"; + const timelockPayload = await CDMProxy.interface.encodeFunctionData("sendMessage", [optimismMessengerAddress, + messengerPayload, minGasLimit]); + + // Send the message to baseSepolia receiver + if (!sendFundsFromL1) { + // Funds are not sent from the L1 side, so if the value in payload is non-zero - make sure the L2 contract is fed + const gasLimit = "3000000"; + tx = await mockTimelock.connect(EOAsepolia).execute(timelockPayload, { gasLimit }); + console.log("Timelock data execution hash", tx.hash); + await tx.wait(); + } else { + // If one wants to sent ETH along with the tx, they need to provide much more start up gas limit + // along with the transferred value, as there are more value specific calculations required pre-transfer + const gasLimit = "5000000"; + tx = await mockTimelock.connect(EOAsepolia).execute(timelockPayload, { value: amountToSend, gasLimit }); + console.log("Timelock data execution hash", tx.hash); + await tx.wait(); + } + + // Wait for the event of a processed data on baseSepolia + // catch NewFxMessage event from mockChildERC20 and MessageReceived event from optimismMessenger + // Compare the data sent and the data from the NewFxMessage event that must match + // MessageReceived(uint256 indexed stateId, address indexed sender, bytes message) + let waitForEvent = true; + while (waitForEvent) { + // Check for the last 100 blocks in order to catch the event + const events = await optimismMessenger.queryFilter("MessageReceived", -200); + events.forEach((item) => { + const msg = item["args"]["data"]; + if (msg == data) { + console.log("Event MessageReceived. Message in baseSepolia:", msg); + waitForEvent = false; + } + }); + // Continue waiting for the event if none was received + if (waitForEvent) { + console.log("Waiting for the receive event, next update in 5 minutes ..."); + // Sleep for a minute + await new Promise(r => setTimeout(r, 300000)); + } + } + + // Balance of ERC20 token after the cross-bridge transaction + const balanceERC20After = Number(await mockChildERC20.balanceOf(EOAbaseSepolia.address)); + const balanceERC20Diff = balanceERC20After - balanceERC20Before; + if (balanceERC20Diff == amountToMint) { + console.log("Successfully minted MockChildERC20"); + } + + // Balance of xETH of the OptimismMessenger after the cross-bridge transaction + const balanceETHAfter = await baseSepoliaProvider.getBalance(EOAbaseSepolia.address); + const balanceETHDiff = balanceETHAfter - balanceETHBefore; + if (balanceETHDiff == amountToSend) { + console.log("Successfully sent xETH"); + } +} + +main() + .then(() => process.exit(0)) + .catch((error) => { + console.error(error); + process.exit(1); + }); diff --git a/scripts/deployment/bridges/base/test/verify_00_mock_timelock.js b/scripts/deployment/bridges/base/test/verify_00_mock_timelock.js new file mode 100644 index 0000000..77cb69c --- /dev/null +++ b/scripts/deployment/bridges/base/test/verify_00_mock_timelock.js @@ -0,0 +1,8 @@ +const fs = require("fs"); +const globalsFile = "globals.json"; +const dataFromJSON = fs.readFileSync(globalsFile, "utf8"); +const parsedData = JSON.parse(dataFromJSON); + +module.exports = [ + parsedData.L1CrossDomainMessengerProxyAddress +]; \ No newline at end of file diff --git a/scripts/deployment/bridges/base/verify_01_home_mediator.js b/scripts/deployment/bridges/base/verify_01_home_mediator.js new file mode 100644 index 0000000..e42543b --- /dev/null +++ b/scripts/deployment/bridges/base/verify_01_home_mediator.js @@ -0,0 +1,9 @@ +const fs = require("fs"); +const globalsFile = "globals.json"; +const dataFromJSON = fs.readFileSync(globalsFile, "utf8"); +const parsedData = JSON.parse(dataFromJSON); + +module.exports = [ + parsedData.L2CrossDomainMessengerAddress, + parsedData.timelockAddress +]; \ No newline at end of file diff --git a/scripts/deployment/bridges/optimistic/globals_optimistic_mainnet.json b/scripts/deployment/bridges/optimistic/globals_optimistic_mainnet.json index 797dc2a..2a6c30c 100644 --- a/scripts/deployment/bridges/optimistic/globals_optimistic_mainnet.json +++ b/scripts/deployment/bridges/optimistic/globals_optimistic_mainnet.json @@ -1 +1 @@ -{"contractVerification":true,"useLedger":true,"derivationPath":"m/44'/60'/2'/0/0","providerName":"optimistic","gasPriceInGwei":"2","AMBContractProxyHomeAddress":"0x75Df5AF045d91108662D8080fD1FEFAd6aA0bb59","timelockAddress":"0x3C1fF68f5aa342D296d4DEe4Bb1cACCA912D95fE","homeMediatorAddress":"0x15bd56669F57192a97dF41A2aa8f4403e9491776"} \ No newline at end of file +{"contractVerification":true,"useLedger":true,"derivationPath":"m/44'/60'/2'/0/0","providerName":"optimistic","gasPriceInGwei":"2","networkURL":"https://optimism.drpc.org","L1CrossDomainMessengerProxyAddress":"0x25ace71c97B33Cc4729CF772ae268934F7ab5fA1","timelockAddress":"0x3C1fF68f5aa342D296d4DEe4Bb1cACCA912D95fE","optimismMessengerAddress":""} \ No newline at end of file diff --git a/scripts/deployment/bridges/optimistic/globals_optimistic_sepolia.json b/scripts/deployment/bridges/optimistic/globals_optimistic_sepolia.json index cef8c5b..710c1a5 100644 --- a/scripts/deployment/bridges/optimistic/globals_optimistic_sepolia.json +++ b/scripts/deployment/bridges/optimistic/globals_optimistic_sepolia.json @@ -1 +1 @@ -{"contractVerification":true,"useLedger":false,"derivationPath":"m/44'/60'/2'/0/0","providerName":"optimisticSepolia","gasPriceInGwei":"2","L1CrossDomainMessengerProxyAddress":"0x58Cc85b8D04EA49cC6DBd3CbFFd00B4B8D6cb3ef","timelockAddress":"0x43d28764bB39936185c84906983fB57A8A905a4F","L2CrossDomainMessengerAddress":"0x4200000000000000000000000000000000000007","optimismMessengerAddress":"0x670Ac235EE13C0B2a5065282bBB0c61cfB354592"} \ No newline at end of file +{"contractVerification":true,"useLedger":false,"derivationPath":"m/44'/60'/2'/0/0","providerName":"optimisticSepolia","gasPriceInGwei":"2","networkURL":"https://sepolia.optimism.io","L1CrossDomainMessengerProxyAddress":"0x58Cc85b8D04EA49cC6DBd3CbFFd00B4B8D6cb3ef","timelockAddress":"0x43d28764bB39936185c84906983fB57A8A905a4F","L2CrossDomainMessengerAddress":"0x4200000000000000000000000000000000000007","optimismMessengerAddress":"0x670Ac235EE13C0B2a5065282bBB0c61cfB354592"} \ No newline at end of file