diff --git a/.eslintrc b/.eslintrc index 1ea4faa57..9ec2a92ef 100644 --- a/.eslintrc +++ b/.eslintrc @@ -6,7 +6,7 @@ "extends": ["@zero-tech/eslint-config-cpt/node-ts/.eslintrc.json"], "rules": { "no-unused-expressions": "off", - // "no-console": "off", // For debugging + "no-console": "off" // "@typescript-eslint/no-unused-vars": "off" // For debugging } } diff --git a/.gitignore b/.gitignore index 3c8122848..3399b131a 100644 --- a/.gitignore +++ b/.gitignore @@ -10,3 +10,7 @@ typechain-types cache artifacts +# hardhat-tenderly plugin +deployments + +*.env diff --git a/contracts/access/ZNSRoles.sol b/contracts/access/ZNSRoles.sol index 2a19007b9..a6d2facad 100644 --- a/contracts/access/ZNSRoles.sol +++ b/contracts/access/ZNSRoles.sol @@ -12,6 +12,6 @@ abstract contract ZNSRoles { // so we don't have to upgrade all contracts // TODO AC: possibly remove executor role? bytes32 public constant EXECUTOR_ROLE = keccak256("EXECUTOR_ROLE"); - // this role is here specifically for the ZNSEthRegistrar contract + // this role is here specifically for the ZNSRegistrar contract bytes32 public constant REGISTRAR_ROLE = keccak256("REGISTRAR_ROLE"); } diff --git a/contracts/distribution/IZNSEthRegistrar.sol b/contracts/distribution/IZNSRegistrar.sol similarity index 98% rename from contracts/distribution/IZNSEthRegistrar.sol rename to contracts/distribution/IZNSRegistrar.sol index e8dbfb7c3..29ae9f259 100644 --- a/contracts/distribution/IZNSEthRegistrar.sol +++ b/contracts/distribution/IZNSRegistrar.sol @@ -2,7 +2,7 @@ pragma solidity ^0.8.18; -interface IZNSEthRegistrar { +interface IZNSRegistrar { event DomainRegistered( bytes32 indexed domainHash, uint256 indexed tokenId, diff --git a/contracts/distribution/ZNSEthRegistrar.sol b/contracts/distribution/ZNSRegistrar.sol similarity index 87% rename from contracts/distribution/ZNSEthRegistrar.sol rename to contracts/distribution/ZNSRegistrar.sol index ccfcef820..3faa13452 100644 --- a/contracts/distribution/ZNSEthRegistrar.sol +++ b/contracts/distribution/ZNSRegistrar.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.18; -import { IZNSEthRegistrar } from "./IZNSEthRegistrar.sol"; +import { IZNSRegistrar } from "./IZNSRegistrar.sol"; import { IZNSRegistry } from "../registry/IZNSRegistry.sol"; import { IZNSTreasury } from "./IZNSTreasury.sol"; import { IZNSDomainToken } from "../token/IZNSDomainToken.sol"; @@ -10,7 +10,7 @@ import { AccessControlled } from "../access/AccessControlled.sol"; import { UUPSUpgradeable } from "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol"; -contract ZNSEthRegistrar is AccessControlled, UUPSUpgradeable, IZNSEthRegistrar { +contract ZNSRegistrar is AccessControlled, UUPSUpgradeable, IZNSRegistrar { IZNSRegistry public registry; IZNSTreasury public treasury; IZNSDomainToken public domainToken; @@ -19,7 +19,7 @@ contract ZNSEthRegistrar is AccessControlled, UUPSUpgradeable, IZNSEthRegistrar modifier onlyNameOwner(bytes32 domainHash) { require( msg.sender == registry.getDomainOwner(domainHash), - "ZNSEthRegistrar: Not the owner of the Name" + "ZNSRegistrar: Not the owner of the Name" ); _; } @@ -27,13 +27,13 @@ contract ZNSEthRegistrar is AccessControlled, UUPSUpgradeable, IZNSEthRegistrar modifier onlyTokenOwner(bytes32 domainHash) { require( msg.sender == domainToken.ownerOf(uint256(domainHash)), - "ZNSEthRegistrar: Not the owner of the Token" + "ZNSRegistrar: Not the owner of the Token" ); _; } /** - * @notice Create an instance of the ZNSEthRegistrar + * @notice Create an instance of the ZNSRegistrar * for registering ZNS domains and subdomains */ function initialize( @@ -62,7 +62,7 @@ contract ZNSEthRegistrar is AccessControlled, UUPSUpgradeable, IZNSEthRegistrar ) external override returns (bytes32) { require( bytes(name).length != 0, - "ZNSEthRegistrar: Domain Name not provided" + "ZNSRegistrar: Domain Name not provided" ); // Create hash for given domain name @@ -70,7 +70,7 @@ contract ZNSEthRegistrar is AccessControlled, UUPSUpgradeable, IZNSEthRegistrar require( !registry.exists(domainHash), - "ZNSEthRegistrar: Domain already exists" + "ZNSRegistrar: Domain already exists" ); // Staking logic @@ -96,9 +96,9 @@ contract ZNSEthRegistrar is AccessControlled, UUPSUpgradeable, IZNSEthRegistrar // TODO: figure out how to guard this so people can stake tokens // without the risk of staking contract or wallet to call reclaim+revoke // from underneath them - function revokeDomain(bytes32 domainHash) + function revokeDomain(bytes32 domainHash) external - override + override onlyNameOwner(domainHash) onlyTokenOwner(domainHash) { @@ -123,7 +123,7 @@ contract ZNSEthRegistrar is AccessControlled, UUPSUpgradeable, IZNSEthRegistrar function setRegistry(address registry_) public override onlyAdmin { require( registry_ != address(0), - "ZNSEthRegistrar: registry_ is 0x0 address" + "ZNSRegistrar: registry_ is 0x0 address" ); registry = IZNSRegistry(registry_); @@ -133,7 +133,7 @@ contract ZNSEthRegistrar is AccessControlled, UUPSUpgradeable, IZNSEthRegistrar function setTreasury(address treasury_) public override onlyAdmin { require( treasury_ != address(0), - "ZNSEthRegistrar: treasury_ is 0x0 address" + "ZNSRegistrar: treasury_ is 0x0 address" ); treasury = IZNSTreasury(treasury_); @@ -143,7 +143,7 @@ contract ZNSEthRegistrar is AccessControlled, UUPSUpgradeable, IZNSEthRegistrar function setDomainToken(address domainToken_) public override onlyAdmin { require( domainToken_ != address(0), - "ZNSEthRegistrar: domainToken_ is 0x0 address" + "ZNSRegistrar: domainToken_ is 0x0 address" ); domainToken = IZNSDomainToken(domainToken_); @@ -153,7 +153,7 @@ contract ZNSEthRegistrar is AccessControlled, UUPSUpgradeable, IZNSEthRegistrar function setAddressResolver(address addressResolver_) public override onlyAdmin { require( addressResolver_ != address(0), - "ZNSEthRegistrar: addressResolver_ is 0x0 address" + "ZNSRegistrar: addressResolver_ is 0x0 address" ); addressResolver = IZNSAddressResolver(addressResolver_); @@ -162,13 +162,13 @@ contract ZNSEthRegistrar is AccessControlled, UUPSUpgradeable, IZNSEthRegistrar function setAccessController(address accessController_) external - override(AccessControlled, IZNSEthRegistrar) + override(AccessControlled, IZNSRegistrar) onlyAdmin { _setAccessController(accessController_); } - function getAccessController() external view override(AccessControlled, IZNSEthRegistrar) returns (address) { + function getAccessController() external view override(AccessControlled, IZNSRegistrar) returns (address) { return address(accessController); } diff --git a/contracts/upgradeMocks/distribution/ZNSEthRegistrarMock.sol b/contracts/upgradeMocks/distribution/ZNSEthRegistrarMock.sol deleted file mode 100644 index 9f98d9f93..000000000 --- a/contracts/upgradeMocks/distribution/ZNSEthRegistrarMock.sol +++ /dev/null @@ -1,8 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.18; - -import { ZNSEthRegistrar } from "../../distribution/ZNSEthRegistrar.sol"; -import { UpgradeMock } from "../UpgradeMock.sol"; - - /* solhint-disable */ -contract ZNSEthRegistrarUpgradeMock is ZNSEthRegistrar, UpgradeMock {} diff --git a/contracts/upgradeMocks/distribution/ZNSRegistrarMock.sol b/contracts/upgradeMocks/distribution/ZNSRegistrarMock.sol new file mode 100644 index 000000000..a9e7d2390 --- /dev/null +++ b/contracts/upgradeMocks/distribution/ZNSRegistrarMock.sol @@ -0,0 +1,8 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.18; + +import { ZNSRegistrar } from "../../distribution/ZNSRegistrar.sol"; +import { UpgradeMock } from "../UpgradeMock.sol"; + + /* solhint-disable */ +contract ZNSRegistrarUpgradeMock is ZNSRegistrar, UpgradeMock {} diff --git a/hardhat.config.ts b/hardhat.config.ts index f2e6387c5..8801a8c3f 100644 --- a/hardhat.config.ts +++ b/hardhat.config.ts @@ -1,7 +1,8 @@ -// eslint-disable-next-line @typescript-eslint/no-var-requires +/* eslint-disable @typescript-eslint/no-var-requires, @typescript-eslint/no-unused-vars */ require("dotenv").config(); import { HardhatUserConfig } from "hardhat/config"; +import * as tenderly from "@tenderly/hardhat-tenderly"; import "@nomicfoundation/hardhat-toolbox"; import "@nomiclabs/hardhat-ethers"; import "@nomicfoundation/hardhat-network-helpers"; @@ -9,6 +10,7 @@ import "@nomicfoundation/hardhat-chai-matchers"; import "@openzeppelin/hardhat-upgrades"; import "solidity-coverage"; + const config : HardhatUserConfig = { solidity: { compilers: [ @@ -44,10 +46,31 @@ const config : HardhatUserConfig = { url: "https://goerli.infura.io/v3/77c3d733140f4c12a77699e24cb30c27", timeout: 10000000, }, + devnet: { + // Add current URL that you spawned if not using automated spawning + url: `${process.env.DEVNET_RPC_URL}`, + chainId: 1, + }, }, etherscan: { apiKey: `${process.env.ETHERSCAN_API_KEY}`, }, + tenderly: { + project: `${process.env.TENDERLY_PROJECT_SLUG}`, + username: `${process.env.TENDERLY_ACCOUNT_ID}`, + }, }; +// This call is needed to initialize Tenderly with Hardhat, +// the automatic verifications, though, don't seem to work, +// needing us to verify explicitly in code, however, +// for Tenderly to work properly with Hardhat this method +// needs to be called. The call below is commented out +// because if we leave it here, solidity-coverage +// does not work properly locally or in CI, so we +// keep it commented out and uncomment when using DevNet +// locally. +// !!! Uncomment this when using Tenderly DevNet !!! +// tenderly.setup({ automaticVerifications: true }); + export default config; diff --git a/package.json b/package.json index 0ad3633cd..4867acf4e 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,5 @@ { - "name": "zns-contracts", + "name": "@zero-tech/zns-contracts", "version": "0.0.0", "description": "Zero Name Service Smart Contracts", "author": "Zero CPT", @@ -20,7 +20,8 @@ "test": "hardhat test", "semantic-release": "semantic-release --tag-format='v${version}-dev'", "coverage": "hardhat coverage", - "check-coverage": "istanbul check-coverage --statements 90 --branches 87 --functions 89 --lines 90" + "check-coverage": "istanbul check-coverage --statements 90 --branches 87 --functions 89 --lines 90", + "devnet": "ts-node src/tenderly/devnet-execute.ts" }, "pre-commit": [ "lint" @@ -32,10 +33,11 @@ "@nomicfoundation/hardhat-network-helpers": "^1.0.8", "@nomicfoundation/hardhat-toolbox": "2.0.2", "@nomiclabs/hardhat-ethers": "2.2.2", - "@nomiclabs/hardhat-etherscan": "^3.0.0", - "@openzeppelin/contracts": "4.8.2", - "@openzeppelin/contracts-upgradeable": "4.8.2", - "@openzeppelin/hardhat-upgrades": "^1.26.0", + "@nomiclabs/hardhat-etherscan": "3.0.0", + "@openzeppelin/contracts": "4.8.3", + "@openzeppelin/contracts-upgradeable": "4.8.3", + "@openzeppelin/hardhat-upgrades": "1.26.0", + "@tenderly/hardhat-tenderly": "^1.7.4", "@semantic-release/git": "^10.0.1", "@typechain/ethers-v5": "10.1.0", "@typechain/hardhat": "6.1.2", diff --git a/src/tenderly/devnet-execute.ts b/src/tenderly/devnet-execute.ts new file mode 100644 index 000000000..af43a7204 --- /dev/null +++ b/src/tenderly/devnet-execute.ts @@ -0,0 +1,46 @@ +/* eslint-disable @typescript-eslint/no-var-requires, no-console */ +import { promisify } from "util"; +import { exec } from "child_process"; + +const execAsync = promisify(exec); + +const spawnCommand = "ts-node src/tenderly/spawn-devnet.ts"; +const opCommandBase = "npx hardhat run"; +const networkArg = "--network devnet"; +const opsPath = "src/tenderly/run-all-flows.ts"; + +/** + * Top level function to execute everything on the DevNet. + * It executes 2 child processes: + * 1. Spawn a DevNet through the helper and ts-node directly, + * this will also set all the required env vars, so that Hardhat can correctly + * work with contracts and auth in Tenderly + * 2. Launch deploy and operation flow with contracts using Hardhat + * + * To execute this, uncomment `tenderly.setup()` line in the hardhat.config.ts + * then run `yarn devnet` in the terminal. + * */ +const execute = async () => { + // spawn DevNet on Tenderly with ts-node directly + const spawnRes = await execAsync(spawnCommand); + process.stdout.write(spawnRes.stdout); + process.stderr.write(spawnRes.stderr); + + const opCommand = `${opCommandBase} ${opsPath} ${networkArg}`; + + // deploy all contracts, run flows using Hardhat + const opRes = await execAsync(opCommand); + // pass Tenderly logger through + process.stdout.write(opRes.stdout); + process.stderr.write(opRes.stderr); + + return spawnRes; +}; + + +execute() + .then(() => process.exit(0)) + .catch(error => { + console.error(error); + process.exit(1); + }); diff --git a/src/tenderly/run-all-flows.ts b/src/tenderly/run-all-flows.ts new file mode 100644 index 000000000..e3eb2056a --- /dev/null +++ b/src/tenderly/run-all-flows.ts @@ -0,0 +1,52 @@ +import * as hre from "hardhat"; +import * as ethers from "ethers"; +import { deployZNS, hashDomainLabel } from "../../test/helpers"; +import { BigNumber } from "ethers"; + + +const domainName = "wilder"; +const domainHash = hashDomainLabel(domainName); +const tokenId = BigNumber.from(domainHash); + + +export const runAllFlows = async () => { + const [ + governor, + user, + ] = await hre.ethers.getSigners(); + + const zns = await deployZNS({ + deployer: governor, + governorAddresses: [governor.address], + adminAddresses: [governor.address], + logAddresses: true, + }); + + // get some funds for the user + await zns.zeroToken.connect(user).approve(zns.treasury.address, ethers.constants.MaxUint256); + await zns.zeroToken.transfer(user.address, ethers.utils.parseEther("15")); + + // Register Domain + await zns.registrar.connect(governor).registerDomain( + domainName, + user.address, + ); + + // Transfer Domain + await zns.domainToken.connect(governor).transferFrom(governor.address, user.address, tokenId); + + // Reclaim Domain + await zns.registrar.connect(user).reclaimDomain(domainHash); + + // Revoke Domain + await zns.registrar.connect(user).revokeDomain(domainHash); +}; + + +runAllFlows() + .then(() => process.exit(0)) + .catch(error => { + // eslint-disable-next-line no-console + console.error(error); + process.exit(1); + }); diff --git a/src/tenderly/spawn-devnet.ts b/src/tenderly/spawn-devnet.ts new file mode 100644 index 000000000..1e96f1bfb --- /dev/null +++ b/src/tenderly/spawn-devnet.ts @@ -0,0 +1,45 @@ +/* eslint-disable @typescript-eslint/no-var-requires, no-console */ +import fs from "fs"; +import dotenv from "dotenv"; +import util from "util"; +import proc from "child_process"; + +const asyncExec = util.promisify(proc.exec); + +dotenv.config(); + +const { + TENDERLY_ACCESS_KEY, + TENDERLY_PROJECT_SLUG, + TENDERLY_ACCOUNT_ID, + TENDERLY_DEVNET_TEMPLATE, +} = process.env; + +// eslint-disable-next-line max-len +const command = `tenderly devnet spawn-rpc --project ${TENDERLY_PROJECT_SLUG} --template ${TENDERLY_DEVNET_TEMPLATE} --account ${TENDERLY_ACCOUNT_ID} --access_key ${TENDERLY_ACCESS_KEY}`; + + +const spawnDevNet = async () => { + const res = await asyncExec(command); + const upperStr = res.stderr.trim().toString(); + const devNetUrl = upperStr.substring(upperStr.indexOf("https")); + + console.log(`DEVNET_RPC_URL=${ devNetUrl }`); + + // if file doesn't exist, create it + if (!fs.existsSync(".env")) { + fs.writeFileSync(".env", ""); + } + const fileContent = fs.readFileSync(".env", "utf8"); + + const newFileContent = fileContent.replace(/DEVNET_RPC_URL=.*/g, ""); + fs.writeFileSync(".env", newFileContent); + fs.appendFileSync(".env", `DEVNET_RPC_URL=${ devNetUrl }`); +}; + +spawnDevNet() + .then(() => process.exit(0)) + .catch(error => { + console.error(error); + process.exit(1); + }); diff --git a/tenderly.yaml b/tenderly.yaml new file mode 100644 index 000000000..5d6d39a40 --- /dev/null +++ b/tenderly.yaml @@ -0,0 +1,21 @@ +account_id: e750f9f2-65bc-4765-84a8-7f8dbddd73ee +exports: + hardhat: + project_slug: zer0-os/zns + rpc_address: 127.0.0.1:8545 + protocol: "" + forked_network: Mainnet + chain_config: + homestead_block: 0 + eip150_block: 0 + eip150_hash: "0x0000000000000000000000000000000000000000000000000000000000000000" + eip155_block: 0 + eip158_block: 0 + byzantium_block: 0 + constantinople_block: 0 + petersburg_block: 0 + istanbul_block: 0 + berlin_block: 0 + london_block: 0 +project_slug: zns +provider: "" diff --git a/test/ZNSEthRegistrar.test.ts b/test/ZNSEthRegistrar.test.ts index 0565eeee4..1626b7c7f 100644 --- a/test/ZNSEthRegistrar.test.ts +++ b/test/ZNSEthRegistrar.test.ts @@ -19,11 +19,11 @@ import { getDomainHashFromEvent, getTokenIdFromEvent } from "./helpers/events"; import { BigNumber } from "ethers"; import { getAccessRevertMsg } from "./helpers/errors"; import { ADMIN_ROLE, GOVERNOR_ROLE } from "./helpers/access"; -import { ZNSEthRegistrar__factory, ZNSEthRegistrarUpgradeMock__factory } from "../typechain"; +import { ZNSRegistrar__factory, ZNSRegistrarUpgradeMock__factory } from "../typechain"; require("@nomicfoundation/hardhat-chai-matchers"); -describe("ZNSEthRegistrar", () => { +describe("ZNSRegistrar", () => { let deployer : SignerWithAddress; let user : SignerWithAddress; let governor : SignerWithAddress; @@ -63,7 +63,7 @@ describe("ZNSEthRegistrar", () => { const userHasAdmin = await zns.accessController.hasRole(ADMIN_ROLE, user.address); expect(userHasAdmin).to.be.false; - const registrarFactory = new ZNSEthRegistrar__factory(deployer); + const registrarFactory = new ZNSRegistrar__factory(deployer); const registrar = await registrarFactory.connect(user).deploy(); await registrar.deployed(); @@ -84,7 +84,7 @@ describe("ZNSEthRegistrar", () => { await expect( defaultRegistration(deployer, zns, emptyName) - ).to.be.revertedWith("ZNSEthRegistrar: Domain Name not provided"); + ).to.be.revertedWith("ZNSRegistrar: Domain Name not provided"); }); it("Successfully registers a domain without a resolver or resolver content", async () => { @@ -172,7 +172,7 @@ describe("ZNSEthRegistrar", () => { await defaultRegistration(user, zns, defaultDomain); const failTx = defaultRegistration(deployer, zns, defaultDomain); - await expect(failTx).to.be.revertedWith("ZNSEthRegistrar: Domain already exists"); + await expect(failTx).to.be.revertedWith("ZNSRegistrar: Domain already exists"); }); it("Successfully registers a domain without resolver content", async () => { @@ -548,7 +548,7 @@ describe("ZNSEthRegistrar", () => { it("Should revert if ZNSRegistry is address zero", async () => { const tx = zns.registrar.connect(deployer).setRegistry(ethers.constants.AddressZero); - await expect(tx).to.be.revertedWith("ZNSEthRegistrar: registry_ is 0x0 address"); + await expect(tx).to.be.revertedWith("ZNSRegistrar: registry_ is 0x0 address"); }); }); @@ -573,7 +573,7 @@ describe("ZNSEthRegistrar", () => { it("Should revert if Treasury is address zero", async () => { const tx = zns.registrar.connect(deployer).setTreasury(ethers.constants.AddressZero); - await expect(tx).to.be.revertedWith("ZNSEthRegistrar: treasury_ is 0x0 address"); + await expect(tx).to.be.revertedWith("ZNSRegistrar: treasury_ is 0x0 address"); }); }); @@ -598,7 +598,7 @@ describe("ZNSEthRegistrar", () => { it("Should revert if DomainToken is address zero", async () => { const tx = zns.registrar.connect(deployer).setDomainToken(ethers.constants.AddressZero); - await expect(tx).to.be.revertedWith("ZNSEthRegistrar: domainToken_ is 0x0 address"); + await expect(tx).to.be.revertedWith("ZNSRegistrar: domainToken_ is 0x0 address"); }); }); @@ -623,7 +623,7 @@ describe("ZNSEthRegistrar", () => { it("Should revert if AddressResolver is address zero", async () => { const tx = zns.registrar.connect(deployer).setAddressResolver(ethers.constants.AddressZero); - await expect(tx).to.be.revertedWith("ZNSEthRegistrar: addressResolver_ is 0x0 address"); + await expect(tx).to.be.revertedWith("ZNSRegistrar: addressResolver_ is 0x0 address"); }); }); }); @@ -633,7 +633,7 @@ describe("ZNSEthRegistrar", () => { // Confirm deployer has the correct role first await expect(zns.accessController.checkGovernor(deployer.address)).to.not.be.reverted; - const registrarFactory = new ZNSEthRegistrar__factory(deployer); + const registrarFactory = new ZNSRegistrar__factory(deployer); const registrar = await registrarFactory.deploy(); await registrar.deployed(); @@ -642,7 +642,7 @@ describe("ZNSEthRegistrar", () => { }); it("Fails to upgrade when an unauthorized users calls", async () => { - const registrarFactory = new ZNSEthRegistrar__factory(deployer); + const registrarFactory = new ZNSRegistrar__factory(deployer); const registrar = await registrarFactory.deploy(); await registrar.deployed(); @@ -657,7 +657,7 @@ describe("ZNSEthRegistrar", () => { // Confirm deployer has the correct role first await expect(zns.accessController.checkGovernor(deployer.address)).to.not.be.reverted; - const registrarFactory = new ZNSEthRegistrarUpgradeMock__factory(deployer); + const registrarFactory = new ZNSRegistrarUpgradeMock__factory(deployer); const registrar = await registrarFactory.deploy(); await registrar.deployed(); diff --git a/test/helpers/access.ts b/test/helpers/access.ts index 4b66f486b..0ef451509 100644 --- a/test/helpers/access.ts +++ b/test/helpers/access.ts @@ -26,14 +26,21 @@ export const deployAccessController = async ({ deployer, governorAddresses, adminAddresses, + logAddress, } : { deployer : SignerWithAddress; governorAddresses : Array; adminAddresses : Array; + logAddress : boolean; }) : Promise => { const accessControllerFactory = new ZNSAccessController__factory(deployer); const controller = await accessControllerFactory.deploy(); + await controller.deployed(); + await controller.initialize(governorAddresses, adminAddresses); + + if (logAddress) console.log(`AccessController deployed at: ${controller.address}`); + return controller; }; diff --git a/test/helpers/constants.ts b/test/helpers/constants.ts index 610c7704e..1376f897b 100644 --- a/test/helpers/constants.ts +++ b/test/helpers/constants.ts @@ -2,7 +2,7 @@ import { BigNumber } from "ethers"; import { PriceParams } from "./types"; import { ethers } from "hardhat"; -export const ZNS_DOMAIN_TOKEN_NAME = "ZNSDomainToken"; +export const ZNS_DOMAIN_TOKEN_NAME = "ZNS Domain Token"; export const ZNS_DOMAIN_TOKEN_SYMBOL = "ZDT"; export const registrationFeePercDefault = BigNumber.from("222"); @@ -18,3 +18,16 @@ export const priceConfigDefault : PriceParams = { baseSubdomainLength: BigNumber.from(3), priceMultiplier: ethers.BigNumber.from("390"), }; + +export const implSlotErc1967 = "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc"; + +// Contract names +export const accessControllerName = "ZNSAccessController"; +export const registryName = "ZNSRegistry"; +export const domainTokenName = "ZNSDomainToken"; +export const zeroTokenMockName = "ZeroTokenMock"; +export const addressResolverName = "ZNSAddressResolver"; +export const priceOracleName = "ZNSPriceOracle"; +export const treasuryName = "ZNSTreasury"; +export const registrarName = "ZNSRegistrar"; + diff --git a/test/helpers/deployZNS.ts b/test/helpers/deployZNS.ts index 0e70ebb1f..4875afdad 100644 --- a/test/helpers/deployZNS.ts +++ b/test/helpers/deployZNS.ts @@ -6,8 +6,8 @@ import { ZNSAddressResolver__factory, ZNSDomainToken, ZNSDomainToken__factory, - ZNSEthRegistrar, - ZNSEthRegistrar__factory, + ZNSRegistrar, + ZNSRegistrar__factory, ZNSPriceOracle, ZNSPriceOracle__factory, ZNSRegistry, @@ -29,9 +29,11 @@ import { } from "./constants"; import { deployAccessController, REGISTRAR_ROLE } from "./access"; import { BigNumber } from "ethers"; +import { getProxyImplAddress } from "./utils"; export const deployZeroToken = async ( - deployer : SignerWithAddress + deployer : SignerWithAddress, + logAddress : boolean ) => { const factory = new ZeroToken__factory(deployer); @@ -46,6 +48,16 @@ export const deployZeroToken = async ( } ) as ZeroToken; + await zeroToken.deployed(); + + if (logAddress) { + const impl = await getProxyImplAddress(zeroToken.address); + + console.log(`ZeroToken deployed at: + proxy: ${zeroToken.address} + implementation: ${impl}`); + } + const mintAmount = ethers.utils.parseEther("10000"); // Mint 10,000 ZERO for self @@ -59,7 +71,8 @@ export const deployZeroToken = async ( export const deployRegistry = async ( deployer : SignerWithAddress, - accessControllerAddress : string + accessControllerAddress : string, + logAddress : boolean ) : Promise => { const registryFactory = new ZNSRegistry__factory(deployer); const registry = await hre.upgrades.deployProxy( @@ -71,13 +84,24 @@ export const deployRegistry = async ( kind: "uups", }) as ZNSRegistry; + await registry.deployed(); + + if (logAddress) { + const impl = await getProxyImplAddress(registry.address); + + console.log(`ZNSRegistry deployed at: + proxy: ${registry.address} + implementation: ${impl}`); + } + return registry; }; export const deployAddressResolver = async ( deployer : SignerWithAddress, accessControllerAddress : string, - registryAddress : string + registryAddress : string, + logAddress : boolean ) : Promise => { const addressResolverFactory = new ZNSAddressResolver__factory(deployer); @@ -92,6 +116,16 @@ export const deployAddressResolver = async ( } ) as ZNSAddressResolver; + await resolver.deployed(); + + if (logAddress) { + const impl = await getProxyImplAddress(resolver.address); + + console.log(`ZNSAddressResolver deployed at: + proxy: ${resolver.address} + implementation: ${impl}`); + } + return resolver; }; @@ -100,11 +134,13 @@ export const deployPriceOracle = async ({ accessControllerAddress, priceConfig, registrationFee, + logAddress, } : { deployer : SignerWithAddress; accessControllerAddress : string; priceConfig : PriceParams; registrationFee : BigNumber; + logAddress : boolean; }) : Promise => { const priceOracleFactory = new ZNSPriceOracle__factory(deployer); @@ -120,12 +156,23 @@ export const deployPriceOracle = async ({ } ) as ZNSPriceOracle; + await priceOracle.deployed(); + + if (logAddress) { + const impl = await getProxyImplAddress(priceOracle.address); + + console.log(`ZNSPriceOracle deployed at: + proxy: ${priceOracle.address} + implementation: ${impl}`); + } + return priceOracle; }; export const deployDomainToken = async ( deployer : SignerWithAddress, - accessControllerAddress : string + accessControllerAddress : string, + logAddress : boolean ) : Promise => { const domainTokenFactory = new ZNSDomainToken__factory(deployer); const domainToken = await upgrades.deployProxy( @@ -140,14 +187,33 @@ export const deployDomainToken = async ( } ) as ZNSDomainToken; + await domainToken.deployed(); + + if (logAddress) { + const impl = await getProxyImplAddress(domainToken.address); + + console.log(`ZNSDomainToken deployed at: + proxy: ${domainToken.address} + implementation: ${impl}`); + } + return domainToken; }; export const deployZeroTokenMock = async ( - deployer : SignerWithAddress + deployer : SignerWithAddress, + logAddress : boolean ) : Promise => { const zTokenMockMockFactory = new ZeroTokenMock__factory(deployer); - return zTokenMockMockFactory.deploy(deployer.address); + const token = await zTokenMockMockFactory.deploy(deployer.address); + + await token.deployed(); + + if (logAddress) { + console.log(`ZeroTokenMock deployed at: ${token.address}`); + } + + return token; }; export const deployTreasury = async ( @@ -155,7 +221,8 @@ export const deployTreasury = async ( accessControllerAddress : string, priceOracleAddress : string, zTokenMockAddress : string, - zeroVaultAddress : string + zeroVaultAddress : string, + logAddress : boolean ) : Promise => { const treasuryFactory = new ZNSTreasury__factory(deployer); const treasury : ZNSTreasury = await upgrades.deployProxy(treasuryFactory, @@ -170,15 +237,26 @@ export const deployTreasury = async ( } ) as ZNSTreasury; + await treasury.deployed(); + + if (logAddress) { + const impl = await getProxyImplAddress(treasury.address); + + console.log(`ZNSTreasury deployed at: + proxy: ${treasury.address} + implementation: ${impl}`); + } + return treasury; }; export const deployRegistrar = async ( deployer : SignerWithAddress, accessController : ZNSAccessController, - config : RegistrarConfig -) : Promise => { - const registrarFactory = new ZNSEthRegistrar__factory(deployer); + config : RegistrarConfig, + logAddress : boolean +) : Promise => { + const registrarFactory = new ZNSRegistrar__factory(deployer); const registrar = await upgrades.deployProxy( registrarFactory, @@ -192,10 +270,20 @@ export const deployRegistrar = async ( { kind: "uups", } - ) as ZNSEthRegistrar; + ) as ZNSRegistrar; + + await registrar.deployed(); await accessController.connect(deployer).grantRole(REGISTRAR_ROLE, registrar.address); + if (logAddress) { + const impl = await getProxyImplAddress(registrar.address); + + console.log(`ZNSRegistrar deployed at: + proxy: ${registrar.address} + implementation: ${impl}`); + } + return registrar; }; @@ -212,13 +300,8 @@ export const deployZNS = async ({ priceConfig = priceConfigDefault, registrationFeePerc = registrationFeePercDefault, zeroVaultAddress = deployer.address, + logAddresses = false, } : DeployZNSParams) : Promise => { - const accessController = await deployAccessController({ - deployer, - governorAddresses: [deployer.address, ...governorAddresses], - adminAddresses: [deployer.address, ...adminAddresses], - }); - // We deploy every contract as a UUPS proxy, but ZERO is already // deployed as a transparent proxy. This means that there is already // a proxy admin deployed to the network. Because future deployments @@ -226,19 +309,27 @@ export const deployZNS = async ({ // to not clog the test output. await hre.upgrades.silenceWarnings(); - const registry = await deployRegistry(deployer, accessController.address); + const accessController = await deployAccessController({ + deployer, + governorAddresses: [deployer.address, ...governorAddresses], + adminAddresses: [deployer.address, ...adminAddresses], + logAddress: logAddresses, + }); + + const registry = await deployRegistry(deployer, accessController.address, logAddresses); - const domainToken = await deployDomainToken(deployer, accessController.address); + const domainToken = await deployDomainToken(deployer, accessController.address, logAddresses); // While we do use the real ZeroToken contract, it is only deployed as a mock here // for testing purposes that verify expected behavior of other contracts. // This should not be used in any other context than deploying to a local hardhat testnet. - const zeroTokenMock = await deployZeroToken(deployer); + const zeroTokenMock = await deployZeroToken(deployer, logAddresses); const addressResolver = await deployAddressResolver( deployer, accessController.address, - registry.address + registry.address, + logAddresses ); const priceOracle = await deployPriceOracle({ @@ -246,6 +337,7 @@ export const deployZNS = async ({ accessControllerAddress: accessController.address, priceConfig, registrationFee: registrationFeePerc, + logAddress: logAddresses, }); const treasury = await deployTreasury( @@ -253,7 +345,8 @@ export const deployZNS = async ({ accessController.address, priceOracle.address, zeroTokenMock.address, - zeroVaultAddress + zeroVaultAddress, + logAddresses ); const config : RegistrarConfig = { @@ -263,24 +356,20 @@ export const deployZNS = async ({ addressResolverAddress: addressResolver.address, }; - const registrar = await deployRegistrar(deployer, accessController, config); + const registrar = await deployRegistrar(deployer, accessController, config, logAddresses); const znsContracts : ZNSContracts = { accessController, - addressResolver, registry, domainToken, zeroToken: zeroTokenMock, - treasury, + addressResolver, priceOracle, + treasury, registrar, }; - - // TODO verify tests are fine without this line - // await registry.connect(deployer).setOwnerOperator(registrar.address, true); - - // Give allowance to the treasury from the deployer + // Give 15 ZERO to the deployer and allowance to the treasury await zeroTokenMock.connect(deployer).approve(treasury.address, ethers.constants.MaxUint256); return znsContracts; diff --git a/test/helpers/errors.ts b/test/helpers/errors.ts index a8eb80288..14499f120 100644 --- a/test/helpers/errors.ts +++ b/test/helpers/errors.ts @@ -11,9 +11,9 @@ export const ONLY_OWNER_REGISTRAR_REG_ERR = "ZNSRegistry: Only Name Owner or Reg export const NOT_AUTHORIZED_REG_ERR = "ZNSRegistry: Not authorized"; export const OWNER_NOT_ZERO_REG_ERR = "ZNSRegistry: Owner cannot be zero address"; -// ZNSEthRegistrar -export const NOT_NAME_OWNER_RAR_ERR = "ZNSEthRegistrar: Not the owner of the Name"; -export const NOT_TOKEN_OWNER_RAR_ERR = "ZNSEthRegistrar: Not the owner of the Token"; +// ZNSRegistrar +export const NOT_NAME_OWNER_RAR_ERR = "ZNSRegistrar: Not the owner of the Name"; +export const NOT_TOKEN_OWNER_RAR_ERR = "ZNSRegistrar: Not the owner of the Token"; export const MULTIPLIER_OUT_OF_RANGE_ORA_ERR = "ZNSPriceOracle: Multiplier out of range"; export const INVALID_TOKENID_ERC_ERR = "ERC721: invalid token ID"; export const INITIALIZED_ERR = "Initializable: contract is already initialized"; diff --git a/test/helpers/types.ts b/test/helpers/types.ts index c65a772b5..45675fd6d 100644 --- a/test/helpers/types.ts +++ b/test/helpers/types.ts @@ -2,13 +2,13 @@ import { BigNumber } from "ethers"; import { ZNSAddressResolver, ZNSDomainToken, - ZNSEthRegistrar, + ZNSRegistrar, ZNSPriceOracle, ZNSRegistry, ZNSTreasury, ZeroTokenMock, ZNSAccessController, - ZNSEthRegistrarUpgradeMock, + ZNSRegistrarUpgradeMock, ZNSPriceOracleUpgradeMock, ZNSAddressResolverUpgradeMock, ZNSDomainTokenUpgradeMock, @@ -16,7 +16,7 @@ import { ZNSTreasuryUpgradeMock, ZNSAddressResolverUpgradeMock__factory, ZNSDomainTokenUpgradeMock__factory, - ZNSEthRegistrarUpgradeMock__factory, + ZNSRegistrarUpgradeMock__factory, ZNSPriceOracleUpgradeMock__factory, ZNSRegistryUpgradeMock__factory, ZNSTreasuryUpgradeMock__factory, @@ -28,7 +28,7 @@ export type Maybe = T | undefined; export type GetterFunction = Promise>; export type ZNSContractMockFactory = - ZNSEthRegistrarUpgradeMock__factory | + ZNSRegistrarUpgradeMock__factory | ZNSPriceOracleUpgradeMock__factory | ZNSTreasuryUpgradeMock__factory | ZNSRegistryUpgradeMock__factory | @@ -36,7 +36,7 @@ export type ZNSContractMockFactory = ZNSDomainTokenUpgradeMock__factory; export type ZNSContractMock = - ZNSEthRegistrarUpgradeMock | + ZNSRegistrarUpgradeMock | ZNSPriceOracleUpgradeMock | ZNSTreasuryUpgradeMock | ZNSRegistryUpgradeMock | @@ -44,7 +44,7 @@ export type ZNSContractMock = ZNSDomainTokenUpgradeMock; export type ZNSContract = - ZNSEthRegistrar | + ZNSRegistrar | ZNSPriceOracle | ZNSTreasury | ZNSRegistry | @@ -72,13 +72,13 @@ export interface RegistrarConfig { export interface ZNSContracts { accessController : ZNSAccessController; - addressResolver : ZNSAddressResolver; registry : ZNSRegistry; domainToken : ZNSDomainToken; zeroToken : ZeroTokenMock; // TODO fix when real token - treasury : ZNSTreasury; + addressResolver : ZNSAddressResolver; priceOracle : ZNSPriceOracle; - registrar : ZNSEthRegistrar; + treasury : ZNSTreasury; + registrar : ZNSRegistrar; } export interface DeployZNSParams { @@ -88,4 +88,5 @@ export interface DeployZNSParams { priceConfig ?: PriceParams; registrationFeePerc ?: BigNumber; zeroVaultAddress ?: string; -} \ No newline at end of file + logAddresses ?: boolean; +} diff --git a/test/helpers/utils.ts b/test/helpers/utils.ts new file mode 100644 index 000000000..ae369c4a9 --- /dev/null +++ b/test/helpers/utils.ts @@ -0,0 +1,15 @@ +import { ethers, upgrades } from "hardhat"; +import { implSlotErc1967 } from "./constants"; + +export const getProxyImplAddress = async (proxyAddress : string) => { + let impl; + try { + impl = await upgrades.erc1967.getImplementationAddress(proxyAddress); + } catch (e) { + const padded = await ethers.provider.getStorageAt(proxyAddress, implSlotErc1967); + impl = ethers.utils.hexStripZeros(padded); + } + + return impl; +}; + diff --git a/tsconfig.json b/tsconfig.json index 9a841b3bd..89d3cb260 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,7 +1,13 @@ { + "ts-node": { + "compilerOptions": { + "module": "node16" + } + }, "compilerOptions": { - "target": "es2020", - "module": "commonjs", + "target": "es2022", + "module": "node16", + "moduleResolution": "node16", "esModuleInterop": true, "forceConsistentCasingInFileNames": true, "strict": true, diff --git a/yarn.lock b/yarn.lock index 0a2490728..18da015d0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -350,7 +350,7 @@ "@ethersproject/properties" "^5.5.0" "@ethersproject/transactions" "^5.5.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== @@ -564,7 +564,7 @@ bech32 "1.1.4" ws "7.4.6" -"@ethersproject/providers@5.7.2": +"@ethersproject/providers@5.7.2", "@ethersproject/providers@^5.7.2": version "5.7.2" resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.7.2.tgz#f8b1a4f275d7ce58cf0a2eec222269a08beb18cb" integrity sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg== @@ -676,7 +676,7 @@ "@ethersproject/sha2" "^5.5.0" "@ethersproject/strings" "^5.5.0" -"@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== @@ -775,7 +775,7 @@ "@ethersproject/transactions" "^5.5.0" "@ethersproject/wordlists" "^5.5.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== @@ -1162,21 +1162,23 @@ resolved "https://registry.yarnpkg.com/@nomiclabs/hardhat-ethers/-/hardhat-ethers-2.2.2.tgz#812d48929c3bf8fe840ec29eab4b613693467679" integrity sha512-NLDlDFL2us07C0jB/9wzvR0kuLivChJWCXTKcj3yqjZqMoYp7g7wwS157F70VHx/+9gHIBGzak5pKDwG8gEefA== -"@nomiclabs/hardhat-etherscan@^3.0.0": - version "3.1.7" - resolved "https://registry.yarnpkg.com/@nomiclabs/hardhat-etherscan/-/hardhat-etherscan-3.1.7.tgz#72e3d5bd5d0ceb695e097a7f6f5ff6fcbf062b9a" - integrity sha512-tZ3TvSgpvsQ6B6OGmo1/Au6u8BrAkvs1mIC/eURA3xgIfznUZBhmpne8hv7BXUzw9xNL3fXdpOYgOQlVMTcoHQ== +"@nomiclabs/hardhat-ethers@^2.1.1": + version "2.2.3" + resolved "https://registry.yarnpkg.com/@nomiclabs/hardhat-ethers/-/hardhat-ethers-2.2.3.tgz#b41053e360c31a32c2640c9a45ee981a7e603fe0" + integrity sha512-YhzPdzb612X591FOe68q+qXVXGG2ANZRvDo0RRUtimev85rCrAlv/TLMEZw5c+kq9AbzocLTVX/h2jVIFPL9Xg== + +"@nomiclabs/hardhat-etherscan@3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@nomiclabs/hardhat-etherscan/-/hardhat-etherscan-3.0.0.tgz#06e0d59787f01f1296d829e8d43fece50e7ffff1" + integrity sha512-E5s35dCHmzuY6pFqlgTdDGQr2xIyUJ3f91m6e7HYlPGz0FGzad9Nem/y0L7L3FHG4LPYg1UObkQVUzqBjtyAOA== dependencies: "@ethersproject/abi" "^5.1.2" "@ethersproject/address" "^5.0.2" - cbor "^8.1.0" - chalk "^2.4.2" + cbor "^5.0.2" debug "^4.1.1" fs-extra "^7.0.1" - lodash "^4.17.11" + node-fetch "^2.6.0" semver "^6.3.0" - table "^6.8.0" - undici "^5.14.0" "@npmcli/arborist@^6.2.9": version "6.2.9" @@ -1441,20 +1443,20 @@ dependencies: "@octokit/openapi-types" "^18.0.0" -"@openzeppelin/contracts-upgradeable@4.8.2": - version "4.8.2" - resolved "https://registry.yarnpkg.com/@openzeppelin/contracts-upgradeable/-/contracts-upgradeable-4.8.2.tgz#edef522bdbc46d478481391553bababdd2199e27" - integrity sha512-zIggnBwemUmmt9IS73qxi+tumALxCY4QEs3zLCII78k0Gfse2hAOdAkuAeLUzvWUpneMUfFE5sGHzEUSTvn4Ag== +"@openzeppelin/contracts-upgradeable@4.8.3": + version "4.8.3" + resolved "https://registry.yarnpkg.com/@openzeppelin/contracts-upgradeable/-/contracts-upgradeable-4.8.3.tgz#6b076a7b751811b90fe3a172a7faeaa603e13a3f" + integrity sha512-SXDRl7HKpl2WDoJpn7CK/M9U4Z8gNXDHHChAKh0Iz+Wew3wu6CmFYBeie3je8V0GSXZAIYYwUktSrnW/kwVPtg== -"@openzeppelin/contracts@4.8.2": - version "4.8.2" - resolved "https://registry.yarnpkg.com/@openzeppelin/contracts/-/contracts-4.8.2.tgz#d815ade0027b50beb9bcca67143c6bcc3e3923d6" - integrity sha512-kEUOgPQszC0fSYWpbh2kT94ltOJwj1qfT2DWo+zVttmGmf97JZ99LspePNaeeaLhCImaHVeBbjaQFZQn7+Zc5g== +"@openzeppelin/contracts@4.8.3": + version "4.8.3" + resolved "https://registry.yarnpkg.com/@openzeppelin/contracts/-/contracts-4.8.3.tgz#cbef3146bfc570849405f59cba18235da95a252a" + integrity sha512-bQHV8R9Me8IaJoJ2vPG4rXcL7seB7YVuskr4f+f5RyOStSZetwzkWtoqDMl5erkBJy0lDRUnIR2WIkPiC0GJlg== -"@openzeppelin/hardhat-upgrades@^1.26.0": - version "1.27.0" - resolved "https://registry.yarnpkg.com/@openzeppelin/hardhat-upgrades/-/hardhat-upgrades-1.27.0.tgz#0e304041d72c97979c76466137b48733120270fd" - integrity sha512-+OwrHWDz9tzpmBev6t2CtZM2tRpy/ybhg5e3GIgyeqTxK2vUV40dxIxO6lie+qKeJHZ2RIdDwvSTSiCEJif+fA== +"@openzeppelin/hardhat-upgrades@1.26.0": + version "1.26.0" + resolved "https://registry.yarnpkg.com/@openzeppelin/hardhat-upgrades/-/hardhat-upgrades-1.26.0.tgz#a1c667c6fd59fa90d026bab461486ea2bffb948f" + integrity sha512-ggCvdIf7A9QcMedCaswecgt3N7hacx3qYOn+4bNPqMAwslo/SJ9vN4AhV0VWkDcY4CqFFou3RFQmDWNeLMBX9A== dependencies: "@openzeppelin/upgrades-core" "^1.26.2" chalk "^4.1.0" @@ -1707,6 +1709,21 @@ dependencies: antlr4ts "^0.5.0-alpha.4" +"@tenderly/hardhat-tenderly@^1.7.4": + version "1.7.7" + resolved "https://registry.yarnpkg.com/@tenderly/hardhat-tenderly/-/hardhat-tenderly-1.7.7.tgz#b320ee6bea3779e4781eb0299a3a816cbdc83def" + integrity sha512-p/jLzRPpoD7J0LGvUFEQjgniDzmP5AzfTgy41qqzyjhOsW0voe7wZI8lXjadl5MEr7rAXN1iH3VncT13qG6+Zw== + dependencies: + "@ethersproject/bignumber" "^5.7.0" + "@nomiclabs/hardhat-ethers" "^2.1.1" + axios "^0.27.2" + ethers "^5.7.0" + fs-extra "^10.1.0" + hardhat-deploy "^0.11.14" + js-yaml "^4.1.0" + tenderly "^0.5.3" + tslog "^4.3.1" + "@tootallnate/once@2": version "2.0.0" resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-2.0.0.tgz#f544a148d3ab35801c1f633a7441fd87c2e484bf" @@ -1886,7 +1903,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.2.31", "@types/qs@^6.9.7": version "6.9.7" resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.7.tgz#63bb7d067db107cc1e457c303bc25d511febf6cb" integrity sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw== @@ -2050,6 +2067,14 @@ abstract-level@^1.0.0, abstract-level@^1.0.2, abstract-level@^1.0.3: module-error "^1.0.1" queue-microtask "^1.2.3" +accepts@~1.3.8: + version "1.3.8" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" + integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== + dependencies: + mime-types "~2.1.34" + negotiator "0.6.3" + acorn-jsx@^5.3.2: version "5.3.2" resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" @@ -2317,6 +2342,11 @@ array-buffer-byte-length@^1.0.0: call-bind "^1.0.2" is-array-buffer "^3.0.1" +array-flatten@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" + integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== + array-ify@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/array-ify/-/array-ify-1.0.0.tgz#9e528762b4a9066ad163a6962a364418e9626ece" @@ -2462,13 +2492,21 @@ aws4@^1.8.0: resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.12.0.tgz#ce1c9d143389679e253b314241ea9aa5cec980d3" integrity sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg== -axios@^0.21.2: +axios@^0.21.1, axios@^0.21.2: 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@^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" + balanced-match@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" @@ -2553,6 +2591,24 @@ bn.js@^5.1.2, bn.js@^5.2.0, bn.js@^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.20.1: + version "1.20.1" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.1.tgz#b1812a8912c195cd371a3ee5e66faa2338a5c668" + integrity sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw== + dependencies: + bytes "3.1.2" + content-type "~1.0.4" + debug "2.6.9" + depd "2.0.0" + destroy "1.2.0" + http-errors "2.0.0" + iconv-lite "0.4.24" + on-finished "2.4.1" + qs "6.11.0" + raw-body "2.5.1" + type-is "~1.6.18" + unpipe "1.0.0" + bottleneck@^2.15.3: version "2.19.5" resolved "https://registry.yarnpkg.com/bottleneck/-/bottleneck-2.19.5.tgz#5df0b90f59fd47656ebe63c78a98419205cadd91" @@ -2828,7 +2884,7 @@ chokidar@3.3.0: optionalDependencies: fsevents "~2.1.1" -chokidar@3.5.3, chokidar@^3.4.0: +chokidar@3.5.3, chokidar@^3.4.0, chokidar@^3.5.2: version "3.5.3" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== @@ -2930,7 +2986,7 @@ cli-table3@^0.5.0: optionalDependencies: colors "^1.1.2" -cli-table3@^0.6.3: +cli-table3@^0.6.2, cli-table3@^0.6.3: version "0.6.3" resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.6.3.tgz#61ab765aac156b52f222954ffc607a6f01dbeeb2" integrity sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg== @@ -3032,7 +3088,7 @@ columnify@^1.6.0: strip-ansi "^6.0.1" wcwidth "^1.0.0" -combined-stream@^1.0.6, combined-stream@~1.0.6: +combined-stream@^1.0.6, combined-stream@^1.0.8, combined-stream@~1.0.6: version "1.0.8" resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== @@ -3074,6 +3130,11 @@ commander@^10.0.0: resolved "https://registry.yarnpkg.com/commander/-/commander-10.0.1.tgz#881ee46b4f77d1c1dccc5823433aa39b022cbe06" integrity sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug== +commander@^9.4.0: + version "9.5.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-9.5.0.tgz#bc08d1eb5cedf7ccb797a96199d41c7bc3e60d30" + integrity sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ== + comment-parser@1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/comment-parser/-/comment-parser-1.3.1.tgz#3d7ea3adaf9345594aedee6563f422348f165c1b" @@ -3130,6 +3191,13 @@ console-control-strings@^1.1.0: resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" integrity sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ== +content-disposition@0.5.4: + version "0.5.4" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" + integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== + dependencies: + safe-buffer "5.2.1" + content-hash@^2.5.2: version "2.5.2" resolved "https://registry.yarnpkg.com/content-hash/-/content-hash-2.5.2.tgz#bbc2655e7c21f14fd3bfc7b7d4bfe6e454c9e211" @@ -3139,6 +3207,11 @@ content-hash@^2.5.2: multicodec "^0.5.5" multihashes "^0.4.15" +content-type@~1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918" + integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== + conventional-changelog-angular@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/conventional-changelog-angular/-/conventional-changelog-angular-6.0.0.tgz#a9a9494c28b7165889144fd5b91573c4aa9ca541" @@ -3177,6 +3250,16 @@ conventional-commits-parser@^4.0.0: meow "^8.1.2" split2 "^3.2.2" +cookie-signature@1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" + integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== + +cookie@0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b" + integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== + cookie@^0.4.1: version "0.4.2" resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.2.tgz#0e41f24de5ecf317947c82fc789e06a884824432" @@ -3291,6 +3374,13 @@ death@^1.1.0: resolved "https://registry.yarnpkg.com/death/-/death-1.1.0.tgz#01aa9c401edd92750514470b8266390c66c67318" integrity sha512-vsV6S4KVHvTGxbEcij7hkWRv0It+sGGWVOM67dQde/o5Xjnr+KmLjxWJii2uEObIrt1CcM9w0Yaovx+iOlIL+w== +debug@2.6.9: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + debug@3.2.6: version "3.2.6" resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" @@ -3372,6 +3462,11 @@ defender-base-client@^1.44.0: lodash "^4.17.19" node-fetch "^2.6.0" +define-lazy-prop@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f" + integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== + define-properties@^1.1.2, define-properties@^1.1.3, define-properties@^1.1.4, define-properties@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.0.tgz#52988570670c9eacedd8064f4a990f2405849bd5" @@ -3400,6 +3495,11 @@ deprecation@^2.0.0: resolved "https://registry.yarnpkg.com/deprecation/-/deprecation-2.3.1.tgz#6368cbdb40abf3373b525ac87e4a260c3a700919" integrity sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ== +destroy@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" + integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== + detect-port@^1.3.0: version "1.5.1" resolved "https://registry.yarnpkg.com/detect-port/-/detect-port-1.5.1.tgz#451ca9b6eaf20451acb0799b8ab40dff7718727b" @@ -3488,6 +3588,11 @@ ecc-jsbn@~0.1.1: jsbn "~0.1.0" safer-buffer "^2.1.0" +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== + elliptic@6.5.4, elliptic@^6.5.2, elliptic@^6.5.4: version "6.5.4" resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" @@ -3516,6 +3621,16 @@ 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== + +encodeurl@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== + encoding@^0.1.13: version "0.1.13" resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9" @@ -3523,7 +3638,7 @@ encoding@^0.1.13: dependencies: iconv-lite "^0.6.2" -enquirer@^2.3.0: +enquirer@^2.3.0, enquirer@^2.3.6: version "2.3.6" resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== @@ -3630,6 +3745,11 @@ escalade@^3.1.1: resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== +escape-html@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== + escape-string-regexp@1.0.5, escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" @@ -3850,6 +3970,11 @@ esutils@^2.0.2: resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== +etag@~1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== + eth-ens-namehash@^2.0.8: version "2.0.8" resolved "https://registry.yarnpkg.com/eth-ens-namehash/-/eth-ens-namehash-2.0.8.tgz#229ac46eca86d52e0c991e7cb2aef83ff0f68bcf" @@ -4000,7 +4125,7 @@ ethers@^4.0.40: uuid "2.0.1" xmlhttprequest "1.8.0" -ethers@^5.0.13: +ethers@^5.0.13, ethers@^5.5.3, ethers@^5.7.0: version "5.7.2" resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.7.2.tgz#3a7deeabbb8c030d4126b24f84e525466145872e" integrity sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg== @@ -4105,6 +4230,43 @@ exponential-backoff@^3.1.1: resolved "https://registry.yarnpkg.com/exponential-backoff/-/exponential-backoff-3.1.1.tgz#64ac7526fe341ab18a39016cd22c787d01e00bf6" integrity sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw== +express@^4.18.1: + version "4.18.2" + resolved "https://registry.yarnpkg.com/express/-/express-4.18.2.tgz#3fabe08296e930c796c19e3c516979386ba9fd59" + integrity sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ== + dependencies: + accepts "~1.3.8" + array-flatten "1.1.1" + body-parser "1.20.1" + content-disposition "0.5.4" + content-type "~1.0.4" + cookie "0.5.0" + cookie-signature "1.0.6" + debug "2.6.9" + depd "2.0.0" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + finalhandler "1.2.0" + fresh "0.5.2" + http-errors "2.0.0" + merge-descriptors "1.0.1" + methods "~1.1.2" + on-finished "2.4.1" + parseurl "~1.3.3" + path-to-regexp "0.1.7" + proxy-addr "~2.0.7" + qs "6.11.0" + range-parser "~1.2.1" + safe-buffer "5.2.1" + send "0.18.0" + serve-static "1.15.0" + setprototypeof "1.2.0" + statuses "2.0.1" + type-is "~1.6.18" + utils-merge "1.0.1" + vary "~1.1.2" + extend@~3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" @@ -4197,6 +4359,19 @@ fill-range@^7.0.1: dependencies: to-regex-range "^5.0.1" +finalhandler@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.2.0.tgz#7d23fe5731b207b4640e4fcd00aec1f9207a7b32" + integrity sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg== + dependencies: + debug "2.6.9" + encodeurl "~1.0.2" + escape-html "~1.0.3" + on-finished "2.4.1" + parseurl "~1.3.3" + statuses "2.0.1" + unpipe "~1.0.0" + find-replace@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/find-replace/-/find-replace-3.0.0.tgz#3e7e23d3b05167a76f770c9fbd5258b0def68c38" @@ -4282,7 +4457,14 @@ flatted@^3.1.0: resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.7.tgz#609f39207cb614b89d0765b477cb2d437fbf9787" integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ== -follow-redirects@^1.12.1, follow-redirects@^1.14.0: +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.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== @@ -4316,6 +4498,15 @@ form-data@^2.2.0: combined-stream "^1.0.6" mime-types "^2.1.12" +form-data@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" + integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + mime-types "^2.1.12" + form-data@~2.3.2: version "2.3.3" resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" @@ -4325,6 +4516,11 @@ form-data@~2.3.2: combined-stream "^1.0.6" mime-types "^2.1.12" +forwarded@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" + integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== + fp-ts@1.19.3: version "1.19.3" resolved "https://registry.yarnpkg.com/fp-ts/-/fp-ts-1.19.3.tgz#261a60d1088fbff01f91256f91d21d0caaaaa96f" @@ -4335,6 +4531,11 @@ fp-ts@^1.0.0: resolved "https://registry.yarnpkg.com/fp-ts/-/fp-ts-1.19.5.tgz#3da865e585dfa1fdfd51785417357ac50afc520a" integrity sha512-wDNqTimnzs8QqpldiId9OavWK2NptormjXnRJTQecNjzwfyp6P/8s/zG8e4h3ja3oqkKaY72UlTjQYt/1yXf9A== +fresh@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== + from2@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af" @@ -4354,6 +4555,15 @@ fs-extra@^0.30.0: path-is-absolute "^1.0.0" rimraf "^2.2.8" +fs-extra@^10.0.0, fs-extra@^10.1.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@^11.0.0: version "11.1.1" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.1.1.tgz#da69f7c39f3b002378b0954bb6ae7efdc0876e2d" @@ -4777,6 +4987,36 @@ hard-rejection@^2.1.0: resolved "https://registry.yarnpkg.com/hard-rejection/-/hard-rejection-2.1.0.tgz#1c6eda5c1685c63942766d79bb40ae773cecd883" integrity sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA== +hardhat-deploy@^0.11.14: + version "0.11.30" + resolved "https://registry.yarnpkg.com/hardhat-deploy/-/hardhat-deploy-0.11.30.tgz#d47203b584446dce8136ac6d0a96fce2827fb532" + integrity sha512-FpMP1zSa24NEARVh/vwFCJJa9Gws3SBRZbVIDYMIvleoH3yOwFcdWY68zfGoxrm4kRHNcaiVNAXVFTm0enKR0A== + 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.5.3" + 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.8: version "1.0.8" resolved "https://registry.yarnpkg.com/hardhat-gas-reporter/-/hardhat-gas-reporter-1.0.8.tgz#93ce271358cd748d9c4185dbb9d1d5525ec145e0" @@ -5058,6 +5298,11 @@ humanize-ms@^1.2.1: dependencies: ms "^2.0.0" +hyperlinker@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/hyperlinker/-/hyperlinker-1.0.0.tgz#23dc9e38a206b208ee49bc2d6c8ef47027df0c0e" + integrity sha512-Ty8UblRWFEcfSuIaajM34LdPXIhbs1ajEX/BBPv24J+enSVaEVY63xQ6lTO9VRYS5LAoghIG0IDJ+p+IPzKUQQ== + iconv-lite@0.4.24: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" @@ -5114,6 +5359,11 @@ import-from@^4.0.0: resolved "https://registry.yarnpkg.com/import-from/-/import-from-4.0.0.tgz#2710b8d66817d232e16f4166e319248d3d5492e2" integrity sha512-P9J71vT5nLlDeV8FHs5nNxaLbrpfAV5cF5srvbZfpwpcJoM/xZR3hiv+q+SAnuSmuGbXMWud063iIMx/V/EWZQ== +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" @@ -5209,6 +5459,11 @@ ip@^2.0.0: resolved "https://registry.yarnpkg.com/ip/-/ip-2.0.0.tgz#4cf4ab182fee2314c75ede1276f8c80b479936da" integrity sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ== +ipaddr.js@1.9.1: + version "1.9.1" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" + integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== + is-array-buffer@^3.0.1, is-array-buffer@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.2.tgz#f2653ced8412081638ecb0ebbd0c41c6e0aecbbe" @@ -5276,6 +5531,11 @@ is-date-object@^1.0.1: dependencies: has-tostringtag "^1.0.0" +is-docker@^2.0.0, is-docker@^2.1.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" + integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== + is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" @@ -5441,6 +5701,13 @@ is-weakref@^1.0.2: dependencies: call-bind "^1.0.2" +is-wsl@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" + integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== + dependencies: + is-docker "^2.0.0" + isarray@^1.0.0, isarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" @@ -5673,6 +5940,11 @@ klaw@^1.0.0: optionalDependencies: graceful-fs "^4.1.9" +kleur@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" + integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== + lcid@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" @@ -6067,6 +6339,11 @@ marked@^5.0.0: resolved "https://registry.yarnpkg.com/marked/-/marked-5.1.0.tgz#cf51f03ba04dfb3469774029fd0106d258658767" integrity sha512-z3/nBe7aTI8JDszlYLk7dDVNpngjw0o1ZJtrA9kIfkkHcIF+xH7mO23aISl4WxP83elU+MFROgahqdpd05lMEQ== +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" @@ -6081,6 +6358,11 @@ md5.js@^1.3.4: inherits "^2.0.1" safe-buffer "^5.1.2" +media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== + memory-level@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/memory-level/-/memory-level-1.0.0.tgz#7323c3fd368f9af2f71c3cd76ba403a17ac41692" @@ -6112,6 +6394,11 @@ meow@^8.1.2: type-fest "^0.18.0" yargs-parser "^20.2.3" +merge-descriptors@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" + integrity sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w== + merge-stream@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" @@ -6122,6 +6409,11 @@ merge2@^1.2.3, merge2@^1.3.0, merge2@^1.4.1: resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== +methods@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== + micromatch@^4.0.0, micromatch@^4.0.2, micromatch@^4.0.4: version "4.0.5" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" @@ -6135,13 +6427,18 @@ mime-db@1.52.0: resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== -mime-types@^2.1.12, mime-types@~2.1.19: +mime-types@^2.1.12, mime-types@~2.1.19, mime-types@~2.1.24, mime-types@~2.1.34: version "2.1.35" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== dependencies: mime-db "1.52.0" +mime@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" + integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== + mime@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/mime/-/mime-3.0.0.tgz#b374550dca3a0c18443b0c950a6a58f1931cf7a7" @@ -6416,6 +6713,11 @@ module-error@^1.0.1, module-error@^1.0.2: resolved "https://registry.yarnpkg.com/module-error/-/module-error-1.0.2.tgz#8d1a48897ca883f47a45816d4fb3e3c6ba404d86" integrity sha512-0yuvsqSCv8LbaOKhnsQ/T5JhyFlCYLPXK3U2sgV10zoKQwzs/MyfuQUOZQ1V/6OCOJsK/TRgNVrPuPDqtdMFtA== +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== + ms@2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" @@ -6471,6 +6773,15 @@ multihashes@^0.4.15, multihashes@~0.4.15: multibase "^0.7.0" varint "^5.0.0" +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" + mute-stream@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-1.0.0.tgz#e31bd9fe62f0aed23520aa4324ea6671531e013e" @@ -6501,7 +6812,7 @@ natural-compare@^1.4.0: resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== -negotiator@^0.6.3: +negotiator@0.6.3, negotiator@^0.6.3: version "0.6.3" resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== @@ -6900,6 +7211,13 @@ obliterator@^2.0.0: resolved "https://registry.yarnpkg.com/obliterator/-/obliterator-2.0.4.tgz#fa650e019b2d075d745e44f1effeb13a2adbe816" integrity sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ== +on-finished@2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" + integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== + dependencies: + ee-first "1.1.1" + once@1.x, once@^1.3.0, once@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" @@ -6921,6 +7239,15 @@ onetime@^6.0.0: dependencies: mimic-fn "^4.0.0" +open@^8.4.0: + version "8.4.2" + resolved "https://registry.yarnpkg.com/open/-/open-8.4.2.tgz#5b5ffe2a8f793dcd2aad73e550cb87b59cb084f9" + integrity sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ== + dependencies: + define-lazy-prop "^2.0.0" + is-docker "^2.1.1" + is-wsl "^2.2.0" + optionator@^0.8.1: version "0.8.3" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" @@ -7157,6 +7484,11 @@ parse-json@^7.0.0: lines-and-columns "^2.0.3" type-fest "^3.8.0" +parseurl@~1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" + integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== + path-exists@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" @@ -7207,6 +7539,11 @@ path-scurry@^1.7.0: lru-cache "^9.1.1" minipass "^5.0.0 || ^6.0.2" +path-to-regexp@0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" + integrity sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ== + path-type@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" @@ -7366,6 +7703,14 @@ promise@^8.0.0: dependencies: asap "~2.0.6" +prompts@^2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" + integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== + dependencies: + kleur "^3.0.3" + sisteransi "^1.0.5" + promzard@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/promzard/-/promzard-1.0.0.tgz#3246f8e6c9895a77c0549cefb65828ac0f6c006b" @@ -7387,6 +7732,14 @@ proto-list@~1.2.1: resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849" integrity sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA== +proxy-addr@~2.0.7: + version "2.0.7" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" + integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== + dependencies: + forwarded "0.2.0" + ipaddr.js "1.9.1" + psl@^1.1.28: version "1.9.0" resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7" @@ -7407,7 +7760,14 @@ qrcode-terminal@^0.12.0: resolved "https://registry.yarnpkg.com/qrcode-terminal/-/qrcode-terminal-0.12.0.tgz#bb5b699ef7f9f0505092a3748be4464fe71b5819" integrity sha512-EXtzRZmC+YGmGlDFbXKxQiMZNwCLEO6BANKXG4iCtSIM0yqc/pappSx3RIKr4r0uh5JsBckOXeKrB3Iz7mdQpQ== -qs@^6.4.0, qs@^6.7.0: +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.4.0, qs@^6.7.0, qs@^6.9.4: version "6.11.2" resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.2.tgz#64bea51f12c1f5da1bc01496f48ffcff7c69d7d9" integrity sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA== @@ -7436,6 +7796,21 @@ randombytes@^2.1.0: dependencies: safe-buffer "^5.1.0" +range-parser@~1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" + integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== + +raw-body@2.5.1: + version "2.5.1" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.1.tgz#fe1b1628b181b700215e5fd42389f98b71392857" + integrity sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig== + dependencies: + bytes "3.1.2" + http-errors "2.0.0" + iconv-lite "0.4.24" + unpipe "1.0.0" + raw-body@^2.4.1: version "2.5.2" resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.2.tgz#99febd83b90e08975087e8f1f9419a149366b68a" @@ -7847,7 +8222,7 @@ safe-array-concat@^1.0.0: has-symbols "^1.0.3" isarray "^2.0.5" -safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0: +safe-buffer@5.2.1, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== @@ -7973,6 +8348,25 @@ semver@^7.0.0, semver@^7.1.1, semver@^7.1.2, semver@^7.3.2, semver@^7.3.4, semve dependencies: lru-cache "^6.0.0" +send@0.18.0: + version "0.18.0" + resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" + integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg== + dependencies: + debug "2.6.9" + depd "2.0.0" + destroy "1.2.0" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + fresh "0.5.2" + http-errors "2.0.0" + mime "1.6.0" + ms "2.1.3" + on-finished "2.4.1" + range-parser "~1.2.1" + statuses "2.0.1" + serialize-javascript@6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz#efae5d88f45d7924141da8b5c3a7a7e663fefeb8" @@ -7980,6 +8374,16 @@ serialize-javascript@6.0.0: dependencies: randombytes "^2.1.0" +serve-static@1.15.0: + version "1.15.0" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.15.0.tgz#faaef08cffe0a1a62f60cad0c4e513cff0ac9540" + integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g== + dependencies: + encodeurl "~1.0.2" + escape-html "~1.0.3" + parseurl "~1.3.3" + send "0.18.0" + set-blocking@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" @@ -8082,6 +8486,11 @@ sigstore@^1.3.0, sigstore@^1.4.0, sigstore@^1.5.0: make-fetch-happen "^11.0.1" tuf-js "^1.1.3" +sisteransi@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" + integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== + slash@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" @@ -8617,6 +9026,21 @@ tempy@^3.0.0: type-fest "^2.12.2" unique-string "^3.0.0" +tenderly@^0.5.3: + version "0.5.3" + resolved "https://registry.yarnpkg.com/tenderly/-/tenderly-0.5.3.tgz#115653ff33fc33e3be41ab7dd669fdbe0f28a6fb" + integrity sha512-sR+sbZKZzt3b2+moXJsrkBvbava1/4mGulIfuZw8bwr2OpCH8N00dME1t89JC8RjVnQjy4VewVFHyWANdn5zYQ== + dependencies: + axios "^0.27.2" + cli-table3 "^0.6.2" + commander "^9.4.0" + express "^4.18.1" + hyperlinker "^1.0.0" + js-yaml "^4.1.0" + open "^8.4.0" + prompts "^2.4.2" + tslog "^4.4.0" + testrpc@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/testrpc/-/testrpc-0.0.1.tgz#83e2195b1f5873aec7be1af8cbe6dcf39edb7aed" @@ -8768,6 +9192,11 @@ tslib@^2.3.1, tslib@^2.5.0: resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.5.3.tgz#24944ba2d990940e6e982c4bea147aba80209913" integrity sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w== +tslog@^4.3.1, tslog@^4.4.0: + version "4.8.2" + resolved "https://registry.yarnpkg.com/tslog/-/tslog-4.8.2.tgz#dbb0c96249e387e8a711ae6e077330ba1ef102c9" + integrity sha512-eAKIRjxfSKYLs06r1wT7oou6Uv9VN6NW9g0JPidBlqQwPBBl5+84dm7r8zSOPVq1kyfEw1P6B3/FLSpZCorAgA== + tsort@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/tsort/-/tsort-0.0.1.tgz#e2280f5e817f8bf4275657fd0f9aebd44f5a2786" @@ -8875,6 +9304,14 @@ type-fest@^3.0.0, type-fest@^3.8.0: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-3.11.1.tgz#d8e62c7f42e14537d5b8796de5450d541f3a33a7" integrity sha512-aCuRNRERRVh33lgQaJRlUxZqzfhzwTrsE98Mc3o3VXqmiaQdHacgUtJ0esp+7MvZ92qhtzKPeusaX6vIEcoreA== +type-is@~1.6.18: + version "1.6.18" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" + integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== + dependencies: + media-typer "0.3.0" + mime-types "~2.1.24" + typechain@8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/typechain/-/typechain-8.1.0.tgz#fc4902ce596519cb2ccfd012e4ddf92a9945b569" @@ -8983,7 +9420,7 @@ universalify@^2.0.0: resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== -unpipe@1.0.0: +unpipe@1.0.0, unpipe@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== @@ -9010,6 +9447,11 @@ util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== +utils-merge@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" + integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== + uuid@2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/uuid/-/uuid-2.0.1.tgz#c2a30dedb3e535d72ccf82e343941a50ba8533ac" @@ -9050,6 +9492,11 @@ varint@^5.0.0: resolved "https://registry.yarnpkg.com/varint/-/varint-5.0.2.tgz#5b47f8a947eb668b848e034dcfa87d0ff8a7f7a4" integrity sha512-lKxKYG6H03yCZUpAGOPOsMcGxd1RHCu1iKvEHYDPmTyq2HueGhD73ssNBqqQWfvYs04G9iUFRvmAVLW20Jw6ow== +vary@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== + verror@1.10.0: version "1.10.0" resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" @@ -9412,3 +9859,8 @@ yocto-queue@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-1.0.0.tgz#7f816433fb2cbc511ec8bf7d263c3b58a1a3c251" integrity sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g== + +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==