diff --git a/README.md b/README.md index 3afb6c0..799530a 100644 --- a/README.md +++ b/README.md @@ -4,33 +4,33 @@ Ren has two repositories for its Solidity contract: -- [`darknode-sol`](https://github.com/renproject/darknode-sol) - contracts on Ethereum for managing darknode registrations. -- `gateway-sol` (this repository) - contracts on multiple EVM chains for minting and burning of ren-assets. +- [`darknode-sol`](https://github.com/renproject/darknode-sol) - contracts on Ethereum for managing darknode registrations. +- `gateway-sol` (this repository) - contracts on multiple EVM chains for minting and burning of ren-assets. ## ~ [Documentation](https://renproject.github.io/ren-client-docs/contracts/) ~ -- For the latest contract addresses, see the [contract addresses](https://renproject.github.io/ren-client-docs/contracts/deployments) page. -- For a summary of each contract, see the [summary of contracts](https://renproject.github.io/ren-client-docs/contracts/summary) page. +- For the latest contract addresses, see the [contract addresses](https://renproject.github.io/ren-client-docs/contracts/deployments) page. +- For a summary of each contract, see the [summary of contracts](https://renproject.github.io/ren-client-docs/contracts/summary) page. ## Contract summary There are three core layers in the gateway-sol contracts: -- **GatewayRegistry** - responsible for deploying and tracking gateway and asset instances -- **RenAsset** - ERC20s backed 1:1 by a corresponding asset on another chain. e.g. renDAI on Fantom is backed by DAI on Ethereum -- **Gateways** - responsible for minting and burning (_MintGateway_) and locking and releasing (_LockGateway_) Ren assets. +- **GatewayRegistry** - responsible for deploying and tracking gateway and asset instances +- **RenAsset** - ERC20s backed 1:1 by a corresponding asset on another chain. e.g. renDAI on Fantom is backed by DAI on Ethereum +- **Gateways** - responsible for minting and burning (_MintGateway_) and locking and releasing (_LockGateway_) Ren assets. ![gateway-sol diagram](https://user-images.githubusercontent.com/2221955/137038758-bbdba875-d73d-445b-8c81-76eec038a02d.png) For example, minting renDAI on Fantom backed by DAI on Ethereum involves the following contracts: -- On Ethereum: - - The Ethereum GatewayRegistry - - A DAI LockGateway -- On Fantom: - - The Fantom GatewayRegistry - - A DAI MintGateway - - A renDAI RenAsset +- On Ethereum: + - The Ethereum GatewayRegistry + - A DAI LockGateway +- On Fantom: + - The Fantom GatewayRegistry + - A DAI MintGateway + - A renDAI RenAsset
diff --git a/deploy/001_deploy_multisig.ts b/deploy/001_deploy_multisig.ts new file mode 100644 index 0000000..722f6ae --- /dev/null +++ b/deploy/001_deploy_multisig.ts @@ -0,0 +1,53 @@ +import chalk from "chalk"; +import { HardhatRuntimeEnvironment } from "hardhat/types"; + +import { ConsoleInterface, updateLogger } from "./deploymentUtils/general"; +import { Multisig } from "./deploymentUtils/multisig"; +import { NetworkConfig, networks } from "./networks"; + +export const deployProtocol = async function ( + hre: HardhatRuntimeEnvironment, + config?: NetworkConfig, + logger: ConsoleInterface = console +) { + // if (true as boolean) { + // return; + // } + logger = updateLogger(logger); + + const { ethers, getNamedAccounts, network } = hre; + const { deployer } = await getNamedAccounts(); + + const { chainId } = await ethers.provider.getNetwork(); + + logger.log(chalk.green(`\n\nRunning deployment 001 (MultiSig) on ${network.name}...`)); + + config = config || networks[network.name as "hardhat"]; + if (!config) { + throw new Error(`No network configuration found for ${network.name}!`); + } + + logger.group("MultiSig"); + let multisig: Multisig = new Multisig(hre, network.name, chainId, logger); + + try { + await multisig.load(); + if (multisig.safeSdk) { + logger.log(`Loaded Multisig at address ${multisig.getAddress()}`); + } + } catch (error) { + logger.log(`Deploying Multisig...`); + await multisig.deploy([deployer, ...config.multisigSigners], 1); + if (multisig.safeSdk) { + logger.log(`Deployed Multisig at address ${multisig.getAddress()}`); + } + } + + logger.groupEnd(); +}; + +export default async function func(env: HardhatRuntimeEnvironment): Promise { + await deployProtocol(env); +} + +func.tags = ["Multisig"]; diff --git a/deploy/001_deploy_gateways.ts b/deploy/002_deploy_gateways.ts similarity index 85% rename from deploy/001_deploy_gateways.ts rename to deploy/002_deploy_gateways.ts index 27b8686..d1fb19a 100644 --- a/deploy/001_deploy_gateways.ts +++ b/deploy/002_deploy_gateways.ts @@ -1,10 +1,11 @@ import BigNumber from "bignumber.js"; import chalk from "chalk"; -import { keccak256 } from "ethers/lib/utils"; +import { getAddress as Ox, keccak256 } from "ethers/lib/utils"; import { deployments } from "hardhat"; import { HardhatRuntimeEnvironment } from "hardhat/types"; import { + BasicBridge, BasicBridge__factory, BeaconProxy__factory, ERC20, @@ -22,6 +23,7 @@ import { RenAssetV2__factory, RenProxyAdmin, RenProxyAdmin__factory, + RenTimelock, RenTimelock__factory, RenVMSignatureVerifierV1, RenVMSignatureVerifierV1__factory, @@ -32,25 +34,31 @@ import { CREATE2_DEPLOYER, getContractAt, Ox0, + Ox1_32, setupCreate2, setupDeployProxy, setupGetExistingDeployment, setupWaitForTimelockedTx, setupWaitForTx, -} from "./deploymentUtils"; + updateLogger, +} from "./deploymentUtils/general"; +import { Multisig } from "./deploymentUtils/multisig"; +import { getTimelockConfig } from "./deploymentUtils/timelock"; import { NetworkConfig, networks } from "./networks"; export const deployGatewaySol = async function ( hre: HardhatRuntimeEnvironment, config?: NetworkConfig, logger: ConsoleInterface = console -) { - // if (true as boolean) { - // return; - // } - const { getNamedAccounts, ethers, network } = hre; +): Promise<{ + gatewayRegistry: GatewayRegistryV2; + basicBridge: BasicBridge; + signatureVerifier: RenVMSignatureVerifierV1; + renTimelock: RenTimelock; +}> { + logger = updateLogger(logger); - const Ox = ethers.utils.getAddress; + const { getNamedAccounts, ethers, network } = hre; config = config || networks[network.name as "hardhat"]; if (!config) { @@ -61,7 +69,9 @@ export const deployGatewaySol = async function ( const chainId: number = (await ethers.provider.getNetwork()).chainId; const { deployer } = await getNamedAccounts(); - logger.log(`Deploying to ${network.name} from ${deployer}...`); + const multisig = await new Multisig(hre, network.name, chainId, logger).load(); + + logger.log(chalk.green(`\n\nRunning deployment 002 (Gateways) on ${network.name} from ${deployer}...`)); if (Ox(mintAuthority) === Ox0) { throw new Error(`Invalid empty mintAuthority`); @@ -71,13 +81,13 @@ export const deployGatewaySol = async function ( const getExistingDeployment = setupGetExistingDeployment(hre); const waitForTx = setupWaitForTx(logger); - // const provider = await ethers.getSigner(deployer); - // const gatewayRegistry2 = GatewayRegistryV2__factory.connect("0x5076a1F237531fa4dC8ad99bb68024aB6e1Ff701", provider); + // const signer = await ethers.getSigner(deployer); + // const gatewayRegistry2 = GatewayRegistryV2__factory.connect("0x5076a1F237531fa4dC8ad99bb68024aB6e1Ff701", signer); // console.log("gatewayRegistry2", await gatewayRegistry2!.getMintGatewaySymbols(0, 100)); // const ibbtc = await gatewayRegistry2?.getMintGatewayBySymbol("ibBTC"); // console.log(ibbtc); // // console.log("renLuna", renLuna); - // // const forceSend = await ForceSend__factory.connect(renLuna, provider); + // // const forceSend = await ForceSend__factory.connect(renLuna, signer); // // console.log( // // await forceSend.send(deployer, { // // gasLimit: 1000000, @@ -88,10 +98,56 @@ export const deployGatewaySol = async function ( // } // Deploy RenTimelock //////////////////////////////////////////////// - logger.log(chalk.yellow("RenTimelock")); + logger.group("RenTimelock"); const renTimelock = await create2("RenTimelock", [0, [deployer], [deployer]]); - const waitForTimelockedTx = setupWaitForTimelockedTx(hre, renTimelock, logger); + const waitForTimelockedTx = await setupWaitForTimelockedTx(hre, renTimelock, multisig, logger); + + if (await renTimelock.hasRole(await renTimelock.TIMELOCK_ADMIN_ROLE(), CREATE2_DEPLOYER)) { + await waitForTimelockedTx( + renTimelock.populateTransaction.revokeRole(await renTimelock.TIMELOCK_ADMIN_ROLE(), CREATE2_DEPLOYER), + "Revoking ADMIN role from CREATE2 deployer in RenTimelock contract.", + true + ); + } + + if (multisig) { + // Give Multisig EXECUTOR role in timelock. + if (!(await renTimelock.hasRole(await renTimelock.EXECUTOR_ROLE(), multisig.getAddress()))) { + await waitForTimelockedTx( + renTimelock.populateTransaction.grantRole(await renTimelock.EXECUTOR_ROLE(), multisig.getAddress()), + "Granting EXECUTOR role to Multisig in RenTimelock contract.", + true + ); + } + + // Give Multisig PROPOSER role in timelock. + if (!(await renTimelock.hasRole(await renTimelock.PROPOSER_ROLE(), multisig.getAddress()))) { + await waitForTimelockedTx( + renTimelock.populateTransaction.grantRole(await renTimelock.PROPOSER_ROLE(), multisig.getAddress()), + "Granting PROPOSER role to Multisig in RenTimelock contract.", + true + ); + } + + // Revoke EXECUTOR role from deployer in timelock. + if (await renTimelock.hasRole(await renTimelock.EXECUTOR_ROLE(), deployer)) { + await waitForTimelockedTx( + renTimelock.populateTransaction.revokeRole(await renTimelock.EXECUTOR_ROLE(), deployer), + "Revoking EXECUTOR role from contract deployer in RenTimelock contract.", + true + ); + } + } + + if ((await renTimelock.getMinDelay()).toNumber() !== config.timelockDelay) { + await waitForTimelockedTx( + renTimelock.populateTransaction.updateDelay(config.timelockDelay), + `Updating Timelock delay to ${config.timelockDelay}` + ); + } + + logger.log(`Timelock config:`, await getTimelockConfig(hre, renTimelock, multisig)); let governanceAddress: string; if (network.name === "hardhat") { @@ -100,19 +156,23 @@ export const deployGatewaySol = async function ( governanceAddress = renTimelock.address; } + logger.groupEnd(); + // Deploy RenProxyAdmin //////////////////////////////////////////////// - logger.log(chalk.yellow("RenProxyAdmin")); + logger.group("RenProxyAdmin"); const renProxyAdmin = (await getExistingDeployment("RenProxyAdmin")) || (await create2("RenProxyAdmin", [governanceAddress])); - const deployProxy = setupDeployProxy(hre, create2, renProxyAdmin, renTimelock, logger); + const deployProxy = setupDeployProxy(hre, create2, renProxyAdmin, renTimelock, multisig, logger); // This should only be false on hardhat. const create2IsContract = (await ethers.provider.getCode(CREATE2_DEPLOYER)).replace(/^0x/, "").length > 0; + logger.groupEnd(); + // Deploy RenAssetProxyBeacon //////////////////////////////////////////////// - logger.log(chalk.yellow("RenAsset beacon")); + logger.group("RenAsset beacon"); const renAssetImplementation = await create2("RenAssetV2", []); const existingRenAssetProxyBeacon = await getExistingDeployment("RenAssetProxyBeacon"); const renAssetProxyBeacon = @@ -127,12 +187,16 @@ export const deployGatewaySol = async function ( if (Ox(await renAssetProxyBeacon.implementation()) !== Ox(renAssetImplementation.address)) { await waitForTimelockedTx( renAssetProxyBeacon.populateTransaction.upgradeTo(renAssetImplementation.address), - `Updating RenAssetProxy beacon implementation to ${renAssetImplementation.address}` + `Updating RenAssetProxy beacon implementation to ${renAssetImplementation.address}`, + false, + Ox1_32 ); } + logger.groupEnd(); + // Deploy MintGatewayProxyBeacon ///////////////////////////////////////////// - logger.log(chalk.yellow("MintGateway beacon")); + logger.group("MintGateway beacon"); const mintGatewayImplementation = await create2("MintGatewayV3", []); const existingMintGatewayProxyBeacon = await getExistingDeployment( "MintGatewayProxyBeacon" @@ -153,8 +217,10 @@ export const deployGatewaySol = async function ( ); } + logger.groupEnd(); + // Deploy LockGatewayProxyBeacon ///////////////////////////////////////////// - logger.log(chalk.yellow("LockGateway beacon")); + logger.group("LockGateway beacon"); const lockGatewayImplementation = await create2("LockGatewayV3", []); const existingLockGatewayProxyBeacon = await getExistingDeployment( "LockGatewayProxyBeacon" @@ -175,7 +241,10 @@ export const deployGatewaySol = async function ( ); } - logger.log(chalk.yellow("Signature Verifier")); + logger.groupEnd(); + + // Deploy SignatureVerifier //////////////////////////////////////////////// + logger.group("Signature Verifier"); const signatureVerifier = await deployProxy( "RenVMSignatureVerifierV1", // should be changed if there's a new version "RenVMSignatureVerifierProxy", @@ -198,14 +267,16 @@ export const deployGatewaySol = async function ( )}) Deployer: ${deployer}` ); } + logger.groupEnd(); - logger.log(chalk.yellow("TransferWithLog")); + logger.group("TransferWithLog"); const transferWithLog = await create2("TransferWithLog", []); + logger.groupEnd(); // Deploy GatewayRegistry //////////////////////////////////////////////////// - logger.log(chalk.yellow("GatewayRegistry")); + logger.group("GatewayRegistry"); const gatewayRegistry = await deployProxy( - "GatewayRegistryV3", // should be changed if there's a new version + "GatewayRegistryV2", // should be changed if there's a new version "GatewayRegistryProxy", "GatewayRegistryV2", // shouldn't be changed if there's a new version { @@ -225,7 +296,7 @@ export const deployGatewaySol = async function ( try { await gatewayRegistry.getSignatureVerifier(); return true; - } catch (error: any) { + } catch (error: unknown) { return false; } } @@ -290,8 +361,9 @@ export const deployGatewaySol = async function ( logger.log(`Transferring lockGatewayProxyBeacon ownership to timelock.`); await waitForTimelockedTx(lockGatewayProxyBeacon.populateTransaction.transferOwnership(governanceAddress)); } + logger.groupEnd(); - logger.log(`Deploying contract verification helper contract.`); + logger.group(`Contract verification helper`); const beaconProxy = await create2("BeaconProxy", [renAssetProxyBeacon!.address, []]); const renAssetProxy = await getContractAt(hre)("RenAssetV2", beaconProxy.address); if ((await renAssetProxy.symbol()) === "") { @@ -299,11 +371,12 @@ export const deployGatewaySol = async function ( await waitForTx(renAssetProxy.__RenAsset_init(0, "1", "TESTDEPLOYMENT", "TESTDEPLOYMENT", 0, deployer)); } const beaconDeployment = await deployments.get("BeaconProxy"); + logger.groupEnd(); logger.log(`Handling ${(config.mintGateways || []).length} mint assets.`); const prefix = config.tokenPrefix; for (const { symbol, gateway, token, decimals, version, legacy } of config.mintGateways) { - logger.log(chalk.yellow(`Mint asset: ${symbol}`)); + logger.group(`Mint asset: ${symbol}`); const existingGateway = Ox(await gatewayRegistry.getMintGatewayBySymbol(symbol)); const existingToken = Ox(await gatewayRegistry.getRenAssetBySymbol(symbol)); if ((await gatewayRegistry.getGatewayBySymbol(symbol)) === Ox0) { @@ -386,13 +459,15 @@ export const deployGatewaySol = async function ( throw error; } } + + logger.groupEnd(); } // Test Tokens are deployed when a particular lock-asset doesn't exist on a // testnet. logger.log(`Handling ${(config.lockGateways || []).length} lock assets.`); for (const { symbol, gateway, token, decimals, version } of config.lockGateways || []) { - logger.log(chalk.yellow(`Lock asset: ${symbol}`)); + logger.group(`Lock asset: ${symbol}`); const existingGateway = Ox(await gatewayRegistry.getLockGatewayBySymbol(symbol)); const existingToken = Ox(await gatewayRegistry.getLockAssetBySymbol(symbol)); const totalSupply = typeof token === "object" ? token.totalSupply : undefined; @@ -475,6 +550,8 @@ export const deployGatewaySol = async function ( } catch (error) { console.error(error); } + + logger.groupEnd(); } // await gatewayRegistry.deployMintGatewayAndRenAsset( @@ -574,6 +651,7 @@ export const deployGatewaySol = async function ( gatewayRegistry, basicBridge, signatureVerifier, + renTimelock, }; }; diff --git a/deploy/002_deploy_protocol.ts b/deploy/003_deploy_protocol.ts similarity index 55% rename from deploy/002_deploy_protocol.ts rename to deploy/003_deploy_protocol.ts index 4272944..dba43c2 100644 --- a/deploy/002_deploy_protocol.ts +++ b/deploy/003_deploy_protocol.ts @@ -1,5 +1,6 @@ import BigNumber from "bignumber.js"; import chalk from "chalk"; +import { getAddress as Ox } from "ethers/lib/utils"; import { HardhatRuntimeEnvironment } from "hardhat/types"; import { @@ -15,8 +16,9 @@ import { setupCreate2, setupDeployProxy, setupWaitForTimelockedTx, - setupWaitForTx, -} from "./deploymentUtils"; + updateLogger, +} from "./deploymentUtils/general"; +import { Multisig } from "./deploymentUtils/multisig"; import { NetworkConfig, networks } from "./networks"; export const deployProtocol = async function ( @@ -24,12 +26,16 @@ export const deployProtocol = async function ( config?: NetworkConfig, logger: ConsoleInterface = console ) { + if (true as any) { + return {} as any; + } // if (true as boolean) { // return; // } + logger = updateLogger(logger); const { getNamedAccounts, ethers, network } = hre; - logger.log(`Deploying to ${network.name}...`); + logger.log(chalk.green(`\n\nRunning deployment 003 (Protocol) on ${network.name}...`)); if ( !network.name.match(/^ethereumMainnet/) && @@ -44,16 +50,19 @@ export const deployProtocol = async function ( throw new Error(`No network configuration found for ${network.name}!`); } - const { darknodeRegistry, mintAuthority, chainName, create2SaltOverride } = config; + const { darknodeRegistry, create2SaltOverride } = config; const { deployer } = await getNamedAccounts(); + const { chainId } = await ethers.provider.getNetwork(); + + const multisig = await new Multisig(hre, network.name, chainId, logger).load(); const create2 = setupCreate2(hre, create2SaltOverride, logger); // Deploy RenTimelock //////////////////////////////////////////////// - logger.log(chalk.yellow("RenTimelock")); + logger.group("RenTimelock"); const renTimelock = await create2("RenTimelock", [0, [deployer], [deployer]]); - const waitForTimelockedTx = setupWaitForTimelockedTx(hre, renTimelock, logger); + const waitForTimelockedTx = await setupWaitForTimelockedTx(hre, renTimelock, multisig, logger); let governanceAddress: string; if (network.name === "hardhat") { @@ -61,19 +70,22 @@ export const deployProtocol = async function ( } else { governanceAddress = renTimelock.address; } + logger.groupEnd(); // Deploy RenProxyAdmin //////////////////////////////////////////////// - logger.log(chalk.yellow("RenProxyAdmin")); + logger.group("RenProxyAdmin"); const renProxyAdmin = await create2("RenProxyAdmin", [governanceAddress]); - const deployProxy = setupDeployProxy(hre, create2, renProxyAdmin, renTimelock, logger); + const deployProxy = setupDeployProxy(hre, create2, renProxyAdmin, renTimelock, multisig, logger); + logger.groupEnd(); - logger.log(chalk.yellow("GetOperatorDarknodes")); + logger.group("GetOperatorDarknodes"); const getOperatorDarknodes = await create2("GetOperatorDarknodes", [ darknodeRegistry, ]); + logger.groupEnd(); // Deploy ClaimRewards //////////////////////////////////////////////////// - logger.log(chalk.yellow("ClaimRewards")); + logger.group("ClaimRewards"); const claimRewards = await deployProxy( "ClaimRewardsV1", // should be changed if there's a new version "ClaimRewardsProxy", @@ -86,46 +98,27 @@ export const deployProtocol = async function ( return new BigNumber(await ethers.provider.getStorageAt(claimRewards.address, 0)).isEqualTo(1); } ); + logger.groupEnd(); - const waitForTx = setupWaitForTx(logger); - const NULL32 = "0x" + "00".repeat(32); - - logger.log(chalk.yellow("Protocol")); + logger.group("Protocol"); const protocol = await create2("Protocol", [renTimelock.address, [deployer]]); - await waitForTimelockedTx( - protocol.populateTransaction.updateContract("DarknodeRegistry", darknodeRegistry), - `Updating DarknodeRegistry in protocol to ${darknodeRegistry}` - ); - await waitForTimelockedTx( - protocol.populateTransaction.updateContract("ClaimRewards", claimRewards.address), - `Updating ClaimRewards in protocol to ${claimRewards.address}` - ); - // await protocol.updateContract("DarknodeRegistry", darknodeRegistry); - // await protocol.updateContract("ClaimRewards", claimRewards.address); - // const txData = await protocol.populateTransaction.updateContract("ClaimRewards", claimRewards.address); - // const tx = await renTimelock.schedule(protocol.address, 0, txData.data!, NULL32, NULL32, 0); - // await waitForTx(tx); - - // const tx2 = await renTimelock.execute(protocol.address, 0, txData.data!, NULL32, NULL32); - // await waitForTx(tx2);const txData = await protocol.populateTransaction.updateContract("ClaimRewards", claimRewards.address); - // const tx = await renTimelock.schedule(protocol.address, 0, txData.data!, NULL32, NULL32, 0); - // await waitForTx(tx); - - // const tx2 = await renTimelock.execute(protocol.address, 0, txData.data!, NULL32, NULL32); - // await waitForTx(tx2); - - // const txData = await protocol.populateTransaction.updateContract( - // "GetOperatorDarknodes", - // getOperatorDarknodes.address - // ); - // const tx = await renTimelock.schedule(protocol.address, 0, txData.data!, NULL32, NULL32, 0); - // await waitForTx(tx); - - // const tx2 = await renTimelock.execute(protocol.address, 0, txData.data!, NULL32, NULL32); - // await waitForTx(tx2); - - // await protocol.updateContract("GetOperatorDarknodes", getOperatorDarknodes.address); + const existingDarknodeRegistry = await protocol.getContract("DarknodeRegistry"); + if (Ox(existingDarknodeRegistry) !== Ox(darknodeRegistry)) { + await waitForTimelockedTx( + protocol.populateTransaction.updateContract("DarknodeRegistry", darknodeRegistry), + `Updating DarknodeRegistry in protocol to ${darknodeRegistry}` + ); + } + + const existingClaimRewards = await protocol.getContract("ClaimRewards"); + if (Ox(existingClaimRewards) !== Ox(claimRewards.address)) { + await waitForTimelockedTx( + protocol.populateTransaction.updateContract("ClaimRewards", claimRewards.address), + `Updating ClaimRewards in protocol to ${claimRewards.address}` + ); + } + logger.groupEnd(); return { protocol, diff --git a/deploy/deploymentUtils.ts b/deploy/deploymentUtils/general.ts similarity index 68% rename from deploy/deploymentUtils.ts rename to deploy/deploymentUtils/general.ts index 759b5a2..0e5efe2 100644 --- a/deploy/deploymentUtils.ts +++ b/deploy/deploymentUtils/general.ts @@ -1,9 +1,8 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ import { randomBytes } from "crypto"; -import { - readValidations, - withDefaults, -} from "@openzeppelin/hardhat-upgrades/dist/utils"; +import { SafeTransactionDataPartial } from "@gnosis.pm/safe-core-sdk-types"; +import { readValidations, withDefaults } from "@openzeppelin/hardhat-upgrades/dist/utils"; import { assertStorageUpgradeSafe, assertUpgradeSafe, @@ -19,13 +18,8 @@ import { SyncOrPromise, utils } from "@renproject/utils"; import BigNumber from "bignumber.js"; import BN from "bn.js"; import chalk from "chalk"; -import { - BaseContract, - ContractFactory, - ContractTransaction, - PopulatedTransaction, -} from "ethers"; -import { getAddress, keccak256 } from "ethers/lib/utils"; +import { BaseContract, ContractFactory, ContractTransaction, PopulatedTransaction } from "ethers"; +import { BytesLike, getAddress as Ox, keccak256 } from "ethers/lib/utils"; import { CallOptions, DeployFunction } from "hardhat-deploy/types"; import { HardhatRuntimeEnvironment } from "hardhat/types"; @@ -38,18 +32,24 @@ import { RenTimelock, TransparentUpgradeableProxy, TransparentUpgradeableProxy__factory, -} from "../typechain"; -import { NetworkConfig, networks } from "./networks"; +} from "../../typechain"; +import { NetworkConfig, networks } from "../networks"; +import { Multisig } from "./multisig"; export const Ox0 = "0x0000000000000000000000000000000000000000"; export const Ox0_32 = "0x" + "00".repeat(32); +export const Ox1_32 = "0x" + "00".repeat(31) + "01"; export const CREATE2_DEPLOYER = "0x2222229fb3318a6375fa78fd299a9a42ac6a8fbf"; export interface ConsoleInterface { log(message?: any, ...optionalParams: any[]): void; error(message?: any, ...optionalParams: any[]): void; + group(message?: string): void; + groupEnd(): void; + + oldLog?: Array; } -export const create2Salt = (network: string) => `REN.RC1`; // Release Candidate 1 +export const CREATE2_SALT = `REN.RC1`; // Ren - Release Candidate 1 export const getContractAt = (hre: HardhatRuntimeEnvironment) => @@ -89,7 +89,7 @@ export const setupDeploy = args: F extends { deploy: (...args: infer X) => Promise } ? X : never, overrides?: CallOptions ): Promise Promise } ? C : never> => { - const { deployments, getNamedAccounts, ethers, network } = hre; + const { deployments, getNamedAccounts, ethers } = hre; const { deploy } = deployments; const { deployer } = await getNamedAccounts(); @@ -141,13 +141,15 @@ export const setupCreate2 = overrides?: CallOptions, create2SaltOverrideAlt?: string ): Promise Promise } ? C : never> => { - const { deployments, getNamedAccounts, ethers, network } = hre; + const { deployments, getNamedAccounts, ethers } = hre; const { deploy } = deployments; const { deployer } = await getNamedAccounts(); - const salt = keccak256(Buffer.from(create2SaltOverrideAlt || create2SaltOverride || create2Salt(network.name))); - logger.log(`Deploying ${name} from ${deployer} (salt: keccak256(${create2Salt(network.name)}))`); + const salt = keccak256(Buffer.from(create2SaltOverrideAlt || create2SaltOverride || CREATE2_SALT)); + logger.log(`Deploying ${name} from ${deployer} (salt: keccak256(${CREATE2_SALT}))`); + // const oldLog = logger.log; + // logger.log = (...j: any[]) => oldLog(" >", ...j); const result = await deploy(name, { from: deployer, args: args, @@ -156,6 +158,7 @@ export const setupCreate2 = skipIfAlreadyDeployed: true, ...overrides, }); + // logger.log = oldLog; logger.log(`Deployed ${name} at ${result.address}`); const contract = await ethers.getContractAt(name, result.address, deployer); @@ -185,7 +188,8 @@ export const setupDeployProxy = hre: HardhatRuntimeEnvironment, create2: ReturnType, proxyAdmin: RenProxyAdmin, - renTimelock: RenTimelock, + renTimelock?: RenTimelock, + multisig?: Multisig, logger: ConsoleInterface = console ) => async < @@ -213,14 +217,12 @@ export const setupDeployProxy = create2SaltOverrideAlt?: string ): Promise => { const { getNamedAccounts, ethers } = hre; - const Ox = ethers.utils.getAddress; - const { deployer } = await getNamedAccounts(); const { initializer, constructorArgs } = options; const waitForTx = setupWaitForTx(logger); - const waitForTimelockedTx = setupWaitForTimelockedTx(hre, renTimelock, logger); + const waitForTimelockedTx = await setupWaitForTimelockedTx(hre, renTimelock, multisig, logger); const existingProxyDeployment = await setupGetExistingDeployment(hre)(proxyName); @@ -260,20 +262,6 @@ export const setupDeployProxy = )) as unknown as C; } - // openzeppelin-upgrades manifest ////////////////////////////////////// - await manifest.lockedRun(async () => { - const data = await manifest.read(); - data.admin = { - address: proxyAdmin.address, - }; - data.impls[version.linkedWithoutMetadata] = { - address: implementation.address, - layout, - }; - manifest.write(data); - }); - //////////////////////////////////////////////////////////////////////// - if (!(await isInitialized(implementation))) { logger.log(`Initializing ${contractName} instance (optional).`); await waitForTx(implementation[initializer](...constructorArgs)); @@ -297,7 +285,7 @@ export const setupDeployProxy = } const currentImplementation = await proxyAdmin.getProxyImplementation(proxy.address); - logger.log(proxyName, "points to", currentImplementation); + logger.log(" >", proxyName, "points to", currentImplementation); if (currentImplementation.toLowerCase() !== implementation.address.toLowerCase()) { logger.log( `Updating ${proxyName} to point to ${implementation.address} instead of ${currentImplementation}` @@ -307,6 +295,21 @@ export const setupDeployProxy = await waitForTimelockedTx(proxyAdmin.populateTransaction.upgrade(proxy.address, implementation.address)); } + // openzeppelin-upgrades manifest ////////////////////////////////////// + // Update the proxy's implementation address and layout. + await manifest.lockedRun(async () => { + const data = await manifest.read(); + data.admin = { + address: proxyAdmin.address, + }; + data.impls[version.linkedWithoutMetadata] = { + address: implementation.address, + layout, + }; + manifest.write(data); + }); + //////////////////////////////////////////////////////////////////////// + const final = await ethers.getContractAt(contractName, proxy.address, deployer); if (!(await isInitialized(final))) { @@ -338,29 +341,111 @@ export const setupWaitForTx = logger.log(msg); } const tx = await txOrPromise; - process.stdout.write(`Waiting for ${tx.hash}...`); + process.stdout.write(chalk.blue(`Waiting for ${tx.hash}...`)); await tx.wait(); // Clear the line process.stdout.write(`\x1B[2K\r`); - logger.log(`Transaction confirmed: ${tx.hash}`); + logger.log(`Transaction confirmed: ${chalk.blue(tx.hash)}`); }; -export const setupWaitForTimelockedTx = - (hre: HardhatRuntimeEnvironment, renTimelock: RenTimelock, logger: ConsoleInterface = console) => - async (txDetailsPromise: Promise | PopulatedTransaction, msg?: string) => { - const waitForTx = setupWaitForTx(logger); +export const setupMultisigTx = async ( + hre: HardhatRuntimeEnvironment, + multisig?: Multisig, + logger: ConsoleInterface = console +) => { + const waitForTx = setupWaitForTx(logger); + const { getNamedAccounts, ethers } = hre; - const { ethers, getNamedAccounts } = hre; - const Ox = ethers.utils.getAddress; - const { deployer } = await getNamedAccounts(); - const provider = await ethers.getSigner(deployer); + const { deployer } = await getNamedAccounts(); + const signer = await ethers.getSigner(deployer); + const safeAddress = multisig && multisig.getAddress(); + + return async ( + txDetailsPromise: Promise | PopulatedTransaction, + msg?: string, + skipMultisig?: boolean + ) => { const txDetails = await txDetailsPromise; - const ownableContract = await Ownable__factory.connect(txDetails.to || Ox0, provider); + const ownableContract = Ownable__factory.connect(txDetails.to || Ox0, signer); + let owner: string | undefined; + try { + owner = Ox(await ownableContract.owner()); + } catch (error) { + // Ignore + } // Check if the proxyAdmin is owned by the timelock. - if (Ox(await ownableContract.owner()) === Ox(renTimelock.address)) { + if (safeAddress && (!owner || owner === safeAddress) && !skipMultisig) { + if (!txDetails.to) { + throw new Error(`Must provide transaction target.`); + } + const safeTransactionData: SafeTransactionDataPartial = { + to: txDetails.to, + value: txDetails.value ? txDetails.value.toString() : "0", + data: txDetails.data || "", + }; + + logger.log(`Proposing Multisig transaction${msg ? `: ${msg}` : ""}`); + const safeTransaction = await multisig.proposeTransaction(safeTransactionData); + + const [signed, nextInQueue, link] = await Promise.all([ + multisig.transactionSigned(safeTransaction), + multisig.transactionNextInQueue(safeTransaction), + multisig.getTransactionLink(safeTransaction), + ]); + + if (signed && nextInQueue) { + logger.log(`Executing Multisig transaction${msg ? `: ${msg}` : ""}`); + await multisig.executeTransaction(safeTransaction); + } else if (signed) { + logger.log(chalk.red(`Previous Multisig call must be executed.`)); + } else if (nextInQueue) { + logger.log(chalk.magenta(`Multisig transaction ready to be signed${link ? `: ${link}` : "."}`)); + } else { + logger.log(`Multisig transaction proposed - not ready to be executed.`); + } + } else { + await waitForTx((await ethers.getSigner(deployer)).sendTransaction(txDetails), msg); + } + }; +}; + +export const setupWaitForTimelockedTx = async ( + hre: HardhatRuntimeEnvironment, + renTimelock?: RenTimelock, + multisig?: Multisig, + logger: ConsoleInterface = console +) => { + const waitForTx = setupWaitForTx(logger); + + const { ethers, getNamedAccounts } = hre; + const { deployer } = await getNamedAccounts(); + const signer = await ethers.getSigner(deployer); + + const multisigTx = await setupMultisigTx(hre, multisig, logger); + + return async ( + txDetailsPromise: Promise | PopulatedTransaction, + msg?: string, + skipMultisig?: boolean, + salt?: BytesLike + ) => { + const txDetails = await txDetailsPromise; + + const ownableContract = Ownable__factory.connect(txDetails.to || Ox0, signer); + let owner: string | undefined; + try { + owner = Ox(await ownableContract.owner()); + } catch (error) { + // Ignore + } + + logger.group(`Handling governance call${msg ? `: ${msg}` : ""}`); + + // Check if the proxyAdmin is owned by the timelock. + if (renTimelock && (!owner || owner === Ox(renTimelock.address))) { const minimumDelay = (await renTimelock.getMinDelay()).toNumber(); // If the call hasn't already been scheduled, schedule it with the @@ -370,40 +455,50 @@ export const setupWaitForTimelockedTx = 0, txDetails.data || Buffer.from([]), Ox0_32, - Ox0_32 + salt || Ox0_32 ); + + if (await renTimelock.isOperationDone(hash)) { + logger.log(`Timelock call ${chalk.red("already executed")}.`); + logger.groupEnd(); + return; + } + if (!(await renTimelock.isOperation(hash))) { - const tx = renTimelock.schedule( - txDetails.to || Ox0, - 0, - txDetails.data || Buffer.from([]), - Ox0_32, - Ox0_32, - minimumDelay + await waitForTx( + renTimelock.schedule( + txDetails.to || Ox0, + 0, + txDetails.data || Buffer.from([]), + Ox0_32, + salt || Ox0_32, + minimumDelay + ), + `Scheduling timelock call` ); - await waitForTx(tx, `Sheduling ${msg || "timelock call"}`); } // Check if the timelocked call is ready to be called. - const readyTimestamp = (await renTimelock.getTimestamp(hash)).toNumber() - Date.now() / 1000; - if (readyTimestamp <= 60) { + const readyTimestamp = (await renTimelock.getTimestamp(hash)).toNumber() - Date.now() / 1000 + 20; + if (readyTimestamp <= 80) { if (readyTimestamp > 0) { - console.log(`Sleeping ${readyTimestamp.toFixed(2)} seconds for timelock`); + logger.log(`Sleeping ${chalk.yellow(readyTimestamp.toFixed(2))} seconds for timelock.`); await utils.sleep(readyTimestamp * utils.sleep.SECONDS); } - const tx2 = renTimelock.execute( - txDetails.to || Ox0, - 0, - txDetails.data || Buffer.from([]), - Ox0_32, - Ox0_32 + await multisigTx( + renTimelock.populateTransaction.execute( + txDetails.to || Ox0, + 0, + txDetails.data || Buffer.from([]), + Ox0_32, + salt || Ox0_32 + ), + `Executing timelock call`, + skipMultisig ); - await waitForTx(tx2, msg); } else { const hoursRemaining = readyTimestamp / 60 / 60; - logger.log( - `WARNING: Timelock not ready for another ${hoursRemaining.toFixed(2)} hours: ${msg || hash}` - ); + logger.log(`WARNING: Timelock not ready for another ${hoursRemaining.toFixed(2)} hours.`); // Continue without calling `execute`. If there's any calls in // the rest of the migration that depend on the execution, they // will fail. @@ -411,7 +506,10 @@ export const setupWaitForTimelockedTx = } else { await waitForTx((await ethers.getSigner(deployer)).sendTransaction(txDetails), msg); } + + logger.groupEnd(); }; +}; export const fixNonce = async (hre: HardhatRuntimeEnvironment, nonce: number) => { const { getNamedAccounts, ethers } = hre; @@ -447,7 +545,7 @@ export const forwardBalance = async (hre: HardhatRuntimeEnvironment, to: string) await tx.wait(); }; -export const randomAddress = (): string => getAddress("0x" + randomBytes(20).toString("hex")); +export const randomAddress = (): string => Ox("0x" + randomBytes(20).toString("hex")); export const forwardTokens = (hre: HardhatRuntimeEnvironment, config?: NetworkConfig, logger: ConsoleInterface = console) => @@ -456,8 +554,6 @@ export const forwardTokens = logger.log(`Deploying to ${network.name}...`); - const Ox = ethers.utils.getAddress; - config = config || networks[network.name as "hardhat"]; if (!config) { throw new Error(`No network configuration found for ${network.name}!`); @@ -469,9 +565,9 @@ export const forwardTokens = // Test Tokens are deployed when a particular lock-asset doesn't exist on a // testnet. - console.log(`Handling ${(config.lockGateways || []).length} lock assets.`); - for (const { symbol, gateway, token, decimals } of config.lockGateways || []) { - console.log(chalk.yellow(`Lock asset: ${symbol}`)); + logger.log(`Handling ${(config.lockGateways || []).length} lock assets.`); + for (const { symbol, token } of config.lockGateways || []) { + logger.log(chalk.yellow(`Lock asset: ${symbol}`)); // Check token symbol and decimals if (token && typeof token === "string") { const erc20 = await ethers.getContractAt("ERC20", token); @@ -484,15 +580,34 @@ export const forwardTokens = new BigNumber(10000).shiftedBy(decimals) ).minus(recipientBalance); if (amount.isGreaterThan(0)) { - console.log(`Transferring ${amount.shiftedBy(-decimals).toFixed()} ${symbol}`); + logger.log(`Transferring ${amount.shiftedBy(-decimals).toFixed()} ${symbol}`); await waitForTx(erc20.transfer(recipient, amount.toFixed())); } else { - console.log(`Skipping ${symbol}`); + logger.log(`Skipping ${symbol}`); } } } }; -const func: DeployFunction = async function (hre: HardhatRuntimeEnvironment) {}; +export const updateLogger = (logger: ConsoleInterface) => { + logger.group = (msg: string) => { + const oldLog = logger.log; + logger.log(chalk.yellow(msg)); + logger.oldLog = [...(logger.oldLog || []), oldLog]; + logger.log = (...j: any[]) => { + oldLog(" >", ...j.map((ji) => (typeof ji === "string" ? ji.split("\n").join("\n > ") : ji))); + }; + }; + + logger.groupEnd = () => { + const oldLog = (logger.oldLog && logger.oldLog.length && logger.oldLog[logger.oldLog.length - 1]) || logger.log; + logger.oldLog = logger.oldLog?.slice(0, logger.oldLog.length - 1); + logger.log = oldLog; + }; + + return logger; +}; + +const func: DeployFunction = async function () {}; func.tags = []; export default func; diff --git a/deploy/deploymentUtils/multisig.ts b/deploy/deploymentUtils/multisig.ts new file mode 100644 index 0000000..0ebd93d --- /dev/null +++ b/deploy/deploymentUtils/multisig.ts @@ -0,0 +1,610 @@ +import { existsSync } from "fs"; +import path from "path"; + +import Safe, { SafeAccountConfig, SafeFactory } from "@gnosis.pm/safe-core-sdk"; +import { OperationType, SafeTransactionData, SafeTransactionDataPartial } from "@gnosis.pm/safe-core-sdk-types"; +import SafeSignature from "@gnosis.pm/safe-core-sdk/dist/src/utils/signatures/SafeSignature"; +import SafeTransaction from "@gnosis.pm/safe-core-sdk/dist/src/utils/transactions/SafeTransaction"; +import EthersAdapter from "@gnosis.pm/safe-ethers-lib"; +import { utils } from "@renproject/utils"; +import Axios from "axios"; +import chalk from "chalk"; +import { mkdir, readFile, writeFile } from "fs/promises"; +import { DeployFunction } from "hardhat-deploy/types"; +import { HardhatRuntimeEnvironment } from "hardhat/types"; +import { OrderedMap } from "immutable"; + +import { ConsoleInterface, setupWaitForTx } from "./general"; + +// TYPES /////////////////////////////////////////////////////////////////////// + +/** + * Each network has a MultisigConfig file to track the deploment of a Multisig + * to that network as well as any queued transactions. + */ +export interface MultisigConfig { + /** + * The name of the network (e.g. "ethereumTestnet", "optimismMainnet") + */ + network: string; + + /** + * The address of the Multisig deployment. + */ + address: string | undefined; + + /** + * An array of queued transactions that need to be signed by the required + * quorum of signers and executed. Transactions must be executed in the + * order of their nonces. + */ + queuedTransactions: Array<{ + data: SafeTransactionData; + signatures: Array<{ + readonly signer: string; + readonly data: string; + }>; + }>; +} + +// The interface for the safe.global API. +interface SafeAPI { + Propose: { + Request: { + to: string; + value: string; + data: string; + operation: OperationType; + nonce: string; + safeTxGas: string; + baseGas: string; + gasPrice: string; + gasToken: string; + refundReceiver: string; + safeTxHash: string; + sender: string; + origin: string | null; + signature: string; + }; + Response: { + id: string; + timestamp: number; + txStatus: string; // "AWAITING_EXECUTION"; + txInfo: { + type: string; // "Custom"; + to: { + value: string; + }; + dataSize: string; + value: string; + methodName: string | null; + isCancellation: boolean; + }; + executionInfo: { + type: string; // "MULTISIG"; + nonce: number; + confirmationsRequired: number; + confirmationsSubmitted: number; + }; + }; + }; + + Queue: { + Response: { + next: string | undefined; + prev: string | undefined; + results: Array<{ + type: "TRANSACTION" | "LABEL"; + transaction: SafeAPI["Propose"]["Response"]; + }>; + }; + }; + + Transaction: { + Response: { + safeAddress: string; // "0xb6Aa82Db4c7dA3B30eaC3fD395A7dD2215f6773E"; + txId: string; // "multisig_0xb6..."; + executedAt: null; + txStatus: string; // "AWAITING_EXECUTION"; + txInfo: SafeAPI["Propose"]["Response"]["txInfo"]; + txData: { + hexData: string; // "0x01020304"; + dataDecoded: null; + to: { value: string }; + value: string; // "1"; + operation: OperationType; + }; + detailedExecutionInfo: { + type: string; //"MULTISIG"; + submittedAt: number; // 1665978427763; + nonce: number; // 6; + safeTxGas: string; // "0"; + baseGas: string; // "0"; + gasPrice: string; // "0"; + gasToken: string; // "0x0000000000000000000000000000000000000000"; + refundReceiver: { value: string }; // { value: "0x0000000000000000000000000000000000000000" }; + safeTxHash: string; // "0x8945482864f5a81060a634c99ed8f4c8954599c9be3a05e4a7cc16c08bd4e148"; + executor: null; + signers: [{ value: string }]; // [{ value: "0x1111538e6a1657a4cd58Be1CCc13Da0c979e0e5C" }]; + confirmationsRequired: number; + confirmations: [ + { + signer: { value: string }; // { value: "0x1111538e6a1657a4cd58Be1CCc13Da0c979e0e5C" }; + signature: string; // "0xe21bf0201c72712fde750c8c4e5c628bb40638ea682179a790d5a2775193a1db6bdfaffed6d6ec7e902ada82aa6519070085b9696ff97ac81b31aff581781abb20"; + submittedAt: number; // 1665978427796; + } + ]; + }; + txHash: null; + }; + }; +} + +//////////////////////////////////////////////////////////////////////////////// + +export class Multisig { + network: string; + logger: ConsoleInterface; + chainId: number; + + safeSdk: Safe | undefined; + hre: HardhatRuntimeEnvironment; + + chainIsSupported: boolean | undefined; + + constructor(hre: HardhatRuntimeEnvironment, network: string, chainId: number, logger: ConsoleInterface) { + this.network = network; + this.logger = logger; + this.hre = hre; + this.chainId = chainId; + } + + load = async () => { + const { getNamedAccounts, ethers } = this.hre; + + const { deployer } = await getNamedAccounts(); + // const waitForTx = setupWaitForTx(logger); + + const deployerSigner = await ethers.getSigner(deployer); + // const multisigDeployerSigner = await ethers.getSigner(multisigDeployer); + + const multisigConfig = await this.readMultisigConfig(); + + const ethAdapter = new EthersAdapter({ ethers, signer: deployerSigner }); + + if (!multisigConfig.address) { + return undefined; + } + + this.safeSdk = await Safe.create({ ethAdapter, safeAddress: multisigConfig.address }); + + return this; + }; + + deploy = async (owners: string[], threshold: number) => { + const { getNamedAccounts, ethers } = this.hre; + + const { deployer } = await getNamedAccounts(); + // const waitForTx = setupWaitForTx(logger); + + const deployerSigner = await ethers.getSigner(deployer); + // const multisigDeployerSigner = await ethers.getSigner(multisigDeployer); + + const multisigConfig = await this.readMultisigConfig(); + + let safeSdk: Safe; + const ethAdapter = new EthersAdapter({ ethers, signer: deployerSigner }); + + // Deploy MultiSig //////////////////////////////////////////////// + if (!multisigConfig.address) { + try { + const safeFactory = await SafeFactory.create({ ethAdapter }); + + if (threshold < 1 || threshold > owners.length) { + throw new Error(`Invalid threshold ${threshold} - must be between 1 and ${owners.length}`); + } + const safeAccountConfig: SafeAccountConfig = { + owners, + threshold, + // ... + }; + + safeSdk = await safeFactory.deploySafe({ safeAccountConfig }); + } catch (error) { + if (error instanceof Error && error.message.match(/Invalid SafeProxyFactory contract address/)) { + this.logger.log(`Multisig not supported on ${this.network}.`); + return undefined; + } else { + throw error; + } + } + multisigConfig.address = safeSdk.getAddress(); + await this.writeMultisigConfig(multisigConfig); + + this.logger.log(`${chalk.green(`Safe deployed to`)} ${chalk.blue(multisigConfig.address)}`); + } else { + safeSdk = await Safe.create({ ethAdapter, safeAddress: multisigConfig.address }); + } + + this.safeSdk = safeSdk; + return this; + }; + + /** + * Returns the address of the network's Multisig config file, creating the + * containing directory if it doesn't exist. + */ + getMultisigConfigPath = async (): Promise => { + const deploymentPath = `./deployments/${this.network}/multisig`; + if (!existsSync(deploymentPath)) { + await mkdir(deploymentPath, { recursive: true }); + } + return path.join(deploymentPath, "multisig.json"); + }; + + /** + * Reads the network's Multisig config, returning an empty config if the config + * file doesn't exist. + */ + readMultisigConfig = async (): Promise => { + const configPath = await this.getMultisigConfigPath(); + if (!existsSync(configPath)) { + return { + network: this.network, + address: undefined, + queuedTransactions: [], + }; + } + const config = JSON.parse((await readFile(configPath)).toString()); + return { + ...{ + network: this.network, + address: undefined, + queuedTransactions: [], + }, + ...config, + }; + }; + + /** + * Saves the network's Multisig config file. + */ + writeMultisigConfig = async (config: MultisigConfig): Promise => { + if (config.network !== this.network) { + throw new Error(`Invalid MultisigConfig: expected network ${config.network} to be ${this.network}.`); + } + + const configPath = await this.getMultisigConfigPath(); + const filledConfig: MultisigConfig = { + ...{ + network: this.network, + address: undefined, + queuedTransactions: [], + }, + ...config, + }; + + await writeFile(configPath, JSON.stringify(filledConfig, null, " ")); + }; + + safeClientUrl = (): string => `https://safe-client.gnosis.io/v1/chains/${this.chainId}`; + + // Check that the chain is supported by the API. + chainIsSupportedByAPI = async (): Promise => { + if (typeof this.chainIsSupported === "boolean") { + return this.chainIsSupported; + } + + try { + const response = await Axios.get<{ chainId: string }>(this.safeClientUrl()); + if (response.data.chainId !== this.chainId.toString()) { + throw new Error(`Expected Safe API to return chainId ${this.chainId}.`); + } + this.chainIsSupported = true; + return this.chainIsSupported; + } catch (error: unknown) { + if (Axios.isAxiosError(error) && error.response?.status === 404) { + this.chainIsSupported = false; + return this.chainIsSupported; + } + throw error; + } + }; + + // Fetch the transaction queue from the Safe API. + fetchAPIQueue = async (): Promise => { + if (!this.safeSdk) { + throw new Error(`Must call .load()`); + } + + const safeAddress = this.safeSdk.getAddress(); + + if (!(await this.chainIsSupportedByAPI())) { + return []; + } + + let unprocessedRemoteQueue: Array = []; + let cursor; + do { + // Try fetching the data 5 times. If the response is 404 then the API might not support the chain. + const { data } = await utils.tryNTimes( + () => + Axios.get( + `${this.safeClientUrl()}/safes/${safeAddress}/transactions/queued` + ), + 2 + ); + cursor = data.next; + unprocessedRemoteQueue = [ + ...unprocessedRemoteQueue, + ...data.results.filter((tx) => tx.type === "TRANSACTION").map((tx) => tx.transaction), + ]; + } while (cursor); + + const remoteQueue: SafeTransaction[] = ( + await Promise.all( + unprocessedRemoteQueue.map( + async (tx) => + ( + await Axios.get( + `${this.safeClientUrl()}/transactions/${tx.id}` + ) + ).data + ) + ) + ).map((tx) => { + const safeTransaction = new SafeTransaction({ + to: tx.txData.to.value, + value: tx.txData.value, + data: tx.txData.hexData, + operation: tx.txData.operation, + baseGas: parseInt(tx.detailedExecutionInfo.baseGas), + gasPrice: parseInt(tx.detailedExecutionInfo.gasPrice), + gasToken: tx.detailedExecutionInfo.gasToken, + refundReceiver: tx.detailedExecutionInfo.refundReceiver.value, + nonce: tx.detailedExecutionInfo.nonce, + safeTxGas: parseInt(tx.detailedExecutionInfo.safeTxGas), + }); + + for (const signature of tx.detailedExecutionInfo.confirmations) { + safeTransaction.addSignature(new SafeSignature(signature.signer.value, signature.signature)); + } + return safeTransaction; + }); + + return remoteQueue; + }; + + // Fetches the transaction queue from the API and combines it with the local queue. + fetchQueue = async (): Promise => { + if (!this.safeSdk) { + throw new Error(`Must call .deployOrLoad()`); + } + + const [config, remoteQueue, nextNonce] = await Promise.all([ + this.readMultisigConfig(), + this.fetchAPIQueue(), + this.safeSdk.getNonce(), + ]); + + // Convert local queue to SafeTransaction array. + const localQueue = config.queuedTransactions.map(({ data, signatures }) => { + const tx = new SafeTransaction(data); + for (const signature of signatures) { + tx.addSignature(new SafeSignature(signature.signer, signature.data)); + } + return tx; + }); + + let queueMap = remoteQueue.reduce( + (map, tx) => map.set(tx.data.nonce, tx), + OrderedMap() + ); + + const chainIsSupported = await this.chainIsSupportedByAPI(); + + for (const localTx of localQueue) { + if (localTx.data.nonce >= nextNonce && !queueMap.has(localTx.data.nonce)) { + queueMap = queueMap.set(localTx.data.nonce, localTx); + if (chainIsSupported) { + await this.submitTransactionToAPI(localTx); + } + } + } + + const queue = queueMap.valueSeq().toArray(); + + // Update config. + await this.writeMultisigConfig({ + ...config, + queuedTransactions: queue.map(({ data, signatures }) => ({ + data, + signatures: Array.from(signatures.values()), + })), + }); + + return queue; + }; + + submitTransactionToAPI = async (safeTransaction: SafeTransaction) => { + if (!this.safeSdk) { + throw new Error(`Must call .deployOrLoad()`); + } + + const safeAddress = this.safeSdk.getAddress(); + + const safeTxHash = await this.safeSdk.getTransactionHash(safeTransaction); + + const signature = safeTransaction.signatures.values().next().value; + + const request: SafeAPI["Propose"]["Request"] = { + ...safeTransaction.data, + nonce: safeTransaction.data.nonce.toString(), + safeTxGas: safeTransaction.data.safeTxGas.toString(), + baseGas: safeTransaction.data.baseGas.toString(), + gasPrice: safeTransaction.data.gasPrice.toString(), + safeTxHash, + sender: signature.signer, + origin: null, + signature: signature.data, + }; + + return await Axios.post( + `${this.safeClientUrl()}/transactions/${safeAddress}/propose`, + request, + {} + ); + }; + + saveTransaction = async (safeTransaction: SafeTransaction) => { + if (await this.chainIsSupportedByAPI()) { + await this.submitTransactionToAPI(safeTransaction); + } + + const config = await this.readMultisigConfig(); + await this.writeMultisigConfig({ + ...config, + queuedTransactions: [ + ...config.queuedTransactions, + { + data: safeTransaction.data, + signatures: Array.from(safeTransaction.signatures.values()), + }, + ], + }); + + return safeTransaction; + }; + + proposeTransaction = async (tx: SafeTransactionDataPartial): Promise => { + if (!this.safeSdk) { + throw new Error(`Must call .deployOrLoad()`); + } + + const queue = await this.fetchQueue(); + const nextNonce = queue.reduce( + (acc, tx) => Math.max(acc || 0, tx.data.nonce + 1), + undefined + ); + + for (const queuedTx of queue) { + if (queuedTx.data.data === tx.data && queuedTx.data.to.toLowerCase() === tx.to.toLowerCase()) { + console.log(`Already proposed.`); + return queuedTx; + } + } + + const safeTransaction = await this.safeSdk.createTransaction({ + safeTransactionData: { ...tx, nonce: nextNonce }, + }); + const safeTxHash = await this.safeSdk.getTransactionHash(safeTransaction); + + const signature = await this.safeSdk.signTransactionHash(safeTxHash); + + safeTransaction.addSignature(signature); + + return await this.saveTransaction(safeTransaction); + }; + + /** + * A transaction can be executed if it has received the required number + * of signatures and its nonce matches the Multisig's current nonce. + */ + transactionSigned = async (safeTransaction: SafeTransaction) => { + if (!this.safeSdk) { + throw new Error(`Must call .deployOrLoad()`); + } + + const threshold = await this.safeSdk.getThreshold(); + const signatureCount = safeTransaction.signatures.size; + + return signatureCount >= threshold; + }; + + transactionNextInQueue = async (safeTransaction: SafeTransaction) => { + if (!this.safeSdk) { + throw new Error(`Must call .deployOrLoad()`); + } + + const nextNonce = await this.safeSdk.getNonce(); + + return safeTransaction.data.nonce === nextNonce; + }; + + executeTransaction = async (safeTransaction: SafeTransaction) => { + if (!this.safeSdk) { + throw new Error(`Must call .deployOrLoad()`); + } + + const tx = await this.safeSdk.executeTransaction(safeTransaction); + + if (!tx.transactionResponse) { + throw new Error(`Expected transaction response to be returned from Safe SDK.`); + } + + const waitForTx = setupWaitForTx(this.logger); + await waitForTx(tx.transactionResponse); + + // Synchronise local and remote queues. + await this.fetchQueue(); + }; + + getAddress = () => { + if (!this.safeSdk) { + throw new Error(`Must call .deployOrLoad()`); + } + + return this.safeSdk.getAddress(); + }; + + getTransactionLink = async (transaction?: SafeTransaction): Promise => { + const networkKey: { [network: string]: string } = { + ethereumMainnet: "eth", + polygonMainnet: "matic", + bscMainnet: "bnb", + arbitrumMainnet: "arb1", + avalancheMainnet: "avax", + optimismMainnet: "oeth", + goerliTestnet: "gor", + }; + + if (!networkKey[this.network]) { + return undefined; + } + + const baseLink = `https://gnosis-safe.io/app/${networkKey[this.network]}:${this.getAddress()}`; + + if (!transaction) { + return baseLink; + } + + const hash = await this.safeSdk?.getTransactionHash(transaction); + + return `${baseLink}/transactions/multisig_${this.getAddress()}_${hash}`; + + // https://gnosis-safe.io/app/gor:0xb6Aa82Db4c7dA3B30eaC3fD395A7dD2215f6773E/transactions/multisig_0xb6Aa82Db4c7dA3B30eaC3fD395A7dD2215f6773E_0xb5f947719a682d114eac5e99a889f6575e4d194b7a5ad11ffc91061c3234e851 + }; +} + +/* Old code for deploying from a seperate account. */ +// console.log(JSON.stringify(signedData)); + +// console.log(await safeSdk.executeTransaction(signedData)); + +// const balanceAfter = await ethers.provider.getBalance(multisigDeployer); +// const returnGasPrice = await ethers.provider.getGasPrice(); +// const returnTxFee = returnGasPrice.mul(21000); +// if (balanceAfter.gt(returnTxFee)) { +// await waitForTx( +// await multisigDeployerSigner.sendTransaction({ +// to: deployer, +// value: balanceAfter.sub(returnTxFee), +// gasPrice: returnGasPrice, +// }), +// "Returning funds from Multisig Deployer" +// ); +// } + +const func: DeployFunction = async function () {}; +func.tags = []; +export default func; diff --git a/deploy/deploymentUtils/timelock.ts b/deploy/deploymentUtils/timelock.ts new file mode 100644 index 0000000..6836bf7 --- /dev/null +++ b/deploy/deploymentUtils/timelock.ts @@ -0,0 +1,130 @@ +import BigNumber from "bignumber.js"; +import chalk from "chalk"; +import { getAddress as Ox } from "ethers/lib/utils"; +import { DeployFunction } from "hardhat-deploy/types"; +import { HardhatRuntimeEnvironment } from "hardhat/types"; + +import { RenTimelock } from "../../typechain"; +import { CREATE2_DEPLOYER } from "./general"; +import { Multisig } from "./multisig"; + +interface Roles { + DEFAULT: string; + ADMIN: string; + EXECUTOR: string; + PROPOSER: string; +} + +const getAddressRoles = async (renTimelock: RenTimelock, roles: Roles, address: string) => { + return [ + ...((await renTimelock.hasRole(await renTimelock.TIMELOCK_ADMIN_ROLE(), address)) ? ["ADMIN"] : []), + ...((await renTimelock.hasRole(await renTimelock.DEFAULT_ADMIN_ROLE(), address)) ? ["DEFAULT"] : []), + ...((await renTimelock.hasRole(await renTimelock.PROPOSER_ROLE(), address)) ? ["PROPOSER"] : []), + ...((await renTimelock.hasRole(await renTimelock.EXECUTOR_ROLE(), address)) ? ["EXECUTOR"] : []), + ]; +}; + +export const SECONDS = 1; +export const MINUTE = 60; +export const HOUR = MINUTE * 60; +export const DAY = HOUR * 24; + +export const getTimelockConfig = async ( + hre: HardhatRuntimeEnvironment, + renTimelock: RenTimelock, + multisig: Multisig | undefined +) => { + const { getNamedAccounts, ethers } = hre; + const { deployer } = await getNamedAccounts(); + + // The following may hold roles in the Timelock. + const knownAccounts = { + multisig: multisig ? Ox(multisig.getAddress()) : undefined, + timelock: Ox(renTimelock.address), + deployer: Ox(deployer), + create2: Ox(CREATE2_DEPLOYER), + }; + + const [DEFAULT_ADMIN_ROLE, TIMELOCK_ADMIN_ROLE, EXECUTOR_ROLE, PROPOSER_ROLE] = await Promise.all([ + renTimelock.DEFAULT_ADMIN_ROLE(), + renTimelock.TIMELOCK_ADMIN_ROLE(), + renTimelock.EXECUTOR_ROLE(), + renTimelock.PROPOSER_ROLE(), + ]); + + const roles: Roles = { + DEFAULT: DEFAULT_ADMIN_ROLE, + ADMIN: TIMELOCK_ADMIN_ROLE, + EXECUTOR: EXECUTOR_ROLE, + PROPOSER: PROPOSER_ROLE, + }; + + const reverseRoles = { + [DEFAULT_ADMIN_ROLE]: "DEFAULT", + [TIMELOCK_ADMIN_ROLE]: "ADMIN", + [EXECUTOR_ROLE]: "EXECUTOR", + [PROPOSER_ROLE]: "PROPOSER", + }; + + const permissionedAccounts = new Map(); + try { + const roleGrantedLogs = await ethers.provider.getLogs({ + ...renTimelock.filters.RoleGranted(null, null, null), + fromBlock: 1, + toBlock: "latest", + }); + + for (const log of roleGrantedLogs) { + const decoded = renTimelock.interface.decodeEventLog( + renTimelock.interface.events["RoleGranted(bytes32,address,address)"], + log.data, + log.topics + ); + const account = Ox(decoded.account); + permissionedAccounts.set(account, [ + ...(permissionedAccounts.get(account) || []), + reverseRoles[decoded.role], + ]); + } + } catch (error) { + // Ignore error - some chains don't allow fetching from block 1. + } + + for (const [account, roles] of permissionedAccounts) { + if (!Object.values(knownAccounts).includes(account)) { + console.error(chalk.red(`\n\nUnknown account ${account} has Timelock roles ${roles.join(", ")}\n\n`)); + } + } + + const [delayRaw, multisigRoles, timelockRoles, deployerRoles, create2Roles] = await Promise.all([ + renTimelock.getMinDelay(), + knownAccounts.multisig ? getAddressRoles(renTimelock, roles, knownAccounts.multisig) : undefined, + getAddressRoles(renTimelock, roles, knownAccounts.timelock), + getAddressRoles(renTimelock, roles, knownAccounts.deployer), + getAddressRoles(renTimelock, roles, knownAccounts.create2), + ]); + + const delay = new BigNumber(delayRaw.toString()); + + const delayReadable = delay.gt(DAY) + ? `${delay.div(DAY).toFixed(2)} days` + : delay.gt(HOUR) + ? `${delay.div(HOUR).toFixed(2)} hours` + : delay.gt(MINUTE) + ? `${delay.div(MINUTE).toFixed(2)} minutes` + : `${delay.toFixed()} seconds`; + + return { + roles: { + ...(multisigRoles && multisigRoles.length ? { multisig: multisigRoles } : {}), + ...(timelockRoles && timelockRoles.length ? { timelock: timelockRoles } : {}), + ...(deployerRoles && deployerRoles.length ? { deployer: deployerRoles } : {}), + ...(create2Roles && create2Roles.length ? { create2: create2Roles } : {}), + }, + delay: delayReadable, + }; +}; + +const func: DeployFunction = async function () {}; +func.tags = []; +export default func; diff --git a/deploy/networks.ts b/deploy/networks.ts index e100890..10e2551 100644 --- a/deploy/networks.ts +++ b/deploy/networks.ts @@ -1,20 +1,9 @@ import { DeployFunction } from "hardhat-deploy/types"; -import { HardhatRuntimeEnvironment } from "hardhat/types"; -export enum Chain { - Hardhat = "Hardhat", +import { MINUTE, SECONDS } from "./deploymentUtils/timelock"; - Ethereum = "Ethereum", - Goerli = "Goerli", - BinanceSmartChain = "BinanceSmartChain", - Fantom = "Fantom", - Polygon = "Polygon", - Avalanche = "Avalanche", - Arbitrum = "Arbitrum", - Moonbeam = "Moonbeam", - Kava = "Kava", - Optimism = "Optimism", -} +// mintAuthority is generated by +// > utils.toChecksumAddress(utils.pubToAddress("... public key ...", true).toString("hex")) export interface NetworkConfig { tokenPrefix: "dev" | "test" | "ren"; @@ -23,6 +12,9 @@ export interface NetworkConfig { darknodeRegistry: string; governanceAddress?: string; create2SaltOverride?: string; + timelockDelay: number; + multisigSigners: string[]; + mintGateways: Array<{ symbol: string; decimals: number; @@ -41,6 +33,37 @@ export interface NetworkConfig { }>; } +const renvmMainnetConfig = { + darknodeRegistry: "0x2D7b6C95aFeFFa50C068D50f89C5C0014e054f0A", + mintAuthority: "0x7f64e4e4b2d7589eb0ac8439c0e639856aeceee7", + tokenPrefix: "ren" as const, + timelockDelay: 1 * MINUTE, // TODO: Update to 1 day + multisigSigners: [], +}; + +const renvmTestnetConfig = { + darknodeRegistry: "0xC791dB283bc6FFbcC00e474B9F7eb130e48E8bC4", + mintAuthority: "0x44Bb4eF43408072bC888Afd1a5986ba0Ce35Cb54", + tokenPrefix: "test" as const, + timelockDelay: 60 * SECONDS, + multisigSigners: [], +}; + +export enum Chain { + Hardhat = "Hardhat", + + Ethereum = "Ethereum", + Goerli = "Goerli", + BinanceSmartChain = "BinanceSmartChain", + Fantom = "Fantom", + Polygon = "Polygon", + Avalanche = "Avalanche", + Arbitrum = "Arbitrum", + Moonbeam = "Moonbeam", + Kava = "Kava", + Optimism = "Optimism", +} + export const mainnetTokens = [ { symbol: "ibBTC", @@ -351,27 +374,14 @@ export const testnetTokens = [ }, ]; -// mintAuthority is generated by -// > utils.toChecksumAddress(utils.pubToAddress("... public key ...", true).toString("hex")) - -const renvmMainnetConfig = { - darknodeRegistry: "0x2D7b6C95aFeFFa50C068D50f89C5C0014e054f0A", - mintAuthority: "0x7f64e4e4b2d7589eb0ac8439c0e639856aeceee7", - tokenPrefix: "ren" as const, -}; - -const renvmTestnetConfig = { - darknodeRegistry: "0xC791dB283bc6FFbcC00e474B9F7eb130e48E8bC4", - mintAuthority: "0x44Bb4eF43408072bC888Afd1a5986ba0Ce35Cb54", - tokenPrefix: "test" as const, -}; - export const networks: { [network: string]: NetworkConfig } = { hardhat: { mintAuthority: "0x0000000000000000000000000000000000000001", darknodeRegistry: "0x0000000000000000000000000000000000000002", tokenPrefix: "dev", chainName: Chain.Hardhat, + timelockDelay: 0, + multisigSigners: [], mintGateways: [ { @@ -414,6 +424,8 @@ export const networks: { [network: string]: NetworkConfig } = { chainName: Chain.Ethereum, ...renvmMainnetConfig, + // safeAddress: "0xc49d7d07f1b21168a89d686F3E65BC07142250ef", + mintGateways: [ { // renBTC @@ -1321,6 +1333,8 @@ export const networks: { [network: string]: NetworkConfig } = { ...renvmTestnetConfig, chainName: Chain.Goerli, + // safeAddress: "0xb6Aa82Db4c7dA3B30eaC3fD395A7dD2215f6773E", + mintGateways: [ { // testBTC @@ -1729,6 +1743,6 @@ export const networks: { [network: string]: NetworkConfig } = { }, }; -const func: DeployFunction = async function (hre: HardhatRuntimeEnvironment) {}; +const func: DeployFunction = async function () {}; func.tags = []; export default func; diff --git a/hardhat.config.ts b/hardhat.config.ts index 9d8d034..5a3cbf1 100644 --- a/hardhat.config.ts +++ b/hardhat.config.ts @@ -16,7 +16,7 @@ if (process.env.HARDHAT_FORK) { process.env["HARDHAT_DEPLOY_FORK"] = process.env.HARDHAT_FORK; } -const MNEMONIC_DEVNET = process.env.MNEMONIC_DEVNET || process.env.MNEMONIC || ""; +// const MNEMONIC_DEVNET = process.env.MNEMONIC_DEVNET || process.env.MNEMONIC || ""; const MNEMONIC_TESTNET = process.env.MNEMONIC_TESTNET || process.env.MNEMONIC || ""; const MNEMONIC_MAINNET = process.env.MNEMONIC_MAINNET || process.env.MNEMONIC || ""; const INFURA_KEY = process.env.INFURA_KEY || ""; diff --git a/package.json b/package.json index eaba3b7..6cc5e8d 100644 --- a/package.json +++ b/package.json @@ -10,16 +10,20 @@ "@openzeppelin/contracts-upgradeable": "4.3.3" }, "devDependencies": { - "@ethersproject/hardware-wallets": "^5.5.0", - "@ethersproject/providers": "^5.5.0", - "@nomiclabs/hardhat-ethers": "npm:hardhat-deploy-ethers@0.3.0-beta.11", + "@ethersproject/hardware-wallets": "^5.7.0", + "@ethersproject/providers": "^5.7.1", + "@gnosis.pm/safe-core-sdk": "^3.1.1", + "@gnosis.pm/safe-core-sdk-types": "^1.6.1", + "@gnosis.pm/safe-ethers-lib": "^1.6.1", + "@gnosis.pm/safe-service-client": "^1.3.1", + "@nomiclabs/hardhat-ethers": "npm:hardhat-deploy-ethers@0.3.0-beta.13", "@nomiclabs/hardhat-etherscan": "^2.1.7", "@openzeppelin/hardhat-upgrades": "^1.12.0", "@openzeppelin/upgrades-core": "^1.10.0", - "@renproject/chains-ethereum": "^3.0.0-alpha.7", - "@renproject/mock-provider": "^3.0.0-alpha.7", - "@renproject/provider": "^3.0.0-alpha.7", - "@renproject/ren": "^3.0.0-alpha.7", + "@renproject/chains-ethereum": "^3.5.0", + "@renproject/mock-provider": "^3.5.0", + "@renproject/provider": "^3.5.0", + "@renproject/ren": "^3.5.0", "@typechain/ethers-v5": "^8.0.4", "@typechain/hardhat": "^3.0.0", "@types/chai": "^4.2.22", @@ -37,7 +41,7 @@ "dotenv": "^10.0.0", "eslint": "^8.3.0", "eslint-config-prettier": "^8.3.0", - "ethers": "^5.5.1", + "ethers": "^5.7.1", "fs-extra": "^10.0.0", "hardhat": "^2.6.8", "hardhat-deploy": "^0.9.10", diff --git a/src/GatewayRegistry/GatewayRegistryV3.sol b/src/GatewayRegistry/GatewayRegistryV3.sol index e190e77..b9f6bb4 100644 --- a/src/GatewayRegistry/GatewayRegistryV3.sol +++ b/src/GatewayRegistry/GatewayRegistryV3.sol @@ -18,11 +18,11 @@ import {RenAssetFactory} from "./RenAssetFactory.sol"; import {StringSet} from "../libraries/StringSet.sol"; import {GatewayRegistryStateV2, GatewayRegistryGettersV2, GatewayRegistryV2} from "./GatewayRegistry.sol"; -contract GatewayRegistryStateV3 is GatewayRegistryStateV2 {} +/// @dev if any new values are being added, GatewayRegistryStateV3 should +/// be updated to have all the values from GatewayRegistryStateV2 instead of +/// inheriting from it, to that values can be added before the __gap. +contract GatewayRegistryStateV3 is GatewayRegistryStateV2 { -contract GatewayRegistryStateGapV3 { - // See GatewayRegistryStateGapV2 - uint256[39] private __gap; } contract GatewayRegistryGettersV3 is GatewayRegistryGettersV2, GatewayRegistryStateV3 {} @@ -34,8 +34,7 @@ contract GatewayRegistryV3 is AccessControlEnumerableUpgradeable, RenAssetFactory, GatewayRegistryStateV3, - GatewayRegistryGettersV3, - GatewayRegistryStateGapV3 + GatewayRegistryGettersV3 { using StringSet for StringSet.Set; diff --git a/src/Gateways/common/GatewayState.sol b/src/Gateways/common/GatewayState.sol index 3432069..593e145 100644 --- a/src/Gateways/common/GatewayState.sol +++ b/src/Gateways/common/GatewayState.sol @@ -38,6 +38,7 @@ abstract contract GatewayStateManagerV3 is Initializable, ContextUpgradeable, Ga event LogTokenUpdated(address indexed token); event LogSignatureVerifierUpdated(address indexed oldSignatureVerifier, address indexed newSignatureVerifier); event LogPreviousGatewayUpdated(address indexed oldPreviousGateway, address indexed newPreviousGateway); + event LogEventNonceOverriden(uint256 oldEventNonce, uint256 newEventNonce); function __GatewayStateManager_init( string calldata asset_, @@ -154,6 +155,17 @@ abstract contract GatewayStateManagerV3 is Initializable, ContextUpgradeable, Ga return false; } + /// @notice Allow the owner to update the previous gateway used for + /// backwards compatibility. + /// + /// @param newEventNonce The new gateway contract's address. + function overrideEventNonce(uint256 newEventNonce) external onlySignatureVerifierOwner { + uint256 oldEventNonce = _eventNonce; + require(newEventNonce > oldEventNonce, "Gateway: overriden nonce must be greater than old nonce"); + _eventNonce = newEventNonce; + emit LogEventNonceOverriden(oldEventNonce, newEventNonce); + } + // INTERNAL //////////////////////////////////////////////////////////////// /// @notice Allow the owner to update the asset. diff --git a/test/GatewayRegistry.test.ts b/test/GatewayRegistry.test.ts index c7870ba..9095370 100644 --- a/test/GatewayRegistry.test.ts +++ b/test/GatewayRegistry.test.ts @@ -1,9 +1,10 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ import chai, { expect } from "chai"; import ChaiAsPromised from "chai-as-promised"; import hre from "hardhat"; import log from "loglevel"; -import { Ox0, randomAddress, setupCreate2, setupDeployProxy } from "../deploy/deploymentUtils"; +import { Ox0, randomAddress, setupCreate2 } from "../deploy/deploymentUtils/general"; import { GatewayRegistryV2, GatewayRegistryV2__factory, @@ -13,20 +14,19 @@ import { MintGatewayV3__factory, RenAssetV2, RenAssetV2__factory, - RenProxyAdmin, TestToken, } from "../typechain"; -import { deployToken, getFixture } from "./utils"; +import { deployToken } from "./utils"; chai.use(ChaiAsPromised); const setup = hre.deployments.createFixture(async () => { - const { deployments, ethers, getNamedAccounts, getUnnamedAccounts } = hre; + const { deployments, ethers, getUnnamedAccounts } = hre; log.setLevel("ERROR"); - const create2 = setupCreate2(hre, undefined, log); + const create2 = setupCreate2(hre, undefined, log as any); - const [_, gatewayAdder, gatewayUpdater] = await getUnnamedAccounts(); + const [, gatewayAdder, gatewayUpdater] = await getUnnamedAccounts(); await deployments.fixture("GatewayRegistryV2"); const gatewayRegistryV2 = await ethers.getContractAt( @@ -95,8 +95,7 @@ describe("GatewayRegistry", function () { describe("gateway adder and updater", () => { it("gateway adder", async () => { - const { ethers, getNamedAccounts } = hre; - const { deployer } = await getNamedAccounts(); + const { ethers } = hre; let { create2, gatewayRegistryV2, gatewayAdder } = await setup(); gatewayRegistryV2 = gatewayRegistryV2.connect(await ethers.getSigner(gatewayAdder)); @@ -224,8 +223,7 @@ describe("GatewayRegistry", function () { }); it("gateway adder and updater", async () => { - const { ethers, getNamedAccounts } = hre; - const { deployer } = await getNamedAccounts(); + const { ethers } = hre; let { create2, gatewayRegistryV2, gatewayUpdater } = await setup(); gatewayRegistryV2 = gatewayRegistryV2.connect(await ethers.getSigner(gatewayUpdater)); diff --git a/test/utils/index.ts b/test/utils/index.ts index 3883b89..d8c4a9c 100644 --- a/test/utils/index.ts +++ b/test/utils/index.ts @@ -1,24 +1,18 @@ -import BigNumber from "bignumber.js"; -import { BaseContract } from "ethers"; -import { HardhatRuntimeEnvironment } from "hardhat/types"; -import log from "loglevel"; - -import { BinanceSmartChain, Ethereum, EvmNetworkConfig } from "@renproject/chains-ethereum"; +/* eslint-disable @typescript-eslint/no-explicit-any */ +import { BinanceSmartChain, Ethereum, EVMNetworkConfig } from "@renproject/chains-ethereum"; import { MockChain, MockProvider } from "@renproject/mock-provider"; import { RenVMProvider } from "@renproject/provider"; import RenJS, { Gateway, GatewayTransaction } from "@renproject/ren"; import { utils } from "@renproject/utils"; +import BigNumber from "bignumber.js"; +import { BaseContract } from "ethers"; +import { HardhatRuntimeEnvironment } from "hardhat/types"; +import log from "loglevel"; -import { deployGatewaySol } from "../../deploy/001_deploy_gateways"; -import { - setupCreate2, - setupDeployProxy, - setupGetExistingDeployment, - setupWaitForTx, -} from "../../deploy/deploymentUtils"; +import { deployGatewaySol } from "../../deploy/002_deploy_gateways"; +import { setupCreate2, setupDeployProxy } from "../../deploy/deploymentUtils/general"; import { ERC20PresetMinterPauserUpgradeable__factory, - RenProxyAdmin, RenProxyAdmin__factory, TestToken, TestToken__factory, @@ -30,7 +24,7 @@ export const LocalEthereumNetwork = ( networkID: number, gatewayRegistry: string, basicBridge: string -): EvmNetworkConfig => ({ +): EVMNetworkConfig => ({ selector: selector, nativeAsset: { name: symbol, @@ -40,7 +34,7 @@ export const LocalEthereumNetwork = ( averageConfirmationTime: 1, isTestnet: true, - network: { + config: { chainId: utils.Ox(networkID), chainName: "Hardhat", nativeCurrency: { name: "Hardhat Ether", symbol: symbol, decimals: 18 }, @@ -115,7 +109,11 @@ export const setupNetworks = async (hre: HardhatRuntimeEnvironment) => { const mintAuthority = mockRenVMProvider.mintAuthority(); log.setLevel("ERROR"); - const { gatewayRegistry: ethGatewayRegistry, basicBridge: ethBasicBridge } = await deployGatewaySol( + const { + gatewayRegistry: ethGatewayRegistry, + basicBridge: ethBasicBridge, + // renTimelock: ethRenTimelock, + } = await deployGatewaySol( hre, { mintAuthority, @@ -125,9 +123,13 @@ export const setupNetworks = async (hre: HardhatRuntimeEnvironment) => { mintGateways: [], create2SaltOverride: "eth", }, - log + log as any ); - const { gatewayRegistry: bscGatewayRegistry, basicBridge: bscBasicBridge } = await deployGatewaySol( + const { + gatewayRegistry: bscGatewayRegistry, + basicBridge: bscBasicBridge, + // renTimelock: bscRenTimelock, + } = await deployGatewaySol( hre, { mintAuthority, @@ -137,7 +139,7 @@ export const setupNetworks = async (hre: HardhatRuntimeEnvironment) => { mintGateways: [], create2SaltOverride: "bsc", }, - log + log as any ); await ethGatewayRegistry.deployMintGatewayAndRenAsset("BTC", "renBTC", "renBTC", 8, "1"); @@ -145,11 +147,9 @@ export const setupNetworks = async (hre: HardhatRuntimeEnvironment) => { await bscGatewayRegistry.deployMintGatewayAndRenAsset("ETH", "renETH", "renETH", 18, "1"); - const create2 = setupCreate2(hre, undefined, log); - const getExistingDeployment = setupGetExistingDeployment(hre); - const waitForTx = setupWaitForTx(log); + const create2 = setupCreate2(hre, undefined, log as any); const renProxyAdmin = await create2("RenProxyAdmin", [deployer]); - const deployProxy = setupDeployProxy(hre, create2, renProxyAdmin, log); + const deployProxy = setupDeployProxy(hre, create2, renProxyAdmin, undefined, undefined, log as any); const usdc = await create2("ERC20PresetMinterPauserUpgradeable", []); await usdc.initialize("USDC", "USDC"); @@ -182,6 +182,7 @@ export const setupNetworks = async (hre: HardhatRuntimeEnvironment) => { network: ethereumNetwork, provider: signer.provider as any, signer: (await ethers.getSigner(user)) as any, + defaultTestnet: "kovan", }); mockRenVMProvider.registerChain(ethereum, ["USDC"]); @@ -219,12 +220,12 @@ export const deployToken = async (hre: HardhatRuntimeEnvironment, symbol: string const { deployer } = await getNamedAccounts(); log.setLevel("ERROR"); - const create2 = setupCreate2(hre, String(Math.random()), log); + const create2 = setupCreate2(hre, String(Math.random()), log as any); const decimals = 18; - const supply = new BigNumber(1000000).shiftedBy(18); + const supply = new BigNumber(1000000).shiftedBy(decimals); - return await create2("TestToken", [symbol, symbol, 18, supply.toFixed(), deployer]); + return await create2("TestToken", [symbol, symbol, decimals, supply.toFixed(), deployer]); }; export const getFixture = async (hre: HardhatRuntimeEnvironment, name: string): Promise => { diff --git a/tsconfig.json b/tsconfig.json index adc7d80..e509bac 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,18 +1,12 @@ { - "compilerOptions": { - "target": "es5", - "module": "commonjs", - "strict": true, - "esModuleInterop": true, - "moduleResolution": "node", - "forceConsistentCasingInFileNames": true, - "outDir": "dist" - }, - "include": [ - "hardhat.config.ts", - "./scripts", - "./deploy", - "./test", - "typechain/**/*" - ] + "compilerOptions": { + "target": "es6", + "module": "commonjs", + "strict": true, + "esModuleInterop": true, + "moduleResolution": "node", + "forceConsistentCasingInFileNames": true, + "outDir": "dist" + }, + "include": ["hardhat.config.ts", "./scripts", "./deploy", "./test", "typechain/**/*"] } diff --git a/yarn.lock b/yarn.lock index a928aff..c2e3d13 100644 --- a/yarn.lock +++ b/yarn.lock @@ -149,6 +149,36 @@ "@ethersproject/properties" "^5.6.0" "@ethersproject/strings" "^5.6.0" +"@ethersproject/abi@5.6.4": + version "5.6.4" + resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.6.4.tgz#f6e01b6ed391a505932698ecc0d9e7a99ee60362" + integrity sha512-TTeZUlCeIHG6527/2goZA6gW5F8Emoc7MrZDC7hhP84aRGvW3TEdTnZR08Ls88YXM1m2SuK42Osw/jSi3uO8gg== + dependencies: + "@ethersproject/address" "^5.6.1" + "@ethersproject/bignumber" "^5.6.2" + "@ethersproject/bytes" "^5.6.1" + "@ethersproject/constants" "^5.6.1" + "@ethersproject/hash" "^5.6.1" + "@ethersproject/keccak256" "^5.6.1" + "@ethersproject/logger" "^5.6.0" + "@ethersproject/properties" "^5.6.0" + "@ethersproject/strings" "^5.6.1" + +"@ethersproject/abi@5.7.0", "@ethersproject/abi@^5.6.3", "@ethersproject/abi@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.7.0.tgz#b3f3e045bbbeed1af3947335c247ad625a44e449" + integrity sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA== + dependencies: + "@ethersproject/address" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/constants" "^5.7.0" + "@ethersproject/hash" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + "@ethersproject/abstract-provider@5.6.0", "@ethersproject/abstract-provider@^5.6.0": version "5.6.0" resolved "https://registry.yarnpkg.com/@ethersproject/abstract-provider/-/abstract-provider-5.6.0.tgz#0c4ac7054650dbd9c476cf5907f588bbb6ef3061" @@ -162,6 +192,32 @@ "@ethersproject/transactions" "^5.6.0" "@ethersproject/web" "^5.6.0" +"@ethersproject/abstract-provider@5.6.1": + version "5.6.1" + resolved "https://registry.yarnpkg.com/@ethersproject/abstract-provider/-/abstract-provider-5.6.1.tgz#02ddce150785caf0c77fe036a0ebfcee61878c59" + integrity sha512-BxlIgogYJtp1FS8Muvj8YfdClk3unZH0vRMVX791Z9INBNT/kuACZ9GzaY1Y4yFq+YSy6/w4gzj3HCRKrK9hsQ== + dependencies: + "@ethersproject/bignumber" "^5.6.2" + "@ethersproject/bytes" "^5.6.1" + "@ethersproject/logger" "^5.6.0" + "@ethersproject/networks" "^5.6.3" + "@ethersproject/properties" "^5.6.0" + "@ethersproject/transactions" "^5.6.2" + "@ethersproject/web" "^5.6.1" + +"@ethersproject/abstract-provider@5.7.0", "@ethersproject/abstract-provider@^5.6.1", "@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" + integrity sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw== + dependencies: + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/networks" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/transactions" "^5.7.0" + "@ethersproject/web" "^5.7.0" + "@ethersproject/abstract-signer@5.6.0", "@ethersproject/abstract-signer@^5.4.1", "@ethersproject/abstract-signer@^5.6.0": version "5.6.0" resolved "https://registry.yarnpkg.com/@ethersproject/abstract-signer/-/abstract-signer-5.6.0.tgz#9cd7ae9211c2b123a3b29bf47aab17d4d016e3e7" @@ -173,6 +229,28 @@ "@ethersproject/logger" "^5.6.0" "@ethersproject/properties" "^5.6.0" +"@ethersproject/abstract-signer@5.6.2": + version "5.6.2" + resolved "https://registry.yarnpkg.com/@ethersproject/abstract-signer/-/abstract-signer-5.6.2.tgz#491f07fc2cbd5da258f46ec539664713950b0b33" + integrity sha512-n1r6lttFBG0t2vNiI3HoWaS/KdOt8xyDjzlP2cuevlWLG6EX0OwcKLyG/Kp/cuwNxdy/ous+R/DEMdTUwWQIjQ== + dependencies: + "@ethersproject/abstract-provider" "^5.6.1" + "@ethersproject/bignumber" "^5.6.2" + "@ethersproject/bytes" "^5.6.1" + "@ethersproject/logger" "^5.6.0" + "@ethersproject/properties" "^5.6.0" + +"@ethersproject/abstract-signer@5.7.0", "@ethersproject/abstract-signer@^5.6.2", "@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" + integrity sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ== + dependencies: + "@ethersproject/abstract-provider" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/address@5.6.0", "@ethersproject/address@^5.0.2", "@ethersproject/address@^5.0.4", "@ethersproject/address@^5.4.0", "@ethersproject/address@^5.6.0": version "5.6.0" resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.6.0.tgz#13c49836d73e7885fc148ad633afad729da25012" @@ -184,6 +262,28 @@ "@ethersproject/logger" "^5.6.0" "@ethersproject/rlp" "^5.6.0" +"@ethersproject/address@5.6.1": + version "5.6.1" + resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.6.1.tgz#ab57818d9aefee919c5721d28cd31fd95eff413d" + integrity sha512-uOgF0kS5MJv9ZvCz7x6T2EXJSzotiybApn4XlOgoTX0xdtyVIJ7pF+6cGPxiEq/dpBiTfMiw7Yc81JcwhSYA0Q== + dependencies: + "@ethersproject/bignumber" "^5.6.2" + "@ethersproject/bytes" "^5.6.1" + "@ethersproject/keccak256" "^5.6.1" + "@ethersproject/logger" "^5.6.0" + "@ethersproject/rlp" "^5.6.1" + +"@ethersproject/address@5.7.0", "@ethersproject/address@^5.6.1", "@ethersproject/address@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.7.0.tgz#19b56c4d74a3b0a46bfdbb6cfcc0a153fc697f37" + integrity sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA== + dependencies: + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/rlp" "^5.7.0" + "@ethersproject/base64@5.6.0", "@ethersproject/base64@^5.6.0": version "5.6.0" resolved "https://registry.yarnpkg.com/@ethersproject/base64/-/base64-5.6.0.tgz#a12c4da2a6fb86d88563216b0282308fc15907c9" @@ -191,6 +291,20 @@ dependencies: "@ethersproject/bytes" "^5.6.0" +"@ethersproject/base64@5.6.1": + version "5.6.1" + resolved "https://registry.yarnpkg.com/@ethersproject/base64/-/base64-5.6.1.tgz#2c40d8a0310c9d1606c2c37ae3092634b41d87cb" + integrity sha512-qB76rjop6a0RIYYMiB4Eh/8n+Hxu2NIZm8S/Q7kNo5pmZfXhHGHmS4MinUainiBC54SCyRnwzL+KZjj8zbsSsw== + dependencies: + "@ethersproject/bytes" "^5.6.1" + +"@ethersproject/base64@5.7.0", "@ethersproject/base64@^5.6.1", "@ethersproject/base64@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/base64/-/base64-5.7.0.tgz#ac4ee92aa36c1628173e221d0d01f53692059e1c" + integrity sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/basex@5.6.0", "@ethersproject/basex@^5.6.0": version "5.6.0" resolved "https://registry.yarnpkg.com/@ethersproject/basex/-/basex-5.6.0.tgz#9ea7209bf0a1c3ddc2a90f180c3a7f0d7d2e8a69" @@ -199,6 +313,22 @@ "@ethersproject/bytes" "^5.6.0" "@ethersproject/properties" "^5.6.0" +"@ethersproject/basex@5.6.1": + version "5.6.1" + resolved "https://registry.yarnpkg.com/@ethersproject/basex/-/basex-5.6.1.tgz#badbb2f1d4a6f52ce41c9064f01eab19cc4c5305" + integrity sha512-a52MkVz4vuBXR06nvflPMotld1FJWSj2QT0985v7P/emPZO00PucFAkbcmq2vpVU7Ts7umKiSI6SppiLykVWsA== + dependencies: + "@ethersproject/bytes" "^5.6.1" + "@ethersproject/properties" "^5.6.0" + +"@ethersproject/basex@5.7.0", "@ethersproject/basex@^5.6.1", "@ethersproject/basex@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/basex/-/basex-5.7.0.tgz#97034dc7e8938a8ca943ab20f8a5e492ece4020b" + integrity sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/bignumber@5.6.0", "@ethersproject/bignumber@^5.0.7", "@ethersproject/bignumber@^5.4.1", "@ethersproject/bignumber@^5.6.0": version "5.6.0" resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.6.0.tgz#116c81b075c57fa765a8f3822648cf718a8a0e26" @@ -208,6 +338,24 @@ "@ethersproject/logger" "^5.6.0" bn.js "^4.11.9" +"@ethersproject/bignumber@5.6.2": + version "5.6.2" + resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.6.2.tgz#72a0717d6163fab44c47bcc82e0c550ac0315d66" + integrity sha512-v7+EEUbhGqT3XJ9LMPsKvXYHFc8eHxTowFCG/HgJErmq4XHJ2WR7aeyICg3uTOAQ7Icn0GFHAohXEhxQHq4Ubw== + dependencies: + "@ethersproject/bytes" "^5.6.1" + "@ethersproject/logger" "^5.6.0" + bn.js "^5.2.1" + +"@ethersproject/bignumber@5.7.0", "@ethersproject/bignumber@^5.6.2", "@ethersproject/bignumber@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.7.0.tgz#e2f03837f268ba655ffba03a57853e18a18dc9c2" + integrity sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + bn.js "^5.2.1" + "@ethersproject/bytes@5.6.1", "@ethersproject/bytes@^5.0.4", "@ethersproject/bytes@^5.4.0", "@ethersproject/bytes@^5.6.0": version "5.6.1" resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.6.1.tgz#24f916e411f82a8a60412344bf4a813b917eefe7" @@ -215,6 +363,13 @@ dependencies: "@ethersproject/logger" "^5.6.0" +"@ethersproject/bytes@5.7.0", "@ethersproject/bytes@^5.6.1", "@ethersproject/bytes@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.7.0.tgz#a00f6ea8d7e7534d6d87f47188af1148d71f155d" + integrity sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A== + dependencies: + "@ethersproject/logger" "^5.7.0" + "@ethersproject/constants@5.6.0", "@ethersproject/constants@^5.0.4", "@ethersproject/constants@^5.4.0", "@ethersproject/constants@^5.6.0": version "5.6.0" resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.6.0.tgz#55e3eb0918584d3acc0688e9958b0cedef297088" @@ -222,6 +377,20 @@ dependencies: "@ethersproject/bignumber" "^5.6.0" +"@ethersproject/constants@5.6.1": + version "5.6.1" + resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.6.1.tgz#e2e974cac160dd101cf79fdf879d7d18e8cb1370" + integrity sha512-QSq9WVnZbxXYFftrjSjZDUshp6/eKp6qrtdBtUCm0QxCV5z1fG/w3kdlcsjMCQuQHUnAclKoK7XpXMezhRDOLg== + dependencies: + "@ethersproject/bignumber" "^5.6.2" + +"@ethersproject/constants@5.7.0", "@ethersproject/constants@^5.6.1", "@ethersproject/constants@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.7.0.tgz#df80a9705a7e08984161f09014ea012d1c75295e" + integrity sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA== + dependencies: + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/contracts@5.6.0", "@ethersproject/contracts@^5.4.1": version "5.6.0" resolved "https://registry.yarnpkg.com/@ethersproject/contracts/-/contracts-5.6.0.tgz#60f2cfc7addd99a865c6c8cfbbcec76297386067" @@ -238,15 +407,47 @@ "@ethersproject/properties" "^5.6.0" "@ethersproject/transactions" "^5.6.0" -"@ethersproject/hardware-wallets@^5.5.0": - version "5.6.0" - resolved "https://registry.yarnpkg.com/@ethersproject/hardware-wallets/-/hardware-wallets-5.6.0.tgz#10176a4e8dfc2c5d691410547ebb9dec53ce9f3a" - integrity sha512-jq/9osE7mfH6Ur4/N2/EdrgRuXacXlCzp5Irvyy8sWM3xMuzg2Git8czEFdFFTfLO6IBVxfEi1ANb+76tsa8BA== +"@ethersproject/contracts@5.6.2": + version "5.6.2" + resolved "https://registry.yarnpkg.com/@ethersproject/contracts/-/contracts-5.6.2.tgz#20b52e69ebc1b74274ff8e3d4e508de971c287bc" + integrity sha512-hguUA57BIKi6WY0kHvZp6PwPlWF87MCeB4B7Z7AbUpTxfFXFdn/3b0GmjZPagIHS+3yhcBJDnuEfU4Xz+Ks/8g== + dependencies: + "@ethersproject/abi" "^5.6.3" + "@ethersproject/abstract-provider" "^5.6.1" + "@ethersproject/abstract-signer" "^5.6.2" + "@ethersproject/address" "^5.6.1" + "@ethersproject/bignumber" "^5.6.2" + "@ethersproject/bytes" "^5.6.1" + "@ethersproject/constants" "^5.6.1" + "@ethersproject/logger" "^5.6.0" + "@ethersproject/properties" "^5.6.0" + "@ethersproject/transactions" "^5.6.2" + +"@ethersproject/contracts@5.7.0", "@ethersproject/contracts@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/contracts/-/contracts-5.7.0.tgz#c305e775abd07e48aa590e1a877ed5c316f8bd1e" + integrity sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg== + dependencies: + "@ethersproject/abi" "^5.7.0" + "@ethersproject/abstract-provider" "^5.7.0" + "@ethersproject/abstract-signer" "^5.7.0" + "@ethersproject/address" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/constants" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/transactions" "^5.7.0" + +"@ethersproject/hardware-wallets@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/hardware-wallets/-/hardware-wallets-5.7.0.tgz#1c902fc255e2f108af44d4c1dc46ec2c34cb669c" + integrity sha512-DjMMXIisRc8xFvEoLoYz1w7JDOYmaz/a0X9sp7Zu668RR8U1zCAyj5ow25HLRW+TCzEC5XiFetTXqS5kXonFCQ== dependencies: "@ledgerhq/hw-app-eth" "5.27.2" "@ledgerhq/hw-transport" "5.26.0" "@ledgerhq/hw-transport-u2f" "5.26.0" - ethers "^5.6.0" + ethers "^5.7.0" optionalDependencies: "@ledgerhq/hw-transport-node-hid" "5.26.0" @@ -264,6 +465,35 @@ "@ethersproject/properties" "^5.6.0" "@ethersproject/strings" "^5.6.0" +"@ethersproject/hash@5.6.1": + version "5.6.1" + resolved "https://registry.yarnpkg.com/@ethersproject/hash/-/hash-5.6.1.tgz#224572ea4de257f05b4abf8ae58b03a67e99b0f4" + integrity sha512-L1xAHurbaxG8VVul4ankNX5HgQ8PNCTrnVXEiFnE9xoRnaUcgfD12tZINtDinSllxPLCtGwguQxJ5E6keE84pA== + dependencies: + "@ethersproject/abstract-signer" "^5.6.2" + "@ethersproject/address" "^5.6.1" + "@ethersproject/bignumber" "^5.6.2" + "@ethersproject/bytes" "^5.6.1" + "@ethersproject/keccak256" "^5.6.1" + "@ethersproject/logger" "^5.6.0" + "@ethersproject/properties" "^5.6.0" + "@ethersproject/strings" "^5.6.1" + +"@ethersproject/hash@5.7.0", "@ethersproject/hash@^5.6.1", "@ethersproject/hash@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/hash/-/hash-5.7.0.tgz#eb7aca84a588508369562e16e514b539ba5240a7" + integrity sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g== + dependencies: + "@ethersproject/abstract-signer" "^5.7.0" + "@ethersproject/address" "^5.7.0" + "@ethersproject/base64" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + "@ethersproject/hdnode@5.6.0", "@ethersproject/hdnode@^5.6.0": version "5.6.0" resolved "https://registry.yarnpkg.com/@ethersproject/hdnode/-/hdnode-5.6.0.tgz#9dcbe8d629bbbcf144f2cae476337fe92d320998" @@ -282,6 +512,42 @@ "@ethersproject/transactions" "^5.6.0" "@ethersproject/wordlists" "^5.6.0" +"@ethersproject/hdnode@5.6.2": + version "5.6.2" + resolved "https://registry.yarnpkg.com/@ethersproject/hdnode/-/hdnode-5.6.2.tgz#26f3c83a3e8f1b7985c15d1db50dc2903418b2d2" + integrity sha512-tERxW8Ccf9CxW2db3WsN01Qao3wFeRsfYY9TCuhmG0xNpl2IO8wgXU3HtWIZ49gUWPggRy4Yg5axU0ACaEKf1Q== + dependencies: + "@ethersproject/abstract-signer" "^5.6.2" + "@ethersproject/basex" "^5.6.1" + "@ethersproject/bignumber" "^5.6.2" + "@ethersproject/bytes" "^5.6.1" + "@ethersproject/logger" "^5.6.0" + "@ethersproject/pbkdf2" "^5.6.1" + "@ethersproject/properties" "^5.6.0" + "@ethersproject/sha2" "^5.6.1" + "@ethersproject/signing-key" "^5.6.2" + "@ethersproject/strings" "^5.6.1" + "@ethersproject/transactions" "^5.6.2" + "@ethersproject/wordlists" "^5.6.1" + +"@ethersproject/hdnode@5.7.0", "@ethersproject/hdnode@^5.6.2", "@ethersproject/hdnode@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/hdnode/-/hdnode-5.7.0.tgz#e627ddc6b466bc77aebf1a6b9e47405ca5aef9cf" + integrity sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg== + dependencies: + "@ethersproject/abstract-signer" "^5.7.0" + "@ethersproject/basex" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/pbkdf2" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/sha2" "^5.7.0" + "@ethersproject/signing-key" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + "@ethersproject/transactions" "^5.7.0" + "@ethersproject/wordlists" "^5.7.0" + "@ethersproject/json-wallets@5.6.0", "@ethersproject/json-wallets@^5.6.0": version "5.6.0" resolved "https://registry.yarnpkg.com/@ethersproject/json-wallets/-/json-wallets-5.6.0.tgz#4c2fc27f17e36c583e7a252fb938bc46f98891e5" @@ -301,6 +567,44 @@ aes-js "3.0.0" scrypt-js "3.0.1" +"@ethersproject/json-wallets@5.6.1": + version "5.6.1" + resolved "https://registry.yarnpkg.com/@ethersproject/json-wallets/-/json-wallets-5.6.1.tgz#3f06ba555c9c0d7da46756a12ac53483fe18dd91" + integrity sha512-KfyJ6Zwz3kGeX25nLihPwZYlDqamO6pfGKNnVMWWfEVVp42lTfCZVXXy5Ie8IZTN0HKwAngpIPi7gk4IJzgmqQ== + dependencies: + "@ethersproject/abstract-signer" "^5.6.2" + "@ethersproject/address" "^5.6.1" + "@ethersproject/bytes" "^5.6.1" + "@ethersproject/hdnode" "^5.6.2" + "@ethersproject/keccak256" "^5.6.1" + "@ethersproject/logger" "^5.6.0" + "@ethersproject/pbkdf2" "^5.6.1" + "@ethersproject/properties" "^5.6.0" + "@ethersproject/random" "^5.6.1" + "@ethersproject/strings" "^5.6.1" + "@ethersproject/transactions" "^5.6.2" + aes-js "3.0.0" + scrypt-js "3.0.1" + +"@ethersproject/json-wallets@5.7.0", "@ethersproject/json-wallets@^5.6.1", "@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" + integrity sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g== + dependencies: + "@ethersproject/abstract-signer" "^5.7.0" + "@ethersproject/address" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/hdnode" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/pbkdf2" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/random" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + "@ethersproject/transactions" "^5.7.0" + aes-js "3.0.0" + scrypt-js "3.0.1" + "@ethersproject/keccak256@5.6.0", "@ethersproject/keccak256@^5.0.3", "@ethersproject/keccak256@^5.6.0": version "5.6.0" resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.6.0.tgz#fea4bb47dbf8f131c2e1774a1cecbfeb9d606459" @@ -309,11 +613,32 @@ "@ethersproject/bytes" "^5.6.0" js-sha3 "0.8.0" +"@ethersproject/keccak256@5.6.1": + version "5.6.1" + resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.6.1.tgz#b867167c9b50ba1b1a92bccdd4f2d6bd168a91cc" + integrity sha512-bB7DQHCTRDooZZdL3lk9wpL0+XuG3XLGHLh3cePnybsO3V0rdCAOQGpn/0R3aODmnTOOkCATJiD2hnL+5bwthA== + dependencies: + "@ethersproject/bytes" "^5.6.1" + js-sha3 "0.8.0" + +"@ethersproject/keccak256@5.7.0", "@ethersproject/keccak256@^5.6.1", "@ethersproject/keccak256@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.7.0.tgz#3186350c6e1cd6aba7940384ec7d6d9db01f335a" + integrity sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg== + dependencies: + "@ethersproject/bytes" "^5.7.0" + js-sha3 "0.8.0" + "@ethersproject/logger@5.6.0", "@ethersproject/logger@^5.0.5", "@ethersproject/logger@^5.6.0": version "5.6.0" resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.6.0.tgz#d7db1bfcc22fd2e4ab574cba0bb6ad779a9a3e7a" integrity sha512-BiBWllUROH9w+P21RzoxJKzqoqpkyM1pRnEKG69bulE9TSQD8SAIvTQqIMZmmCO8pUNkgLP1wndX1gKghSpBmg== +"@ethersproject/logger@5.7.0", "@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/networks@5.6.2", "@ethersproject/networks@^5.6.0": version "5.6.2" resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.6.2.tgz#2bacda62102c0b1fcee408315f2bed4f6fbdf336" @@ -321,6 +646,20 @@ dependencies: "@ethersproject/logger" "^5.6.0" +"@ethersproject/networks@5.6.4": + version "5.6.4" + resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.6.4.tgz#51296d8fec59e9627554f5a8a9c7791248c8dc07" + integrity sha512-KShHeHPahHI2UlWdtDMn2lJETcbtaJge4k7XSjDR9h79QTd6yQJmv6Cp2ZA4JdqWnhszAOLSuJEd9C0PRw7hSQ== + dependencies: + "@ethersproject/logger" "^5.6.0" + +"@ethersproject/networks@5.7.1", "@ethersproject/networks@^5.6.3", "@ethersproject/networks@^5.7.0": + version "5.7.1" + resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.7.1.tgz#118e1a981d757d45ccea6bb58d9fd3d9db14ead6" + integrity sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ== + dependencies: + "@ethersproject/logger" "^5.7.0" + "@ethersproject/pbkdf2@5.6.0", "@ethersproject/pbkdf2@^5.6.0": version "5.6.0" resolved "https://registry.yarnpkg.com/@ethersproject/pbkdf2/-/pbkdf2-5.6.0.tgz#04fcc2d7c6bff88393f5b4237d906a192426685a" @@ -329,6 +668,22 @@ "@ethersproject/bytes" "^5.6.0" "@ethersproject/sha2" "^5.6.0" +"@ethersproject/pbkdf2@5.6.1": + version "5.6.1" + resolved "https://registry.yarnpkg.com/@ethersproject/pbkdf2/-/pbkdf2-5.6.1.tgz#f462fe320b22c0d6b1d72a9920a3963b09eb82d1" + integrity sha512-k4gRQ+D93zDRPNUfmduNKq065uadC2YjMP/CqwwX5qG6R05f47boq6pLZtV/RnC4NZAYOPH1Cyo54q0c9sshRQ== + dependencies: + "@ethersproject/bytes" "^5.6.1" + "@ethersproject/sha2" "^5.6.1" + +"@ethersproject/pbkdf2@5.7.0", "@ethersproject/pbkdf2@^5.6.1", "@ethersproject/pbkdf2@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/pbkdf2/-/pbkdf2-5.7.0.tgz#d2267d0a1f6e123f3771007338c47cccd83d3102" + integrity sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/sha2" "^5.7.0" + "@ethersproject/properties@5.6.0", "@ethersproject/properties@^5.0.3", "@ethersproject/properties@^5.6.0": version "5.6.0" resolved "https://registry.yarnpkg.com/@ethersproject/properties/-/properties-5.6.0.tgz#38904651713bc6bdd5bdd1b0a4287ecda920fa04" @@ -336,7 +691,14 @@ dependencies: "@ethersproject/logger" "^5.6.0" -"@ethersproject/providers@5.6.4", "@ethersproject/providers@^5.4.4", "@ethersproject/providers@^5.5.0", "@ethersproject/providers@^5.6.1": +"@ethersproject/properties@5.7.0", "@ethersproject/properties@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/properties/-/properties-5.7.0.tgz#a6e12cb0439b878aaf470f1902a176033067ed30" + integrity sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw== + dependencies: + "@ethersproject/logger" "^5.7.0" + +"@ethersproject/providers@5.6.4", "@ethersproject/providers@^5.4.4": version "5.6.4" resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.6.4.tgz#1a49c211b57b0b2703c320819abbbfa35c83dff7" integrity sha512-WAdknnaZ52hpHV3qPiJmKx401BLpup47h36Axxgre9zT+doa/4GC/Ne48ICPxTm0BqndpToHjpLP1ZnaxyE+vw== @@ -361,6 +723,58 @@ bech32 "1.1.4" ws "7.4.6" +"@ethersproject/providers@5.6.8": + version "5.6.8" + resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.6.8.tgz#22e6c57be215ba5545d3a46cf759d265bb4e879d" + integrity sha512-Wf+CseT/iOJjrGtAOf3ck9zS7AgPmr2fZ3N97r4+YXN3mBePTG2/bJ8DApl9mVwYL+RpYbNxMEkEp4mPGdwG/w== + dependencies: + "@ethersproject/abstract-provider" "^5.6.1" + "@ethersproject/abstract-signer" "^5.6.2" + "@ethersproject/address" "^5.6.1" + "@ethersproject/base64" "^5.6.1" + "@ethersproject/basex" "^5.6.1" + "@ethersproject/bignumber" "^5.6.2" + "@ethersproject/bytes" "^5.6.1" + "@ethersproject/constants" "^5.6.1" + "@ethersproject/hash" "^5.6.1" + "@ethersproject/logger" "^5.6.0" + "@ethersproject/networks" "^5.6.3" + "@ethersproject/properties" "^5.6.0" + "@ethersproject/random" "^5.6.1" + "@ethersproject/rlp" "^5.6.1" + "@ethersproject/sha2" "^5.6.1" + "@ethersproject/strings" "^5.6.1" + "@ethersproject/transactions" "^5.6.2" + "@ethersproject/web" "^5.6.1" + bech32 "1.1.4" + ws "7.4.6" + +"@ethersproject/providers@5.7.1", "@ethersproject/providers@^5.7.1": + version "5.7.1" + resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.7.1.tgz#b0799b616d5579cd1067a8ebf1fc1ec74c1e122c" + integrity sha512-vZveG/DLyo+wk4Ga1yx6jSEHrLPgmTt+dFv0dv8URpVCRf0jVhalps1jq/emN/oXnMRsC7cQgAF32DcXLL7BPQ== + dependencies: + "@ethersproject/abstract-provider" "^5.7.0" + "@ethersproject/abstract-signer" "^5.7.0" + "@ethersproject/address" "^5.7.0" + "@ethersproject/base64" "^5.7.0" + "@ethersproject/basex" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/constants" "^5.7.0" + "@ethersproject/hash" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/networks" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/random" "^5.7.0" + "@ethersproject/rlp" "^5.7.0" + "@ethersproject/sha2" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + "@ethersproject/transactions" "^5.7.0" + "@ethersproject/web" "^5.7.0" + bech32 "1.1.4" + ws "7.4.6" + "@ethersproject/random@5.6.0", "@ethersproject/random@^5.6.0": version "5.6.0" resolved "https://registry.yarnpkg.com/@ethersproject/random/-/random-5.6.0.tgz#1505d1ab6a250e0ee92f436850fa3314b2cb5ae6" @@ -369,6 +783,22 @@ "@ethersproject/bytes" "^5.6.0" "@ethersproject/logger" "^5.6.0" +"@ethersproject/random@5.6.1": + version "5.6.1" + resolved "https://registry.yarnpkg.com/@ethersproject/random/-/random-5.6.1.tgz#66915943981bcd3e11bbd43733f5c3ba5a790255" + integrity sha512-/wtPNHwbmng+5yi3fkipA8YBT59DdkGRoC2vWk09Dci/q5DlgnMkhIycjHlavrvrjJBkFjO/ueLyT+aUDfc4lA== + dependencies: + "@ethersproject/bytes" "^5.6.1" + "@ethersproject/logger" "^5.6.0" + +"@ethersproject/random@5.7.0", "@ethersproject/random@^5.6.1", "@ethersproject/random@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/random/-/random-5.7.0.tgz#af19dcbc2484aae078bb03656ec05df66253280c" + integrity sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/rlp@5.6.0", "@ethersproject/rlp@^5.6.0": version "5.6.0" resolved "https://registry.yarnpkg.com/@ethersproject/rlp/-/rlp-5.6.0.tgz#55a7be01c6f5e64d6e6e7edb6061aa120962a717" @@ -377,6 +807,22 @@ "@ethersproject/bytes" "^5.6.0" "@ethersproject/logger" "^5.6.0" +"@ethersproject/rlp@5.6.1": + version "5.6.1" + resolved "https://registry.yarnpkg.com/@ethersproject/rlp/-/rlp-5.6.1.tgz#df8311e6f9f24dcb03d59a2bac457a28a4fe2bd8" + integrity sha512-uYjmcZx+DKlFUk7a5/W9aQVaoEC7+1MOBgNtvNg13+RnuUwT4F0zTovC0tmay5SmRslb29V1B7Y5KCri46WhuQ== + dependencies: + "@ethersproject/bytes" "^5.6.1" + "@ethersproject/logger" "^5.6.0" + +"@ethersproject/rlp@5.7.0", "@ethersproject/rlp@^5.6.1", "@ethersproject/rlp@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/rlp/-/rlp-5.7.0.tgz#de39e4d5918b9d74d46de93af80b7685a9c21304" + integrity sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/sha2@5.6.0", "@ethersproject/sha2@^5.6.0": version "5.6.0" resolved "https://registry.yarnpkg.com/@ethersproject/sha2/-/sha2-5.6.0.tgz#364c4c11cc753bda36f31f001628706ebadb64d9" @@ -386,6 +832,24 @@ "@ethersproject/logger" "^5.6.0" hash.js "1.1.7" +"@ethersproject/sha2@5.6.1": + version "5.6.1" + resolved "https://registry.yarnpkg.com/@ethersproject/sha2/-/sha2-5.6.1.tgz#211f14d3f5da5301c8972a8827770b6fd3e51656" + integrity sha512-5K2GyqcW7G4Yo3uenHegbXRPDgARpWUiXc6RiF7b6i/HXUoWlb7uCARh7BAHg7/qT/Q5ydofNwiZcim9qpjB6g== + dependencies: + "@ethersproject/bytes" "^5.6.1" + "@ethersproject/logger" "^5.6.0" + hash.js "1.1.7" + +"@ethersproject/sha2@5.7.0", "@ethersproject/sha2@^5.6.1", "@ethersproject/sha2@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/sha2/-/sha2-5.7.0.tgz#9a5f7a7824ef784f7f7680984e593a800480c9fb" + integrity sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + hash.js "1.1.7" + "@ethersproject/signing-key@5.6.0", "@ethersproject/signing-key@^5.6.0": version "5.6.0" resolved "https://registry.yarnpkg.com/@ethersproject/signing-key/-/signing-key-5.6.0.tgz#4f02e3fb09e22b71e2e1d6dc4bcb5dafa69ce042" @@ -398,6 +862,30 @@ elliptic "6.5.4" hash.js "1.1.7" +"@ethersproject/signing-key@5.6.2": + version "5.6.2" + resolved "https://registry.yarnpkg.com/@ethersproject/signing-key/-/signing-key-5.6.2.tgz#8a51b111e4d62e5a62aee1da1e088d12de0614a3" + integrity sha512-jVbu0RuP7EFpw82vHcL+GP35+KaNruVAZM90GxgQnGqB6crhBqW/ozBfFvdeImtmb4qPko0uxXjn8l9jpn0cwQ== + dependencies: + "@ethersproject/bytes" "^5.6.1" + "@ethersproject/logger" "^5.6.0" + "@ethersproject/properties" "^5.6.0" + bn.js "^5.2.1" + elliptic "6.5.4" + hash.js "1.1.7" + +"@ethersproject/signing-key@5.7.0", "@ethersproject/signing-key@^5.6.2", "@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" + integrity sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + bn.js "^5.2.1" + elliptic "6.5.4" + hash.js "1.1.7" + "@ethersproject/solidity@5.6.0", "@ethersproject/solidity@^5.4.0": version "5.6.0" resolved "https://registry.yarnpkg.com/@ethersproject/solidity/-/solidity-5.6.0.tgz#64657362a596bf7f5630bdc921c07dd78df06dc3" @@ -410,6 +898,30 @@ "@ethersproject/sha2" "^5.6.0" "@ethersproject/strings" "^5.6.0" +"@ethersproject/solidity@5.6.1": + version "5.6.1" + resolved "https://registry.yarnpkg.com/@ethersproject/solidity/-/solidity-5.6.1.tgz#5845e71182c66d32e6ec5eefd041fca091a473e2" + integrity sha512-KWqVLkUUoLBfL1iwdzUVlkNqAUIFMpbbeH0rgCfKmJp0vFtY4AsaN91gHKo9ZZLkC4UOm3cI3BmMV4N53BOq4g== + dependencies: + "@ethersproject/bignumber" "^5.6.2" + "@ethersproject/bytes" "^5.6.1" + "@ethersproject/keccak256" "^5.6.1" + "@ethersproject/logger" "^5.6.0" + "@ethersproject/sha2" "^5.6.1" + "@ethersproject/strings" "^5.6.1" + +"@ethersproject/solidity@5.7.0", "@ethersproject/solidity@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/solidity/-/solidity-5.7.0.tgz#5e9c911d8a2acce2a5ebb48a5e2e0af20b631cb8" + integrity sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA== + dependencies: + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/sha2" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + "@ethersproject/strings@5.6.0", "@ethersproject/strings@^5.0.4", "@ethersproject/strings@^5.6.0": version "5.6.0" resolved "https://registry.yarnpkg.com/@ethersproject/strings/-/strings-5.6.0.tgz#9891b26709153d996bf1303d39a7f4bc047878fd" @@ -419,6 +931,24 @@ "@ethersproject/constants" "^5.6.0" "@ethersproject/logger" "^5.6.0" +"@ethersproject/strings@5.6.1": + version "5.6.1" + resolved "https://registry.yarnpkg.com/@ethersproject/strings/-/strings-5.6.1.tgz#dbc1b7f901db822b5cafd4ebf01ca93c373f8952" + integrity sha512-2X1Lgk6Jyfg26MUnsHiT456U9ijxKUybz8IM1Vih+NJxYtXhmvKBcHOmvGqpFSVJ0nQ4ZCoIViR8XlRw1v/+Cw== + dependencies: + "@ethersproject/bytes" "^5.6.1" + "@ethersproject/constants" "^5.6.1" + "@ethersproject/logger" "^5.6.0" + +"@ethersproject/strings@5.7.0", "@ethersproject/strings@^5.6.1", "@ethersproject/strings@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/strings/-/strings-5.7.0.tgz#54c9d2a7c57ae8f1205c88a9d3a56471e14d5ed2" + integrity sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/constants" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/transactions@5.6.0", "@ethersproject/transactions@^5.0.0-beta.135", "@ethersproject/transactions@^5.4.0", "@ethersproject/transactions@^5.6.0": version "5.6.0" resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.6.0.tgz#4b594d73a868ef6e1529a2f8f94a785e6791ae4e" @@ -434,6 +964,36 @@ "@ethersproject/rlp" "^5.6.0" "@ethersproject/signing-key" "^5.6.0" +"@ethersproject/transactions@5.6.2": + version "5.6.2" + resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.6.2.tgz#793a774c01ced9fe7073985bb95a4b4e57a6370b" + integrity sha512-BuV63IRPHmJvthNkkt9G70Ullx6AcM+SDc+a8Aw/8Yew6YwT51TcBKEp1P4oOQ/bP25I18JJr7rcFRgFtU9B2Q== + dependencies: + "@ethersproject/address" "^5.6.1" + "@ethersproject/bignumber" "^5.6.2" + "@ethersproject/bytes" "^5.6.1" + "@ethersproject/constants" "^5.6.1" + "@ethersproject/keccak256" "^5.6.1" + "@ethersproject/logger" "^5.6.0" + "@ethersproject/properties" "^5.6.0" + "@ethersproject/rlp" "^5.6.1" + "@ethersproject/signing-key" "^5.6.2" + +"@ethersproject/transactions@5.7.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" + integrity sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ== + dependencies: + "@ethersproject/address" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/constants" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/rlp" "^5.7.0" + "@ethersproject/signing-key" "^5.7.0" + "@ethersproject/units@5.6.0": version "5.6.0" resolved "https://registry.yarnpkg.com/@ethersproject/units/-/units-5.6.0.tgz#e5cbb1906988f5740254a21b9ded6bd51e826d9c" @@ -443,6 +1003,24 @@ "@ethersproject/constants" "^5.6.0" "@ethersproject/logger" "^5.6.0" +"@ethersproject/units@5.6.1": + version "5.6.1" + resolved "https://registry.yarnpkg.com/@ethersproject/units/-/units-5.6.1.tgz#ecc590d16d37c8f9ef4e89e2005bda7ddc6a4e6f" + integrity sha512-rEfSEvMQ7obcx3KWD5EWWx77gqv54K6BKiZzKxkQJqtpriVsICrktIQmKl8ReNToPeIYPnFHpXvKpi068YFZXw== + dependencies: + "@ethersproject/bignumber" "^5.6.2" + "@ethersproject/constants" "^5.6.1" + "@ethersproject/logger" "^5.6.0" + +"@ethersproject/units@5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/units/-/units-5.7.0.tgz#637b563d7e14f42deeee39245275d477aae1d8b1" + integrity sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg== + dependencies: + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/constants" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/wallet@5.6.0", "@ethersproject/wallet@^5.4.0": version "5.6.0" resolved "https://registry.yarnpkg.com/@ethersproject/wallet/-/wallet-5.6.0.tgz#33d11a806d783864208f348709a5a3badac8e22a" @@ -464,6 +1042,48 @@ "@ethersproject/transactions" "^5.6.0" "@ethersproject/wordlists" "^5.6.0" +"@ethersproject/wallet@5.6.2": + version "5.6.2" + resolved "https://registry.yarnpkg.com/@ethersproject/wallet/-/wallet-5.6.2.tgz#cd61429d1e934681e413f4bc847a5f2f87e3a03c" + integrity sha512-lrgh0FDQPuOnHcF80Q3gHYsSUODp6aJLAdDmDV0xKCN/T7D99ta1jGVhulg3PY8wiXEngD0DfM0I2XKXlrqJfg== + dependencies: + "@ethersproject/abstract-provider" "^5.6.1" + "@ethersproject/abstract-signer" "^5.6.2" + "@ethersproject/address" "^5.6.1" + "@ethersproject/bignumber" "^5.6.2" + "@ethersproject/bytes" "^5.6.1" + "@ethersproject/hash" "^5.6.1" + "@ethersproject/hdnode" "^5.6.2" + "@ethersproject/json-wallets" "^5.6.1" + "@ethersproject/keccak256" "^5.6.1" + "@ethersproject/logger" "^5.6.0" + "@ethersproject/properties" "^5.6.0" + "@ethersproject/random" "^5.6.1" + "@ethersproject/signing-key" "^5.6.2" + "@ethersproject/transactions" "^5.6.2" + "@ethersproject/wordlists" "^5.6.1" + +"@ethersproject/wallet@5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/wallet/-/wallet-5.7.0.tgz#4e5d0790d96fe21d61d38fb40324e6c7ef350b2d" + integrity sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA== + dependencies: + "@ethersproject/abstract-provider" "^5.7.0" + "@ethersproject/abstract-signer" "^5.7.0" + "@ethersproject/address" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/hash" "^5.7.0" + "@ethersproject/hdnode" "^5.7.0" + "@ethersproject/json-wallets" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/random" "^5.7.0" + "@ethersproject/signing-key" "^5.7.0" + "@ethersproject/transactions" "^5.7.0" + "@ethersproject/wordlists" "^5.7.0" + "@ethersproject/web@5.6.0", "@ethersproject/web@^5.6.0": version "5.6.0" resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.6.0.tgz#4bf8b3cbc17055027e1a5dd3c357e37474eaaeb8" @@ -475,6 +1095,28 @@ "@ethersproject/properties" "^5.6.0" "@ethersproject/strings" "^5.6.0" +"@ethersproject/web@5.6.1": + version "5.6.1" + resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.6.1.tgz#6e2bd3ebadd033e6fe57d072db2b69ad2c9bdf5d" + integrity sha512-/vSyzaQlNXkO1WV+RneYKqCJwualcUdx/Z3gseVovZP0wIlOFcCE1hkRhKBH8ImKbGQbMl9EAAyJFrJu7V0aqA== + dependencies: + "@ethersproject/base64" "^5.6.1" + "@ethersproject/bytes" "^5.6.1" + "@ethersproject/logger" "^5.6.0" + "@ethersproject/properties" "^5.6.0" + "@ethersproject/strings" "^5.6.1" + +"@ethersproject/web@5.7.1", "@ethersproject/web@^5.6.1", "@ethersproject/web@^5.7.0": + version "5.7.1" + resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.7.1.tgz#de1f285b373149bee5928f4eb7bcb87ee5fbb4ae" + integrity sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w== + dependencies: + "@ethersproject/base64" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + "@ethersproject/wordlists@5.6.0", "@ethersproject/wordlists@^5.6.0": version "5.6.0" resolved "https://registry.yarnpkg.com/@ethersproject/wordlists/-/wordlists-5.6.0.tgz#79e62c5276e091d8575f6930ba01a29218ded032" @@ -486,6 +1128,85 @@ "@ethersproject/properties" "^5.6.0" "@ethersproject/strings" "^5.6.0" +"@ethersproject/wordlists@5.6.1": + version "5.6.1" + resolved "https://registry.yarnpkg.com/@ethersproject/wordlists/-/wordlists-5.6.1.tgz#1e78e2740a8a21e9e99947e47979d72e130aeda1" + integrity sha512-wiPRgBpNbNwCQFoCr8bcWO8o5I810cqO6mkdtKfLKFlLxeCWcnzDi4Alu8iyNzlhYuS9npCwivMbRWF19dyblw== + dependencies: + "@ethersproject/bytes" "^5.6.1" + "@ethersproject/hash" "^5.6.1" + "@ethersproject/logger" "^5.6.0" + "@ethersproject/properties" "^5.6.0" + "@ethersproject/strings" "^5.6.1" + +"@ethersproject/wordlists@5.7.0", "@ethersproject/wordlists@^5.6.1", "@ethersproject/wordlists@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/wordlists/-/wordlists-5.7.0.tgz#8fb2c07185d68c3e09eb3bfd6e779ba2774627f5" + integrity sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/hash" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + +"@gnosis.pm/safe-core-sdk-types@^1.6.1": + version "1.6.1" + resolved "https://registry.yarnpkg.com/@gnosis.pm/safe-core-sdk-types/-/safe-core-sdk-types-1.6.1.tgz#dcd0c19d61fb5266b6e40bac1cd91fde44eda1d7" + integrity sha512-KRflubR/W2qVeRxavh2ALtXI6CyCCcyuL1olJAVn/xkZVYJJjvXn+5GxbRloJFIJrgFCNWYbHrO0sXtywP5Y1g== + dependencies: + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/contracts" "^5.7.0" + "@gnosis.pm/safe-deployments" "1.16.0" + web3-core "^1.8.0" + web3-utils "^1.8.0" + +"@gnosis.pm/safe-core-sdk-utils@^1.4.1": + version "1.4.1" + resolved "https://registry.yarnpkg.com/@gnosis.pm/safe-core-sdk-utils/-/safe-core-sdk-utils-1.4.1.tgz#c1c6d7fe78682a0090c47a24b1306c46a69d2e0d" + integrity sha512-VrebOIw5ULOgTuV1hK4V0Wp1cg50Sw9urUYyBFnkI6kzL13f3ngGa5IUZ6O+HOOSNrO2mB+EEr09gWp5IN7ECA== + dependencies: + "@gnosis.pm/safe-core-sdk-types" "^1.6.1" + semver "^7.3.7" + web3-utils "^1.8.0" + +"@gnosis.pm/safe-core-sdk@^3.1.1": + version "3.1.1" + resolved "https://registry.yarnpkg.com/@gnosis.pm/safe-core-sdk/-/safe-core-sdk-3.1.1.tgz#d609e51fce387b8f12148965a3a053bd50b05b3d" + integrity sha512-RhU7ENNHvqD8SDGwUDSp8PirNzR48N7IlfAmFWSdhVqpqnCUW2Pzaxcn+e/E+rLx3GhZRvM2T6Cl98+JjWQwog== + dependencies: + "@ethersproject/solidity" "^5.7.0" + "@gnosis.pm/safe-core-sdk-types" "^1.6.1" + "@gnosis.pm/safe-deployments" "1.16.0" + ethereumjs-util "^7.1.5" + semver "^7.3.7" + web3-utils "^1.8.0" + +"@gnosis.pm/safe-deployments@1.16.0": + version "1.16.0" + resolved "https://registry.yarnpkg.com/@gnosis.pm/safe-deployments/-/safe-deployments-1.16.0.tgz#78b1fb400934ff117f7d9c8e66398503bd772eeb" + integrity sha512-5Wakso6SiulstuZfz3gH6yME8Q50BT5dVxIfgWz4vzOmyyqmAVstMd0VIwyw6IDee0gU4mHKZjhD3UXPKEvRCw== + dependencies: + semver "^7.3.7" + +"@gnosis.pm/safe-ethers-lib@^1.6.1": + version "1.6.1" + resolved "https://registry.yarnpkg.com/@gnosis.pm/safe-ethers-lib/-/safe-ethers-lib-1.6.1.tgz#2fe88464faa348d4dbe58e93199c419976a5da88" + integrity sha512-rUv2Dwi3whTmcgx6EejI5llMDnxhwyTX/8j01K6fWBfOAFaUV78gbtPcwmdr1WCVVcXSdKszyarus5fyZTKNfA== + dependencies: + "@gnosis.pm/safe-core-sdk-types" "^1.6.1" + "@gnosis.pm/safe-core-sdk-utils" "^1.4.1" + ethers "^5.7.1" + +"@gnosis.pm/safe-service-client@^1.3.1": + version "1.3.1" + resolved "https://registry.yarnpkg.com/@gnosis.pm/safe-service-client/-/safe-service-client-1.3.1.tgz#e16e7855258cae6bf1ef6d3f6838b1f48ce5f509" + integrity sha512-Gy2RjF0tvQs23nFlPQGpuFam2W3x1BxyHDd+RnYcNn9NUsoVmPjeGc85okpxWjpU6tl85ccovWl5fZrflIH1Vw== + dependencies: + "@ethersproject/abstract-signer" "^5.7.0" + "@gnosis.pm/safe-core-sdk-types" "^1.6.1" + node-fetch "^2.6.6" + "@humanwhocodes/config-array@^0.9.2": version "0.9.5" resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.9.5.tgz#2cbaf9a89460da24b5ca6531b8bbfc23e1df50c7" @@ -607,6 +1328,11 @@ resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.0.0.tgz#d5e38bfbdaba174805a4e649f13be9a9ed3351ae" integrity sha512-DZVbtY62kc3kkBtMHqwCOfXrT/hnoORy5BJ4+HU1IR59X0KWAOqsfzQPcUl/lQLlG7qXbe/fZ3r/emxtAl+sqg== +"@noble/hashes@1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.1.2.tgz#e9e035b9b166ca0af657a7848eb2718f0f22f183" + integrity sha512-KYRCASVTv6aeUi1tsF8/vpyR7zpfs3FUzy2Jqm+MU+LmUKhQ0y2FpfwqkCcxSg2ua4GALJd8k2R76WxwZGbQpA== + "@noble/secp256k1@1.5.5", "@noble/secp256k1@~1.5.2": version "1.5.5" resolved "https://registry.yarnpkg.com/@noble/secp256k1/-/secp256k1-1.5.5.tgz#315ab5745509d1a8c8e90d0bdf59823ccf9bcfc3" @@ -633,10 +1359,10 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" -"@nomiclabs/hardhat-ethers@npm:hardhat-deploy-ethers@0.3.0-beta.11": - version "0.3.0-beta.11" - resolved "https://registry.yarnpkg.com/hardhat-deploy-ethers/-/hardhat-deploy-ethers-0.3.0-beta.11.tgz#7f9122301853b01cb85b5ac85ba84dd764c98b07" - integrity sha512-HnniBGBYsFRQDXBy3bQ27i86pQQnHkN0Mxdwiu869jZURY2gDQ4OEZxcXItnWQqBjYiEaavVyw/Xle7qwKOBAg== +"@nomiclabs/hardhat-ethers@npm:hardhat-deploy-ethers@0.3.0-beta.13": + version "0.3.0-beta.13" + resolved "https://registry.yarnpkg.com/hardhat-deploy-ethers/-/hardhat-deploy-ethers-0.3.0-beta.13.tgz#b96086ff768ddf69928984d5eb0a8d78cfca9366" + integrity sha512-PdWVcKB9coqWV1L7JTpfXRCI91Cgwsm7KLmBcwZ8f0COSm1xtABHZTyz3fvF6p42cTnz1VM0QnfDvMFlIRkSNw== "@nomiclabs/hardhat-etherscan@^2.1.7": version "2.1.8" @@ -684,87 +1410,86 @@ proper-lockfile "^4.1.1" solidity-ast "^0.4.15" -"@renproject/chains-bitcoin@^3.0.0-alpha.25": - version "3.0.0-alpha.25" - resolved "https://registry.yarnpkg.com/@renproject/chains-bitcoin/-/chains-bitcoin-3.0.0-alpha.25.tgz#ed3aeae9d53502dafcd4a0e6b8fcafa12129cc5b" - integrity sha512-HYlee9CP18YSbiO4/bQR8lP8v428AN0zzzNySZLia8Vt0zlDWSajGjOF71Ac2lqJUopC6eZXl8OyC2dwDFrFlw== +"@renproject/chains-bitcoin@^3.5.0": + version "3.5.0" + resolved "https://registry.yarnpkg.com/@renproject/chains-bitcoin/-/chains-bitcoin-3.5.0.tgz#633af0859df302e1051639a04238dd46cd19b69a" + integrity sha512-Jflbo9rnBJhWUU9sGsqE51b3p7zmo5GVSkq4CIU+/NRkjZ2ZkRzvhRkuN3Mn2B9YpflFPT6Ya8El6+QPikZ9JA== dependencies: - "@noble/hashes" "1.0.0" - "@renproject/utils" "^3.0.0-alpha.25" - "@types/bchaddrjs" "^0.4.0" - "@types/bs58" "^4.0.1" + "@noble/hashes" "1.1.2" + "@renproject/utils" "^3.5.0" + "@types/bchaddrjs" "0.4.0" + "@types/bs58" "4.0.1" "@types/bs58check" "2.1.0" - "@types/cashaddrjs" "^0.3.0" - bchaddrjs "^0.5.2" - bech32 "^2.0.0" - bignumber.js "^9.0.2" - bs58 "^5.0.0" - bs58check "^2.1.2" - cashaddrjs "^0.4.4" - qs "^6.10.3" - wallet-address-validator "^0.2.4" + "@types/cashaddrjs" "0.3.0" + bchaddrjs "0.5.2" + bech32 "2.0.0" + bignumber.js "9.0.2" + bs58 "5.0.0" + bs58check "2.1.2" + cashaddrjs "0.4.4" + qs "6.11.0" + wallet-address-validator "0.2.4" -"@renproject/chains-ethereum@^3.0.0-alpha.7": - version "3.0.0-alpha.25" - resolved "https://registry.yarnpkg.com/@renproject/chains-ethereum/-/chains-ethereum-3.0.0-alpha.25.tgz#495805e4b4d2bd9cf3ccfef00f77bae0d08cf1bb" - integrity sha512-9R8tNNolf6vwQ52Tt0Bol8VKHF8aJ/LSRjggzHIBN0D2O9C/iyoGHKKTfkV71q7K44C5LSq+/mWalVybc0OuKg== +"@renproject/chains-ethereum@^3.5.0": + version "3.5.0" + resolved "https://registry.yarnpkg.com/@renproject/chains-ethereum/-/chains-ethereum-3.5.0.tgz#f7d01bbfce7ef881d999fbd596cb7f0fc91989ba" + integrity sha512-pYu062Q6mZy/N6DNxw/SjrFr0iCPepbj4zWO6B4chg4pud1UmXfEOQjDs1l77p53QykUpCgBUbvq6cTq2Kiu7A== dependencies: - "@ethersproject/abi" "^5.6.0" - "@ethersproject/bytes" "^5.6.0" - "@ethersproject/providers" "^5.6.1" - "@renproject/utils" "^3.0.0-alpha.25" - "@types/elliptic" "^6.4.14" - bignumber.js "^9.0.2" - elliptic "^6.5.4" - ethers "^5.6.1" - -"@renproject/mock-provider@^3.0.0-alpha.7": - version "3.0.0-alpha.25" - resolved "https://registry.yarnpkg.com/@renproject/mock-provider/-/mock-provider-3.0.0-alpha.25.tgz#0c676bc950f10b56f13fa2402cd8e45f095c999f" - integrity sha512-FjtIu6hvooA5R8kGq1+3C0GGdzDTul0XdIuBZcy2YRzbigEePkRNsnNJkBK9K5/1+C2iCKoGFxrHiRjpm2ml0w== - dependencies: - "@renproject/chains-bitcoin" "^3.0.0-alpha.25" - "@renproject/provider" "^3.0.0-alpha.25" - "@renproject/utils" "^3.0.0-alpha.25" - "@types/elliptic" "^6.4.14" - bignumber.js "^9.0.2" - elliptic "^6.5.4" - ethereumjs-util "^7.1.4" - immutable "^4.0.0" + "@ethersproject/abi" "5.6.4" + "@ethersproject/bytes" "5.6.1" + "@ethersproject/providers" "5.6.8" + "@renproject/utils" "^3.5.0" + "@types/elliptic" "6.4.14" + bignumber.js "9.0.2" + elliptic "6.5.4" + ethers "5.6.9" -"@renproject/provider@^3.0.0-alpha.25", "@renproject/provider@^3.0.0-alpha.7": - version "3.0.0-alpha.25" - resolved "https://registry.yarnpkg.com/@renproject/provider/-/provider-3.0.0-alpha.25.tgz#b6aa8f099541ff533a07e8cc8e2d430c95e85b5e" - integrity sha512-iN7B0A7IQFqsYOCttjtueaIdoBAX8Eqg29viJliw/YNH8tGqyHnHwe15t9vaal8+SqBm5TLp3zKEzV4QMi0FMw== +"@renproject/mock-provider@^3.5.0": + version "3.5.0" + resolved "https://registry.yarnpkg.com/@renproject/mock-provider/-/mock-provider-3.5.0.tgz#3dcd14066d176dfd90b3184636d4142a5a6267b8" + integrity sha512-HLbc3DOekZiLhxbe3dm8rDgMZHRJEPtDjKBI3Pdbq2npWRFPLHQN93DlRjkpXCdQbs3hISWShxit6oYhMzVp1w== + dependencies: + "@renproject/chains-bitcoin" "^3.5.0" + "@renproject/provider" "^3.5.0" + "@renproject/utils" "^3.5.0" + "@types/elliptic" "6.4.14" + bignumber.js "9.0.2" + elliptic "6.5.4" + ethereumjs-util "7.1.5" + immutable "4.1.0" + +"@renproject/provider@^3.5.0": + version "3.5.0" + resolved "https://registry.yarnpkg.com/@renproject/provider/-/provider-3.5.0.tgz#6885c5e343777765b64489ded2f9dd76c6e73800" + integrity sha512-rfqEvbNkvpbDBSLgz7N/mKs5vfk7ieQknXHjZcl7+RBw+on7I8P7YzSxCP/Z6mRjruXvnpQqhE9FulUFOGBHgw== dependencies: - "@renproject/utils" "^3.0.0-alpha.25" - axios "^0.26.1" - bignumber.js "^9.0.2" + "@renproject/utils" "^3.5.0" + axios "0.27.2" + bignumber.js "9.0.2" -"@renproject/ren@^3.0.0-alpha.7": - version "3.0.0-alpha.25" - resolved "https://registry.yarnpkg.com/@renproject/ren/-/ren-3.0.0-alpha.25.tgz#ae8c10e9bfcf03e0a58ebc4f08ead4029df95e03" - integrity sha512-qTQzTdSgtT+pzeb6qe4TQCCt+PSWQ0CCzJC7UHNk3dAXzxoSZLCKR2Nzf1/DE5bzbQBixW2sB+e958tpLfM9fA== +"@renproject/ren@^3.5.0": + version "3.5.0" + resolved "https://registry.yarnpkg.com/@renproject/ren/-/ren-3.5.0.tgz#75a52c1f70a19ce7cdcb52572d47ca1f415c1eb9" + integrity sha512-TyIQSH0hhUU8a/v6knK7K6WV3MvN4ggYnLinG3WRBVdsJLB17pafXj0yQy8CFUJb1wUml0/qvQfy9twQxY/wjA== dependencies: - "@renproject/provider" "^3.0.0-alpha.25" - "@renproject/utils" "^3.0.0-alpha.25" - bignumber.js "^9.0.2" - events "^3.3.0" - immutable "^4.0.0" + "@renproject/provider" "^3.5.0" + "@renproject/utils" "^3.5.0" + bignumber.js "9.0.2" + events "3.3.0" + immutable "4.1.0" -"@renproject/utils@^3.0.0-alpha.25": - version "3.0.0-alpha.25" - resolved "https://registry.yarnpkg.com/@renproject/utils/-/utils-3.0.0-alpha.25.tgz#e4e9f703f43a5ce88bc92b95cf3ec2fd84383f6f" - integrity sha512-QUEHE7cx4FmDJBk4PR7prNjo69GfyuWCcB42BKK1NZyXhHqib8ejXG3Hle1xFYKXyozPag8mn7el4+lOeT635Q== +"@renproject/utils@^3.5.0": + version "3.5.0" + resolved "https://registry.yarnpkg.com/@renproject/utils/-/utils-3.5.0.tgz#e3f90e51a744852174f8a2b576ca8ece13395b28" + integrity sha512-1pBoASH+85cDsWhUJelX8j0w0rTSp+IEBCSEE7VuN9foSMub5OJh87atRbpyWvI5ksJUSeemj0aw/+VOAplsAQ== dependencies: - "@noble/hashes" "1.0.0" - "@types/bn.js" "^5.1.0" + "@noble/hashes" "1.1.2" "@types/events" "3.0.0" - axios "^0.26.1" - base64-js "^1.5.1" - bignumber.js "^9.0.2" - events "^3.3.0" - immutable "^4.0.0" + axios "0.27.2" + base64-js "1.5.1" + bignumber.js "9.0.2" + events "3.3.0" + immutable "4.1.0" "@scure/base@~1.0.0": version "1.0.0" @@ -938,7 +1663,7 @@ resolved "https://registry.yarnpkg.com/@types/abstract-leveldown/-/abstract-leveldown-7.2.0.tgz#f055979a99f7654e84d6b8e6267419e9c4cfff87" integrity sha512-q5veSX6zjUy/DlDhR4Y4cU0k2Ar+DT2LUraP00T19WLmTO6Se1djepCCaqU6nQrwcJ5Hyo/CWqxTzrrFg8eqbQ== -"@types/bchaddrjs@^0.4.0": +"@types/bchaddrjs@0.4.0": version "0.4.0" resolved "https://registry.yarnpkg.com/@types/bchaddrjs/-/bchaddrjs-0.4.0.tgz#f3d29ab56096c9d7105b5ccbc69969d11426e087" integrity sha512-Nvv3haWpXNWYfKasVoEp3VBgVsBTLTh45anhHUN8xVUPhn4ErU3FPS5AEcZtACWc5ICGUxbaiLTWOnwDkwYF1Q== @@ -957,7 +1682,7 @@ dependencies: "@types/node" "*" -"@types/bs58@^4.0.1": +"@types/bs58@4.0.1": version "4.0.1" resolved "https://registry.yarnpkg.com/@types/bs58/-/bs58-4.0.1.tgz#3d51222aab067786d3bc3740a84a7f5a0effaa37" integrity sha512-yfAgiWgVLjFCmRv8zAcOIHywYATEwiTVccTLnRp6UxTNavT55M9d/uhK3T03St/+8/z/wW+CRjGKUNmEqoHHCA== @@ -971,7 +1696,7 @@ dependencies: "@types/node" "*" -"@types/cashaddrjs@^0.3.0": +"@types/cashaddrjs@0.3.0": version "0.3.0" resolved "https://registry.yarnpkg.com/@types/cashaddrjs/-/cashaddrjs-0.3.0.tgz#682240b8d3eacb8625fdcf2ffd4852dcca2d9703" integrity sha512-nPY5HLJLQm6TYOoJb9KE80MjJvGiSS6ewgHELzZnLH+17q3HDww32A1d3kMB722sXG4ACUaTvkMnLD5lgQalxQ== @@ -995,7 +1720,7 @@ dependencies: "@types/node" "*" -"@types/elliptic@^6.4.14": +"@types/elliptic@6.4.14": version "6.4.14" resolved "https://registry.yarnpkg.com/@types/elliptic/-/elliptic-6.4.14.tgz#7bbaad60567a588c1f08b10893453e6b9b4de48e" integrity sha512-z4OBcDAU0GVwDTuwJzQCiL6188QvZMkvoERgcVjq0/mPM8jCfdwZ3x5zQEVoL9WCAru3aG5wl3Z5Ww5wBWn7ZQ== @@ -1221,6 +1946,11 @@ abort-controller@^3.0.0: dependencies: event-target-shim "^5.0.0" +abortcontroller-polyfill@^1.7.3: + version "1.7.5" + resolved "https://registry.yarnpkg.com/abortcontroller-polyfill/-/abortcontroller-polyfill-1.7.5.tgz#6738495f4e901fbb57b6c0611d0c75f76c485bed" + integrity sha512-JMJ5soJWP18htbbxJjG7bG6yuI6pRhgJ0scHHTfkUjf6wjP912xZWvM+A4sJK3gqd9E8fcPbDnOefbA9Th/FIQ== + abstract-leveldown@^6.2.1: version "6.3.0" resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-6.3.0.tgz#d25221d1e6612f820c35963ba4bd739928f6026a" @@ -1541,6 +2271,14 @@ aws4@^1.8.0: resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.11.0.tgz#d61f46d83b2519250e2784daf5b09479a8b41c59" integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA== +axios@0.27.2: + version "0.27.2" + resolved "https://registry.yarnpkg.com/axios/-/axios-0.27.2.tgz#207658cc8621606e586c85db4b41a750e756d972" + integrity sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ== + dependencies: + follow-redirects "^1.14.9" + form-data "^4.0.0" + axios@^0.21.1: version "0.21.4" resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.4.tgz#c67b90dc0568e5c1cf2b0b858c43ba28e2eda575" @@ -1548,13 +2286,6 @@ axios@^0.21.1: dependencies: follow-redirects "^1.14.0" -axios@^0.26.1: - version "0.26.1" - resolved "https://registry.yarnpkg.com/axios/-/axios-0.26.1.tgz#1ede41c51fcf51bbbd6fd43669caaa4f0495aaa9" - integrity sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA== - dependencies: - follow-redirects "^1.14.8" - balanced-match@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" @@ -1572,12 +2303,12 @@ base-x@^4.0.0: resolved "https://registry.yarnpkg.com/base-x/-/base-x-4.0.0.tgz#d0e3b7753450c73f8ad2389b5c018a4af7b2224a" integrity sha512-FuwxlW4H5kh37X/oW59pwTzzTKRzfrrQwhmyspRM7swOEZcHtDZSCt45U6oKgtuFE+WYPblePMVIPR4RZrh/hw== -base64-js@^1.3.1, base64-js@^1.5.1: +base64-js@1.5.1, base64-js@^1.3.1: version "1.5.1" resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== -bchaddrjs@^0.5.2: +bchaddrjs@0.5.2: version "0.5.2" resolved "https://registry.yarnpkg.com/bchaddrjs/-/bchaddrjs-0.5.2.tgz#1f52b5077329774e7c82d4882964628106bb11a0" integrity sha512-OO7gIn3m7ea4FVx4cT8gdlWQR2+++EquhdpWQJH9BQjK63tJJ6ngB3QMZDO6DiBoXiIGUsTPHjlrHVxPGcGxLQ== @@ -1599,7 +2330,7 @@ bech32@1.1.4: resolved "https://registry.yarnpkg.com/bech32/-/bech32-1.1.4.tgz#e38c9f37bf179b8eb16ae3a772b40c356d4832e9" integrity sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ== -bech32@^2.0.0: +bech32@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/bech32/-/bech32-2.0.0.tgz#078d3686535075c8c79709f054b1b226a133b355" integrity sha512-LcknSilhIGatDAsY1ak2I8VtGaHNhgMSYVxFrGLXv+xLHytaKZKcaUJJUE7qmBr7h33o5YQwP55pMI0xmkpJwg== @@ -1609,7 +2340,7 @@ big-integer@1.6.36: resolved "https://registry.yarnpkg.com/big-integer/-/big-integer-1.6.36.tgz#78631076265d4ae3555c04f85e7d9d2f3a071a36" integrity sha512-t70bfa7HYEA1D9idDbmuv7YbsbVkQ+Hp+8KFSul4aE5e/i1bjCNIRYJZlA8Q8p0r9T8cF/RVvwUgRA//FydEyg== -bignumber.js@^9.0.0, bignumber.js@^9.0.1, bignumber.js@^9.0.2: +bignumber.js@9.0.2, bignumber.js@^9.0.0, bignumber.js@^9.0.1, bignumber.js@^9.0.2: version "9.0.2" resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.0.2.tgz#71c6c6bed38de64e24a65ebe16cfcf23ae693673" integrity sha512-GAcQvbpsM0pUb0zw1EI0KhQEZ+lRwR5fYaAp3vPOYuP7aDvGy6cVN6XHLauvF8SOga2y0dcLcjt3iQDTSEliyw== @@ -1660,6 +2391,11 @@ bn.js@^5.0.0, bn.js@^5.1.1, bn.js@^5.1.2, bn.js@^5.1.3, bn.js@^5.2.0: resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.0.tgz#358860674396c6997771a9d051fcc1b57d4ae002" integrity sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw== +bn.js@^5.2.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.1.tgz#0bc527a6a0d18d0aa8d5b0538ce4a77dccfa7b70" + integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ== + body-parser@1.19.2: version "1.19.2" resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.2.tgz#4714ccd9c157d44797b8b5607d72c0b89952f26e" @@ -1773,6 +2509,13 @@ browserify-sign@^4.0.0: readable-stream "^3.6.0" safe-buffer "^5.2.0" +bs58@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/bs58/-/bs58-5.0.0.tgz#865575b4d13c09ea2a84622df6c8cbeb54ffc279" + integrity sha512-r+ihvQJvahgYT50JD05dyJNKlmmSlMoOGwn1lCcEzanPglg7TxYjioQUYehQ9mAR/+hOSd2jRc/Z2y5UxBymvQ== + dependencies: + base-x "^4.0.0" + bs58@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/bs58/-/bs58-4.0.1.tgz#be161e76c354f6f788ae4071f63f34e8c4f0a42a" @@ -1780,13 +2523,6 @@ bs58@^4.0.0: dependencies: base-x "^3.0.2" -bs58@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/bs58/-/bs58-5.0.0.tgz#865575b4d13c09ea2a84622df6c8cbeb54ffc279" - integrity sha512-r+ihvQJvahgYT50JD05dyJNKlmmSlMoOGwn1lCcEzanPglg7TxYjioQUYehQ9mAR/+hOSd2jRc/Z2y5UxBymvQ== - dependencies: - base-x "^4.0.0" - bs58check@2.1.2, bs58check@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/bs58check/-/bs58check-2.1.2.tgz#53b018291228d82a5aa08e7d796fdafda54aebfc" @@ -1906,7 +2642,7 @@ caseless@^0.12.0, caseless@~0.12.0: resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= -cashaddrjs@0.4.4, cashaddrjs@^0.4.4: +cashaddrjs@0.4.4: version "0.4.4" resolved "https://registry.yarnpkg.com/cashaddrjs/-/cashaddrjs-0.4.4.tgz#169f1ae620d325db77700273d972282adeeee331" integrity sha512-xZkuWdNOh0uq/mxJIng6vYWfTowZLd9F4GMAlp2DwFHlcCqCm91NtuAc47RuV4L7r4PYcY5p6Cr2OKNb4hnkWA== @@ -2330,6 +3066,13 @@ cross-env@^7.0.3: dependencies: cross-spawn "^7.0.1" +cross-fetch@^3.1.4: + version "3.1.5" + resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.5.tgz#e1389f44d9e7ba767907f7af8454787952ab534f" + integrity sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw== + dependencies: + node-fetch "2.6.7" + cross-spawn@^6.0.5: version "6.0.5" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" @@ -2738,6 +3481,11 @@ es6-iterator@^2.0.3: es5-ext "^0.10.35" es6-symbol "^3.1.1" +es6-promise@^4.2.8: + version "4.2.8" + resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a" + integrity sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w== + es6-symbol@^3.1.1, es6-symbol@^3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.3.tgz#bad5d3c1bcdac28269f4cb331e431c78ac705d18" @@ -3082,6 +3830,17 @@ ethereumjs-abi@^0.6.8: bn.js "^4.11.8" ethereumjs-util "^6.0.0" +ethereumjs-util@7.1.5, ethereumjs-util@^7.1.5: + version "7.1.5" + resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz#9ecf04861e4fbbeed7465ece5f23317ad1129181" + integrity sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg== + dependencies: + "@types/bn.js" "^5.1.0" + bn.js "^5.1.2" + create-hash "^1.1.2" + ethereum-cryptography "^0.1.3" + rlp "^2.2.4" + ethereumjs-util@^6.0.0, ethereumjs-util@^6.2.1: version "6.2.1" resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz#fcb4e4dd5ceacb9d2305426ab1a5cd93e3163b69" @@ -3106,6 +3865,42 @@ ethereumjs-util@^7.0.10, ethereumjs-util@^7.0.3, ethereumjs-util@^7.1.0, ethereu ethereum-cryptography "^0.1.3" rlp "^2.2.4" +ethers@5.6.9: + version "5.6.9" + resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.6.9.tgz#4e12f8dfcb67b88ae7a78a9519b384c23c576a4d" + integrity sha512-lMGC2zv9HC5EC+8r429WaWu3uWJUCgUCt8xxKCFqkrFuBDZXDYIdzDUECxzjf2BMF8IVBByY1EBoGSL3RTm8RA== + dependencies: + "@ethersproject/abi" "5.6.4" + "@ethersproject/abstract-provider" "5.6.1" + "@ethersproject/abstract-signer" "5.6.2" + "@ethersproject/address" "5.6.1" + "@ethersproject/base64" "5.6.1" + "@ethersproject/basex" "5.6.1" + "@ethersproject/bignumber" "5.6.2" + "@ethersproject/bytes" "5.6.1" + "@ethersproject/constants" "5.6.1" + "@ethersproject/contracts" "5.6.2" + "@ethersproject/hash" "5.6.1" + "@ethersproject/hdnode" "5.6.2" + "@ethersproject/json-wallets" "5.6.1" + "@ethersproject/keccak256" "5.6.1" + "@ethersproject/logger" "5.6.0" + "@ethersproject/networks" "5.6.4" + "@ethersproject/pbkdf2" "5.6.1" + "@ethersproject/properties" "5.6.0" + "@ethersproject/providers" "5.6.8" + "@ethersproject/random" "5.6.1" + "@ethersproject/rlp" "5.6.1" + "@ethersproject/sha2" "5.6.1" + "@ethersproject/signing-key" "5.6.2" + "@ethersproject/solidity" "5.6.1" + "@ethersproject/strings" "5.6.1" + "@ethersproject/transactions" "5.6.2" + "@ethersproject/units" "5.6.1" + "@ethersproject/wallet" "5.6.2" + "@ethersproject/web" "5.6.1" + "@ethersproject/wordlists" "5.6.1" + ethers@^4.0.32, ethers@^4.0.40: version "4.0.49" resolved "https://registry.yarnpkg.com/ethers/-/ethers-4.0.49.tgz#0eb0e9161a0c8b4761be547396bbe2fb121a8894" @@ -3121,7 +3916,7 @@ ethers@^4.0.32, ethers@^4.0.40: uuid "2.0.1" xmlhttprequest "1.8.0" -ethers@^5.0.0, ethers@^5.5.1, ethers@^5.6.0, ethers@^5.6.1: +ethers@^5.0.0: version "5.6.4" resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.6.4.tgz#23629e9a7d4bc5802dfb53d4da420d738744b53c" integrity sha512-62UIfxAQXdf67TeeOaoOoPctm5hUlYgfd0iW3wxfj7qRYKDcvvy0f+sJ3W2/Pyx77R8dblvejA8jokj+lS+ATQ== @@ -3157,6 +3952,42 @@ ethers@^5.0.0, ethers@^5.5.1, ethers@^5.6.0, ethers@^5.6.1: "@ethersproject/web" "5.6.0" "@ethersproject/wordlists" "5.6.0" +ethers@^5.7.0, ethers@^5.7.1: + version "5.7.1" + resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.7.1.tgz#48c83a44900b5f006eb2f65d3ba6277047fd4f33" + integrity sha512-5krze4dRLITX7FpU8J4WscXqADiKmyeNlylmmDLbS95DaZpBhDe2YSwRQwKXWNyXcox7a3gBgm/MkGXV1O1S/Q== + dependencies: + "@ethersproject/abi" "5.7.0" + "@ethersproject/abstract-provider" "5.7.0" + "@ethersproject/abstract-signer" "5.7.0" + "@ethersproject/address" "5.7.0" + "@ethersproject/base64" "5.7.0" + "@ethersproject/basex" "5.7.0" + "@ethersproject/bignumber" "5.7.0" + "@ethersproject/bytes" "5.7.0" + "@ethersproject/constants" "5.7.0" + "@ethersproject/contracts" "5.7.0" + "@ethersproject/hash" "5.7.0" + "@ethersproject/hdnode" "5.7.0" + "@ethersproject/json-wallets" "5.7.0" + "@ethersproject/keccak256" "5.7.0" + "@ethersproject/logger" "5.7.0" + "@ethersproject/networks" "5.7.1" + "@ethersproject/pbkdf2" "5.7.0" + "@ethersproject/properties" "5.7.0" + "@ethersproject/providers" "5.7.1" + "@ethersproject/random" "5.7.0" + "@ethersproject/rlp" "5.7.0" + "@ethersproject/sha2" "5.7.0" + "@ethersproject/signing-key" "5.7.0" + "@ethersproject/solidity" "5.7.0" + "@ethersproject/strings" "5.7.0" + "@ethersproject/transactions" "5.7.0" + "@ethersproject/units" "5.7.0" + "@ethersproject/wallet" "5.7.0" + "@ethersproject/web" "5.7.1" + "@ethersproject/wordlists" "5.7.0" + ethjs-unit@0.1.6: version "0.1.6" resolved "https://registry.yarnpkg.com/ethjs-unit/-/ethjs-unit-0.1.6.tgz#c665921e476e87bce2a9d588a6fe0405b2c41699" @@ -3183,7 +4014,7 @@ eventemitter3@4.0.4: resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.4.tgz#b5463ace635a083d018bdc7c917b4c5f10a85384" integrity sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ== -events@^3.2.0, events@^3.3.0: +events@3.3.0, events@^3.2.0, events@^3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== @@ -3427,11 +4258,16 @@ fmix@^0.1.0: dependencies: imul "^1.0.0" -follow-redirects@^1.12.1, follow-redirects@^1.14.0, follow-redirects@^1.14.8: +follow-redirects@^1.12.1, follow-redirects@^1.14.0: version "1.14.9" resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.9.tgz#dd4ea157de7bfaf9ea9b3fbd85aa16951f78d8d7" integrity sha512-MQDfihBQYMcyy5dhRDJUHcw7lb2Pv/TuE6xP1vyraLukNDHKbDxDNaOE3NbCAdKQApno+GPRyo1YAp89yCjK4w== +follow-redirects@^1.14.9: + version "1.15.2" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13" + integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== + foreach@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99" @@ -4159,7 +4995,12 @@ immediate@~3.2.3: resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.2.3.tgz#d140fa8f614659bd6541233097ddaac25cdd991c" integrity sha1-0UD6j2FGWb1lQSMwl92qwlzdmRw= -immutable@^4.0.0, immutable@^4.0.0-rc.12: +immutable@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.1.0.tgz#f795787f0db780183307b9eb2091fcac1f6fafef" + integrity sha512-oNkuqVTA8jqG1Q6c+UglTOD1xhC1BtjKI7XkCXRkZHrN5m18/XsnUp8Q89GkQO/z+0WjonSvl0FLhDYftp46nQ== + +immutable@^4.0.0-rc.12: version "4.0.0" resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.0.0.tgz#b86f78de6adef3608395efb269a91462797e2c23" integrity sha512-zIE9hX70qew5qTUjSS7wi1iwj/l7+m54KWU247nhM3v806UdGj1yDndXj+IOYxxtW9zyLI+xqFNZjTuDaLUqFw== @@ -5277,7 +6118,7 @@ node-environment-flags@1.0.6: object.getownpropertydescriptors "^2.0.3" semver "^5.7.0" -node-fetch@^2.6.0: +node-fetch@2.6.7, node-fetch@^2.6.0, node-fetch@^2.6.6: version "2.6.7" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== @@ -5856,13 +6697,20 @@ punycode@^2.1.0, punycode@^2.1.1: resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== -qs@6.10.3, qs@^6.10.3, qs@^6.4.0, qs@^6.7.0, qs@^6.9.4: +qs@6.10.3, qs@^6.4.0, qs@^6.7.0, qs@^6.9.4: version "6.10.3" resolved "https://registry.yarnpkg.com/qs/-/qs-6.10.3.tgz#d6cde1b2ffca87b5aa57889816c5f81535e22e8e" integrity sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ== dependencies: side-channel "^1.0.4" +qs@6.11.0: + version "6.11.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.0.tgz#fd0d963446f7a65e1367e01abd85429453f0c37a" + integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== + dependencies: + side-channel "^1.0.4" + qs@6.9.7: version "6.9.7" resolved "https://registry.yarnpkg.com/qs/-/qs-6.9.7.tgz#4610846871485e1e048f44ae3b94033f0e675afe" @@ -6265,6 +7113,13 @@ semver@^7.3.4, semver@^7.3.5: dependencies: lru-cache "^6.0.0" +semver@^7.3.7: + version "7.3.8" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.8.tgz#07a78feafb3f7b32347d725e33de7e2a2df67798" + integrity sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A== + dependencies: + lru-cache "^6.0.0" + send@0.17.2: version "0.17.2" resolved "https://registry.yarnpkg.com/send/-/send-0.17.2.tgz#926622f76601c41808012c8bf1688fe3906f7820" @@ -7268,7 +8123,7 @@ verror@1.10.0: core-util-is "1.0.2" extsprintf "^1.2.0" -wallet-address-validator@^0.2.4: +wallet-address-validator@0.2.4: version "0.2.4" resolved "https://registry.yarnpkg.com/wallet-address-validator/-/wallet-address-validator-0.2.4.tgz#717ce316143b679645639986cc0847a107255881" integrity sha512-3fp0pVdhaCA6UoPK3CQFx9Y+ckQgFlCa9rOQ7DZr2Uzlh0kYKs3NaSwIDn4FSceDsi1g6W28EWDrlr9Pr3mI3Q== @@ -7293,6 +8148,14 @@ web3-core-helpers@1.5.3: web3-eth-iban "1.5.3" web3-utils "1.5.3" +web3-core-helpers@1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/web3-core-helpers/-/web3-core-helpers-1.8.0.tgz#5dcfdda1a4ea277041d912003198f1334ca29d7c" + integrity sha512-nMAVwZB3rEp/khHI2BvFy0e/xCryf501p5NGjswmJtEM+Zrd3Biaw52JrB1qAZZIzCA8cmLKaOgdfamoDOpWdw== + dependencies: + web3-eth-iban "1.8.0" + web3-utils "1.8.0" + web3-core-method@1.5.3: version "1.5.3" resolved "https://registry.yarnpkg.com/web3-core-method/-/web3-core-method-1.5.3.tgz#6cff97ed19fe4ea2e9183d6f703823a079f5132c" @@ -7305,6 +8168,17 @@ web3-core-method@1.5.3: web3-core-subscriptions "1.5.3" web3-utils "1.5.3" +web3-core-method@1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/web3-core-method/-/web3-core-method-1.8.0.tgz#9c2da8896808917d1679c319f19e2174ba17086c" + integrity sha512-c94RAzo3gpXwf2rf8rL8C77jOzNWF4mXUoUfZYYsiY35cJFd46jQDPI00CB5+ZbICTiA5mlVzMj4e7jAsTqiLA== + dependencies: + "@ethersproject/transactions" "^5.6.2" + web3-core-helpers "1.8.0" + web3-core-promievent "1.8.0" + web3-core-subscriptions "1.8.0" + web3-utils "1.8.0" + web3-core-promievent@1.5.3: version "1.5.3" resolved "https://registry.yarnpkg.com/web3-core-promievent/-/web3-core-promievent-1.5.3.tgz#3f11833c3dc6495577c274350b61144e0a4dba01" @@ -7312,6 +8186,13 @@ web3-core-promievent@1.5.3: dependencies: eventemitter3 "4.0.4" +web3-core-promievent@1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/web3-core-promievent/-/web3-core-promievent-1.8.0.tgz#979765fd4d37ab0f158f0ee54037b279b737bd53" + integrity sha512-FGLyjAuOaAQ+ZhV6iuw9tg/9WvIkSZXKHQ4mdTyQ8MxVraOtFivOCbuLLsGgapfHYX+RPxsc1j1YzQjKoupagQ== + dependencies: + eventemitter3 "4.0.4" + web3-core-requestmanager@1.5.3: version "1.5.3" resolved "https://registry.yarnpkg.com/web3-core-requestmanager/-/web3-core-requestmanager-1.5.3.tgz#b339525815fd40e3a2a81813c864ddc413f7b6f7" @@ -7323,6 +8204,17 @@ web3-core-requestmanager@1.5.3: web3-providers-ipc "1.5.3" web3-providers-ws "1.5.3" +web3-core-requestmanager@1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/web3-core-requestmanager/-/web3-core-requestmanager-1.8.0.tgz#06189df80cf52d24a195a7ef655031afe8192df3" + integrity sha512-2AoYCs3Owl5foWcf4uKPONyqFygSl9T54L8b581U16nsUirjhoTUGK/PBhMDVcLCmW4QQmcY5A8oPFpkQc1TTg== + dependencies: + util "^0.12.0" + web3-core-helpers "1.8.0" + web3-providers-http "1.8.0" + web3-providers-ipc "1.8.0" + web3-providers-ws "1.8.0" + web3-core-subscriptions@1.5.3: version "1.5.3" resolved "https://registry.yarnpkg.com/web3-core-subscriptions/-/web3-core-subscriptions-1.5.3.tgz#d7d69c4caad65074212028656e9dc56ca5c2159d" @@ -7331,6 +8223,14 @@ web3-core-subscriptions@1.5.3: eventemitter3 "4.0.4" web3-core-helpers "1.5.3" +web3-core-subscriptions@1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/web3-core-subscriptions/-/web3-core-subscriptions-1.8.0.tgz#ff66ae4467c8cb4716367248bcefb1845c0f8b83" + integrity sha512-7lHVRzDdg0+Gcog55lG6Q3D8JV+jN+4Ly6F8cSn9xFUAwOkdbgdWsjknQG7t7CDWy21DQkvdiY2BJF8S68AqOA== + dependencies: + eventemitter3 "4.0.4" + web3-core-helpers "1.8.0" + web3-core@1.5.3: version "1.5.3" resolved "https://registry.yarnpkg.com/web3-core/-/web3-core-1.5.3.tgz#59f8728b27c8305b349051326aa262b9b7e907bf" @@ -7344,6 +8244,19 @@ web3-core@1.5.3: web3-core-requestmanager "1.5.3" web3-utils "1.5.3" +web3-core@^1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/web3-core/-/web3-core-1.8.0.tgz#90afce527ac1b1dff8cbed2acbc0336530b8aacf" + integrity sha512-9sCA+Z02ci6zoY2bAquFiDjujRwmSKHiSGi4B8IstML8okSytnzXk1izHYSynE7ahIkguhjWAuXFvX76F5rAbA== + dependencies: + "@types/bn.js" "^5.1.0" + "@types/node" "^12.12.6" + bignumber.js "^9.0.0" + web3-core-helpers "1.8.0" + web3-core-method "1.8.0" + web3-core-requestmanager "1.8.0" + web3-utils "1.8.0" + web3-eth-abi@1.5.3: version "1.5.3" resolved "https://registry.yarnpkg.com/web3-eth-abi/-/web3-eth-abi-1.5.3.tgz#5aea9394d797f99ca0d9bd40c3417eb07241c96c" @@ -7405,6 +8318,14 @@ web3-eth-iban@1.5.3: bn.js "^4.11.9" web3-utils "1.5.3" +web3-eth-iban@1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/web3-eth-iban/-/web3-eth-iban-1.8.0.tgz#3af8a0c95b5f7b0b81ab0bcd2075c1e5dda31520" + integrity sha512-4RbvUxcMpo/e5811sE3a6inJ2H4+FFqUVmlRYs0RaXaxiHweahSRBNcpO0UWgmlePTolj0rXqPT2oEr0DuC8kg== + dependencies: + bn.js "^5.2.1" + web3-utils "1.8.0" + web3-eth-personal@1.5.3: version "1.5.3" resolved "https://registry.yarnpkg.com/web3-eth-personal/-/web3-eth-personal-1.5.3.tgz#4ebe09e9a77dd49d23d93b36b36cfbf4a6dae713" @@ -7452,6 +8373,16 @@ web3-providers-http@1.5.3: web3-core-helpers "1.5.3" xhr2-cookies "1.1.0" +web3-providers-http@1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/web3-providers-http/-/web3-providers-http-1.8.0.tgz#3fd1e569ead2095343fac17d53160a3bae674c23" + integrity sha512-/MqxwRzExohBWW97mqlCSW/+NHydGRyoEDUS1bAIF2YjfKFwyRtHgrEzOojzkC9JvB+8LofMvbXk9CcltpZapw== + dependencies: + abortcontroller-polyfill "^1.7.3" + cross-fetch "^3.1.4" + es6-promise "^4.2.8" + web3-core-helpers "1.8.0" + web3-providers-ipc@1.5.3: version "1.5.3" resolved "https://registry.yarnpkg.com/web3-providers-ipc/-/web3-providers-ipc-1.5.3.tgz#4bd7f5e445c2f3c2595fce0929c72bb879320a3f" @@ -7460,6 +8391,14 @@ web3-providers-ipc@1.5.3: oboe "2.1.5" web3-core-helpers "1.5.3" +web3-providers-ipc@1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/web3-providers-ipc/-/web3-providers-ipc-1.8.0.tgz#d339a24c4d764e459e425d3ac868a551ac33e3ea" + integrity sha512-tAXHtVXNUOgehaBU8pzAlB3qhjn/PRpjdzEjzHNFqtRRTwzSEKOJxFeEhaUA4FzHnTlbnrs8ujHWUitcp1elfg== + dependencies: + oboe "2.1.5" + web3-core-helpers "1.8.0" + web3-providers-ws@1.5.3: version "1.5.3" resolved "https://registry.yarnpkg.com/web3-providers-ws/-/web3-providers-ws-1.5.3.tgz#eec6cfb32bb928a4106de506f13a49070a21eabf" @@ -7469,6 +8408,15 @@ web3-providers-ws@1.5.3: web3-core-helpers "1.5.3" websocket "^1.0.32" +web3-providers-ws@1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/web3-providers-ws/-/web3-providers-ws-1.8.0.tgz#a0a73e0606981ea32bed40d215000a64753899de" + integrity sha512-bcZtSifsqyJxwkfQYamfdIRp4nhj9eJd7cxHg1uUkfLJK125WP96wyJL1xbPt7qt0MpfnTFn8/UuIqIB6nFENg== + dependencies: + eventemitter3 "4.0.4" + web3-core-helpers "1.8.0" + websocket "^1.0.32" + web3-shh@1.5.3: version "1.5.3" resolved "https://registry.yarnpkg.com/web3-shh/-/web3-shh-1.5.3.tgz#3c04aa4cda9ba0b746d7225262401160f8e38b13" @@ -7492,6 +8440,19 @@ web3-utils@1.5.3: randombytes "^2.1.0" utf8 "3.0.0" +web3-utils@1.8.0, web3-utils@^1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.8.0.tgz#0a506f8c6af9a2ad6ba79689892662769534fc03" + integrity sha512-7nUIl7UWpLVka2f09CMbKOSEvorvHnaugIabU4mj7zfMvm0tSByLcEu3eyV9qgS11qxxLuOkzBIwCstTflhmpQ== + dependencies: + bn.js "^5.2.1" + ethereum-bloom-filters "^1.0.6" + ethereumjs-util "^7.1.0" + ethjs-unit "0.1.6" + number-to-bn "1.7.0" + randombytes "^2.1.0" + utf8 "3.0.0" + web3-utils@^1.3.0: version "1.7.3" resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.7.3.tgz#b214d05f124530d8694ad364509ac454d05f207c"