From 9ea0601bbc6634629fdccf9a3ed6e48fa0cbdc8b Mon Sep 17 00:00:00 2001 From: TucksonDev Date: Wed, 20 Aug 2025 15:22:57 +0100 Subject: [PATCH 1/5] Deterministic deployment of contracts using Create2 --- package.json | 2 +- scripts/atomicTokenBridgeDeployer.ts | 802 ++++++++++++------ .../deployment/deployTokenBridgeCreator.ts | 13 +- .../local-deployment/localDeploymentLib.ts | 61 +- yarn.lock | 398 ++++++++- 5 files changed, 1003 insertions(+), 273 deletions(-) diff --git a/package.json b/package.json index 7cc704d5d..1ff54731c 100644 --- a/package.json +++ b/package.json @@ -72,7 +72,7 @@ "eslint-plugin-mocha": "^9.0.0", "eslint-plugin-prettier": "^4.0.0", "ethereum-waffle": "^3.2.0", - "ethers": "^5.4.5", + "ethers": "^5.8.0", "fs-extra": "^11.2.0", "hardhat": "2.17.3", "hardhat-contract-sizer": "^2.10.0", diff --git a/scripts/atomicTokenBridgeDeployer.ts b/scripts/atomicTokenBridgeDeployer.ts index 47a375ac2..83ba04951 100644 --- a/scripts/atomicTokenBridgeDeployer.ts +++ b/scripts/atomicTokenBridgeDeployer.ts @@ -1,4 +1,14 @@ -import { BigNumber, Signer, Wallet, ethers } from 'ethers' +import { ethers } from 'hardhat' +import { + BigNumber, + Contract, + ContractFactory, + Overrides, + Signer, + Wallet, +} from 'ethers' +import { Interface, hexZeroPad, defaultAbiCoder } from 'ethers/lib/utils' +import { Provider, Log } from '@ethersproject/providers' import { L1CustomGateway__factory, L1ERC20Gateway__factory, @@ -24,8 +34,8 @@ import { ArbMulticall2__factory, Multicall2__factory, IInboxProxyAdmin__factory, - ERC20__factory, UpgradeExecutor__factory, + L1TokenBridgeRetryableSender, } from '../build/types' import { abi as UpgradeExecutorABI, @@ -36,7 +46,7 @@ import { ParentToChildMessageGasEstimator, ParentToChildMessageStatus, ParentTransactionReceipt, - ParentContractCallTransactionReceipt + ParentContractCallTransactionReceipt, } from '@arbitrum/sdk' import { exit } from 'process' import { getBaseFee } from '@arbitrum/sdk/dist/lib/utils/lib' @@ -45,12 +55,120 @@ import { ContractVerifier } from './contractVerifier' import { OmitTyped } from '@arbitrum/sdk/dist/lib/utils/types' import { _getScaledAmount } from './local-deployment/localDeploymentLib' import { ParentToChildMessageGasParams } from '@arbitrum/sdk/dist/lib/message/ParentToChildMessageCreator' +import { + concat, + getCreate2Address, + hexDataLength, + keccak256, +} from 'ethers/lib/utils' /** * Dummy non-zero address which is provided to logic contracts initializers */ const ADDRESS_DEAD = '0x000000000000000000000000000000000000dEaD' +/** + * Types + */ +export type DeployTokenBridgeCreatorResult = { + parentTokenBridgeCreator: L1AtomicTokenBridgeCreator + retryableSender: L1TokenBridgeRetryableSender +} + +/** + * @notice Deploys a contract using the provided factory class and signer. + * @dev Supports optional contract verification and deployment via CREATE2. + * @param FactoryClass - The contract factory class to use for deployment. + * @param signer - The signer to deploy the contract. + * @param constructorArgs - Arguments for the contract constructor. + * @param verify - Whether to verify the contract after deployment. + * @param useCreate2 - Whether to use CREATE2 for deployment. + * @param overrides - Optional transaction overrides. + * @return The deployed contract instance. + */ +export async function deployContract( + FactoryClass: new (signer: Signer) => ContractFactory, + signer: Signer, + constructorArgs: any[] = [], + verify = true, + useCreate2 = false, + overrides?: Overrides +): Promise { + const factory = new FactoryClass(signer) + + const deploymentArgs = [...constructorArgs] + if (overrides) { + deploymentArgs.push(overrides) + } + + let contract: Contract + if (useCreate2) { + contract = await create2( + factory, + constructorArgs, + ethers.constants.HashZero, + overrides + ) + } else { + contract = await factory.deploy(...deploymentArgs) + await contract.deployTransaction.wait() + } + + const contractName = FactoryClass.name.replace('__factory', '') + + console.log( + `* ${contractName} created at address: ${ + contract.address + } ${constructorArgs.join(' ')}` + ) + + /* + if (verify) { + await verifyContract( + signer, + contractName, + contract.address, + constructorArgs + ) + } + */ + + return contract +} + +/** + * @notice Initializes a contract by calling its `initialize` function with the provided arguments. + * @dev If the contract is already initialized, logs a message and does not throw. + * @param contract The contract instance to initialize. + * @param initializationArgs Arguments to pass to the contract's `initialize` function. + * @throws If initialization fails for reasons other than the contract being already initialized. + */ +export async function initializeContract( + contract: Contract, + initializationArgs: any[] = [] +): Promise { + const contractName = contract.constructor.name.replace('__factory', '') + + try { + await (await contract.initialize(...initializationArgs)).wait() + console.log(` => Initialized successfully`) + } catch (error: any) { + // Revert reason will be in `error.error.reason` + if ( + error.error && + error.error.reason && + [ + 'execution reverted: ALREADY_INIT', + 'execution reverted: Initializable: contract is already initialized', + ].includes(error.error.reason) + ) { + console.log(` => Already initialized`) + } else { + throw error + } + } +} + /** * Use already deployed L1TokenBridgeCreator to create and init token bridge contracts. * Function first gets estimates for 2 retryable tickets - one for deploying L2 factory and @@ -65,7 +183,7 @@ const ADDRESS_DEAD = '0x000000000000000000000000000000000000dEaD' */ export const createTokenBridge = async ( l1Signer: Signer, - l2Provider: ethers.providers.Provider, + l2Provider: Provider, l1TokenBridgeCreator: L1AtomicTokenBridgeCreator, rollupAddress: string, rollupOwnerAddress: string @@ -100,23 +218,23 @@ export const createTokenBridge = async ( const gasEstimateToDeployContracts = await l2FactoryTemplate.estimateGas.deployL2Contracts( l2Code, - ethers.Wallet.createRandom().address, - ethers.Wallet.createRandom().address, - ethers.Wallet.createRandom().address, - ethers.Wallet.createRandom().address, - ethers.Wallet.createRandom().address, - ethers.Wallet.createRandom().address, - ethers.Wallet.createRandom().address, - ethers.Wallet.createRandom().address + Wallet.createRandom().address, + Wallet.createRandom().address, + Wallet.createRandom().address, + Wallet.createRandom().address, + Wallet.createRandom().address, + Wallet.createRandom().address, + Wallet.createRandom().address, + Wallet.createRandom().address ) const maxGasForContracts = gasEstimateToDeployContracts.mul(2) const maxSubmissionCostForContracts = deployFactoryGasParams.maxSubmissionCost.mul(2) - let retryableFeeForFactory = maxSubmissionCostForFactory.add( + const retryableFeeForFactory = maxSubmissionCostForFactory.add( maxGasForFactory.mul(gasPrice) ) - let retryableFeeForContracts = maxSubmissionCostForContracts.add( + const retryableFeeForContracts = maxSubmissionCostForContracts.add( maxGasForContracts.mul(gasPrice) ) @@ -130,12 +248,12 @@ export const createTokenBridge = async ( const feeToken = await _getFeeToken(inbox, l1Signer.provider!) if (feeToken != ethers.constants.AddressZero) { // scale the retryable fees to the fee token decimals denomination - let scaledRetryableFeeForFactory = await _getScaledAmount( + const scaledRetryableFeeForFactory = await _getScaledAmount( feeToken, retryableFeeForFactory, l1Signer.provider! ) - let scaledRetryableFeeForContracts = await _getScaledAmount( + const scaledRetryableFeeForContracts = await _getScaledAmount( feeToken, retryableFeeForContracts, l1Signer.provider! @@ -215,254 +333,380 @@ export const createTokenBridge = async ( } /** - * Deploy token bridge creator contract to base chain and set all the templates - * @param l1Deployer - * @param l2Provider - * @param l1WethAddress - * @returns + * @notice Deploys the TokenBridgeCreator and all required template contracts on the parent chain. + * + * This function deploys and initializes all necessary contracts for the TokenBridgeCreator on the parent chain. + * It also configures the TokenBridgeCreator with the deployed templates. + * + * @param parentChainDeployer - The signer used to deploy contracts on the parent chain. + * @param parentWethAddress - The address of the WETH token on the parent chain. + * @param gasLimitForFactoryDeploymentOnChildChain - The gas limit to use for deploying the factory on the child chain. + * @param verifyContracts - Optional. If true, contract verification will be performed after deployment. Defaults to false. + * @param useCreate2 - Optional. If true, contracts will be deployed using CREATE2 for deterministic addresses. Defaults to false. + * + * @returns An object containing the deployed parentTokenBridgeCreator and retryableSender contract instances. */ -export const deployL1TokenBridgeCreator = async ( - l1Deployer: Signer, - l1WethAddress: string, - gasLimitForL2FactoryDeployment: BigNumber, - verifyContracts = false -) => { - /// deploy creator behind proxy - const l2MulticallAddressOnL1Fac = await new ArbMulticall2__factory( - l1Deployer - ).deploy() - const l2MulticallAddressOnL1 = await l2MulticallAddressOnL1Fac.deployed() - - const l1TokenBridgeCreatorProxyAdmin = await new ProxyAdmin__factory( - l1Deployer - ).deploy() - await l1TokenBridgeCreatorProxyAdmin.deployed() - - const l1TokenBridgeCreatorLogic = - await new L1AtomicTokenBridgeCreator__factory(l1Deployer).deploy() - await l1TokenBridgeCreatorLogic.deployed() - - const l1TokenBridgeCreatorProxy = - await new TransparentUpgradeableProxy__factory(l1Deployer).deploy( - l1TokenBridgeCreatorLogic.address, - l1TokenBridgeCreatorProxyAdmin.address, - '0x' - ) - await l1TokenBridgeCreatorProxy.deployed() +export const deployTokenBridgeCreatorOnParentChain = async ( + parentChainDeployer: Signer, + parentWethAddress: string, + gasLimitForFactoryDeploymentOnChildChain: BigNumber, + verifyContracts = false, + useCreate2 = false +): Promise => { + // + // Parent chain helper contracts + // + // Multicall2 + const parentMulticall2 = await deployContract( + Multicall2__factory, + parentChainDeployer, + [], + verifyContracts, + useCreate2 + ) - const l1TokenBridgeCreator = L1AtomicTokenBridgeCreator__factory.connect( - l1TokenBridgeCreatorProxy.address, - l1Deployer + // + // Parent chain TokenBridge contracts + // (for Arbitrum and ETH-based chains) + // + // Gateway router (initialized with dummy data) + const parentGatewayRouterTemplate = await deployContract( + L1GatewayRouter__factory, + parentChainDeployer, + [], + verifyContracts, + useCreate2 + ) + await initializeContract(parentGatewayRouterTemplate, [ + ADDRESS_DEAD, + ADDRESS_DEAD, + ADDRESS_DEAD, + ADDRESS_DEAD, + ADDRESS_DEAD, + ]) + + // ERC-20 Gateway (initialized with dummy data) + const parentErc20GatewayTemplate = await deployContract( + L1ERC20Gateway__factory, + parentChainDeployer, + [], + verifyContracts, + useCreate2 + ) + await initializeContract(parentErc20GatewayTemplate, [ + ADDRESS_DEAD, + ADDRESS_DEAD, + ADDRESS_DEAD, + hexZeroPad('0x01', 32), + ADDRESS_DEAD, + ]) + + // Generic-custom Gateway (initialized with dummy data) + const parentCustomGatewayTemplate = await deployContract( + L1CustomGateway__factory, + parentChainDeployer, + [], + verifyContracts, + useCreate2 + ) + await initializeContract(parentCustomGatewayTemplate, [ + ADDRESS_DEAD, + ADDRESS_DEAD, + ADDRESS_DEAD, + ADDRESS_DEAD, + ]) + + // WETH Gateway (initialized with dummy data) + const parentWethGatewayTemplate = await deployContract( + L1WethGateway__factory, + parentChainDeployer, + [], + verifyContracts, + useCreate2 + ) + await initializeContract(parentWethGatewayTemplate, [ + ADDRESS_DEAD, + ADDRESS_DEAD, + ADDRESS_DEAD, + ADDRESS_DEAD, + ADDRESS_DEAD, + ]) + + // + // Parent chain TokenBridge contracts + // (for Custom Gas Token chains) + // + // Gateway router (initialized with dummy data) + const parentGatewayRouterOrbitTemplate = await deployContract( + L1OrbitGatewayRouter__factory, + parentChainDeployer, + [], + verifyContracts, + useCreate2 + ) + await initializeContract(parentGatewayRouterOrbitTemplate, [ + ADDRESS_DEAD, + ADDRESS_DEAD, + ADDRESS_DEAD, + ADDRESS_DEAD, + ADDRESS_DEAD, + ]) + + // ERC-20 Gateway (initialized with dummy data) + const parentErc20GatewayOrbitTemplate = await deployContract( + L1OrbitERC20Gateway__factory, + parentChainDeployer, + [], + verifyContracts, + useCreate2 + ) + await initializeContract(parentErc20GatewayOrbitTemplate, [ + ADDRESS_DEAD, + ADDRESS_DEAD, + ADDRESS_DEAD, + hexZeroPad('0x01', 32), + ADDRESS_DEAD, + ]) + + // Generic-custom Gateway (initialized with dummy data) + const parentCustomGatewayOrbitTemplate = await deployContract( + L1OrbitCustomGateway__factory, + parentChainDeployer, + [], + verifyContracts, + useCreate2 + ) + await initializeContract(parentCustomGatewayOrbitTemplate, [ + ADDRESS_DEAD, + ADDRESS_DEAD, + ADDRESS_DEAD, + ADDRESS_DEAD, + ]) + + // + // Upgrade Executor + // (Deployed using ABI and bytecode from @offchainlabs/upgrade-executor) + // + const upgradeExecutorTemplate = await deployContract( + UpgradeExecutor__factory, + parentChainDeployer, + [], + verifyContracts, + useCreate2 + ) + await initializeContract(upgradeExecutorTemplate, [ + ADDRESS_DEAD, + [ADDRESS_DEAD], + ]) + + // + // ProxyAdmin + // + const parentTokenBridgeCreatorProxyAdmin = await deployContract( + ProxyAdmin__factory, + parentChainDeployer, + [], + verifyContracts, + useCreate2 ) - /// deploy retryable sender behind proxy - const retryableSenderLogic = await new L1TokenBridgeRetryableSender__factory( - l1Deployer - ).deploy() - await retryableSenderLogic.deployed() + // + // Retryable sender + // + // RetryableSender logic contract + // Note: this contract is initialized when the TokenBridgeCreator logic contract is initialized + const retryableSenderLogic = await deployContract( + L1TokenBridgeRetryableSender__factory, + parentChainDeployer, + [], + verifyContracts, + useCreate2 + ) - const retryableSenderProxy = await new TransparentUpgradeableProxy__factory( - l1Deployer - ).deploy( - retryableSenderLogic.address, - l1TokenBridgeCreatorProxyAdmin.address, - '0x' + // RetryableSender proxy + // Note: this proxy is initialized when the TokenBridgeCreator is initialized + const retryableSenderProxy = await deployContract( + TransparentUpgradeableProxy__factory, + parentChainDeployer, + [ + retryableSenderLogic.address, + parentTokenBridgeCreatorProxyAdmin.address, + '0x', + ], + verifyContracts, + useCreate2 ) - await retryableSenderProxy.deployed() + // RetryableSender contract instance const retryableSender = L1TokenBridgeRetryableSender__factory.connect( retryableSenderProxy.address, - l1Deployer + parentChainDeployer ) - // initialize retryable sender logic contract - await (await retryableSenderLogic.initialize()).wait() - - /// init creator - await (await l1TokenBridgeCreator.initialize(retryableSender.address)).wait() - - /// deploy L1 logic contracts. Initialize them with dummy data - const routerTemplate = await new L1GatewayRouter__factory(l1Deployer).deploy() - await routerTemplate.deployed() - await ( - await routerTemplate.initialize( - ADDRESS_DEAD, - ADDRESS_DEAD, - ADDRESS_DEAD, - ADDRESS_DEAD, - ADDRESS_DEAD - ) - ).wait() - - const standardGatewayTemplate = await new L1ERC20Gateway__factory( - l1Deployer - ).deploy() - await standardGatewayTemplate.deployed() - await ( - await standardGatewayTemplate.initialize( - ADDRESS_DEAD, - ADDRESS_DEAD, - ADDRESS_DEAD, - ethers.utils.hexZeroPad('0x01', 32), - ADDRESS_DEAD - ) - ).wait() - - const customGatewayTemplate = await new L1CustomGateway__factory( - l1Deployer - ).deploy() - await customGatewayTemplate.deployed() - await ( - await customGatewayTemplate.initialize( - ADDRESS_DEAD, - ADDRESS_DEAD, - ADDRESS_DEAD, - ADDRESS_DEAD - ) - ).wait() - - const wethGatewayTemplate = await new L1WethGateway__factory( - l1Deployer - ).deploy() - await wethGatewayTemplate.deployed() - await ( - await wethGatewayTemplate.initialize( - ADDRESS_DEAD, - ADDRESS_DEAD, - ADDRESS_DEAD, - ADDRESS_DEAD, - ADDRESS_DEAD - ) - ).wait() - - const feeTokenBasedRouterTemplate = await new L1OrbitGatewayRouter__factory( - l1Deployer - ).deploy() - await feeTokenBasedRouterTemplate.deployed() - await ( - await feeTokenBasedRouterTemplate.initialize( - ADDRESS_DEAD, - ADDRESS_DEAD, - ADDRESS_DEAD, - ADDRESS_DEAD, - ADDRESS_DEAD - ) - ).wait() - - const feeTokenBasedStandardGatewayTemplate = - await new L1OrbitERC20Gateway__factory(l1Deployer).deploy() - await feeTokenBasedStandardGatewayTemplate.deployed() - await ( - await feeTokenBasedStandardGatewayTemplate.initialize( - ADDRESS_DEAD, - ADDRESS_DEAD, - ADDRESS_DEAD, - ethers.utils.hexZeroPad('0x01', 32), - ADDRESS_DEAD - ) - ).wait() + // + // Parent chain TokenBridgeCreator + // + // TokenBridgeCreator logic contract + const parentTokenBridgeCreatorLogic = await deployContract( + L1AtomicTokenBridgeCreator__factory, + parentChainDeployer, + [], + verifyContracts, + useCreate2 + ) + await initializeContract(parentTokenBridgeCreatorLogic, [ + retryableSenderLogic.address, + ]) + + // TokenBridgeCreator proxy + const parentTokenBridgeCreatorProxy = await deployContract( + TransparentUpgradeableProxy__factory, + parentChainDeployer, + [ + parentTokenBridgeCreatorLogic.address, + parentTokenBridgeCreatorProxyAdmin.address, + '0x', + ], + verifyContracts, + useCreate2 + ) - const feeTokenBasedCustomGatewayTemplate = - await new L1OrbitCustomGateway__factory(l1Deployer).deploy() - await feeTokenBasedCustomGatewayTemplate.deployed() - await ( - await feeTokenBasedCustomGatewayTemplate.initialize( - ADDRESS_DEAD, - ADDRESS_DEAD, - ADDRESS_DEAD, - ADDRESS_DEAD - ) - ).wait() + // TokenBridgeCreator contract instance + const parentTokenBridgeCreator = L1AtomicTokenBridgeCreator__factory.connect( + parentTokenBridgeCreatorProxy.address, + parentChainDeployer + ) + await initializeContract(parentTokenBridgeCreator, [retryableSender.address]) + + // + // Child chain helper contracts + // + // ArbMulticall + const childArbMulticall = await deployContract( + ArbMulticall2__factory, + parentChainDeployer, + [], + verifyContracts, + useCreate2 + ) - const upgradeExecutorFactory = new ethers.ContractFactory( - UpgradeExecutorABI, - UpgradeExecutorBytecode, - l1Deployer + // + // Child chain TokenBridge contracts + // (deployed on the parent chain as templates) + // + // Gateway router (initialized with dummy data) + const childGatewayRouterTemplate = await deployContract( + L2GatewayRouter__factory, + parentChainDeployer, + [], + verifyContracts, + useCreate2 + ) + await initializeContract(childGatewayRouterTemplate, [ + ADDRESS_DEAD, + ADDRESS_DEAD, + ]) + + // ERC-20 Gateway (initialized with dummy data) + const childErc20GatewayTemplate = await deployContract( + L2ERC20Gateway__factory, + parentChainDeployer, + [], + verifyContracts, + useCreate2 + ) + await initializeContract(childErc20GatewayTemplate, [ + ADDRESS_DEAD, + ADDRESS_DEAD, + ADDRESS_DEAD, + ]) + + // Generic-custom Gateway (initialized with dummy data) + const childCustomGatewayTemplate = await deployContract( + L2CustomGateway__factory, + parentChainDeployer, + [], + verifyContracts, + useCreate2 + ) + await initializeContract(childCustomGatewayTemplate, [ + ADDRESS_DEAD, + ADDRESS_DEAD, + ]) + + // WETH Gateway (initialized with dummy data) + const childWethGatewayTemplate = await deployContract( + L2WethGateway__factory, + parentChainDeployer, + [], + verifyContracts, + useCreate2 + ) + await initializeContract(childWethGatewayTemplate, [ + ADDRESS_DEAD, + ADDRESS_DEAD, + ADDRESS_DEAD, + ADDRESS_DEAD, + ]) + + // WETH token contract + const childWeth = await deployContract( + AeWETH__factory, + parentChainDeployer, + [], + verifyContracts, + useCreate2 + ) + await initializeContract(childWeth, [ + 'WethTemplate', + 'WETHT', + 18, + ADDRESS_DEAD, + ADDRESS_DEAD, + ]) + + // TokenBridge factory + const childTokenBridgeFactory = await deployContract( + L2AtomicTokenBridgeFactory__factory, + parentChainDeployer, + [], + verifyContracts, + useCreate2 ) - const upgradeExecutor = await upgradeExecutorFactory.deploy() - await upgradeExecutor.deployed() - const l1Templates = { - routerTemplate: routerTemplate.address, - standardGatewayTemplate: standardGatewayTemplate.address, - customGatewayTemplate: customGatewayTemplate.address, - wethGatewayTemplate: wethGatewayTemplate.address, - feeTokenBasedRouterTemplate: feeTokenBasedRouterTemplate.address, + // + // Set templates on TokenBridgeCreator + // + const parentChainTemplates = { + routerTemplate: parentGatewayRouterTemplate.address, + standardGatewayTemplate: parentErc20GatewayTemplate.address, + customGatewayTemplate: parentCustomGatewayTemplate.address, + wethGatewayTemplate: parentWethGatewayTemplate.address, + feeTokenBasedRouterTemplate: parentGatewayRouterOrbitTemplate.address, feeTokenBasedStandardGatewayTemplate: - feeTokenBasedStandardGatewayTemplate.address, + parentErc20GatewayOrbitTemplate.address, feeTokenBasedCustomGatewayTemplate: - feeTokenBasedCustomGatewayTemplate.address, - upgradeExecutor: upgradeExecutor.address, + parentCustomGatewayOrbitTemplate.address, + upgradeExecutor: upgradeExecutorTemplate.address, } - /// deploy L2 contracts as placeholders on L1. Initialize them with dummy data - const l2TokenBridgeFactoryOnL1 = - await new L2AtomicTokenBridgeFactory__factory(l1Deployer).deploy() - await l2TokenBridgeFactoryOnL1.deployed() - - const l2GatewayRouterOnL1 = await new L2GatewayRouter__factory( - l1Deployer - ).deploy() - await l2GatewayRouterOnL1.deployed() - await ( - await l2GatewayRouterOnL1.initialize(ADDRESS_DEAD, ADDRESS_DEAD) - ).wait() - - const l2StandardGatewayAddressOnL1 = await new L2ERC20Gateway__factory( - l1Deployer - ).deploy() - await l2StandardGatewayAddressOnL1.deployed() await ( - await l2StandardGatewayAddressOnL1.initialize( - ADDRESS_DEAD, - ADDRESS_DEAD, - ADDRESS_DEAD - ) - ).wait() - - const l2CustomGatewayAddressOnL1 = await new L2CustomGateway__factory( - l1Deployer - ).deploy() - await l2CustomGatewayAddressOnL1.deployed() - await ( - await l2CustomGatewayAddressOnL1.initialize(ADDRESS_DEAD, ADDRESS_DEAD) - ).wait() - - const l2WethGatewayAddressOnL1 = await new L2WethGateway__factory( - l1Deployer - ).deploy() - await l2WethGatewayAddressOnL1.deployed() - await ( - await l2WethGatewayAddressOnL1.initialize( - ADDRESS_DEAD, - ADDRESS_DEAD, - ADDRESS_DEAD, - ADDRESS_DEAD - ) - ).wait() - - const l2WethAddressOnL1 = await new AeWETH__factory(l1Deployer).deploy() - await l2WethAddressOnL1.deployed() - - const l1Multicall = await new Multicall2__factory(l1Deployer).deploy() - await l1Multicall.deployed() - - await ( - await l1TokenBridgeCreator.setTemplates( - l1Templates, - l2TokenBridgeFactoryOnL1.address, - l2GatewayRouterOnL1.address, - l2StandardGatewayAddressOnL1.address, - l2CustomGatewayAddressOnL1.address, - l2WethGatewayAddressOnL1.address, - l2WethAddressOnL1.address, - l2MulticallAddressOnL1.address, - l1WethAddress, - l1Multicall.address, - gasLimitForL2FactoryDeployment + await parentTokenBridgeCreator.setTemplates( + parentChainTemplates, + childTokenBridgeFactory.address, + childGatewayRouterTemplate.address, + childErc20GatewayTemplate.address, + childCustomGatewayTemplate.address, + childWethGatewayTemplate.address, + childWeth.address, + childArbMulticall.address, + parentWethAddress, + parentMulticall2.address, + gasLimitForFactoryDeploymentOnChildChain ) ).wait() + /* ///// verify contracts if (verifyContracts) { console.log('\n\n Start contract verification \n\n') @@ -470,7 +714,7 @@ export const deployL1TokenBridgeCreator = async ( (await l1Deployer.provider!.getNetwork()).chainId, process.env.ARBISCAN_API_KEY! ) - const abi = ethers.utils.defaultAbiCoder + const abi = defaultAbiCoder await l1Verifier.verifyWithAddress( 'l1TokenBridgeCreatorProxyAdmin', @@ -574,13 +818,14 @@ export const deployL1TokenBridgeCreator = async ( await new Promise(resolve => setTimeout(resolve, 2000)) console.log('\n\n Contract verification done \n\n') } + */ - return { l1TokenBridgeCreator, retryableSender } + return { parentTokenBridgeCreator, retryableSender } } export const registerGateway = async ( l1Executor: Signer, - l2Provider: ethers.providers.Provider, + l2Provider: Provider, upgradeExecutor: string, gatewayRouter: string, tokens: string[], @@ -603,7 +848,9 @@ export const registerGateway = async ( const executorAddress = await l1Executor.getAddress() - const buildCall = (params: OmitTyped) => { + const buildCall = ( + params: OmitTyped + ) => { const routerCalldata = L1GatewayRouter__factory.createInterface().encodeFunctionData( 'setGateways', @@ -659,14 +906,14 @@ export const registerGateway = async ( export const getEstimateForDeployingFactory = async ( l1Deployer: Signer, - l2Provider: ethers.providers.Provider + l2Provider: Provider ) => { //// run retryable estimate for deploying L2 factory const l1DeployerAddress = await l1Deployer.getAddress() const l1ToL2MsgGasEstimate = new ParentToChildMessageGasEstimator(l2Provider) const deployFactoryGasParams = await l1ToL2MsgGasEstimate.estimateAll( { - from: ethers.Wallet.createRandom().address, + from: Wallet.createRandom().address, to: ethers.constants.AddressZero, l2CallValue: BigNumber.from(0), excessFeeRefundAddress: l1DeployerAddress, @@ -688,8 +935,8 @@ export const getSigner = (provider: JsonRpcProvider, key?: string) => { } export const getParsedLogs = ( - logs: ethers.providers.Log[], - iface: ethers.utils.Interface, + logs: Log[], + iface: Interface, eventName: string ) => { const eventFragment = iface.getEvent(eventName) @@ -701,10 +948,7 @@ export const getParsedLogs = ( return parsedLogs } -const _getFeeToken = async ( - inbox: string, - l1Provider: ethers.providers.Provider -) => { +const _getFeeToken = async (inbox: string, l1Provider: Provider) => { const bridge = await IInbox__factory.connect(inbox, l1Provider).bridge() let feeToken = ethers.constants.AddressZero @@ -724,3 +968,55 @@ const _getFeeToken = async ( export function sleep(ms: number) { return new Promise(resolve => setTimeout(resolve, ms)) } + +/** + * @notice Deploys a contract using the CREATE2 opcode for deterministic address generation. + * @dev The Create2 factory address can be overridden by the CREATE2_FACTORY environment variable. + * Default factory: https://github.com/Arachnid/deterministic-deployment-proxy/ + * + * @param fac The contract factory used to generate the deployment bytecode. + * @param deploymentArgs The arguments to pass to the contract constructor. + * @param salt The 32-byte salt used for CREATE2 address calculation. Defaults to HashZero. + * @param overrides Optional transaction overrides. + * @return The deployed contract instance at the deterministic address. + */ +export async function create2( + fac: ContractFactory, + deploymentArgs: Array, + salt = ethers.constants.HashZero, + overrides?: Overrides +): Promise { + if (hexDataLength(salt) !== 32) { + throw new Error('Salt must be a 32-byte hex string') + } + + const DEFAULT_FACTORY = '0x4e59b44847b379578588920cA78FbF26c0B4956C' + const FACTORY = process.env.CREATE2_FACTORY ?? DEFAULT_FACTORY + if ((await fac.signer.provider!.getCode(FACTORY)).length <= 2) { + throw new Error( + `Factory contract not deployed at address: ${FACTORY}${ + FACTORY.toLowerCase() === DEFAULT_FACTORY.toLowerCase() + ? '\n(For deployment instructions, see https://github.com/Arachnid/deterministic-deployment-proxy/ )' + : '' + }` + ) + } + const data = fac.getDeployTransaction(...deploymentArgs).data + if (!data) { + throw new Error('No deploy data found for contract factory') + } + + const address = getCreate2Address(FACTORY, salt, keccak256(data)) + if ((await fac.signer.provider!.getCode(address)).length > 2) { + return fac.attach(address) + } + + const tx = await fac.signer.sendTransaction({ + to: FACTORY, + data: concat([salt, data]), + ...overrides, + }) + await tx.wait() + + return fac.attach(address) +} diff --git a/scripts/deployment/deployTokenBridgeCreator.ts b/scripts/deployment/deployTokenBridgeCreator.ts index 6fa8daaf6..01e5a4b12 100644 --- a/scripts/deployment/deployTokenBridgeCreator.ts +++ b/scripts/deployment/deployTokenBridgeCreator.ts @@ -2,7 +2,7 @@ import { JsonRpcProvider } from '@ethersproject/providers' import { ArbitrumNetwork, registerCustomArbitrumNetwork } from '@arbitrum/sdk' import { RollupAdminLogic__factory } from '@arbitrum/sdk/dist/lib/abi/factories/RollupAdminLogic__factory' import { - deployL1TokenBridgeCreator, + deployTokenBridgeCreatorOnParentChain, getEstimateForDeployingFactory, getSigner, } from '../atomicTokenBridgeDeployer' @@ -74,15 +74,16 @@ export const deployTokenBridgeCreator = async () => { } // deploy L1 creator and set templates - const { l1TokenBridgeCreator, retryableSender } = - await deployL1TokenBridgeCreator( + const { parentTokenBridgeCreator, retryableSender } = + await deployTokenBridgeCreatorOnParentChain( l1Deployer, envVars.baseChainWeth, gasLimitForL2FactoryDeployment, + true, true ) - return { l1TokenBridgeCreator, retryableSender } + return { parentTokenBridgeCreator, retryableSender } } const registerNetworks = async ( @@ -123,11 +124,11 @@ const registerNetworks = async ( async function main() { console.log('Deploying token bridge creator...') - const { l1TokenBridgeCreator, retryableSender } = + const { parentTokenBridgeCreator, retryableSender } = await deployTokenBridgeCreator() console.log('Token bridge creator deployed!') - console.log('L1TokenBridgeCreator:', l1TokenBridgeCreator.address) + console.log('L1TokenBridgeCreator:', parentTokenBridgeCreator.address) console.log('L1TokenBridgeRetryableSender:', retryableSender.address, '\n') } diff --git a/scripts/local-deployment/localDeploymentLib.ts b/scripts/local-deployment/localDeploymentLib.ts index 020565c99..88c85119e 100644 --- a/scripts/local-deployment/localDeploymentLib.ts +++ b/scripts/local-deployment/localDeploymentLib.ts @@ -6,7 +6,7 @@ import { RollupAdminLogic__factory } from '@arbitrum/sdk/dist/lib/abi/factories/ import { execSync } from 'child_process' import { createTokenBridge, - deployL1TokenBridgeCreator, + deployTokenBridgeCreatorOnParentChain, getEstimateForDeployingFactory, registerGateway, } from '../atomicTokenBridgeDeployer' @@ -21,6 +21,31 @@ const LOCALHOST_L2_RPC = 'http://127.0.0.1:8547' const LOCALHOST_L3_RPC = 'http://127.0.0.1:3347' const LOCALHOST_L3_OWNER_KEY = '0xecdf21cb41c65afb51f91df408b7656e2c8739a5877f2814add0afd780cc210e' + +export const deployCreate2Factory = async ( + deployerWallet: Wallet +): Promise => { + const create2FactoryAddress = '0x4e59b44847b379578588920ca78fbf26c0b4956c' + const factoryCode = await deployerWallet.provider.getCode( + create2FactoryAddress + ) + if (factoryCode.length <= 2) { + console.log('CREATE2 factory not yet deployed. Deploying...') + const fundingTx = await deployerWallet.sendTransaction({ + to: '0x3fab184622dc19b6109349b94811493bf2a45362', + value: ethers.utils.parseEther('0.01'), + }) + await fundingTx.wait() + const create2SignedTx = + '0xf8a58085174876e800830186a08080b853604580600e600039806000f350fe7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe03601600081602082378035828234f58015156039578182fd5b8082525050506014600cf31ba02222222222222222222222222222222222222222222222222222222222222222a02222222222222222222222222222222222222222222222222222222222222222' + const create2DeployTx = await deployerWallet.provider.sendTransaction( + create2SignedTx + ) + await create2DeployTx.wait() + console.log(`CREATE2 factory deployed at ${create2FactoryAddress}`) + } +} + /** * Steps: * - read network info from local container and register networks @@ -83,8 +108,11 @@ export const setupTokenBridgeInLocalEnv = async () => { ) registerCustomArbitrumNetwork(coreL2Network) + // prerequisite - deploy CREATE2 factory + await deployCreate2Factory(parentDeployer) + // prerequisite - deploy L1 creator and set templates - console.log('Deploying L1TokenBridgeCreator') + console.log('Deploying TokenBridgeCreator and templates:') let l1Weth = process.env['PARENT_WETH_OVERRIDE'] if (l1Weth === undefined || l1Weth === '') { @@ -102,27 +130,36 @@ export const setupTokenBridgeInLocalEnv = async () => { parentDeployer, childDeployer.provider! ) - const gasLimitForL2FactoryDeployment = deployFactoryGasParams.gasLimit + const gasLimitForFactoryDeploymentOnChildChain = + deployFactoryGasParams.gasLimit - const { l1TokenBridgeCreator, retryableSender } = - await deployL1TokenBridgeCreator( + const { parentTokenBridgeCreator, retryableSender } = + await deployTokenBridgeCreatorOnParentChain( parentDeployer, l1Weth, - gasLimitForL2FactoryDeployment + gasLimitForFactoryDeploymentOnChildChain, + false, + true ) - console.log('L1TokenBridgeCreator', l1TokenBridgeCreator.address) - console.log('L1TokenBridgeRetryableSender', retryableSender.address) + + console.log('') + console.log( + `TokenBridgeCreator deployed at ${parentTokenBridgeCreator.address}` + ) + console.log( + `TokenBridgeRetryableSender deployed at ${retryableSender.address}` + ) // create token bridge + console.log('') console.log( - '\nCreating token bridge for rollup', - coreL2Network.ethBridge.rollup + `Creating a token bridge for rollup ${coreL2Network.ethBridge.rollup}:` ) const { l1Deployment, l2Deployment, l1MultiCall, l1ProxyAdmin } = await createTokenBridge( parentDeployer, childDeployer.provider!, - l1TokenBridgeCreator, + parentTokenBridgeCreator, coreL2Network.ethBridge.rollup, rollupOwnerAddress ) @@ -165,7 +202,7 @@ export const setupTokenBridgeInLocalEnv = async () => { }, } - const l1TokenBridgeCreatorAddress = l1TokenBridgeCreator.address + const l1TokenBridgeCreatorAddress = parentTokenBridgeCreator.address const retryableSenderAddress = retryableSender.address return { diff --git a/yarn.lock b/yarn.lock index e5106deb3..7f22bf229 100644 --- a/yarn.lock +++ b/yarn.lock @@ -272,6 +272,21 @@ "@ethersproject/properties" "^5.7.0" "@ethersproject/strings" "^5.7.0" +"@ethersproject/abi@5.8.0", "@ethersproject/abi@^5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.8.0.tgz#e79bb51940ac35fe6f3262d7fe2cdb25ad5f07d9" + integrity sha512-b9YS/43ObplgyV6SlyQsG53/vkSal0MNA1fskSC4mbnCMi8R+NkcH8K9FPYNESf6jUefBUniE4SOKms0E/KK1Q== + dependencies: + "@ethersproject/address" "^5.8.0" + "@ethersproject/bignumber" "^5.8.0" + "@ethersproject/bytes" "^5.8.0" + "@ethersproject/constants" "^5.8.0" + "@ethersproject/hash" "^5.8.0" + "@ethersproject/keccak256" "^5.8.0" + "@ethersproject/logger" "^5.8.0" + "@ethersproject/properties" "^5.8.0" + "@ethersproject/strings" "^5.8.0" + "@ethersproject/abstract-provider@5.7.0", "@ethersproject/abstract-provider@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/abstract-provider/-/abstract-provider-5.7.0.tgz#b0a8550f88b6bf9d51f90e4795d48294630cb9ef" @@ -285,6 +300,19 @@ "@ethersproject/transactions" "^5.7.0" "@ethersproject/web" "^5.7.0" +"@ethersproject/abstract-provider@5.8.0", "@ethersproject/abstract-provider@^5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@ethersproject/abstract-provider/-/abstract-provider-5.8.0.tgz#7581f9be601afa1d02b95d26b9d9840926a35b0c" + integrity sha512-wC9SFcmh4UK0oKuLJQItoQdzS/qZ51EJegK6EmAWlh+OptpQ/npECOR3QqECd8iGHC0RJb4WKbVdSfif4ammrg== + dependencies: + "@ethersproject/bignumber" "^5.8.0" + "@ethersproject/bytes" "^5.8.0" + "@ethersproject/logger" "^5.8.0" + "@ethersproject/networks" "^5.8.0" + "@ethersproject/properties" "^5.8.0" + "@ethersproject/transactions" "^5.8.0" + "@ethersproject/web" "^5.8.0" + "@ethersproject/abstract-signer@5.7.0", "@ethersproject/abstract-signer@^5.4.1", "@ethersproject/abstract-signer@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/abstract-signer/-/abstract-signer-5.7.0.tgz#13f4f32117868452191a4649723cb086d2b596b2" @@ -296,6 +324,17 @@ "@ethersproject/logger" "^5.7.0" "@ethersproject/properties" "^5.7.0" +"@ethersproject/abstract-signer@5.8.0", "@ethersproject/abstract-signer@^5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@ethersproject/abstract-signer/-/abstract-signer-5.8.0.tgz#8d7417e95e4094c1797a9762e6789c7356db0754" + integrity sha512-N0XhZTswXcmIZQdYtUnd79VJzvEwXQw6PK0dTl9VoYrEBxxCPXqS0Eod7q5TNKRxe1/5WUMuR0u0nqTF/avdCA== + dependencies: + "@ethersproject/abstract-provider" "^5.8.0" + "@ethersproject/bignumber" "^5.8.0" + "@ethersproject/bytes" "^5.8.0" + "@ethersproject/logger" "^5.8.0" + "@ethersproject/properties" "^5.8.0" + "@ethersproject/address@5.7.0", "@ethersproject/address@>=5.0.0-beta.128", "@ethersproject/address@^5.0.2", "@ethersproject/address@^5.0.8", "@ethersproject/address@^5.4.0", "@ethersproject/address@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.7.0.tgz#19b56c4d74a3b0a46bfdbb6cfcc0a153fc697f37" @@ -307,6 +346,17 @@ "@ethersproject/logger" "^5.7.0" "@ethersproject/rlp" "^5.7.0" +"@ethersproject/address@5.8.0", "@ethersproject/address@^5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.8.0.tgz#3007a2c352eee566ad745dca1dbbebdb50a6a983" + integrity sha512-GhH/abcC46LJwshoN+uBNoKVFPxUuZm6dA257z0vZkKmU1+t8xTn8oK7B9qrj8W2rFRMch4gbJl6PmVxjxBEBA== + dependencies: + "@ethersproject/bignumber" "^5.8.0" + "@ethersproject/bytes" "^5.8.0" + "@ethersproject/keccak256" "^5.8.0" + "@ethersproject/logger" "^5.8.0" + "@ethersproject/rlp" "^5.8.0" + "@ethersproject/base64@5.7.0", "@ethersproject/base64@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/base64/-/base64-5.7.0.tgz#ac4ee92aa36c1628173e221d0d01f53692059e1c" @@ -314,6 +364,13 @@ dependencies: "@ethersproject/bytes" "^5.7.0" +"@ethersproject/base64@5.8.0", "@ethersproject/base64@^5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@ethersproject/base64/-/base64-5.8.0.tgz#61c669c648f6e6aad002c228465d52ac93ee83eb" + integrity sha512-lN0oIwfkYj9LbPx4xEkie6rAMJtySbpOAFXSDVQaBnAzYfB4X2Qr+FXJGxMoc3Bxp2Sm8OwvzMrywxyw0gLjIQ== + dependencies: + "@ethersproject/bytes" "^5.8.0" + "@ethersproject/basex@5.7.0", "@ethersproject/basex@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/basex/-/basex-5.7.0.tgz#97034dc7e8938a8ca943ab20f8a5e492ece4020b" @@ -322,6 +379,14 @@ "@ethersproject/bytes" "^5.7.0" "@ethersproject/properties" "^5.7.0" +"@ethersproject/basex@5.8.0", "@ethersproject/basex@^5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@ethersproject/basex/-/basex-5.8.0.tgz#1d279a90c4be84d1c1139114a1f844869e57d03a" + integrity sha512-PIgTszMlDRmNwW9nhS6iqtVfdTAKosA7llYXNmGPw4YAI1PUyMv28988wAb41/gHF/WqGdoLv0erHaRcHRKW2Q== + dependencies: + "@ethersproject/bytes" "^5.8.0" + "@ethersproject/properties" "^5.8.0" + "@ethersproject/bignumber@5.7.0", "@ethersproject/bignumber@>=5.0.0-beta.130", "@ethersproject/bignumber@^5.1.1", "@ethersproject/bignumber@^5.4.1", "@ethersproject/bignumber@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.7.0.tgz#e2f03837f268ba655ffba03a57853e18a18dc9c2" @@ -331,6 +396,15 @@ "@ethersproject/logger" "^5.7.0" bn.js "^5.2.1" +"@ethersproject/bignumber@5.8.0", "@ethersproject/bignumber@^5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.8.0.tgz#c381d178f9eeb370923d389284efa19f69efa5d7" + integrity sha512-ZyaT24bHaSeJon2tGPKIiHszWjD/54Sz8t57Toch475lCLljC6MgPmxk7Gtzz+ddNN5LuHea9qhAe0x3D+uYPA== + dependencies: + "@ethersproject/bytes" "^5.8.0" + "@ethersproject/logger" "^5.8.0" + bn.js "^5.2.1" + "@ethersproject/bytes@5.7.0", "@ethersproject/bytes@>=5.0.0-beta.129", "@ethersproject/bytes@^5.0.8", "@ethersproject/bytes@^5.4.0", "@ethersproject/bytes@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.7.0.tgz#a00f6ea8d7e7534d6d87f47188af1148d71f155d" @@ -338,6 +412,13 @@ dependencies: "@ethersproject/logger" "^5.7.0" +"@ethersproject/bytes@5.8.0", "@ethersproject/bytes@^5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.8.0.tgz#9074820e1cac7507a34372cadeb035461463be34" + integrity sha512-vTkeohgJVCPVHu5c25XWaWQOZ4v+DkGoC42/TS2ond+PARCxTJvgTFUNDZovyQ/uAQ4EcpqqowKydcdmRKjg7A== + dependencies: + "@ethersproject/logger" "^5.8.0" + "@ethersproject/constants@5.7.0", "@ethersproject/constants@>=5.0.0-beta.128", "@ethersproject/constants@^5.4.0", "@ethersproject/constants@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.7.0.tgz#df80a9705a7e08984161f09014ea012d1c75295e" @@ -345,6 +426,13 @@ dependencies: "@ethersproject/bignumber" "^5.7.0" +"@ethersproject/constants@5.8.0", "@ethersproject/constants@^5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.8.0.tgz#12f31c2f4317b113a4c19de94e50933648c90704" + integrity sha512-wigX4lrf5Vu+axVTIvNsuL6YrV4O5AXl5ubcURKMEME5TnWBouUh0CDTWxZ2GpnRn1kcCgE7l8O5+VbV9QTTcg== + dependencies: + "@ethersproject/bignumber" "^5.8.0" + "@ethersproject/contracts@5.7.0", "@ethersproject/contracts@^5.4.1": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/contracts/-/contracts-5.7.0.tgz#c305e775abd07e48aa590e1a877ed5c316f8bd1e" @@ -361,6 +449,22 @@ "@ethersproject/properties" "^5.7.0" "@ethersproject/transactions" "^5.7.0" +"@ethersproject/contracts@5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@ethersproject/contracts/-/contracts-5.8.0.tgz#243a38a2e4aa3e757215ea64e276f8a8c9d8ed73" + integrity sha512-0eFjGz9GtuAi6MZwhb4uvUM216F38xiuR0yYCjKJpNfSEy4HUM8hvqqBj9Jmm0IUz8l0xKEhWwLIhPgxNY0yvQ== + dependencies: + "@ethersproject/abi" "^5.8.0" + "@ethersproject/abstract-provider" "^5.8.0" + "@ethersproject/abstract-signer" "^5.8.0" + "@ethersproject/address" "^5.8.0" + "@ethersproject/bignumber" "^5.8.0" + "@ethersproject/bytes" "^5.8.0" + "@ethersproject/constants" "^5.8.0" + "@ethersproject/logger" "^5.8.0" + "@ethersproject/properties" "^5.8.0" + "@ethersproject/transactions" "^5.8.0" + "@ethersproject/hash@5.7.0", "@ethersproject/hash@>=5.0.0-beta.128", "@ethersproject/hash@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/hash/-/hash-5.7.0.tgz#eb7aca84a588508369562e16e514b539ba5240a7" @@ -376,6 +480,21 @@ "@ethersproject/properties" "^5.7.0" "@ethersproject/strings" "^5.7.0" +"@ethersproject/hash@5.8.0", "@ethersproject/hash@^5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@ethersproject/hash/-/hash-5.8.0.tgz#b8893d4629b7f8462a90102572f8cd65a0192b4c" + integrity sha512-ac/lBcTbEWW/VGJij0CNSw/wPcw9bSRgCB0AIBz8CvED/jfvDoV9hsIIiWfvWmFEi8RcXtlNwp2jv6ozWOsooA== + dependencies: + "@ethersproject/abstract-signer" "^5.8.0" + "@ethersproject/address" "^5.8.0" + "@ethersproject/base64" "^5.8.0" + "@ethersproject/bignumber" "^5.8.0" + "@ethersproject/bytes" "^5.8.0" + "@ethersproject/keccak256" "^5.8.0" + "@ethersproject/logger" "^5.8.0" + "@ethersproject/properties" "^5.8.0" + "@ethersproject/strings" "^5.8.0" + "@ethersproject/hdnode@5.7.0", "@ethersproject/hdnode@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/hdnode/-/hdnode-5.7.0.tgz#e627ddc6b466bc77aebf1a6b9e47405ca5aef9cf" @@ -394,6 +513,24 @@ "@ethersproject/transactions" "^5.7.0" "@ethersproject/wordlists" "^5.7.0" +"@ethersproject/hdnode@5.8.0", "@ethersproject/hdnode@^5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@ethersproject/hdnode/-/hdnode-5.8.0.tgz#a51ae2a50bcd48ef6fd108c64cbae5e6ff34a761" + integrity sha512-4bK1VF6E83/3/Im0ERnnUeWOY3P1BZml4ZD3wcH8Ys0/d1h1xaFt6Zc+Dh9zXf9TapGro0T4wvO71UTCp3/uoA== + dependencies: + "@ethersproject/abstract-signer" "^5.8.0" + "@ethersproject/basex" "^5.8.0" + "@ethersproject/bignumber" "^5.8.0" + "@ethersproject/bytes" "^5.8.0" + "@ethersproject/logger" "^5.8.0" + "@ethersproject/pbkdf2" "^5.8.0" + "@ethersproject/properties" "^5.8.0" + "@ethersproject/sha2" "^5.8.0" + "@ethersproject/signing-key" "^5.8.0" + "@ethersproject/strings" "^5.8.0" + "@ethersproject/transactions" "^5.8.0" + "@ethersproject/wordlists" "^5.8.0" + "@ethersproject/json-wallets@5.7.0", "@ethersproject/json-wallets@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/json-wallets/-/json-wallets-5.7.0.tgz#5e3355287b548c32b368d91014919ebebddd5360" @@ -413,6 +550,25 @@ aes-js "3.0.0" scrypt-js "3.0.1" +"@ethersproject/json-wallets@5.8.0", "@ethersproject/json-wallets@^5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@ethersproject/json-wallets/-/json-wallets-5.8.0.tgz#d18de0a4cf0f185f232eb3c17d5e0744d97eb8c9" + integrity sha512-HxblNck8FVUtNxS3VTEYJAcwiKYsBIF77W15HufqlBF9gGfhmYOJtYZp8fSDZtn9y5EaXTE87zDwzxRoTFk11w== + dependencies: + "@ethersproject/abstract-signer" "^5.8.0" + "@ethersproject/address" "^5.8.0" + "@ethersproject/bytes" "^5.8.0" + "@ethersproject/hdnode" "^5.8.0" + "@ethersproject/keccak256" "^5.8.0" + "@ethersproject/logger" "^5.8.0" + "@ethersproject/pbkdf2" "^5.8.0" + "@ethersproject/properties" "^5.8.0" + "@ethersproject/random" "^5.8.0" + "@ethersproject/strings" "^5.8.0" + "@ethersproject/transactions" "^5.8.0" + aes-js "3.0.0" + scrypt-js "3.0.1" + "@ethersproject/keccak256@5.7.0", "@ethersproject/keccak256@>=5.0.0-beta.127", "@ethersproject/keccak256@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.7.0.tgz#3186350c6e1cd6aba7940384ec7d6d9db01f335a" @@ -421,11 +577,24 @@ "@ethersproject/bytes" "^5.7.0" js-sha3 "0.8.0" +"@ethersproject/keccak256@5.8.0", "@ethersproject/keccak256@^5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.8.0.tgz#d2123a379567faf2d75d2aaea074ffd4df349e6a" + integrity sha512-A1pkKLZSz8pDaQ1ftutZoaN46I6+jvuqugx5KYNeQOPqq+JZ0Txm7dlWesCHB5cndJSu5vP2VKptKf7cksERng== + dependencies: + "@ethersproject/bytes" "^5.8.0" + js-sha3 "0.8.0" + "@ethersproject/logger@5.7.0", "@ethersproject/logger@>=5.0.0-beta.129", "@ethersproject/logger@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.7.0.tgz#6ce9ae168e74fecf287be17062b590852c311892" integrity sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig== +"@ethersproject/logger@5.8.0", "@ethersproject/logger@^5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.8.0.tgz#f0232968a4f87d29623a0481690a2732662713d6" + integrity sha512-Qe6knGmY+zPPWTC+wQrpitodgBfH7XoceCGL5bJVejmH+yCS3R8jJm8iiWuvWbG76RUmyEG53oqv6GMVWqunjA== + "@ethersproject/networks@5.7.1", "@ethersproject/networks@^5.7.0": version "5.7.1" resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.7.1.tgz#118e1a981d757d45ccea6bb58d9fd3d9db14ead6" @@ -433,6 +602,13 @@ dependencies: "@ethersproject/logger" "^5.7.0" +"@ethersproject/networks@5.8.0", "@ethersproject/networks@^5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.8.0.tgz#8b4517a3139380cba9fb00b63ffad0a979671fde" + integrity sha512-egPJh3aPVAzbHwq8DD7Po53J4OUSsA1MjQp8Vf/OZPav5rlmWUaFLiq8cvQiGK0Z5K6LYzm29+VA/p4RL1FzNg== + dependencies: + "@ethersproject/logger" "^5.8.0" + "@ethersproject/pbkdf2@5.7.0", "@ethersproject/pbkdf2@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/pbkdf2/-/pbkdf2-5.7.0.tgz#d2267d0a1f6e123f3771007338c47cccd83d3102" @@ -441,6 +617,14 @@ "@ethersproject/bytes" "^5.7.0" "@ethersproject/sha2" "^5.7.0" +"@ethersproject/pbkdf2@5.8.0", "@ethersproject/pbkdf2@^5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@ethersproject/pbkdf2/-/pbkdf2-5.8.0.tgz#cd2621130e5dd51f6a0172e63a6e4a0c0a0ec37e" + integrity sha512-wuHiv97BrzCmfEaPbUFpMjlVg/IDkZThp9Ri88BpjRleg4iePJaj2SW8AIyE8cXn5V1tuAaMj6lzvsGJkGWskg== + dependencies: + "@ethersproject/bytes" "^5.8.0" + "@ethersproject/sha2" "^5.8.0" + "@ethersproject/properties@5.7.0", "@ethersproject/properties@>=5.0.0-beta.131", "@ethersproject/properties@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/properties/-/properties-5.7.0.tgz#a6e12cb0439b878aaf470f1902a176033067ed30" @@ -448,6 +632,13 @@ dependencies: "@ethersproject/logger" "^5.7.0" +"@ethersproject/properties@5.8.0", "@ethersproject/properties@^5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@ethersproject/properties/-/properties-5.8.0.tgz#405a8affb6311a49a91dabd96aeeae24f477020e" + integrity sha512-PYuiEoQ+FMaZZNGrStmN7+lWjlsoufGIHdww7454FIaGdbe/p5rnaCXTr5MtBYl3NkeoVhHZuyzChPeGeKIpQw== + dependencies: + "@ethersproject/logger" "^5.8.0" + "@ethersproject/providers@5.7.2", "@ethersproject/providers@^5.4.4", "@ethersproject/providers@^5.7.1", "@ethersproject/providers@^5.7.2": version "5.7.2" resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.7.2.tgz#f8b1a4f275d7ce58cf0a2eec222269a08beb18cb" @@ -474,6 +665,32 @@ bech32 "1.1.4" ws "7.4.6" +"@ethersproject/providers@5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.8.0.tgz#6c2ae354f7f96ee150439f7de06236928bc04cb4" + integrity sha512-3Il3oTzEx3o6kzcg9ZzbE+oCZYyY+3Zh83sKkn4s1DZfTUjIegHnN2Cm0kbn9YFy45FDVcuCLLONhU7ny0SsCw== + dependencies: + "@ethersproject/abstract-provider" "^5.8.0" + "@ethersproject/abstract-signer" "^5.8.0" + "@ethersproject/address" "^5.8.0" + "@ethersproject/base64" "^5.8.0" + "@ethersproject/basex" "^5.8.0" + "@ethersproject/bignumber" "^5.8.0" + "@ethersproject/bytes" "^5.8.0" + "@ethersproject/constants" "^5.8.0" + "@ethersproject/hash" "^5.8.0" + "@ethersproject/logger" "^5.8.0" + "@ethersproject/networks" "^5.8.0" + "@ethersproject/properties" "^5.8.0" + "@ethersproject/random" "^5.8.0" + "@ethersproject/rlp" "^5.8.0" + "@ethersproject/sha2" "^5.8.0" + "@ethersproject/strings" "^5.8.0" + "@ethersproject/transactions" "^5.8.0" + "@ethersproject/web" "^5.8.0" + bech32 "1.1.4" + ws "8.18.0" + "@ethersproject/random@5.7.0", "@ethersproject/random@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/random/-/random-5.7.0.tgz#af19dcbc2484aae078bb03656ec05df66253280c" @@ -482,6 +699,14 @@ "@ethersproject/bytes" "^5.7.0" "@ethersproject/logger" "^5.7.0" +"@ethersproject/random@5.8.0", "@ethersproject/random@^5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@ethersproject/random/-/random-5.8.0.tgz#1bced04d49449f37c6437c701735a1a022f0057a" + integrity sha512-E4I5TDl7SVqyg4/kkA/qTfuLWAQGXmSOgYyO01So8hLfwgKvYK5snIlzxJMk72IFdG/7oh8yuSqY2KX7MMwg+A== + dependencies: + "@ethersproject/bytes" "^5.8.0" + "@ethersproject/logger" "^5.8.0" + "@ethersproject/rlp@5.7.0", "@ethersproject/rlp@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/rlp/-/rlp-5.7.0.tgz#de39e4d5918b9d74d46de93af80b7685a9c21304" @@ -490,6 +715,14 @@ "@ethersproject/bytes" "^5.7.0" "@ethersproject/logger" "^5.7.0" +"@ethersproject/rlp@5.8.0", "@ethersproject/rlp@^5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@ethersproject/rlp/-/rlp-5.8.0.tgz#5a0d49f61bc53e051532a5179472779141451de5" + integrity sha512-LqZgAznqDbiEunaUvykH2JAoXTT9NV0Atqk8rQN9nx9SEgThA/WMx5DnW8a9FOufo//6FZOCHZ+XiClzgbqV9Q== + dependencies: + "@ethersproject/bytes" "^5.8.0" + "@ethersproject/logger" "^5.8.0" + "@ethersproject/sha2@5.7.0", "@ethersproject/sha2@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/sha2/-/sha2-5.7.0.tgz#9a5f7a7824ef784f7f7680984e593a800480c9fb" @@ -499,6 +732,15 @@ "@ethersproject/logger" "^5.7.0" hash.js "1.1.7" +"@ethersproject/sha2@5.8.0", "@ethersproject/sha2@^5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@ethersproject/sha2/-/sha2-5.8.0.tgz#8954a613bb78dac9b46829c0a95de561ef74e5e1" + integrity sha512-dDOUrXr9wF/YFltgTBYS0tKslPEKr6AekjqDW2dbn1L1xmjGR+9GiKu4ajxovnrDbwxAKdHjW8jNcwfz8PAz4A== + dependencies: + "@ethersproject/bytes" "^5.8.0" + "@ethersproject/logger" "^5.8.0" + hash.js "1.1.7" + "@ethersproject/signing-key@5.7.0", "@ethersproject/signing-key@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/signing-key/-/signing-key-5.7.0.tgz#06b2df39411b00bc57c7c09b01d1e41cf1b16ab3" @@ -511,6 +753,18 @@ elliptic "6.5.4" hash.js "1.1.7" +"@ethersproject/signing-key@5.8.0", "@ethersproject/signing-key@^5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@ethersproject/signing-key/-/signing-key-5.8.0.tgz#9797e02c717b68239c6349394ea85febf8893119" + integrity sha512-LrPW2ZxoigFi6U6aVkFN/fa9Yx/+4AtIUe4/HACTvKJdhm0eeb107EVCIQcrLZkxaSIgc/eCrX8Q1GtbH+9n3w== + dependencies: + "@ethersproject/bytes" "^5.8.0" + "@ethersproject/logger" "^5.8.0" + "@ethersproject/properties" "^5.8.0" + bn.js "^5.2.1" + elliptic "6.6.1" + hash.js "1.1.7" + "@ethersproject/solidity@5.7.0", "@ethersproject/solidity@^5.4.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/solidity/-/solidity-5.7.0.tgz#5e9c911d8a2acce2a5ebb48a5e2e0af20b631cb8" @@ -523,6 +777,18 @@ "@ethersproject/sha2" "^5.7.0" "@ethersproject/strings" "^5.7.0" +"@ethersproject/solidity@5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@ethersproject/solidity/-/solidity-5.8.0.tgz#429bb9fcf5521307a9448d7358c26b93695379b9" + integrity sha512-4CxFeCgmIWamOHwYN9d+QWGxye9qQLilpgTU0XhYs1OahkclF+ewO+3V1U0mvpiuQxm5EHHmv8f7ClVII8EHsA== + dependencies: + "@ethersproject/bignumber" "^5.8.0" + "@ethersproject/bytes" "^5.8.0" + "@ethersproject/keccak256" "^5.8.0" + "@ethersproject/logger" "^5.8.0" + "@ethersproject/sha2" "^5.8.0" + "@ethersproject/strings" "^5.8.0" + "@ethersproject/strings@5.7.0", "@ethersproject/strings@>=5.0.0-beta.130", "@ethersproject/strings@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/strings/-/strings-5.7.0.tgz#54c9d2a7c57ae8f1205c88a9d3a56471e14d5ed2" @@ -532,6 +798,15 @@ "@ethersproject/constants" "^5.7.0" "@ethersproject/logger" "^5.7.0" +"@ethersproject/strings@5.8.0", "@ethersproject/strings@^5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@ethersproject/strings/-/strings-5.8.0.tgz#ad79fafbf0bd272d9765603215ac74fd7953908f" + integrity sha512-qWEAk0MAvl0LszjdfnZ2uC8xbR2wdv4cDabyHiBh3Cldq/T8dPH3V4BbBsAYJUeonwD+8afVXld274Ls+Y1xXg== + dependencies: + "@ethersproject/bytes" "^5.8.0" + "@ethersproject/constants" "^5.8.0" + "@ethersproject/logger" "^5.8.0" + "@ethersproject/transactions@5.7.0", "@ethersproject/transactions@^5.0.0-beta.135", "@ethersproject/transactions@^5.4.0", "@ethersproject/transactions@^5.6.2", "@ethersproject/transactions@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.7.0.tgz#91318fc24063e057885a6af13fdb703e1f993d3b" @@ -547,6 +822,21 @@ "@ethersproject/rlp" "^5.7.0" "@ethersproject/signing-key" "^5.7.0" +"@ethersproject/transactions@5.8.0", "@ethersproject/transactions@^5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.8.0.tgz#1e518822403abc99def5a043d1c6f6fe0007e46b" + integrity sha512-UglxSDjByHG0TuU17bDfCemZ3AnKO2vYrL5/2n2oXvKzvb7Cz+W9gOWXKARjp2URVwcWlQlPOEQyAviKwT4AHg== + dependencies: + "@ethersproject/address" "^5.8.0" + "@ethersproject/bignumber" "^5.8.0" + "@ethersproject/bytes" "^5.8.0" + "@ethersproject/constants" "^5.8.0" + "@ethersproject/keccak256" "^5.8.0" + "@ethersproject/logger" "^5.8.0" + "@ethersproject/properties" "^5.8.0" + "@ethersproject/rlp" "^5.8.0" + "@ethersproject/signing-key" "^5.8.0" + "@ethersproject/units@5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/units/-/units-5.7.0.tgz#637b563d7e14f42deeee39245275d477aae1d8b1" @@ -556,6 +846,15 @@ "@ethersproject/constants" "^5.7.0" "@ethersproject/logger" "^5.7.0" +"@ethersproject/units@5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@ethersproject/units/-/units-5.8.0.tgz#c12f34ba7c3a2de0e9fa0ed0ee32f3e46c5c2c6a" + integrity sha512-lxq0CAnc5kMGIiWW4Mr041VT8IhNM+Pn5T3haO74XZWFulk7wH1Gv64HqE96hT4a7iiNMdOCFEBgaxWuk8ETKQ== + dependencies: + "@ethersproject/bignumber" "^5.8.0" + "@ethersproject/constants" "^5.8.0" + "@ethersproject/logger" "^5.8.0" + "@ethersproject/wallet@5.7.0", "@ethersproject/wallet@^5.4.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/wallet/-/wallet-5.7.0.tgz#4e5d0790d96fe21d61d38fb40324e6c7ef350b2d" @@ -577,6 +876,27 @@ "@ethersproject/transactions" "^5.7.0" "@ethersproject/wordlists" "^5.7.0" +"@ethersproject/wallet@5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@ethersproject/wallet/-/wallet-5.8.0.tgz#49c300d10872e6986d953e8310dc33d440da8127" + integrity sha512-G+jnzmgg6UxurVKRKvw27h0kvG75YKXZKdlLYmAHeF32TGUzHkOFd7Zn6QHOTYRFWnfjtSSFjBowKo7vfrXzPA== + dependencies: + "@ethersproject/abstract-provider" "^5.8.0" + "@ethersproject/abstract-signer" "^5.8.0" + "@ethersproject/address" "^5.8.0" + "@ethersproject/bignumber" "^5.8.0" + "@ethersproject/bytes" "^5.8.0" + "@ethersproject/hash" "^5.8.0" + "@ethersproject/hdnode" "^5.8.0" + "@ethersproject/json-wallets" "^5.8.0" + "@ethersproject/keccak256" "^5.8.0" + "@ethersproject/logger" "^5.8.0" + "@ethersproject/properties" "^5.8.0" + "@ethersproject/random" "^5.8.0" + "@ethersproject/signing-key" "^5.8.0" + "@ethersproject/transactions" "^5.8.0" + "@ethersproject/wordlists" "^5.8.0" + "@ethersproject/web@5.7.1", "@ethersproject/web@^5.7.0": version "5.7.1" resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.7.1.tgz#de1f285b373149bee5928f4eb7bcb87ee5fbb4ae" @@ -588,6 +908,17 @@ "@ethersproject/properties" "^5.7.0" "@ethersproject/strings" "^5.7.0" +"@ethersproject/web@5.8.0", "@ethersproject/web@^5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.8.0.tgz#3e54badc0013b7a801463a7008a87988efce8a37" + integrity sha512-j7+Ksi/9KfGviws6Qtf9Q7KCqRhpwrYKQPs+JBA/rKVFF/yaWLHJEH3zfVP2plVu+eys0d2DlFmhoQJayFewcw== + dependencies: + "@ethersproject/base64" "^5.8.0" + "@ethersproject/bytes" "^5.8.0" + "@ethersproject/logger" "^5.8.0" + "@ethersproject/properties" "^5.8.0" + "@ethersproject/strings" "^5.8.0" + "@ethersproject/wordlists@5.7.0", "@ethersproject/wordlists@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/wordlists/-/wordlists-5.7.0.tgz#8fb2c07185d68c3e09eb3bfd6e779ba2774627f5" @@ -599,6 +930,17 @@ "@ethersproject/properties" "^5.7.0" "@ethersproject/strings" "^5.7.0" +"@ethersproject/wordlists@5.8.0", "@ethersproject/wordlists@^5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@ethersproject/wordlists/-/wordlists-5.8.0.tgz#7a5654ee8d1bb1f4dbe43f91d217356d650ad821" + integrity sha512-2df9bbXicZws2Sb5S6ET493uJ0Z84Fjr3pC4tu/qlnZERibZCeUVuqdtt+7Tv9xxhUxHoIekIA7avrKUWHrezg== + dependencies: + "@ethersproject/bytes" "^5.8.0" + "@ethersproject/hash" "^5.8.0" + "@ethersproject/logger" "^5.8.0" + "@ethersproject/properties" "^5.8.0" + "@ethersproject/strings" "^5.8.0" + "@humanwhocodes/config-array@^0.5.0": version "0.5.0" resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.5.0.tgz#1407967d4c6eecd7388f83acf1eaf4d0c6e58ef9" @@ -3797,6 +4139,19 @@ elliptic@6.5.4, elliptic@^6.4.0, elliptic@^6.5.2, elliptic@^6.5.3, elliptic@^6.5 minimalistic-assert "^1.0.1" minimalistic-crypto-utils "^1.0.1" +elliptic@6.6.1: + version "6.6.1" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.6.1.tgz#3b8ffb02670bf69e382c7f65bf524c97c5405c06" + integrity sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g== + dependencies: + bn.js "^4.11.9" + brorand "^1.1.0" + hash.js "^1.0.0" + hmac-drbg "^1.0.1" + inherits "^2.0.4" + minimalistic-assert "^1.0.1" + minimalistic-crypto-utils "^1.0.1" + emoji-regex@^7.0.1: version "7.0.3" resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" @@ -4604,7 +4959,7 @@ ethers@^4.0.32, ethers@^4.0.40: uuid "2.0.1" xmlhttprequest "1.8.0" -ethers@^5.0.1, ethers@^5.0.2, ethers@^5.1.0, ethers@^5.4.5, ethers@^5.5.2, ethers@^5.7.1: +ethers@^5.0.1, ethers@^5.0.2, ethers@^5.1.0, ethers@^5.5.2, ethers@^5.7.1: version "5.7.2" resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.7.2.tgz#3a7deeabbb8c030d4126b24f84e525466145872e" integrity sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg== @@ -4640,6 +4995,42 @@ ethers@^5.0.1, ethers@^5.0.2, ethers@^5.1.0, ethers@^5.4.5, ethers@^5.5.2, ether "@ethersproject/web" "5.7.1" "@ethersproject/wordlists" "5.7.0" +ethers@^5.8.0: + version "5.8.0" + resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.8.0.tgz#97858dc4d4c74afce83ea7562fe9493cedb4d377" + integrity sha512-DUq+7fHrCg1aPDFCHx6UIPb3nmt2XMpM7Y/g2gLhsl3lIBqeAfOJIl1qEvRf2uq3BiKxmh6Fh5pfp2ieyek7Kg== + dependencies: + "@ethersproject/abi" "5.8.0" + "@ethersproject/abstract-provider" "5.8.0" + "@ethersproject/abstract-signer" "5.8.0" + "@ethersproject/address" "5.8.0" + "@ethersproject/base64" "5.8.0" + "@ethersproject/basex" "5.8.0" + "@ethersproject/bignumber" "5.8.0" + "@ethersproject/bytes" "5.8.0" + "@ethersproject/constants" "5.8.0" + "@ethersproject/contracts" "5.8.0" + "@ethersproject/hash" "5.8.0" + "@ethersproject/hdnode" "5.8.0" + "@ethersproject/json-wallets" "5.8.0" + "@ethersproject/keccak256" "5.8.0" + "@ethersproject/logger" "5.8.0" + "@ethersproject/networks" "5.8.0" + "@ethersproject/pbkdf2" "5.8.0" + "@ethersproject/properties" "5.8.0" + "@ethersproject/providers" "5.8.0" + "@ethersproject/random" "5.8.0" + "@ethersproject/rlp" "5.8.0" + "@ethersproject/sha2" "5.8.0" + "@ethersproject/signing-key" "5.8.0" + "@ethersproject/solidity" "5.8.0" + "@ethersproject/strings" "5.8.0" + "@ethersproject/transactions" "5.8.0" + "@ethersproject/units" "5.8.0" + "@ethersproject/wallet" "5.8.0" + "@ethersproject/web" "5.8.0" + "@ethersproject/wordlists" "5.8.0" + ethjs-unit@0.1.6: version "0.1.6" resolved "https://registry.yarnpkg.com/ethjs-unit/-/ethjs-unit-0.1.6.tgz#c665921e476e87bce2a9d588a6fe0405b2c41699" @@ -11072,6 +11463,11 @@ ws@7.4.6: resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.6.tgz#5654ca8ecdeee47c33a9a4bf6d28e2be2980377c" integrity sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A== +ws@8.18.0: + version "8.18.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.18.0.tgz#0d7505a6eafe2b0e712d232b42279f53bc289bbc" + integrity sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw== + ws@^3.0.0: version "3.3.3" resolved "https://registry.yarnpkg.com/ws/-/ws-3.3.3.tgz#f1cf84fe2d5e901ebce94efaece785f187a228f2" From a894db3444487af525651980fdf8f132f5767885 Mon Sep 17 00:00:00 2001 From: TucksonDev Date: Wed, 20 Aug 2025 15:35:55 +0100 Subject: [PATCH 2/5] Fix typing issue --- hardhat.config.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hardhat.config.ts b/hardhat.config.ts index f2d5ca674..f35070884 100644 --- a/hardhat.config.ts +++ b/hardhat.config.ts @@ -285,7 +285,7 @@ if (process.env['INTERFACE_TESTER_SOLC_VERSION']) { 'contracts/tokenbridge/test/InterfaceCompatibilityTester.sol': { version: process.env['INTERFACE_TESTER_SOLC_VERSION'], }, - } + } as typeof config.solidity.overrides } module.exports = config From f7fe72b5e8399692c13a484f36f54a3fe81b4d0f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20FP?= <105675159+TucksonDev@users.noreply.github.com> Date: Fri, 22 Aug 2025 10:51:20 +0100 Subject: [PATCH 3/5] Update scripts/atomicTokenBridgeDeployer.ts Co-authored-by: Henry <11198460+godzillaba@users.noreply.github.com> --- scripts/atomicTokenBridgeDeployer.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/scripts/atomicTokenBridgeDeployer.ts b/scripts/atomicTokenBridgeDeployer.ts index 83ba04951..d10e104dc 100644 --- a/scripts/atomicTokenBridgeDeployer.ts +++ b/scripts/atomicTokenBridgeDeployer.ts @@ -488,7 +488,11 @@ export const deployTokenBridgeCreatorOnParentChain = async ( // (Deployed using ABI and bytecode from @offchainlabs/upgrade-executor) // const upgradeExecutorTemplate = await deployContract( - UpgradeExecutor__factory, + class UpgradeExecutorFactory extends ContractFactory { + constructor(signer: Signer) { + super(UpgradeExecutorABI, UpgradeExecutorBytecode, signer) + } + }, parentChainDeployer, [], verifyContracts, From 4b2befd556fdeb28cfc01945c1262352391b6a8d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20FP?= <105675159+TucksonDev@users.noreply.github.com> Date: Fri, 22 Aug 2025 10:56:03 +0100 Subject: [PATCH 4/5] Update scripts/atomicTokenBridgeDeployer.ts Co-authored-by: Henry <11198460+godzillaba@users.noreply.github.com> --- scripts/atomicTokenBridgeDeployer.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/scripts/atomicTokenBridgeDeployer.ts b/scripts/atomicTokenBridgeDeployer.ts index d10e104dc..47d8a9aa0 100644 --- a/scripts/atomicTokenBridgeDeployer.ts +++ b/scripts/atomicTokenBridgeDeployer.ts @@ -147,7 +147,6 @@ export async function initializeContract( contract: Contract, initializationArgs: any[] = [] ): Promise { - const contractName = contract.constructor.name.replace('__factory', '') try { await (await contract.initialize(...initializationArgs)).wait() From f87e4ec870ca12302ca3f56b78121806ae41bcf4 Mon Sep 17 00:00:00 2001 From: TucksonDev Date: Fri, 22 Aug 2025 11:02:54 +0100 Subject: [PATCH 5/5] Format --- scripts/atomicTokenBridgeDeployer.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/scripts/atomicTokenBridgeDeployer.ts b/scripts/atomicTokenBridgeDeployer.ts index 47d8a9aa0..6905aef75 100644 --- a/scripts/atomicTokenBridgeDeployer.ts +++ b/scripts/atomicTokenBridgeDeployer.ts @@ -147,7 +147,6 @@ export async function initializeContract( contract: Contract, initializationArgs: any[] = [] ): Promise { - try { await (await contract.initialize(...initializationArgs)).wait() console.log(` => Initialized successfully`)