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/scripts/usdc-bridge-deployment/README.md b/scripts/usdc-bridge-deployment/README.md index bc0fc782a..39bdd23d0 100644 --- a/scripts/usdc-bridge-deployment/README.md +++ b/scripts/usdc-bridge-deployment/README.md @@ -36,7 +36,16 @@ CHILD_DEPLOYER_KEY= L1_ROUTER= L2_ROUTER= INBOX= + +## USDC (or EURC) address on the parent chain L1_USDC= + +## Naming params for the bridged token which is deployed to child chain. Values should be adjusted based on the parent chain and currency used +## Circle's naming guideline: https://brand.circle.com/d/M9z54TaEwsWL/stablecoins#/-/usdc-brand-guide/usdc-naming-guidelines +L2_TOKEN_NAME='USDC' +L2_TOKEN_SYMBOL='USDC.e' +L2_TOKEN_CURRENCY='USD' + ## OPTIONAL arg. If set, script will register the gateway, otherwise it will store TX payload in a file ROLLUP_OWNER_KEY= ``` @@ -80,3 +89,7 @@ Once transition to native USDC is agreed on, following steps are required: - Circle calls `burnLockedUSDC()` on the L1 gateway using `burner` account to burn the `burnAmount` of USDC - remaining USDC will be cleared off when remaining in-flight USDC withdrawals are executed, if any - L1 gateway owner is trusted to not frontrun this TX to modify the burning amount + +## EURC deployment + +Circle also offers EURC stablecoin. This same standard implementation is applicable for EURC. There is no need to change anything, except to adjust the .env vars to provide EURC parent chain address instead of the USDC address and adjust the token naming vars (name, symbol, currency). diff --git a/scripts/usdc-bridge-deployment/deployUsdcBridge.ts b/scripts/usdc-bridge-deployment/deployUsdcBridge.ts index 4f541a636..d0515f36e 100644 --- a/scripts/usdc-bridge-deployment/deployUsdcBridge.ts +++ b/scripts/usdc-bridge-deployment/deployUsdcBridge.ts @@ -70,6 +70,9 @@ main().then(() => console.log('Done.')) * - if `ROLLUP_OWNER_KEY` is provided, register the gateway in the router through the UpgradeExecutor * - if `ROLLUP_OWNER_KEY` is not provided, prepare calldata and store it in `registerUsdcGatewayTx.json` file * - set minter role to L2 USDC gateway with max allowance + * + * Note: Same implementation is used for bridged EURC (Circle's euro stablecoin). The only difference is in the + * name/symbol/currency of the L2 token deployment. */ async function main() { console.log('Starting USDC bridge deployment') @@ -183,14 +186,18 @@ async function _deployBridgedUsdc( deployerL2Wallet ) + const tokenName = process.env['L2_TOKEN_NAME'] as string + const tokenSymbol = process.env['L2_TOKEN_SYMBOL'] as string + const tokenCurrency = process.env['L2_TOKEN_CURRENCY'] as string + const pauserL2 = deployerL2Wallet const blacklisterL2 = deployerL2Wallet const lostAndFound = deployerL2Wallet await ( await l2UsdcFiatToken.initialize( - 'USDC', - 'USDC.e', - 'USD', + tokenName, + tokenSymbol, + tokenCurrency, 6, masterMinter.address, pauserL2.address, @@ -198,15 +205,16 @@ async function _deployBridgedUsdc( deployerL2Wallet.address ) ).wait() - await (await l2UsdcFiatToken.initializeV2('USDC')).wait() + + await (await l2UsdcFiatToken.initializeV2(tokenName)).wait() await (await l2UsdcFiatToken.initializeV2_1(lostAndFound.address)).wait() - await (await l2UsdcFiatToken.initializeV2_2([], 'USDC.e')).wait() + await (await l2UsdcFiatToken.initializeV2_2([], tokenSymbol)).wait() /// verify initialization if ( - (await l2UsdcFiatToken.name()) != 'USDC' || - (await l2UsdcFiatToken.symbol()) != 'USDC.e' || - (await l2UsdcFiatToken.currency()) != 'USD' || + (await l2UsdcFiatToken.name()) != tokenName || + (await l2UsdcFiatToken.symbol()) != tokenSymbol || + (await l2UsdcFiatToken.currency()) != tokenCurrency || (await l2UsdcFiatToken.decimals()) != 6 || (await l2UsdcFiatToken.masterMinter()) != masterMinter.address || (await l2UsdcFiatToken.pauser()) != pauserL2.address || @@ -717,6 +725,9 @@ function _checkEnvVars() { 'L2_ROUTER', 'INBOX', 'L1_USDC', + 'L2_TOKEN_NAME', + 'L2_TOKEN_SYMBOL', + 'L2_TOKEN_CURRENCY', ] for (const envVar of requiredEnvVars) { diff --git a/scripts/usdc-bridge-deployment/env.example b/scripts/usdc-bridge-deployment/env.example index c6eefe980..3468c3835 100644 --- a/scripts/usdc-bridge-deployment/env.example +++ b/scripts/usdc-bridge-deployment/env.example @@ -5,6 +5,15 @@ CHILD_DEPLOYER_KEY= L1_ROUTER= L2_ROUTER= INBOX= + +## USDC (or EURC) address on the parent chain L1_USDC= + +## Naming params for the bridged token which is deployed to child chain. Values should be adjusted based on the parent chain and currency used +## Circle's naming guideline: https://brand.circle.com/d/M9z54TaEwsWL/stablecoins#/-/usdc-brand-guide/usdc-naming-guidelines +L2_TOKEN_NAME='USDC' +L2_TOKEN_SYMBOL='USDC.e' +L2_TOKEN_CURRENCY='USD' + ## OPTIONAL arg. If set, script will register the gateway, otherwise it will store TX payload in a file ROLLUP_OWNER_KEY= \ No newline at end of file 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"