diff --git a/hardhat.config.ts b/hardhat.config.ts index e8dd6b4..de0254a 100644 --- a/hardhat.config.ts +++ b/hardhat.config.ts @@ -1,13 +1,12 @@ import '@nomicfoundation/hardhat-toolbox' +import '@nomicfoundation/hardhat-verify' import 'hardhat-gas-reporter' -import 'hardhat-deploy' - -import './src/deploy/verify' import dotenv from 'dotenv' import { HttpNetworkUserConfig } from 'hardhat/types' -import { DeterministicDeploymentInfo } from 'hardhat-deploy/dist/types' -import { getSingletonFactoryInfo } from '@safe-global/safe-singleton-factory' + +import './tasks/deploy-instance' +import './tasks/deploy-mastercopy' dotenv.config() @@ -25,11 +24,16 @@ export default { paths: { artifacts: 'build/artifacts', cache: 'build/cache', - deploy: 'src/deploy', sources: 'contracts', }, solidity: { compilers: [{ version: '0.8.20' }], + settings: { + optimizer: { + enabled: true, + runs: 100, + }, + }, }, defaultNetwork: 'hardhat', networks: { @@ -46,10 +50,6 @@ export default { ...sharedNetworkConfig, url: 'https://rpc.gnosischain.com', }, - ewc: { - ...sharedNetworkConfig, - url: `https://rpc.energyweb.org`, - }, goerli: { ...sharedNetworkConfig, url: `https://goerli.infura.io/v3/${INFURA_KEY}`, @@ -74,10 +74,6 @@ export default { ...sharedNetworkConfig, url: `https://arb1.arbitrum.io/rpc`, }, - fantomTestnet: { - ...sharedNetworkConfig, - url: `https://rpc.testnet.fantom.network/`, - }, avalanche: { ...sharedNetworkConfig, url: `https://api.avax.network/ext/bc/C/rpc`, @@ -91,10 +87,6 @@ export default { url: 'https://rpc-mainnet.maticvigil.com', }, }, - deterministicDeployment, - namedAccounts: { - deployer: 0, - }, etherscan: { apiKey: ETHERSCAN_API_KEY, }, @@ -102,23 +94,3 @@ export default { enabled: true, }, } - -function deterministicDeployment(network: string): DeterministicDeploymentInfo { - const info = getSingletonFactoryInfo(parseInt(network)) - if (!info) { - throw new Error(` - Safe factory not found for network ${network}. You can request a new deployment at https://github.com/safe-global/safe-singleton-factory. - For more information, see https://github.com/safe-global/safe-contracts#replay-protection-eip-155 - `) - } - - const gasLimit = BigInt(info.gasLimit) - const gasPrice = BigInt(info.gasPrice) - - return { - factory: info.address, - deployer: info.signerAddress, - funding: String(gasLimit * gasPrice), - signedTx: info.transaction, - } -} diff --git a/package.json b/package.json index 8cd53dc..a9df9c4 100644 --- a/package.json +++ b/package.json @@ -10,12 +10,12 @@ "build": "hardhat compile", "test": "hardhat test", "coverage": "hardhat coverage", - "deploy": "yarn hardhat deploy-verify --network", + "deploy": "yarn hardhat deploy:mastercopy --network", "prepack": "yarn run clean && yarn run build", "prepare": "yarn run clean && yarn run build", "lint": "yarn lint:sol && yarn lint:ts", "lint:sol": "solhint 'contracts/**/*.sol'", - "lint:ts": "eslint 'src/**/*.ts' 'test/**/*.ts' --max-warnings 0 --fix", + "lint:ts": "eslint 'tasks/**/*.ts' 'test/**/*.ts' --max-warnings 0 --fix", "fmt": "yarn fmt:sol && yarn fmt:ts", "fmt:sol": "prettier 'contracts/**/*.sol' -w", "fmt:ts": "prettier 'src/**/*.ts' 'test/**/*.ts' -w" @@ -32,7 +32,7 @@ "@nomicfoundation/hardhat-ethers": "^3.0.4", "@nomicfoundation/hardhat-network-helpers": "^1.0.7", "@nomicfoundation/hardhat-toolbox": "3.0.0", - "@nomicfoundation/hardhat-verify": "^1.1.1", + "@nomicfoundation/hardhat-verify": "2.0.0", "@openzeppelin/contracts": "^5.0.0", "@safe-global/safe-singleton-factory": "^1.0.15", "@typechain/ethers-v6": "^0.5.0", @@ -48,10 +48,9 @@ "eslint-plugin-import": "^2.25.4", "eslint-plugin-prettier": "^5.0.0", "eslint": "^8.6.0", - "ethers": "^6.7.1", - "hardhat-deploy": "^0.11.37", + "ethers": "^6.8.1", "hardhat-gas-reporter": "^1.0.9", - "hardhat": "^2.12.5", + "hardhat": "^2.19.0", "prettier-plugin-solidity": "^1.1.3", "prettier": "^3.0.2", "rimraf": "^5.0.1", diff --git a/src/deploy/deploy_module.ts b/src/deploy/deploy_module.ts deleted file mode 100644 index ffdf6e6..0000000 --- a/src/deploy/deploy_module.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { HardhatRuntimeEnvironment } from 'hardhat/types' -import { DeployFunction } from 'hardhat-deploy/types' - -const FirstAddress = '0x0000000000000000000000000000000000000001' - -const deploy: DeployFunction = async function (hre: HardhatRuntimeEnvironment) { - const { deployments, getNamedAccounts } = hre - const { deployer } = await getNamedAccounts() - const { deploy } = deployments - const args = [FirstAddress, FirstAddress, FirstAddress, 0, 0] - - await deploy('Delay', { - from: deployer, - args, - log: true, - deterministicDeployment: true, - }) -} - -deploy.tags = ['delay-modifier'] -export default deploy diff --git a/src/deploy/verify.ts b/src/deploy/verify.ts deleted file mode 100644 index 499fe8e..0000000 --- a/src/deploy/verify.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { HardhatRuntimeEnvironment } from 'hardhat/types' -import { TASK_ETHERSCAN_VERIFY } from 'hardhat-deploy' -import { DeployFunction } from 'hardhat-deploy/types' - -const func: DeployFunction = async function (hre: HardhatRuntimeEnvironment) { - const { run } = hre - if (!['rinkeby', 'mainnet'].includes(hre.network.name)) { - return - } - - if (!process.env.INFURA_KEY) { - console.log( - `Could not find Infura key in env, unable to connect to network ${hre.network.name}` - ) - return - } - - console.log('Verification of Delay Modifier in etherscan...') - console.log('Waiting for 1 minute before verifying contracts...') - // Etherscan needs some time to process before trying to verify. - await new Promise((resolve) => setTimeout(resolve, 60000)) - - console.log('Starting to verify now') - - await run(TASK_ETHERSCAN_VERIFY, { - apiKey: process.env.ETHERSCAN_KEY_API, - license: 'GPL-3.0', - solcInput: true, - forceLicense: true, // we need this because contracts license is LGPL-3.0-only - }) -} -export default func diff --git a/tasks/EIP_2470.ts b/tasks/EIP_2470.ts new file mode 100644 index 0000000..880eeba --- /dev/null +++ b/tasks/EIP_2470.ts @@ -0,0 +1,90 @@ +import assert from 'assert' + +import { + Contract, + getCreate2Address, + keccak256, + parseEther, + Signer, +} from 'ethers' + +export async function deployViaFactory( + creationBytecode: string, + salt: string, + deployer: Signer +): Promise { + await maybeDeployFactory(deployer) + + const provider = deployer.provider + assert(provider) + + const factory = new Contract( + factoryInfo.address, + [ + 'function deploy(bytes memory _initCode, bytes32 _salt) public returns (address payable createdContract)', + ], + deployer + ) + + const computedAddress = getCreate2Address( + factoryInfo.address, + salt, + keccak256(creationBytecode) + ) + + if ((await provider.getCode(computedAddress)) != '0x') { + console.log(`✔ Mastercopy already deployed to: ${computedAddress}`) + return computedAddress + } + + const receipt = await ( + await factory.deploy(creationBytecode, salt, { gasLimit: 10000000 }) + ).wait() + + if (receipt?.status == 1) { + console.log( + `\x1B[32m✔ Mastercopy deployed to: ${computedAddress} 🎉\x1B[0m ` + ) + } else { + console.log('\x1B[31m✘ Mastercopy deployment failed.\x1B[0m') + } + + return computedAddress +} + +const factoryInfo = { + address: '0xce0042b868300000d44a59004da54a005ffdcf9f', + deployer: '0xBb6e024b9cFFACB947A71991E386681B1Cd1477D', + transaction: + '0xf9016c8085174876e8008303c4d88080b90154608060405234801561001057600080fd5b50610134806100206000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c80634af63f0214602d575b600080fd5b60cf60048036036040811015604157600080fd5b810190602081018135640100000000811115605b57600080fd5b820183602082011115606c57600080fd5b80359060200191846001830284011164010000000083111715608d57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550509135925060eb915050565b604080516001600160a01b039092168252519081900360200190f35b6000818351602085016000f5939250505056fea26469706673582212206b44f8a82cb6b156bfcc3dc6aadd6df4eefd204bc928a4397fd15dacf6d5320564736f6c634300060200331b83247000822470', +} + +/** + * If it is not deployed on the network, deploys the singleton factory contract + * + * https://eips.ethereum.org/EIPS/eip-2470 + */ +async function maybeDeployFactory(signer: Signer) { + const { provider } = signer + assert(provider) + + // check if singleton factory is deployed. + if ((await provider.getCode(factoryInfo.address)) === '0x') { + // fund the singleton factory deployer account + await signer.sendTransaction({ + to: factoryInfo.deployer, + value: parseEther('0.0247'), + }) + + // deploy the singleton factory + const receipt = await ( + await provider.broadcastTransaction(factoryInfo.transaction) + ).wait() + + if (receipt?.status != 1) { + throw Error( + 'EIP2470 SingletonFactory could not be deployed to correct address, deployment haulted.' + ) + } + } +} diff --git a/tasks/deploy-instance.ts b/tasks/deploy-instance.ts new file mode 100644 index 0000000..873983f --- /dev/null +++ b/tasks/deploy-instance.ts @@ -0,0 +1,58 @@ +import { task, types } from 'hardhat/config' + +task('deploy:instance', 'Deploys a Delay modifier') + .addParam('owner', 'Address of the owner', undefined, types.string) + .addParam( + 'avatar', + 'Address of the avatar (e.g. Safe)', + undefined, + types.string + ) + .addParam('target', 'Address of the target', undefined, types.string) + .addParam( + 'cooldown', + 'Cooldown in seconds that should be required after a oracle provided answer', + 24 * 3600, + types.int, + true + ) + .addParam( + 'expiration', + 'Time duration in seconds for which a positive answer is valid. After this time the answer is expired', + 7 * 24 * 3600, + types.int, + true + ) + .setAction(async (taskArgs, hre) => { + const [deployer] = await hre.ethers.getSigners() + + const Delay = await hre.ethers.getContractFactory('Delay') + const delay = await ( + await Delay.connect(deployer).deploy( + taskArgs.owner, + taskArgs.avatar, + taskArgs.target, + taskArgs.cooldown, + taskArgs.expiration + ) + ).waitForDeployment() + + const address = await delay.getAddress() + + console.log(`\x1B[32m✔ Instance deployed to: ${address} 🎉\x1B[0m `) + + console.log('Waiting 1 minute before etherscan verification start...') + // Etherscan needs some time to process before trying to verify. + await new Promise((resolve) => setTimeout(resolve, 60000)) + + await hre.run('verify:verify', { + address: address, + constructorArguments: [ + taskArgs.owner, + taskArgs.avatar, + taskArgs.target, + taskArgs.cooldown, + taskArgs.expiration, + ], + }) + }) diff --git a/tasks/deploy-mastercopy.ts b/tasks/deploy-mastercopy.ts new file mode 100644 index 0000000..07833c9 --- /dev/null +++ b/tasks/deploy-mastercopy.ts @@ -0,0 +1,38 @@ +import { AbiCoder, ZeroHash } from 'ethers' +import { task } from 'hardhat/config' + +import { deployViaFactory } from './EIP_2470' + +const AddressOne = '0x0000000000000000000000000000000000000001' + +task('deploy:mastercopy', 'Deploys and verifies Delay mastercopy').setAction( + async (_, hre) => { + const [deployer] = await hre.ethers.getSigners() + + const Delay = await hre.ethers.getContractFactory('Delay') + + const args = AbiCoder.defaultAbiCoder().encode( + ['address', 'address', 'address', 'uint256', 'uint256'], + [AddressOne, AddressOne, AddressOne, 0, 0] + ) + + const creationBytecode = `${Delay.bytecode}${args.substring(2)}` + const salt = ZeroHash + const address = await deployViaFactory(creationBytecode, salt, deployer) + + if (hre.network.name == 'hardhat') { + return + } + + console.log('Waiting 1 minute before etherscan verification start...') + // Etherscan needs some time to process before trying to verify. + await new Promise((resolve) => setTimeout(resolve, 60000)) + + await hre.run('verify:verify', { + address, + constructorArguments: [AddressOne, AddressOne, AddressOne, 0, 0], + }) + } +) + +export {} diff --git a/test/FactoryFriendly.spec.ts b/test/FactoryFriendly.spec.ts index 64c905c..0ec38a9 100644 --- a/test/FactoryFriendly.spec.ts +++ b/test/FactoryFriendly.spec.ts @@ -1,4 +1,3 @@ -import { AddressOne } from '@gnosis.pm/safe-contracts' import { loadFixture } from '@nomicfoundation/hardhat-network-helpers' import { expect } from 'chai' import { AbiCoder, keccak256, toUtf8Bytes } from 'ethers' @@ -6,7 +5,7 @@ import hre, { ethers } from 'hardhat' import { Delay__factory } from '../typechain-types' -const FirstAddress = '0x0000000000000000000000000000000000000001' +const AddressOne = '0x0000000000000000000000000000000000000001' describe('Module works with factory', () => { const cooldown = 100 @@ -20,9 +19,9 @@ describe('Module works with factory', () => { const Delay = await hre.ethers.getContractFactory('Delay') const masterCopy = await Delay.deploy( - FirstAddress, - FirstAddress, - FirstAddress, + AddressOne, + AddressOne, + AddressOne, 0, 0 ) diff --git a/tsconfig.json b/tsconfig.json index f0eb094..1cc912c 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -14,5 +14,5 @@ "typechain-types/hardhat.d.ts" ] }, - "include": ["test", "src", "./typechain-types", "./hardhat.config.ts"] + "include": ["test", "tasks", "./typechain-types", "./hardhat.config.ts"] } diff --git a/yarn.lock b/yarn.lock index 71c3b91..4e00e79 100644 --- a/yarn.lock +++ b/yarn.lock @@ -211,7 +211,7 @@ dependencies: "@ethersproject/bignumber" "^5.7.0" -"@ethersproject/contracts@5.7.0", "@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== @@ -377,7 +377,7 @@ elliptic "6.5.4" hash.js "1.1.7" -"@ethersproject/solidity@5.7.0", "@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== @@ -422,7 +422,7 @@ "@ethersproject/constants" "^5.7.0" "@ethersproject/logger" "^5.7.0" -"@ethersproject/wallet@5.7.0", "@ethersproject/wallet@^5.7.0": +"@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== @@ -770,10 +770,10 @@ resolved "https://registry.yarnpkg.com/@nomicfoundation/hardhat-toolbox/-/hardhat-toolbox-3.0.0.tgz#83e2c28a745aa4eb1236072166367b0de68b4c76" integrity sha512-MsteDXd0UagMksqm9KvcFG6gNKYNa3GGNCy73iQ6bEasEgg2v8Qjl6XA5hjs8o5UD5A3153B6W2BIVJ8SxYUtA== -"@nomicfoundation/hardhat-verify@^1.1.1": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@nomicfoundation/hardhat-verify/-/hardhat-verify-1.1.1.tgz#6a433d777ce0172d1f0edf7f2d3e1df14b3ecfc1" - integrity sha512-9QsTYD7pcZaQFEA3tBb/D/oCStYDiEVDN7Dxeo/4SCyHRSm86APypxxdOMEPlGmXsAvd+p1j/dTODcpxb8aztA== +"@nomicfoundation/hardhat-verify@2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@nomicfoundation/hardhat-verify/-/hardhat-verify-2.0.0.tgz#aa5b26827b67e3b82dae595167b32979c527fc39" + integrity sha512-DlzeYWcPtcD82AD1wSsmjPjrbuESSKlY5XMvUYnr5YMQc81yGUc++U3M7ghHo0JSnZEUhXq+hDc8/HkpOZ6h8A== dependencies: "@ethersproject/abi" "^5.1.2" "@ethersproject/address" "^5.0.2" @@ -1146,7 +1146,7 @@ resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.7.3.tgz#3e51a17e291d01d17d3fc61422015a933af7a08f" integrity sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA== -"@types/qs@^6.2.31", "@types/qs@^6.9.7": +"@types/qs@^6.2.31": version "6.9.9" resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.9.tgz#66f7b26288f6799d279edf13da7ccd40d2fa9197" integrity sha512-wYLxw35euwqGvTDx6zfY1vokBFnsK0HNrzc6xNHchxfO2hpuRg74GbkEW7e3sSmPvj0TjCDT1VCa6OtHXnubsg== @@ -1568,13 +1568,6 @@ available-typed-arrays@^1.0.5: resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== -axios@^0.21.1: - version "0.21.4" - resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.4.tgz#c67b90dc0568e5c1cf2b0b858c43ba28e2eda575" - integrity sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg== - dependencies: - follow-redirects "^1.14.0" - axios@^1.5.1: version "1.6.0" resolved "https://registry.yarnpkg.com/axios/-/axios-1.6.0.tgz#f1e5292f26b2fd5c2e66876adc5b06cdbd7d2102" @@ -1838,7 +1831,7 @@ check-error@^1.0.2, check-error@^1.0.3: dependencies: get-func-name "^2.0.2" -chokidar@3.5.3, chokidar@^3.4.0, chokidar@^3.5.2: +chokidar@3.5.3, chokidar@^3.4.0: version "3.5.3" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== @@ -2225,12 +2218,7 @@ emoji-regex@^9.2.2: resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== -encode-utf8@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/encode-utf8/-/encode-utf8-1.0.3.tgz#f30fdd31da07fb596f281beb2f6b027851994cda" - integrity sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw== - -enquirer@^2.3.0, enquirer@^2.3.6: +enquirer@^2.3.0: version "2.4.1" resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.4.1.tgz#93334b3fbd74fc7097b224ab4a8fb7e40bf4ae56" integrity sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ== @@ -2611,7 +2599,7 @@ ethereumjs-util@^7.1.4: ethereum-cryptography "^0.1.3" rlp "^2.2.4" -ethers@^5.7.0, ethers@^5.7.1, ethers@^5.7.2: +ethers@^5.7.1, ethers@^5.7.2: version "5.7.2" resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.7.2.tgz#3a7deeabbb8c030d4126b24f84e525466145872e" integrity sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg== @@ -2647,10 +2635,10 @@ ethers@^5.7.0, ethers@^5.7.1, ethers@^5.7.2: "@ethersproject/web" "5.7.1" "@ethersproject/wordlists" "5.7.0" -ethers@^6.7.1: - version "6.8.0" - resolved "https://registry.yarnpkg.com/ethers/-/ethers-6.8.0.tgz#0a26f57e96fd697cefcfcef464e0c325689d1daf" - integrity sha512-zrFbmQRlraM+cU5mE4CZTLBurZTs2gdp2ld0nG/f3ecBK+x6lZ69KSxBqZ4NjclxwfTxl5LeNufcBbMsTdY53Q== +ethers@^6.8.1: + version "6.8.1" + resolved "https://registry.yarnpkg.com/ethers/-/ethers-6.8.1.tgz#ee2a1a39b5f62a13678f90ccd879175391d0a2b4" + integrity sha512-iEKm6zox5h1lDn6scuRWdIdFJUCGg3+/aQWu0F4K0GVyEZiktFkqrJbRjTn1FlYEPz7RKA707D6g5Kdk6j7Ljg== dependencies: "@adraffy/ens-normalize" "1.10.0" "@noble/curves" "1.2.0" @@ -2807,14 +2795,7 @@ flatted@^3.2.9: resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.9.tgz#7eb4c67ca1ba34232ca9d2d93e9886e611ad7daf" integrity sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ== -fmix@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/fmix/-/fmix-0.1.0.tgz#c7bbf124dec42c9d191cfb947d0a9778dd986c0c" - integrity sha512-Y6hyofImk9JdzU8k5INtTXX1cu8LDlePWDFU5sftm9H+zKCr5SGrVjdhkvsim646cw5zD0nADj8oHyXMZmCZ9w== - dependencies: - imul "^1.0.0" - -follow-redirects@^1.12.1, follow-redirects@^1.14.0, follow-redirects@^1.15.0: +follow-redirects@^1.12.1, follow-redirects@^1.15.0: version "1.15.3" resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.3.tgz#fe2f3ef2690afce7e82ed0b44db08165b207123a" integrity sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q== @@ -2873,15 +2854,6 @@ fs-extra@^0.30.0: path-is-absolute "^1.0.0" rimraf "^2.2.8" -fs-extra@^10.0.0: - version "10.1.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf" - integrity sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ== - dependencies: - graceful-fs "^4.2.0" - jsonfile "^6.0.1" - universalify "^2.0.0" - fs-extra@^7.0.0, fs-extra@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9" @@ -3164,36 +3136,6 @@ handlebars@^4.0.1: optionalDependencies: uglify-js "^3.1.4" -hardhat-deploy@^0.11.37: - version "0.11.43" - resolved "https://registry.yarnpkg.com/hardhat-deploy/-/hardhat-deploy-0.11.43.tgz#b22ff15b3ea201b72ba0f17f4b2e182cc950e73e" - integrity sha512-D760CjDtinwjOCpKOvdyRtIJYLQIYXmhfgkFe+AkxlYM9bPZ/T4tZ/xIB2tR89ZT+z0hF1YuZFBXIL3/G/9T5g== - dependencies: - "@ethersproject/abi" "^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/contracts" "^5.7.0" - "@ethersproject/providers" "^5.7.2" - "@ethersproject/solidity" "^5.7.0" - "@ethersproject/transactions" "^5.7.0" - "@ethersproject/wallet" "^5.7.0" - "@types/qs" "^6.9.7" - axios "^0.21.1" - chalk "^4.1.2" - chokidar "^3.5.2" - debug "^4.3.2" - enquirer "^2.3.6" - ethers "^5.7.0" - form-data "^4.0.0" - fs-extra "^10.0.0" - match-all "^1.2.6" - murmur-128 "^0.2.1" - qs "^6.9.4" - zksync-web3 "^0.14.3" - hardhat-gas-reporter@^1.0.9: version "1.0.9" resolved "https://registry.yarnpkg.com/hardhat-gas-reporter/-/hardhat-gas-reporter-1.0.9.tgz#9a2afb354bc3b6346aab55b1c02ca556d0e16450" @@ -3203,10 +3145,10 @@ hardhat-gas-reporter@^1.0.9: eth-gas-reporter "^0.2.25" sha1 "^1.1.1" -hardhat@^2.12.5: - version "2.18.3" - resolved "https://registry.yarnpkg.com/hardhat/-/hardhat-2.18.3.tgz#8fd01348795c77086fff417a4d13c521dce28fcf" - integrity sha512-JuYaTG+4ZHVjEHCW5Hn6jCHH3LpO75dtgznZpM/dLv12RcSlw/xHbeQh3FAsGahQr1epKryZcZEMHvztVZHe0g== +hardhat@^2.19.0: + version "2.19.0" + resolved "https://registry.yarnpkg.com/hardhat/-/hardhat-2.19.0.tgz#1e08658863550ba351788ea128e544ff80584a31" + integrity sha512-kMpwovOEfrFRQXEopCP+JTcKVwSYVj8rnXE0LynxDqnh06yvyKCQknmXL6IVYTHQL6Csysc/yNbCHQbjSeJGpA== dependencies: "@ethersproject/abi" "^5.1.2" "@metamask/eth-sig-util" "^4.0.0" @@ -3420,11 +3362,6 @@ import-fresh@^3.2.1, import-fresh@^3.3.0: parent-module "^1.0.0" resolve-from "^4.0.0" -imul@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/imul/-/imul-1.0.1.tgz#9d5867161e8b3de96c2c38d5dc7cb102f35e2ac9" - integrity sha512-WFAgfwPLAjU66EKt6vRdTlKj4nAgIDQzh29JonLa4Bqtl6D8JrIMvWjCnx7xEjVNmP3U0fM5o8ZObk7d0f62bA== - imurmurhash@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" @@ -3948,11 +3885,6 @@ markdown-table@^1.1.3: resolved "https://registry.yarnpkg.com/markdown-table/-/markdown-table-1.1.3.tgz#9fcb69bcfdb8717bfd0398c6ec2d93036ef8de60" integrity sha512-1RUZVgQlpJSPWYbFSpmudq5nHY1doEIv89gBtF0s4gW1GF2XorxcA/70M5vq7rLv0a6mhOUccRsqkwhwLCIQ2Q== -match-all@^1.2.6: - version "1.2.6" - resolved "https://registry.yarnpkg.com/match-all/-/match-all-1.2.6.tgz#66d276ad6b49655551e63d3a6ee53e8be0566f8d" - integrity sha512-0EESkXiTkWzrQQntBu2uzKvLu6vVkUGz40nGPbSZuegcfE5UuSzNjLaIu76zJWuaT/2I3Z/8M06OlUOZLGwLlQ== - mcl-wasm@^0.7.1: version "0.7.9" resolved "https://registry.yarnpkg.com/mcl-wasm/-/mcl-wasm-0.7.9.tgz#c1588ce90042a8700c3b60e40efb339fc07ab87f" @@ -4135,15 +4067,6 @@ ms@2.1.3, ms@^2.1.1: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== -murmur-128@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/murmur-128/-/murmur-128-0.2.1.tgz#a9f6568781d2350ecb1bf80c14968cadbeaa4b4d" - integrity sha512-WseEgiRkI6aMFBbj8Cg9yBj/y+OdipwVC7zUo3W2W1JAJITwouUOtpqsmGSg67EQmwwSyod7hsVsWY5LsrfQVg== - dependencies: - encode-utf8 "^1.0.2" - fmix "^0.1.0" - imul "^1.0.0" - nanoid@3.3.3: version "3.3.3" resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.3.tgz#fd8e8b7aa761fe807dba2d1b98fb7241bb724a25" @@ -4542,7 +4465,7 @@ punycode@^2.1.0: resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== -qs@^6.4.0, qs@^6.9.4: +qs@^6.4.0: version "6.11.2" resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.2.tgz#64bea51f12c1f5da1bc01496f48ffcff7c69d7d9" integrity sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA== @@ -5730,8 +5653,3 @@ yocto-queue@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== - -zksync-web3@^0.14.3: - version "0.14.3" - resolved "https://registry.yarnpkg.com/zksync-web3/-/zksync-web3-0.14.3.tgz#64ac2a16d597464c3fc4ae07447a8007631c57c9" - integrity sha512-hT72th4AnqyLW1d5Jlv8N2B/qhEnl2NePK2A3org7tAa24niem/UAaHMkEvmWI3SF9waYUPtqAtjpf+yvQ9zvQ==