diff --git a/.circleci/config.yml b/.circleci/config.yml index a3e13bdae..f1b38ff91 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -7,7 +7,7 @@ orbs: defaults: &defaults working_directory: ~/repo docker: - - image: cimg/node:18.15.0 + - image: cimg/node:18.20.3 - image: mongo:7.0.0-rc5-jammy jobs: diff --git a/.eslintrc b/.eslintrc index 67dd7deb3..0fba55420 100644 --- a/.eslintrc +++ b/.eslintrc @@ -9,9 +9,10 @@ "no-console": "off", "no-shadow": "warn", "@typescript-eslint/no-shadow": "warn", - "no-invalid-this": "off" + "no-invalid-this": "off", + "jsdoc/newline-after-description": "off" // "@typescript-eslint/no-unused-vars": "off" // For debugging } } ] -} \ No newline at end of file +} diff --git a/.gitignore b/.gitignore index 2abca5351..a9de5f05c 100644 --- a/.gitignore +++ b/.gitignore @@ -5,6 +5,7 @@ coverage.json typechain typechain-types .idea +dist # Hardhat files cache diff --git a/.solcover.js b/.solcover.js index d4924e9a2..cc58f8471 100644 --- a/.solcover.js +++ b/.solcover.js @@ -1,4 +1,8 @@ module.exports = { + mocha: { + grep: "@skip-on-coverage", // Find everything with this tag + invert: true // Run the grep's inverse set. + }, skipFiles: [ 'utils/StringUtils.sol', 'token/mocks', diff --git a/README.md b/README.md index fc65f483a..e2b290de4 100644 --- a/README.md +++ b/README.md @@ -2,8 +2,70 @@ [![CircleCI](https://dl.circleci.com/status-badge/img/gh/zer0-os/zNS/tree/development.svg?style=svg)](https://dl.circleci.com/status-badge/redirect/gh/zer0-os/zNS/tree/development) -# zNS +# zNS - Zer0 Name Service Protocol +________________________________________________________ + +## System Documentation ### [System Architecture](./docs/architecture.md) ### [Smart Contract Docs](./docs/contracts) -### [Flow Diagrams](./docs/flows.md) \ No newline at end of file +### [Flow Diagrams](./docs/flows.md) + +**Full Protocol Documentation - [zero.study](https://www.zero.study/)** +________________________________________________________ + +## About +Zer0 Name Service, or zNS, is a protocol that allows you to create domain and subdomain NFTs that focus on community building and creation of unique, on-chain identification. + +Zero Website - [zero.tech](https://zero.tech/) + +## Developers + +### Install Dependencies +We are using `yarn` as our package manager. +```bash +yarn install +``` +> **Docker Engine** is required to run tests locally. You can install it from [here](https://docs.docker.com/engine/install/). + +### Setup Environment +Create `.env` file in the root directory and add the following variables: +```bash +ENV_LEVEL: "dev" # local dev environment +MONGO_DB_URI: "mongodb://localhost:27018" # local instance of MongoDB in the Docker +MONGO_DB_NAME: "zns-campaign" # name of the database +MOCK_MEOW_TOKEN: "true" # use mock MeowToken contract for local testing +SILENT_LOGGER: "true" # disable logging for tests +``` + +The full ENV setup with descriptions can be found in the [.env.sample](./.env.sample) file. + +### Build +```bash +yarn build +``` +This will compile all the contracts and add a git tag and a last commit for the current version of the contracts +that is **required** for the MongoDB where deployed contract data is stored. + +This will also run a bash script that will pull **tag and commit** from git and write +it locally to `./artifacts/git-tag.txt` file. If you are using Windows, that script may fail. In that case you can +pull git data manually and write it to the file or use the TS based script here: `./src/utils/save-tag.ts` simply by running `yarn save-tag` +The resulting text in the `./artifacts/git-tag.txt` file should look like this: +``` +v1.0.1:213334f3d4f47940779cb7e825aaf1fab77adb2e +``` + +### Run Tests +```bash +yarn test +``` +This will launch `docker-compose` with MongoDB instance on it, required for some tests. Then launch all the tests in the `./test` directory. + +> Note: If you do not have Docker installed this will fail. + +### Submit Work +All new code is submitted through Pull Requests **ONLY**. Please make sure that you have all the tests passing in CircleCI and that +you have added new tests for your code before submitting for review. Codecov will fail the CI if the coverage drops. Pull Requests are not merged with a failing CI build. + +All new code is merged into `development` branch and that will make a new prerelease tag. +`master` branch is used for production releases only. Code from `development` branch should be fully tested on the testnet before merging into `master`. diff --git a/contracts/access/AAccessControlled.sol b/contracts/access/AAccessControlled.sol index 19de2287c..fa2897fcf 100644 --- a/contracts/access/AAccessControlled.sol +++ b/contracts/access/AAccessControlled.sol @@ -1,7 +1,8 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.18; +pragma solidity 0.8.26; import { IZNSAccessController } from "./IZNSAccessController.sol"; +import { ZeroAddressPassed } from "../utils/CommonErrors.sol"; /** @@ -11,7 +12,6 @@ import { IZNSAccessController } from "./IZNSAccessController.sol"; * this contract needs to be inherited by the module. */ abstract contract AAccessControlled { - /** * @notice Emitted when the access controller contract address is set. */ @@ -66,7 +66,7 @@ abstract contract AAccessControlled { * @param _accessController Address of the ZNSAccessController contract. */ function _setAccessController(address _accessController) internal { - require(_accessController != address(0), "AC: _accessController is 0x0 address"); + if (_accessController == address(0)) revert ZeroAddressPassed(); accessController = IZNSAccessController(_accessController); emit AccessControllerSet(_accessController); } diff --git a/contracts/access/IZNSAccessController.sol b/contracts/access/IZNSAccessController.sol index 4008a1780..9263708d4 100644 --- a/contracts/access/IZNSAccessController.sol +++ b/contracts/access/IZNSAccessController.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.18; +pragma solidity 0.8.26; import { IAccessControl } from "@openzeppelin/contracts/access/IAccessControl.sol"; diff --git a/contracts/access/ZNSAccessController.sol b/contracts/access/ZNSAccessController.sol index 06357fe4e..2174dd7a3 100644 --- a/contracts/access/ZNSAccessController.sol +++ b/contracts/access/ZNSAccessController.sol @@ -1,9 +1,10 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.18; +pragma solidity 0.8.26; import { AccessControl } from "@openzeppelin/contracts/access/AccessControl.sol"; import { IZNSAccessController } from "./IZNSAccessController.sol"; import { ZNSRoles } from "./ZNSRoles.sol"; +import { ZeroAddressPassed } from "../utils/CommonErrors.sol"; /** @@ -77,10 +78,8 @@ contract ZNSAccessController is AccessControl, ZNSRoles, IZNSAccessController { function _grantRoleToMany(bytes32 role, address[] memory addresses) internal { uint256 length = addresses.length; for (uint256 i = 0; i < length; ++i) { - require( - addresses[i] != address(0), - "ZNSAccessController: Can't grant role to zero address" - ); + if (addresses[i] == address(0)) revert ZeroAddressPassed(); + _grantRole(role, addresses[i]); } } diff --git a/contracts/access/ZNSRoles.sol b/contracts/access/ZNSRoles.sol index 48a920620..3ff956067 100644 --- a/contracts/access/ZNSRoles.sol +++ b/contracts/access/ZNSRoles.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.18; +pragma solidity 0.8.26; /** diff --git a/contracts/oz-proxies/ERC1967ProxyAcc.sol b/contracts/oz-proxies/ERC1967ProxyAcc.sol index 67824c9c9..5ccb57862 100644 --- a/contracts/oz-proxies/ERC1967ProxyAcc.sol +++ b/contracts/oz-proxies/ERC1967ProxyAcc.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.18; +pragma solidity 0.8.26; // solhint-disable-next-line no-global-import import "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol"; diff --git a/contracts/oz-proxies/TransparentUpgradeableProxyAcc.sol b/contracts/oz-proxies/TransparentUpgradeableProxyAcc.sol index a3d6f86a3..3275c8120 100644 --- a/contracts/oz-proxies/TransparentUpgradeableProxyAcc.sol +++ b/contracts/oz-proxies/TransparentUpgradeableProxyAcc.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.18; +pragma solidity 0.8.26; // solhint-disable-next-line no-global-import import "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol"; diff --git a/contracts/price/IZNSCurvePricer.sol b/contracts/price/IZNSCurvePricer.sol index 1b029f435..f1ff10fa5 100644 --- a/contracts/price/IZNSCurvePricer.sol +++ b/contracts/price/IZNSCurvePricer.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.18; +pragma solidity 0.8.26; import { ICurvePriceConfig } from "../types/ICurvePriceConfig.sol"; import { IZNSPricer } from "../types/IZNSPricer.sol"; @@ -7,6 +7,23 @@ import { IZNSPricer } from "../types/IZNSPricer.sol"; interface IZNSCurvePricer is ICurvePriceConfig, IZNSPricer { + /** + * @notice Reverted when multiplier passed by the domain owner + * is equal to 0 or more than 10^18, which is too large. + */ + error InvalidMultiplierPassed(uint256 multiplier); + + /** + * @notice Reverted when `priceConfig` set by the owner does not result in a proper asymptotic curve + * and one of it's incorrect values causes the price spike at maxLength, meaning that the price + * for a domain label shorter than `baseLength` (the one before `minPrice`) becomes higher than `minPrice`. + */ + error InvalidConfigCausingPriceSpikes( + bytes32 configsDomainHash, + uint256 minPrice, + uint256 previousToMinPrice + ); + /** * @notice Emitted when the `maxPrice` is set in `CurvePriceConfig` * @param price The new maxPrice value diff --git a/contracts/price/IZNSFixedPricer.sol b/contracts/price/IZNSFixedPricer.sol index cf09360db..69cdfad8b 100644 --- a/contracts/price/IZNSFixedPricer.sol +++ b/contracts/price/IZNSFixedPricer.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.18; +pragma solidity 0.8.26; import { IZNSPricer } from "../types/IZNSPricer.sol"; diff --git a/contracts/price/ZNSCurvePricer.sol b/contracts/price/ZNSCurvePricer.sol index 67a22c880..3524261ef 100644 --- a/contracts/price/ZNSCurvePricer.sol +++ b/contracts/price/ZNSCurvePricer.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.18; +pragma solidity 0.8.26; import { UUPSUpgradeable } from "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol"; import { IZNSCurvePricer } from "./IZNSCurvePricer.sol"; @@ -75,10 +75,7 @@ contract ZNSCurvePricer is AAccessControlled, ARegistryWired, UUPSUpgradeable, I string calldata label, bool skipValidityCheck ) public view override returns (uint256) { - require( - priceConfigs[parentHash].isSet, - "ZNSCurvePricer: parent's price config has not been set properly through IZNSPricer.setPriceConfig()" - ); + if (!priceConfigs[parentHash].isSet) revert ParentPriceConfigNotSet(parentHash); if (!skipValidityCheck) { // Confirms string values are only [a-z0-9-] @@ -256,8 +253,8 @@ contract ZNSCurvePricer is AAccessControlled, ARegistryWired, UUPSUpgradeable, I bytes32 domainHash, uint256 multiplier ) public override onlyOwnerOrOperator(domainHash) { - require(multiplier != 0, "ZNSCurvePricer: precisionMultiplier cannot be 0"); - require(multiplier <= 10**18, "ZNSCurvePricer: precisionMultiplier cannot be greater than 10^18"); + if (multiplier == 0 || multiplier > 10**18) revert InvalidMultiplierPassed(multiplier); + priceConfigs[domainHash].precisionMultiplier = multiplier; emit PrecisionMultiplierSet(domainHash, multiplier); @@ -275,10 +272,8 @@ contract ZNSCurvePricer is AAccessControlled, ARegistryWired, UUPSUpgradeable, I public override onlyOwnerOrOperator(domainHash) { - require( - feePercentage <= PERCENTAGE_BASIS, - "ZNSCurvePricer: feePercentage cannot be greater than PERCENTAGE_BASIS" - ); + if (feePercentage > PERCENTAGE_BASIS) + revert FeePercentageValueTooLarge(feePercentage, PERCENTAGE_BASIS); priceConfigs[domainHash].feePercentage = feePercentage; emit FeePercentageSet(domainHash, feePercentage); @@ -337,10 +332,12 @@ contract ZNSCurvePricer is AAccessControlled, ARegistryWired, UUPSUpgradeable, I */ function _validateConfig(bytes32 domainHash) internal view { uint256 prevToMinPrice = _getPrice(domainHash, priceConfigs[domainHash].maxLength); - require( - priceConfigs[domainHash].minPrice <= prevToMinPrice, - "ZNSCurvePricer: incorrect value set causes the price spike at maxLength." - ); + if (priceConfigs[domainHash].minPrice > prevToMinPrice) + revert InvalidConfigCausingPriceSpikes( + domainHash, + priceConfigs[domainHash].minPrice, + prevToMinPrice + ); } /** diff --git a/contracts/price/ZNSFixedPricer.sol b/contracts/price/ZNSFixedPricer.sol index b345a8059..e3be189a9 100644 --- a/contracts/price/ZNSFixedPricer.sol +++ b/contracts/price/ZNSFixedPricer.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.18; +pragma solidity 0.8.26; import { AAccessControlled } from "../access/AAccessControlled.sol"; import { ARegistryWired } from "../registry/ARegistryWired.sol"; @@ -60,10 +60,7 @@ contract ZNSFixedPricer is AAccessControlled, ARegistryWired, UUPSUpgradeable, I string calldata label, bool skipValidityCheck ) public override view returns (uint256) { - require( - priceConfigs[parentHash].isSet, - "ZNSFixedPricer: parent's price config has not been set properly through IZNSPricer.setPriceConfig()" - ); + if (!priceConfigs[parentHash].isSet) revert ParentPriceConfigNotSet(parentHash); if (!skipValidityCheck) { // Confirms string values are only [a-z0-9-] @@ -161,10 +158,8 @@ contract ZNSFixedPricer is AAccessControlled, ARegistryWired, UUPSUpgradeable, I * @param feePercentage The new feePercentage */ function _setFeePercentage(bytes32 domainHash, uint256 feePercentage) internal { - require( - feePercentage <= PERCENTAGE_BASIS, - "ZNSFixedPricer: feePercentage cannot be greater than PERCENTAGE_BASIS" - ); + if (feePercentage > PERCENTAGE_BASIS) + revert FeePercentageValueTooLarge(feePercentage, PERCENTAGE_BASIS); priceConfigs[domainHash].feePercentage = feePercentage; emit FeePercentageSet(domainHash, feePercentage); diff --git a/contracts/registrar/IZNSRootRegistrar.sol b/contracts/registrar/IZNSRootRegistrar.sol index 365efbbf4..b98da35ce 100644 --- a/contracts/registrar/IZNSRootRegistrar.sol +++ b/contracts/registrar/IZNSRootRegistrar.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.18; +pragma solidity 0.8.26; import { IDistributionConfig } from "../types/IDistributionConfig.sol"; import { PaymentConfig } from "../treasury/IZNSTreasury.sol"; @@ -42,13 +42,19 @@ struct CoreRegisterArgs { * + `isStakePayment`: A flag for whether the payment is a stake payment or not */ interface IZNSRootRegistrar is IDistributionConfig { + error NotTheOwnerOf( + OwnerOf ownerOf, + address candidate, + bytes32 domainHash + ); + + error InvalidOwnerOfEnumValue(OwnerOf value); enum OwnerOf { NAME, TOKEN, BOTH } - /** * @notice Emitted when a NEW domain is registered. * @dev `domainAddress` parameter is the address to which a domain name will relate to in ZNS. diff --git a/contracts/registrar/IZNSSubRegistrar.sol b/contracts/registrar/IZNSSubRegistrar.sol index 1c6574bdd..a8feb7b55 100644 --- a/contracts/registrar/IZNSSubRegistrar.sol +++ b/contracts/registrar/IZNSSubRegistrar.sol @@ -1,34 +1,47 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.18; +pragma solidity 0.8.26; import { IDistributionConfig } from "../types/IDistributionConfig.sol"; import { PaymentConfig } from "../treasury/IZNSTreasury.sol"; import { IZNSPricer } from "../types/IZNSPricer.sol"; - /** * @title IZNSSubRegistrar.sol - Interface for the ZNSSubRegistrar contract responsible for registering subdomains. -*/ + */ interface IZNSSubRegistrar is IDistributionConfig { + /** + * @notice Reverted when someone other than parent owner is trying to buy + a subdomain under the parent that is locked\ + * or when the parent provided does not exist. + */ + error ParentLockedOrDoesntExist(bytes32 parentHash); + + /** + * @notice Reverted when the buyer of subdomain is not approved by the parent in it's mintlist. + */ + error SenderNotApprovedForPurchase(bytes32 parentHash, address sender); /** * @notice Emitted when a new `DistributionConfig.pricerContract` is set for a domain. - */ - event PricerContractSet(bytes32 indexed domainHash, address indexed pricerContract); + */ + event PricerContractSet( + bytes32 indexed domainHash, + address indexed pricerContract + ); /** * @notice Emitted when a new `DistributionConfig.paymentType` is set for a domain. - */ + */ event PaymentTypeSet(bytes32 indexed domainHash, PaymentType paymentType); /** * @notice Emitted when a new `DistributionConfig.accessType` is set for a domain. - */ + */ event AccessTypeSet(bytes32 indexed domainHash, AccessType accessType); /** * @notice Emitted when a new full `DistributionConfig` is set for a domain at once. - */ + */ event DistributionConfigSet( bytes32 indexed domainHash, IZNSPricer pricerContract, @@ -38,7 +51,7 @@ interface IZNSSubRegistrar is IDistributionConfig { /** * @notice Emitted when a `mintlist` is updated for a domain. - */ + */ event MintlistUpdated( bytes32 indexed domainHash, uint256 indexed ownerIndex, @@ -54,16 +67,17 @@ interface IZNSSubRegistrar is IDistributionConfig { /** * @notice Emitted when the ZNSRootRegistrar address is set in state. - */ + */ event RootRegistrarSet(address registrar); function distrConfigs( bytes32 domainHash - ) external view returns ( - IZNSPricer pricerContract, - PaymentType paymentType, - AccessType accessType - ); + ) + external view returns ( + IZNSPricer pricerContract, + PaymentType paymentType, + AccessType accessType + ); function isMintlistedForDomain( bytes32 domainHash, diff --git a/contracts/registrar/ZNSRootRegistrar.sol b/contracts/registrar/ZNSRootRegistrar.sol index 30de690ad..5cb841e91 100644 --- a/contracts/registrar/ZNSRootRegistrar.sol +++ b/contracts/registrar/ZNSRootRegistrar.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.18; +pragma solidity 0.8.26; import { AAccessControlled } from "../access/AAccessControlled.sol"; import { ARegistryWired } from "../registry/ARegistryWired.sol"; @@ -11,6 +11,7 @@ import { IZNSSubRegistrar } from "../registrar/IZNSSubRegistrar.sol"; import { IZNSPricer } from "../types/IZNSPricer.sol"; import { UUPSUpgradeable } from "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol"; import { StringUtils } from "../utils/StringUtils.sol"; +import { ZeroAddressPassed, DomainAlreadyExists } from "../utils/CommonErrors.sol"; /** @@ -100,10 +101,8 @@ contract ZNSRootRegistrar is // Create hash for given domain name bytes32 domainHash = keccak256(bytes(name)); - require( - !registry.exists(domainHash), - "ZNSRootRegistrar: Domain already exists" - ); + if (registry.exists(domainHash)) + revert DomainAlreadyExists(domainHash); // Get price for the domain uint256 domainPrice = rootPricer.getPrice(0x0, name, true); @@ -256,10 +255,8 @@ contract ZNSRootRegistrar is external override { - require( - isOwnerOf(domainHash, msg.sender, OwnerOf.BOTH), - "ZNSRootRegistrar: Not the owner of both Name and Token" - ); + if (!isOwnerOf(domainHash, msg.sender, OwnerOf.BOTH)) + revert NotTheOwnerOf(OwnerOf.BOTH, msg.sender, domainHash); subRegistrar.clearMintlistAndLock(domainHash); _coreRevoke(domainHash, msg.sender); @@ -281,7 +278,9 @@ contract ZNSRootRegistrar is bool stakeRefunded = false; // send the stake back if it exists if (stakedAmount > 0) { - treasury.unstakeForDomain(domainHash, owner); + uint256 protocolFee = rootPricer.getFeeForPrice(0x0, stakedAmount); + + treasury.unstakeForDomain(domainHash, owner, protocolFee); stakeRefunded = true; } @@ -303,10 +302,9 @@ contract ZNSRootRegistrar is external override { - require( - isOwnerOf(domainHash, msg.sender, OwnerOf.TOKEN), - "ZNSRootRegistrar: Not the owner of the Token" - ); + if (!isOwnerOf(domainHash, msg.sender, OwnerOf.TOKEN)) + revert NotTheOwnerOf(OwnerOf.TOKEN, msg.sender, domainHash); + registry.updateDomainOwner(domainHash, msg.sender); emit DomainReclaimed(domainHash, msg.sender); @@ -328,7 +326,7 @@ contract ZNSRootRegistrar is && candidate == domainToken.ownerOf(uint256(domainHash)); } - revert("Wrong enum value for `ownerOf`"); + revert InvalidOwnerOfEnumValue(ownerOf); } /** @@ -346,10 +344,9 @@ contract ZNSRootRegistrar is * @param rootPricer_ Address of the IZNSPricer type contract to set as pricer of Root Domains */ function setRootPricer(address rootPricer_) public override onlyAdmin { - require( - rootPricer_ != address(0), - "ZNSRootRegistrar: rootPricer_ is 0x0 address" - ); + if (rootPricer_ == address(0)) + revert ZeroAddressPassed(); + rootPricer = IZNSPricer(rootPricer_); emit RootPricerSet(rootPricer_); @@ -361,10 +358,9 @@ contract ZNSRootRegistrar is * @param treasury_ Address of the `ZNSTreasury` contract */ function setTreasury(address treasury_) public override onlyAdmin { - require( - treasury_ != address(0), - "ZNSRootRegistrar: treasury_ is 0x0 address" - ); + if (treasury_ == address(0)) + revert ZeroAddressPassed(); + treasury = IZNSTreasury(treasury_); emit TreasurySet(treasury_); @@ -376,10 +372,9 @@ contract ZNSRootRegistrar is * @param domainToken_ Address of the `ZNSDomainToken` contract */ function setDomainToken(address domainToken_) public override onlyAdmin { - require( - domainToken_ != address(0), - "ZNSRootRegistrar: domainToken_ is 0x0 address" - ); + if (domainToken_ == address(0)) + revert ZeroAddressPassed(); + domainToken = IZNSDomainToken(domainToken_); emit DomainTokenSet(domainToken_); @@ -390,7 +385,8 @@ contract ZNSRootRegistrar is * @param subRegistrar_ Address of the `ZNSSubRegistrar` contract */ function setSubRegistrar(address subRegistrar_) external override onlyAdmin { - require(subRegistrar_ != address(0), "ZNSRootRegistrar: subRegistrar_ is 0x0 address"); + if (subRegistrar_ == address(0)) + revert ZeroAddressPassed(); subRegistrar = IZNSSubRegistrar(subRegistrar_); emit SubRegistrarSet(subRegistrar_); diff --git a/contracts/registrar/ZNSSubRegistrar.sol b/contracts/registrar/ZNSSubRegistrar.sol index cd01d86a5..b1b8a65a8 100644 --- a/contracts/registrar/ZNSSubRegistrar.sol +++ b/contracts/registrar/ZNSSubRegistrar.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.18; +pragma solidity 0.8.26; import { IZNSPricer } from "../types/IZNSPricer.sol"; import { IZNSRootRegistrar, CoreRegisterArgs } from "./IZNSRootRegistrar.sol"; @@ -9,6 +9,7 @@ import { ARegistryWired } from "../registry/ARegistryWired.sol"; import { StringUtils } from "../utils/StringUtils.sol"; import { PaymentConfig } from "../treasury/IZNSTreasury.sol"; import { UUPSUpgradeable } from "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol"; +import { DomainAlreadyExists, ZeroAddressPassed, NotAuthorizedForDomain } from "../utils/CommonErrors.sol"; /** @@ -45,11 +46,10 @@ contract ZNSSubRegistrar is AAccessControlled, ARegistryWired, UUPSUpgradeable, mapping(bytes32 domainHash => Mintlist mintStruct) public mintlist; modifier onlyOwnerOperatorOrRegistrar(bytes32 domainHash) { - require( - registry.isOwnerOrOperator(domainHash, msg.sender) - || accessController.isRegistrar(msg.sender), - "ZNSSubRegistrar: Not authorized" - ); + if ( + !registry.isOwnerOrOperator(domainHash, msg.sender) + && !accessController.isRegistrar(msg.sender) + ) revert NotAuthorizedForDomain(msg.sender, domainHash); _; } @@ -95,27 +95,22 @@ contract ZNSSubRegistrar is AAccessControlled, ARegistryWired, UUPSUpgradeable, label.validate(); bytes32 domainHash = hashWithParent(parentHash, label); - require( - !registry.exists(domainHash), - "ZNSSubRegistrar: Subdomain already exists" - ); + if (registry.exists(domainHash)) + revert DomainAlreadyExists(domainHash); DistributionConfig memory parentConfig = distrConfigs[parentHash]; bool isOwnerOrOperator = registry.isOwnerOrOperator(parentHash, msg.sender); - require( - parentConfig.accessType != AccessType.LOCKED || isOwnerOrOperator, - "ZNSSubRegistrar: Parent domain's distribution is locked or parent does not exist" - ); + if (parentConfig.accessType == AccessType.LOCKED && !isOwnerOrOperator) + revert ParentLockedOrDoesntExist(parentHash); if (parentConfig.accessType == AccessType.MINTLIST) { - require( - mintlist[parentHash] + if ( + !mintlist[parentHash] .list [mintlist[parentHash].ownerIndex] - [msg.sender], - "ZNSSubRegistrar: Sender is not approved for purchase" - ); + [msg.sender] + ) revert SenderNotApprovedForPurchase(parentHash, msg.sender); } CoreRegisterArgs memory coreRegisterArgs = CoreRegisterArgs({ @@ -188,10 +183,8 @@ contract ZNSSubRegistrar is AAccessControlled, ARegistryWired, UUPSUpgradeable, bytes32 domainHash, DistributionConfig calldata config ) public override onlyOwnerOperatorOrRegistrar(domainHash) { - require( - address(config.pricerContract) != address(0), - "ZNSSubRegistrar: pricerContract can not be 0x0 address" - ); + if (address(config.pricerContract) == address(0)) + revert ZeroAddressPassed(); distrConfigs[domainHash] = config; @@ -215,15 +208,11 @@ contract ZNSSubRegistrar is AAccessControlled, ARegistryWired, UUPSUpgradeable, bytes32 domainHash, IZNSPricer pricerContract ) public override { - require( - registry.isOwnerOrOperator(domainHash, msg.sender), - "ZNSSubRegistrar: Not authorized" - ); + if (!registry.isOwnerOrOperator(domainHash, msg.sender)) + revert NotAuthorizedForDomain(msg.sender, domainHash); - require( - address(pricerContract) != address(0), - "ZNSSubRegistrar: pricerContract can not be 0x0 address" - ); + if (address(pricerContract) == address(0)) + revert ZeroAddressPassed(); distrConfigs[domainHash].pricerContract = pricerContract; @@ -242,10 +231,8 @@ contract ZNSSubRegistrar is AAccessControlled, ARegistryWired, UUPSUpgradeable, bytes32 domainHash, PaymentType paymentType ) public override { - require( - registry.isOwnerOrOperator(domainHash, msg.sender), - "ZNSSubRegistrar: Not authorized" - ); + if (!registry.isOwnerOrOperator(domainHash, msg.sender)) + revert NotAuthorizedForDomain(msg.sender, domainHash); distrConfigs[domainHash].paymentType = paymentType; @@ -283,10 +270,8 @@ contract ZNSSubRegistrar is AAccessControlled, ARegistryWired, UUPSUpgradeable, address[] calldata candidates, bool[] calldata allowed ) external override { - require( - registry.isOwnerOrOperator(domainHash, msg.sender), - "ZNSSubRegistrar: Not authorized" - ); + if (!registry.isOwnerOrOperator(domainHash, msg.sender)) + revert NotAuthorizedForDomain(msg.sender, domainHash); Mintlist storage mintlistForDomain = mintlist[domainHash]; uint256 ownerIndex = mintlistForDomain.ownerIndex; @@ -344,7 +329,7 @@ contract ZNSSubRegistrar is AAccessControlled, ARegistryWired, UUPSUpgradeable, * @param registrar_ The new address of the ZNSRootRegistrar contract */ function setRootRegistrar(address registrar_) public override onlyAdmin { - require(registrar_ != address(0), "ZNSSubRegistrar: _registrar can not be 0x0 address"); + if (registrar_ == address(0)) revert ZeroAddressPassed(); rootRegistrar = IZNSRootRegistrar(registrar_); emit RootRegistrarSet(registrar_); diff --git a/contracts/registry/ARegistryWired.sol b/contracts/registry/ARegistryWired.sol index c4b0de706..259b04e85 100644 --- a/contracts/registry/ARegistryWired.sol +++ b/contracts/registry/ARegistryWired.sol @@ -1,7 +1,8 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.18; +pragma solidity 0.8.26; import { IZNSRegistry } from "./IZNSRegistry.sol"; +import { ZeroAddressPassed, NotAuthorizedForDomain } from "../utils/CommonErrors.sol"; /** @@ -10,7 +11,6 @@ import { IZNSRegistry } from "./IZNSRegistry.sol"; * and is able to get AC and domain data from it or write to it. */ abstract contract ARegistryWired { - /** * @notice Emitted when the ZNSRegistry address is set in state of the child contract. */ @@ -22,10 +22,8 @@ abstract contract ARegistryWired { IZNSRegistry public registry; modifier onlyOwnerOrOperator(bytes32 domainHash) { - require( - registry.isOwnerOrOperator(domainHash, msg.sender), - "ARegistryWired: Not authorized. Only Owner or Operator allowed" - ); + if (!registry.isOwnerOrOperator(domainHash, msg.sender)) + revert NotAuthorizedForDomain(msg.sender, domainHash); _; } @@ -33,7 +31,7 @@ abstract contract ARegistryWired { * @notice Internal function to set the ZNSRegistry address in the state of the child contract. */ function _setRegistry(address registry_) internal { - require(registry_ != address(0), "ARegistryWired: _registry can not be 0x0 address"); + if (registry_ == address(0)) revert ZeroAddressPassed(); registry = IZNSRegistry(registry_); emit RegistrySet(registry_); } diff --git a/contracts/registry/IZNSRegistry.sol b/contracts/registry/IZNSRegistry.sol index f6df6e3f3..f73a74ff6 100644 --- a/contracts/registry/IZNSRegistry.sol +++ b/contracts/registry/IZNSRegistry.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.18; +pragma solidity 0.8.26; /** @@ -14,7 +14,7 @@ pragma solidity 0.8.18; interface IZNSRegistry { /** - * @notice Description of a domain record, pointing to the + * @notice Description of a domain record, pointing to the * owner address of that record as well as the address of * its resolver */ @@ -123,7 +123,7 @@ interface IZNSRegistry { function getResolverType( string calldata resolverType - ) external returns (address); + ) external returns (address); function addResolverType( string calldata resolverType, diff --git a/contracts/registry/ZNSRegistry.sol b/contracts/registry/ZNSRegistry.sol index 2b79a8113..72d2376f7 100644 --- a/contracts/registry/ZNSRegistry.sol +++ b/contracts/registry/ZNSRegistry.sol @@ -1,9 +1,10 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.18; +pragma solidity 0.8.26; import { IZNSRegistry } from "./IZNSRegistry.sol"; import { AAccessControlled } from "../access/AAccessControlled.sol"; import { UUPSUpgradeable } from "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol"; +import { ZeroAddressPassed, NotAuthorizedForDomain } from "../utils/CommonErrors.sol"; /** @@ -36,10 +37,8 @@ contract ZNSRegistry is AAccessControlled, UUPSUpgradeable, IZNSRegistry { * @param domainHash the hash of a domain's name */ modifier onlyOwnerOrOperator(bytes32 domainHash) { - require( - isOwnerOrOperator(domainHash, msg.sender), - "ZNSRegistry: Not authorized" - ); + if (!isOwnerOrOperator(domainHash, msg.sender)) + revert NotAuthorizedForDomain(msg.sender, domainHash); _; } @@ -48,10 +47,8 @@ contract ZNSRegistry is AAccessControlled, UUPSUpgradeable, IZNSRegistry { * @param domainHash the hash of a domain's name */ modifier onlyOwner(bytes32 domainHash) { - require( - records[domainHash].owner == msg.sender, - "ZNSRegistry: Not the Name Owner" - ); + if (records[domainHash].owner != msg.sender) + revert NotAuthorizedForDomain(msg.sender, domainHash); _; } @@ -183,7 +180,7 @@ contract ZNSRegistry is AAccessControlled, UUPSUpgradeable, IZNSRegistry { /** * @notice Add a new resolver type option to the mapping of types - * This function can also be used to update the resolver mapping for an existing resolver + * This function can also be used to update the resolver mapping for an existing resolver * simple by using an existing key like "address" with a new address * @param resolverType The type of the resolver to add * @param resolver The address of the new resolver contract @@ -234,11 +231,10 @@ contract ZNSRegistry is AAccessControlled, UUPSUpgradeable, IZNSRegistry { bytes32 domainHash, address owner ) external override { - require( - msg.sender == records[domainHash].owner || - accessController.isRegistrar(msg.sender), - "ZNSRegistry: Only Name Owner or Registrar allowed to call" - ); + if ( + msg.sender != records[domainHash].owner && + !accessController.isRegistrar(msg.sender) + ) revert NotAuthorizedForDomain(msg.sender, domainHash); _setDomainOwner(domainHash, owner); } @@ -286,7 +282,7 @@ contract ZNSRegistry is AAccessControlled, UUPSUpgradeable, IZNSRegistry { * @param owner The owner to set */ function _setDomainOwner(bytes32 domainHash, address owner) internal { - require(owner != address(0), "ZNSRegistry: Owner cannot be zero address"); + if (owner == address(0)) revert ZeroAddressPassed(); records[domainHash].owner = owner; emit DomainOwnerSet(domainHash, owner); } diff --git a/contracts/resolver/IZNSAddressResolver.sol b/contracts/resolver/IZNSAddressResolver.sol index 28711f29c..d4e3df1b8 100644 --- a/contracts/resolver/IZNSAddressResolver.sol +++ b/contracts/resolver/IZNSAddressResolver.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.18; +pragma solidity 0.8.26; interface IZNSAddressResolver { diff --git a/contracts/resolver/ZNSAddressResolver.sol b/contracts/resolver/ZNSAddressResolver.sol index f20298e43..e07762837 100644 --- a/contracts/resolver/ZNSAddressResolver.sol +++ b/contracts/resolver/ZNSAddressResolver.sol @@ -1,11 +1,12 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.18; +pragma solidity 0.8.26; import { ERC165 } from "@openzeppelin/contracts/utils/introspection/ERC165.sol"; import { UUPSUpgradeable } from "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol"; import { IZNSAddressResolver } from "./IZNSAddressResolver.sol"; import { AAccessControlled } from "../access/AAccessControlled.sol"; import { ARegistryWired } from "../registry/ARegistryWired.sol"; +import { NotAuthorizedForDomain } from "../utils/CommonErrors.sol"; /** @@ -67,11 +68,10 @@ contract ZNSAddressResolver is ) external override { // only owner or operator of the current domain can set the address // also, ZNSRootRegistrar.sol can set the address as part of the registration process - require( - registry.isOwnerOrOperator(domainHash, msg.sender) || - accessController.isRegistrar(msg.sender), - "ZNSAddressResolver: Not authorized for this domain" - ); + if ( + !registry.isOwnerOrOperator(domainHash, msg.sender) && + !accessController.isRegistrar(msg.sender) + ) revert NotAuthorizedForDomain(msg.sender, domainHash); domainAddresses[domainHash] = newAddress; diff --git a/contracts/token/IZNSDomainToken.sol b/contracts/token/IZNSDomainToken.sol index 4e288c8c7..977ea5f2a 100644 --- a/contracts/token/IZNSDomainToken.sol +++ b/contracts/token/IZNSDomainToken.sol @@ -1,11 +1,11 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.18; +pragma solidity 0.8.26; -import { IERC721Upgradeable } from "@openzeppelin/contracts-upgradeable/token/ERC721/IERC721Upgradeable.sol"; -import { IERC2981Upgradeable } from "@openzeppelin/contracts-upgradeable/interfaces/IERC2981Upgradeable.sol"; +import { IERC721 } from "@openzeppelin/contracts/token/ERC721/IERC721.sol"; +import { IERC2981 } from "@openzeppelin/contracts/interfaces/IERC2981.sol"; -interface IZNSDomainToken is IERC2981Upgradeable, IERC721Upgradeable { +interface IZNSDomainToken is IERC2981, IERC721 { /** * @notice Emitted when a Default Royalty (for all tokens) is set. diff --git a/contracts/token/ZNSDomainToken.sol b/contracts/token/ZNSDomainToken.sol index ec3cc1ecd..ed5410562 100644 --- a/contracts/token/ZNSDomainToken.sol +++ b/contracts/token/ZNSDomainToken.sol @@ -1,7 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.18; +pragma solidity 0.8.26; -import { ERC721Upgradeable } from "@openzeppelin/contracts-upgradeable/token/ERC721/ERC721Upgradeable.sol"; import { UUPSUpgradeable } from "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol"; import { ERC2981Upgradeable } from "@openzeppelin/contracts-upgradeable/token/common/ERC2981Upgradeable.sol"; import { ERC721URIStorageUpgradeable } @@ -18,9 +17,8 @@ import { AAccessControlled } from "../access/AAccessControlled.sol"; */ contract ZNSDomainToken is AAccessControlled, - ERC721Upgradeable, - ERC2981Upgradeable, ERC721URIStorageUpgradeable, + ERC2981Upgradeable, UUPSUpgradeable, IZNSDomainToken { @@ -89,6 +87,7 @@ contract ZNSDomainToken is */ function revoke(uint256 tokenId) external override onlyRegistrar { _burn(tokenId); + --_totalSupply; _resetTokenRoyalty(tokenId); } @@ -98,7 +97,7 @@ contract ZNSDomainToken is function tokenURI(uint256 tokenId) public view - override(ERC721URIStorageUpgradeable, ERC721Upgradeable, IZNSDomainToken) + override(ERC721URIStorageUpgradeable, IZNSDomainToken) returns (string memory) { return super.tokenURI(tokenId); @@ -170,23 +169,11 @@ contract ZNSDomainToken is public view virtual - override(ERC721Upgradeable, ERC721URIStorageUpgradeable, ERC2981Upgradeable, IZNSDomainToken) + override(ERC721URIStorageUpgradeable, ERC2981Upgradeable, IZNSDomainToken) returns (bool) { return super.supportsInterface(interfaceId); } - /** - * @notice ERC721 `_burn` function - * @param tokenId The ID of the token to burn - */ - function _burn(uint256 tokenId) - internal - override(ERC721URIStorageUpgradeable, ERC721Upgradeable) - { - super._burn(tokenId); - --_totalSupply; - } - /** * @notice Return the baseURI */ diff --git a/contracts/token/mocks/CustomDecimalTokenMock.sol b/contracts/token/mocks/CustomDecimalTokenMock.sol index 3d5c46b0b..507a1adf0 100644 --- a/contracts/token/mocks/CustomDecimalTokenMock.sol +++ b/contracts/token/mocks/CustomDecimalTokenMock.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.18; +pragma solidity 0.8.26; // solhint-disable import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; @@ -9,9 +9,9 @@ contract CustomDecimalTokenMock is ERC20 { uint256 private _totalSupplyBase = 10000000000000000000000; - constructor(address owner, uint256 decimals) ERC20("VariedDecimalTokenMock", "VDTM") { - _decimals = uint8(decimals); - _mint(owner, totalSupply()); + constructor(address owner_, uint256 decimals_) ERC20("VariedDecimalTokenMock", "VDTM") { + _decimals = uint8(decimals_); + _mint(owner_, totalSupply()); } function decimals() public view override returns (uint8) { diff --git a/contracts/token/mocks/MeowTokenMock.sol b/contracts/token/mocks/MeowTokenMock.sol index 7465f6a21..dcbfce985 100644 --- a/contracts/token/mocks/MeowTokenMock.sol +++ b/contracts/token/mocks/MeowTokenMock.sol @@ -1,12 +1,15 @@ // SPDX-License-Identifier: MIT /* solhint-disable */ -pragma solidity 0.8.3; +pragma solidity 0.8.26; -import { MeowToken } from "@zero-tech/ztoken/contracts/MeowToken.sol"; -import { MeowTokenTest } from "@zero-tech/ztoken/contracts/MeowTokenTest.sol"; +import { ERC20Upgradeable } from "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol"; -contract MeowTokenMock is MeowToken { +contract MeowTokenMock is ERC20Upgradeable { + function initialize(string memory name_, string memory symbol_) external initializer { + __ERC20_init(name_, symbol_); + } + function mint(address account, uint256 amount) public { _mint(account, amount); } diff --git a/contracts/treasury/IZNSTreasury.sol b/contracts/treasury/IZNSTreasury.sol index 26c17f8ed..bd2ed85d0 100644 --- a/contracts/treasury/IZNSTreasury.sol +++ b/contracts/treasury/IZNSTreasury.sol @@ -1,9 +1,9 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.18; +pragma solidity 0.8.26; import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; -/** +/** * @notice The `PaymentConfig` struct describes the two pieces of information * needed to create a payment configuration for a domain. The address of the * user to send funds to in a sale, and what token those funds are in. @@ -26,9 +26,10 @@ struct PaymentConfig { * + `amount`: The amount of the staking token above deposited by the user */ interface IZNSTreasury { + error NoBeneficiarySetForParent(bytes32 domainHash); /** - * @notice Describe a stake for a domain. This could be + * @notice Describe a stake for a domain. This could be * in any ERC20 token so the address of the specific token * as well as the amount is required. */ @@ -121,7 +122,11 @@ interface IZNSTreasury { uint256 protocolFee ) external; - function unstakeForDomain(bytes32 domainHash, address owner) external; + function unstakeForDomain( + bytes32 domainHash, + address owner, + uint256 protocolFee + ) external; function processDirectPayment( bytes32 parentHash, diff --git a/contracts/treasury/ZNSTreasury.sol b/contracts/treasury/ZNSTreasury.sol index 463506082..51bb39bdc 100644 --- a/contracts/treasury/ZNSTreasury.sol +++ b/contracts/treasury/ZNSTreasury.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.18; +pragma solidity 0.8.26; import { IZNSTreasury } from "./IZNSTreasury.sol"; import { AAccessControlled } from "../access/AAccessControlled.sol"; @@ -8,6 +8,7 @@ import { UUPSUpgradeable } from "@openzeppelin/contracts-upgradeable/proxy/utils import { SafeERC20 } from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; import { PaymentConfig } from "./IZNSTreasury.sol"; import { ARegistryWired } from "../registry/ARegistryWired.sol"; +import { ZeroAddressPassed, NotAuthorizedForDomain } from "../utils/CommonErrors.sol"; /** @@ -62,14 +63,8 @@ contract ZNSTreasury is AAccessControlled, ARegistryWired, UUPSUpgradeable, IZNS _setAccessController(accessController_); _setRegistry(registry_); - require( - paymentToken_ != address(0), - "ZNSTreasury: paymentToken_ passed as 0x0 address" - ); - require( - zeroVault_ != address(0), - "ZNSTreasury: zeroVault_ passed as 0x0 address" - ); + if (paymentToken_ == address(0) || zeroVault_ == address(0)) + revert ZeroAddressPassed(); paymentConfigs[0x0] = PaymentConfig({ token: IERC20(paymentToken_), @@ -120,10 +115,8 @@ contract ZNSTreasury is AAccessControlled, ARegistryWired, UUPSUpgradeable, IZNS // transfer stake fee to the parent beneficiary if it's > 0 if (stakeFee > 0) { - require( - parentConfig.beneficiary != address(0), - "ZNSTreasury: parent domain has no beneficiary set" - ); + if (parentConfig.beneficiary == address(0)) + revert NoBeneficiarySetForParent(parentHash); parentConfig.token.safeTransfer( parentConfig.beneficiary, @@ -156,14 +149,24 @@ contract ZNSTreasury is AAccessControlled, ARegistryWired, UUPSUpgradeable, IZNS * Since we are clearing storage, gas refund from this operation makes Revoke transactions cheaper. * @param domainHash The hash of the domain for which the stake is being withdrawn. * @param owner The address of the user who is withdrawing the stake. + * @param protocolFee The protocol fee paid by the user to Zero. */ function unstakeForDomain( bytes32 domainHash, - address owner + address owner, + uint256 protocolFee ) external override onlyRegistrar { Stake memory stakeData = stakedForDomain[domainHash]; delete stakedForDomain[domainHash]; + if (protocolFee > 0) { + stakeData.token.safeTransferFrom( + owner, + paymentConfigs[0x0].beneficiary, + protocolFee + ); + } + stakeData.token.safeTransfer(owner, stakeData.amount); emit StakeWithdrawn( @@ -196,10 +199,8 @@ contract ZNSTreasury is AAccessControlled, ARegistryWired, UUPSUpgradeable, IZNS ) external override onlyRegistrar { PaymentConfig memory parentConfig = paymentConfigs[parentHash]; - require( - parentConfig.beneficiary != address(0), - "ZNSTreasury: parent domain has no beneficiary set" - ); + if (parentConfig.beneficiary == address(0)) + revert NoBeneficiarySetForParent(parentHash); // Transfer payment to parent beneficiary from payer parentConfig.token.safeTransferFrom( @@ -235,10 +236,11 @@ contract ZNSTreasury is AAccessControlled, ARegistryWired, UUPSUpgradeable, IZNS bytes32 domainHash, PaymentConfig memory paymentConfig ) external override { - require( - registry.isOwnerOrOperator(domainHash, msg.sender) || accessController.isRegistrar(msg.sender), - "ZNSTreasury: Not authorized." - ); + if ( + !registry.isOwnerOrOperator(domainHash, msg.sender) + && !accessController.isRegistrar(msg.sender) + ) revert NotAuthorizedForDomain(msg.sender, domainHash); + _setBeneficiary(domainHash, paymentConfig.beneficiary); _setPaymentToken(domainHash, address(paymentConfig.token)); } @@ -281,14 +283,16 @@ contract ZNSTreasury is AAccessControlled, ARegistryWired, UUPSUpgradeable, IZNS } function _setBeneficiary(bytes32 domainHash, address beneficiary) internal { - require(beneficiary != address(0), "ZNSTreasury: beneficiary passed as 0x0 address"); + if (beneficiary == address(0)) + revert ZeroAddressPassed(); paymentConfigs[domainHash].beneficiary = beneficiary; emit BeneficiarySet(domainHash, beneficiary); } function _setPaymentToken(bytes32 domainHash, address paymentToken) internal { - require(paymentToken != address(0), "ZNSTreasury: paymentToken passed as 0x0 address"); + if (paymentToken == address(0)) + revert ZeroAddressPassed(); paymentConfigs[domainHash].token = IERC20(paymentToken); emit PaymentTokenSet(domainHash, paymentToken); diff --git a/contracts/types/ICurvePriceConfig.sol b/contracts/types/ICurvePriceConfig.sol index 295b44462..b721e1a1e 100644 --- a/contracts/types/ICurvePriceConfig.sol +++ b/contracts/types/ICurvePriceConfig.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.18; +pragma solidity 0.8.26; /** diff --git a/contracts/types/IDistributionConfig.sol b/contracts/types/IDistributionConfig.sol index 02adc7419..084f07826 100644 --- a/contracts/types/IDistributionConfig.sol +++ b/contracts/types/IDistributionConfig.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.18; +pragma solidity 0.8.26; import { IZNSPricer } from "../types/IZNSPricer.sol"; diff --git a/contracts/types/IZNSPricer.sol b/contracts/types/IZNSPricer.sol index c10900c7b..9f59dbe9e 100644 --- a/contracts/types/IZNSPricer.sol +++ b/contracts/types/IZNSPricer.sol @@ -1,12 +1,23 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.18; - +pragma solidity 0.8.26; /** * @title IZNSPricer.sol * @notice Base interface required to be inherited by all Pricing contracts to work with zNS */ interface IZNSPricer { + /** + * @notice Reverted when someone is trying to buy a subdomain under a parent that is not set up for distribution. + * Specifically it's prices for subdomains. + */ + error ParentPriceConfigNotSet(bytes32 parentHash); + + /** + * @notice Reverted when domain owner is trying to set it's stake fee percentage higher than 100% + (uint256 "10,000"). + */ + error FeePercentageValueTooLarge(uint256 feePercentage, uint256 maximum); + /** * @dev `parentHash` param is here to allow pricer contracts * to have different price configs for different subdomains @@ -38,7 +49,7 @@ interface IZNSPricer { /** * @notice Returns the fee for a given price. * @dev Fees are only supported for PaymentType.STAKE ! - */ + */ function getFeeForPrice( bytes32 parentHash, uint256 price diff --git a/contracts/upgrade-test-mocks/UpgradeMock.sol b/contracts/upgrade-test-mocks/UpgradeMock.sol index 20393f216..38b7957ce 100644 --- a/contracts/upgrade-test-mocks/UpgradeMock.sol +++ b/contracts/upgrade-test-mocks/UpgradeMock.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.18; +pragma solidity 0.8.26; /* solhint-disable */ contract UpgradeMock { diff --git a/contracts/upgrade-test-mocks/distribution/ZNSCurvePricerMock.sol b/contracts/upgrade-test-mocks/distribution/ZNSCurvePricerUpgradeMock.sol similarity index 91% rename from contracts/upgrade-test-mocks/distribution/ZNSCurvePricerMock.sol rename to contracts/upgrade-test-mocks/distribution/ZNSCurvePricerUpgradeMock.sol index 507650178..f3bade036 100644 --- a/contracts/upgrade-test-mocks/distribution/ZNSCurvePricerMock.sol +++ b/contracts/upgrade-test-mocks/distribution/ZNSCurvePricerUpgradeMock.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.18; +pragma solidity 0.8.26; import { ZNSCurvePricer } from "../../price/ZNSCurvePricer.sol"; import { UpgradeMock } from "../UpgradeMock.sol"; diff --git a/contracts/upgrade-test-mocks/distribution/ZNSFixedPricerMock.sol b/contracts/upgrade-test-mocks/distribution/ZNSFixedPricerUpgradeMock.sol similarity index 91% rename from contracts/upgrade-test-mocks/distribution/ZNSFixedPricerMock.sol rename to contracts/upgrade-test-mocks/distribution/ZNSFixedPricerUpgradeMock.sol index 85565a732..25ff6ea39 100644 --- a/contracts/upgrade-test-mocks/distribution/ZNSFixedPricerMock.sol +++ b/contracts/upgrade-test-mocks/distribution/ZNSFixedPricerUpgradeMock.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.18; +pragma solidity 0.8.26; import { ZNSFixedPricer } from "../../price/ZNSFixedPricer.sol"; import { UpgradeMock } from "../UpgradeMock.sol"; diff --git a/contracts/upgrade-test-mocks/distribution/ZNSRootRegistrarMock.sol b/contracts/upgrade-test-mocks/distribution/ZNSRootRegistrarUpgradeMock.sol similarity index 91% rename from contracts/upgrade-test-mocks/distribution/ZNSRootRegistrarMock.sol rename to contracts/upgrade-test-mocks/distribution/ZNSRootRegistrarUpgradeMock.sol index f153db525..76fd2d202 100644 --- a/contracts/upgrade-test-mocks/distribution/ZNSRootRegistrarMock.sol +++ b/contracts/upgrade-test-mocks/distribution/ZNSRootRegistrarUpgradeMock.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.18; +pragma solidity 0.8.26; import { ZNSRootRegistrar } from "../../registrar/ZNSRootRegistrar.sol"; import { UpgradeMock } from "../UpgradeMock.sol"; diff --git a/contracts/upgrade-test-mocks/distribution/ZNSSubRegistrarMock.sol b/contracts/upgrade-test-mocks/distribution/ZNSSubRegistrarUpgradeMock.sol similarity index 62% rename from contracts/upgrade-test-mocks/distribution/ZNSSubRegistrarMock.sol rename to contracts/upgrade-test-mocks/distribution/ZNSSubRegistrarUpgradeMock.sol index 95269a9fe..eaf21610c 100644 --- a/contracts/upgrade-test-mocks/distribution/ZNSSubRegistrarMock.sol +++ b/contracts/upgrade-test-mocks/distribution/ZNSSubRegistrarUpgradeMock.sol @@ -1,9 +1,10 @@ // SPDX-License-Identifier: MIT /* solhint-disable */ -pragma solidity 0.8.18; +pragma solidity 0.8.26; // solhint-disable import { ZNSSubRegistrar } from "../../registrar/ZNSSubRegistrar.sol"; +import { IZNSSubRegistrar } from "../../registrar/IZNSSubRegistrar.sol"; import { UpgradeMock } from "../UpgradeMock.sol"; import { IZNSPricer } from "../../types/IZNSPricer.sol"; import { IZNSRootRegistrar, CoreRegisterArgs } from "../../registrar/IZNSRootRegistrar.sol"; @@ -12,6 +13,7 @@ import { ARegistryWired } from "../../registry/ARegistryWired.sol"; import { UUPSUpgradeable } from "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol"; import { StringUtils } from "../../utils/StringUtils.sol"; import { PaymentConfig } from "../../treasury/IZNSTreasury.sol"; +import { NotAuthorizedForDomain, ZeroAddressPassed, DomainAlreadyExists } from "../../utils/CommonErrors.sol"; enum AccessType { @@ -39,7 +41,12 @@ contract ZNSSubRegistrarMainState { mapping(bytes32 domainHash => DistributionConfig config) public distrConfigs; - mapping(bytes32 domainHash => mapping(address candidate => bool allowed)) public mintlist; + struct Mintlist { + mapping(uint256 idx => mapping(address candidate => bool allowed)) list; + uint256 ownerIndex; + } + + mapping(bytes32 domainHash => Mintlist mintStruct) public mintlist; } @@ -49,18 +56,25 @@ contract ZNSSubRegistrarUpgradeMock is UUPSUpgradeable, ZNSSubRegistrarMainState, UpgradeMock { - using StringUtils for string; + error ParentLockedOrDoesntExist(bytes32 parentHash); + + error SenderNotApprovedForPurchase(bytes32 parentHash, address sender); + modifier onlyOwnerOperatorOrRegistrar(bytes32 domainHash) { - require( - registry.isOwnerOrOperator(domainHash, msg.sender) - || accessController.isRegistrar(msg.sender), - "ZNSSubRegistrar: Not authorized" - ); + if ( + !registry.isOwnerOrOperator(domainHash, msg.sender) + && !accessController.isRegistrar(msg.sender) + ) revert NotAuthorizedForDomain(msg.sender, domainHash); _; } + /// @custom:oz-upgrades-unsafe-allow constructor + constructor() { + _disableInitializers(); + } + function initialize( address _accessController, address _registry, @@ -75,30 +89,35 @@ contract ZNSSubRegistrarUpgradeMock is bytes32 parentHash, string calldata label, address domainAddress, - string memory tokenURI, + string calldata tokenURI, DistributionConfig calldata distrConfig, PaymentConfig calldata paymentConfig ) external returns (bytes32) { + // Confirms string values are only [a-z0-9-] label.validate(); + bytes32 domainHash = hashWithParent(parentHash, label); + if (registry.exists(domainHash)) + revert DomainAlreadyExists(domainHash); + DistributionConfig memory parentConfig = distrConfigs[parentHash]; bool isOwnerOrOperator = registry.isOwnerOrOperator(parentHash, msg.sender); - require( - parentConfig.accessType != AccessType.LOCKED || isOwnerOrOperator, - "ZNSSubRegistrar: Parent domain's distribution is locked or parent does not exist" - ); + if (parentConfig.accessType == AccessType.LOCKED && !isOwnerOrOperator) + revert ParentLockedOrDoesntExist(parentHash); if (parentConfig.accessType == AccessType.MINTLIST) { - require( - mintlist[parentHash][msg.sender], - "ZNSSubRegistrar: Sender is not approved for purchase" - ); + if ( + !mintlist[parentHash] + .list + [mintlist[parentHash].ownerIndex] + [msg.sender] + ) revert SenderNotApprovedForPurchase(parentHash, msg.sender); } CoreRegisterArgs memory coreRegisterArgs = CoreRegisterArgs({ parentHash: parentHash, - domainHash: hashWithParent(parentHash, label), + domainHash: domainHash, label: label, registrant: msg.sender, price: 0, @@ -109,11 +128,6 @@ contract ZNSSubRegistrarUpgradeMock is paymentConfig: paymentConfig }); - require( - !registry.exists(coreRegisterArgs.domainHash), - "ZNSSubRegistrar: Subdomain already exists" - ); - if (!isOwnerOrOperator) { if (coreRegisterArgs.isStakePayment) { (coreRegisterArgs.price, coreRegisterArgs.stakeFee) = IZNSPricer(address(parentConfig.pricerContract)) @@ -138,7 +152,7 @@ contract ZNSSubRegistrarUpgradeMock is setDistributionConfigForDomain(coreRegisterArgs.domainHash, distrConfig); } - return coreRegisterArgs.domainHash; + return domainHash; } function hashWithParent( @@ -157,10 +171,8 @@ contract ZNSSubRegistrarUpgradeMock is bytes32 domainHash, DistributionConfig calldata config ) public onlyOwnerOperatorOrRegistrar(domainHash) { - require( - address(config.pricerContract) != address(0), - "ZNSSubRegistrar: pricerContract can not be 0x0 address" - ); + if (address(config.pricerContract) == address(0)) + revert ZeroAddressPassed(); distrConfigs[domainHash] = config; } @@ -169,15 +181,11 @@ contract ZNSSubRegistrarUpgradeMock is bytes32 domainHash, IZNSPricer pricerContract ) public { - require( - registry.isOwnerOrOperator(domainHash, msg.sender), - "ZNSSubRegistrar: Not authorized" - ); + if (!registry.isOwnerOrOperator(domainHash, msg.sender)) + revert NotAuthorizedForDomain(msg.sender, domainHash); - require( - address(pricerContract) != address(0), - "ZNSSubRegistrar: pricerContract can not be 0x0 address" - ); + if (address(pricerContract) == address(0)) + revert ZeroAddressPassed(); distrConfigs[domainHash].pricerContract = pricerContract; } @@ -186,26 +194,17 @@ contract ZNSSubRegistrarUpgradeMock is bytes32 domainHash, PaymentType paymentType ) public { - require( - registry.isOwnerOrOperator(domainHash, msg.sender), - "ZNSSubRegistrar: Not authorized" - ); + if (!registry.isOwnerOrOperator(domainHash, msg.sender)) + revert NotAuthorizedForDomain(msg.sender, domainHash); distrConfigs[domainHash].paymentType = paymentType; } - function _setAccessTypeForDomain( - bytes32 domainHash, - AccessType accessType - ) internal { - distrConfigs[domainHash].accessType = accessType; - } - function setAccessTypeForDomain( bytes32 domainHash, AccessType accessType - ) external onlyOwnerOperatorOrRegistrar(domainHash) { - _setAccessTypeForDomain(domainHash, accessType); + ) public onlyOwnerOperatorOrRegistrar(domainHash) { + distrConfigs[domainHash].accessType = accessType; } function updateMintlistForDomain( @@ -213,29 +212,47 @@ contract ZNSSubRegistrarUpgradeMock is address[] calldata candidates, bool[] calldata allowed ) external { - require( - registry.isOwnerOrOperator(domainHash, msg.sender), - "ZNSSubRegistrar: Not authorized" - ); + if (!registry.isOwnerOrOperator(domainHash, msg.sender)) + revert NotAuthorizedForDomain(msg.sender, domainHash); + + Mintlist storage mintlistForDomain = mintlist[domainHash]; + uint256 ownerIndex = mintlistForDomain.ownerIndex; for (uint256 i; i < candidates.length; i++) { - mintlist[domainHash][candidates[i]] = allowed[i]; + mintlistForDomain.list[ownerIndex][candidates[i]] = allowed[i]; } } + function isMintlistedForDomain( + bytes32 domainHash, + address candidate + ) external view returns (bool) { + uint256 ownerIndex = mintlist[domainHash].ownerIndex; + return mintlist[domainHash].list[ownerIndex][candidate]; + } + + function clearMintlistForDomain(bytes32 domainHash) + public + onlyOwnerOperatorOrRegistrar(domainHash) { + mintlist[domainHash].ownerIndex = mintlist[domainHash].ownerIndex + 1; + } + + function clearMintlistAndLock(bytes32 domainHash) + external + onlyOwnerOperatorOrRegistrar(domainHash) { + setAccessTypeForDomain(domainHash, AccessType.LOCKED); + clearMintlistForDomain(domainHash); + } + function setRegistry(address registry_) public override onlyAdmin { _setRegistry(registry_); } function setRootRegistrar(address registrar_) public onlyAdmin { - require(registrar_ != address(0), "ZNSSubRegistrar: _registrar can not be 0x0 address"); + if (registrar_ == address(0)) revert ZeroAddressPassed(); rootRegistrar = IZNSRootRegistrar(registrar_); } - /** - * @notice To use UUPS proxy we override this function and revert if `msg.sender` isn't authorized - * @param newImplementation The implementation contract to upgrade to - */ // solhint-disable-next-line function _authorizeUpgrade(address newImplementation) internal view override { accessController.checkGovernor(msg.sender); diff --git a/contracts/upgrade-test-mocks/distribution/ZNSTreasuryMock.sol b/contracts/upgrade-test-mocks/distribution/ZNSTreasuryUpgradeMock.sol similarity index 90% rename from contracts/upgrade-test-mocks/distribution/ZNSTreasuryMock.sol rename to contracts/upgrade-test-mocks/distribution/ZNSTreasuryUpgradeMock.sol index 292bbb424..e6c07bf68 100644 --- a/contracts/upgrade-test-mocks/distribution/ZNSTreasuryMock.sol +++ b/contracts/upgrade-test-mocks/distribution/ZNSTreasuryUpgradeMock.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.18; +pragma solidity 0.8.26; import { ZNSTreasury } from "../../treasury/ZNSTreasury.sol"; import { UpgradeMock } from "../UpgradeMock.sol"; diff --git a/contracts/upgrade-test-mocks/registry/ZNSRegistryMock.sol b/contracts/upgrade-test-mocks/registry/ZNSRegistryUpgradeMock.sol similarity index 90% rename from contracts/upgrade-test-mocks/registry/ZNSRegistryMock.sol rename to contracts/upgrade-test-mocks/registry/ZNSRegistryUpgradeMock.sol index 0193e0e3a..9158a59d5 100644 --- a/contracts/upgrade-test-mocks/registry/ZNSRegistryMock.sol +++ b/contracts/upgrade-test-mocks/registry/ZNSRegistryUpgradeMock.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.18; +pragma solidity 0.8.26; import { ZNSRegistry } from "../../registry/ZNSRegistry.sol"; import { UpgradeMock } from "../UpgradeMock.sol"; diff --git a/contracts/upgrade-test-mocks/resolver/ZNSAddressResolverMock.sol b/contracts/upgrade-test-mocks/resolver/ZNSAddressResolverUpgradeMock.sol similarity index 91% rename from contracts/upgrade-test-mocks/resolver/ZNSAddressResolverMock.sol rename to contracts/upgrade-test-mocks/resolver/ZNSAddressResolverUpgradeMock.sol index eb8027589..00cb37dbd 100644 --- a/contracts/upgrade-test-mocks/resolver/ZNSAddressResolverMock.sol +++ b/contracts/upgrade-test-mocks/resolver/ZNSAddressResolverUpgradeMock.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.18; +pragma solidity 0.8.26; import { ZNSAddressResolver } from "../../resolver/ZNSAddressResolver.sol"; import { UpgradeMock } from "../UpgradeMock.sol"; diff --git a/contracts/upgrade-test-mocks/token/ZNSDomainTokenMock.sol b/contracts/upgrade-test-mocks/token/ZNSDomainTokenUpgradeMock.sol similarity index 90% rename from contracts/upgrade-test-mocks/token/ZNSDomainTokenMock.sol rename to contracts/upgrade-test-mocks/token/ZNSDomainTokenUpgradeMock.sol index 34facac9a..1089e37cc 100644 --- a/contracts/upgrade-test-mocks/token/ZNSDomainTokenMock.sol +++ b/contracts/upgrade-test-mocks/token/ZNSDomainTokenUpgradeMock.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.18; +pragma solidity 0.8.26; import { ZNSDomainToken } from "../../token/ZNSDomainToken.sol"; import { UpgradeMock } from "../UpgradeMock.sol"; diff --git a/contracts/utils/CommonErrors.sol b/contracts/utils/CommonErrors.sol new file mode 100644 index 000000000..11b22462f --- /dev/null +++ b/contracts/utils/CommonErrors.sol @@ -0,0 +1,9 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.26; + + +error ZeroAddressPassed(); + +error DomainAlreadyExists(bytes32 domainHash); + +error NotAuthorizedForDomain(address caller, bytes32 domainHash); diff --git a/contracts/utils/StringUtils.sol b/contracts/utils/StringUtils.sol index 99ac5b36f..158ef9197 100644 --- a/contracts/utils/StringUtils.sol +++ b/contracts/utils/StringUtils.sol @@ -1,10 +1,14 @@ // SPDX-License-Identifier: MIT -// Source: +// Forked from: // https://github.com/ensdomains/ens-contracts/blob/master/contracts/ethregistrar/StringUtils.sol -pragma solidity 0.8.18; +pragma solidity 0.8.26; library StringUtils { + error DomainLabelTooLongOrNonexistent(string label); + + error DomainLabelContainsInvalidCharacters(string label); + /** * @dev Returns the length of a given string * @@ -44,21 +48,14 @@ library StringUtils { // solhint-disable-next-line var-name-mixedcase uint256 MAX_INT = 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff; - require( - length > 0 && length < MAX_INT, - "StringUtils: Domain label too long or nonexistent" - ); + if (length == 0 || length >= MAX_INT) + revert DomainLabelTooLongOrNonexistent(s); - for (uint256 i; i < length;) { + for (uint256 i; i < length; ++i) { bytes1 b = nameBytes[i]; // Valid strings are lower case a-z, 0-9, or a hyphen - require( - (b > 0x60 && b < 0x7B) || (b > 0x2F && b < 0x3A) || b == 0x2D, - "StringUtils: Invalid domain label" - ); - unchecked { - ++i; - } + if (!((b > 0x60 && b < 0x7B) || (b > 0x2F && b < 0x3A) || b == 0x2D)) + revert DomainLabelContainsInvalidCharacters(s); } } -} \ No newline at end of file +} diff --git a/docs/architecture.md b/docs/architecture.md index b573bb937..0f405265d 100644 --- a/docs/architecture.md +++ b/docs/architecture.md @@ -1,105 +1,173 @@ # System Architecture -![zNS Smart Contract Connections and Call Routing](./img/full.jpg) +![zNS Smart Contract Connections and Call Routing](./img/full-architecture.jpg) ## [ZNSAccessController](./contracts/access/ZNSAccessController.md) and [AccessControlled](./contracts/access/AccessControlled.md) ![Access Control](./img/ac.jpg) -This is the module for access control of the whole ZNS system. Every contract inherits AccessControlled abstract contract that implements: +This is the module for access control of the whole ZNS system. Every contract inherits the `AccessControlled` abstract contract that implements: - `accessController` as a state variable to be present in every child - a getter for accessController - a setter declaration for `accessController` to make sure every child contract implements it locally - an event to fire every time `accessController` is changes in state -- `onlyAdmin` modifier since it is used in most child contracts +- `onlyAdmin` and `onlyRegistrar` modifiers since they are used in most child contracts Upon inheriting the `AccessControlled` every contract is connected to the overall access control of the system through `ZNSAccessController` address that has to be passed at initialization time in order to prevent non-admin accounts from setting crucial values in storage. `ZNSAccessController` itself inherits `AccessControl` from Open Zeppelin and adds some specific logic to provide ZNS contracts with necessary functions to limit system access to crucial functions. ### Key responsibilities -- Provide a template for every contract in the system on how to add access control to its logic (via 1) -- Make sure important functions are implemented in children so that accessController variable can not be lost and can be reset on a live system +- Provide a template for every contract in the system on how to add access control to its logic (via `AccessControlled`) +- Make sure important functions are implemented in children so that `accessController` variable can not be lost and can be reset on a live system - Provide constants for all active roles in the system that will be used in production to validate callers - Provide functionality to set good role structure for system safety - Provide functionality to set and remove roles from accounts -- Provide easy checking functionality that all contracts using this module can access within their logic +- Provide easy role checking functionality that all contracts using this module can access within their logic ## [ZNSRegistry](./contracts/registry/ZNSRegistry.md) Key storage contract of the system responsible for basic crucial data about every domain/subdomain registered. The below data is mapped to each domain’s hash in `ZNSRegistry.records`. - `owner` (address) - owner of a domain. This address is necessary for the system to keep track of owners of domains and to provide secure access to domain management functionality. Only domain owner can modify and control a domain. Can be any arbitrary Ethereum address: smart contract, EOA. In cases when subdomain distribution (or other functionality) is being managed by the arbitrary contract, this contract has to be the owner of the parent domain. -- `resolver` (address) - address of a contract responsible for binding each domain name to a content of a certain type (e.g. ethereum address). For more info see “Resolvers” section. +- `resolver` (address) - address of a contract responsible for binding each domain name to a content of a certain type (e.g. ethereum address). For more info see the "Resolvers" section. -Every domain registered HAS to settle on this contract with its crucial data (above) written into a mapping keyed by domain name hash (bytes32). +Every domain registered has to settle on this contract with its crucial data (above) written into a mapping keyed by domain name hash (bytes32). -ZNSRegistry also has a mapping of `operators` in its state to manage operators for each owner. +`ZNSRegistry` also has a mapping of `operators` in its state to manage operators for each owner. An operator gets access to **all** domains of the owner and can perform any operation on them. This is a crucial functionality for the system to be able to provide a way for owners to delegate domain management to other accounts. An operator is **not** able to change the owner of the domain in `ZNSRegistry`. ### Key responsibilities - Serves as the last step of a domain registration process by saving the domain data in its storage -- Official final reference of an existence of a certain domain - we call ZNSRegistry to verify that a new domain being minted has not been minted already -- Is the first step in domain source discovery - we call `ZNSRegistry.getDomainResolver()` to find the Resolver that will tell us what this domain was created for (contract or wallet address, string, metadata hash, etc.). Currently ONLY ZNSAddressResolver is implemented, but more resolvers to come in the future for more data types. +- Official final reference of an existence of a certain domain - we call `ZNSRegistry` to verify that a new domain being minted has not been minted already +- Is the first step in domain source discovery - we call `ZNSRegistry.getDomainResolver()` to find the Resolver that will tell us what this domain was created for (contract or wallet address, string, metadata hash, etc.). Currently ONLY `ZNSAddressResolver` is implemented, but more resolvers to come in the future for more data types. - Reference for crucial domain related data (owner, resolver). - Provide a way to install operators for any owner to allow them access to changing resolvers without the presence of the owner ## [ZNSDomainToken](./contracts/token/ZNSDomainToken.md) -A single token contract (ERC-721) responsible for tokenizing every domain/subdomain in the system, providing standard token functionality (e.g. transfer, mint, burn, etc.) for the ease of domain management along with ZNS specific functionality added on top of ERC ABI. +A single token contract (ERC-721) responsible for tokenizing every domain/subdomain in the system, providing standard token functionality (e.g. transfer, mint, burn, etc.) for the ease of domain management along with ZNS specific functionality added on top of the ERC-721 ABI. ### Key responsibilities -- Mint a new token every time a domain is registered atomically within the register transaction (`ZNSRegistrar.register()` -> `ZNSDomainToken.register()`) +- Mint a new token every time a domain is registered atomically within the register transaction (i.e. `ZNSRegistrar.registerRootDomain()` -> `ZNSDomainToken.register()`) - Burn the respective token every time a domain is revoked atomically within the revoke transaction (`ZNSRegistrar.revokeDomain()` -> `ZNSDomainToken.revoke()`) - Determine and check owner of any given domain token by the tokenId -- Transfer domain token to change the owner -- Serve as a standard ERC-721 token with all the functionality provided, so the token can be traded and managed by other applications +- Transfer/sell domain token to change the owner of the Token +- Serve as a standard ERC-721 token with all the functionality provided so the token can be traded and managed by other applications. ## Resolvers and [ZNSAddressResolver](./contracts/resolver/ZNSAddressResolver.md) -System is expected to have multiple Resolver contracts, each being responsible for resolutions to their own supported types for domain sources. Zero will deploy a certain amount of them to support data types planned (FUTURE) , but these Resolvers can potentially be developed, deployed and managed by any parent domain owner to provide more data type resolutions for their subdomains. +The zNS system is expected to have multiple Resolver contracts, each being responsible for resolutions to their own supported types for domain sources. Zero will deploy a certain amount of them to support different data types in the future, but resolvers can potentially be developed, deployed and managed by any parent domain owner to provide more data type resolutions for their subdomains. -Resolver is structured to be a simple contract, having a mapping of a domain namehash to the specific source type (e.g. `bytes32 => address` OR `bytes32 => bytes`, etc.). Each Resolver can support one data type at a time or can be a combined one, supporting multiple. +A resolver is structured to be a simple contract, having a mapping of a domain namehash to the specific source type (e.g. `bytes32 => address` OR `bytes32 => bytes`, etc.). Each Resolver can support one data type at a time or can be a combined one, supporting multiple. -The ONLY resolver currently implemented is `ZNSAddressResolver`. It supports only address data type and has a simple mapping of `bytes32 domainHash => address contentAddress`. +The only resolver currently implemented is `ZNSAddressResolver`. It supports only address data type and has a simple mapping of `bytes32 domainHash => address contentAddress`. ### Key responsibilities -- Provide a straightforward binging of a domain namehash to specific domain source data (e.g. `hash(“cooldomainname”) => 0x1bc5d767ff…`) +- Provide a straightforward binging of a domain namehash to specific domain source data (e.g. `hash("cooldomainname") => 0x1bc5d767ff…`) - Provide a simple and straightforward resolution from a name to domain source -- Provide the way for any DO to change their domain source at any point in time along with simple access control which will not allow anyone else, other than the domain owner, to change this data +- Provide the way for any domain owner to change their domain source at any point in time along with simple access control which will not allow anyone else, other than the domain owner, to change this data - Interface checking logic (ERC-165) to provide easy type checking on supported types for the current Resolver. -## [ZNSPriceOracle](./contracts/distribution/ZNSPriceOracle.md) -Price Oracle contract serves as the trusted source of pricing data and determines prices of domain names based on the predefined formula and length of the domain name. Current implementation includes a formula, all the base values necessary to calculate prices and their setters. +## ZNSPricers +The zNS system supports using multiple different contracts as "pricers". A Pricer contract is a contract that encompases a certain mathematical model +to price the registrations of its subdomains. Every time a new subdomain is minted one of the pricer contracts is used to determine how much +a subdomain buyer needs to pay its parent. -`ZNSPriceOracle` is called by `ZNSTreasury` contract within the operation of staking user funds to register a new domain. Beside the actual pricing, ZNSPriceOracle also provides calculation of the fees based on the price of the domain. Upon determining the price + fee, the data comes back to ZNSTreasury that performs it’s own state writes and withdraws the funds from user’s wallet. +Currently, 2 different pricers are implemented and supported: + +## [ZNSCurvePricer](./contracts/price/ZNSCurvePricer.md) +`ZNSCurvePricer` is one of the options a domain owner can use to price their subdomains. It is based on a curve formula that takes the length of the label string and calculates the price compared to the maximum price the owner of the parent domain has set. +The curve has 3 main parts: +- the flat beginning, until `baseLength`, where a fixed `maxPrice` is returned; +- a curve part where the price declines the longer the domain label is; +- the flat end, from `maxLength`, where a fixed `minPrice` is returned. + +This contract also includes the possibility to set a certain `feePercentage` that will be applied to the calculated price and will be sent to the domain owner. +The `feePercentage` is set by the domain owner and can be changed at any point in time, but **not** be taken into account unless the distribution type of the parent domain is set to `STAKE`. + +Another feature of the contract is the ability to set `precisionMultiplier` that allows a calculated price to be truncated to a certain precision. +The `precisionMultiplier` is set by the domain owner and can be changed at any point in time. + +> Zer0 uses `ZNSCurvePricer` as the default pricer for all World domains. + +To learn more about the formula, fees and precisions, please refer to the contract documentation - [ZNSCurvePricer](./contracts/price/ZNSCurvePricer.md). ### Key responsibilities -- Provide deterministic formula for domain name price calculations based on the length of the label string -- Provide a way to get a calculated fee value based on the price of the domain -- Provide ways to reconfigure pricing and fees on a live system based on the set of variables through their setters +- Provides a deterministic formula for domain name price calculations based on the length of the label string, where a price declines the longer the label is +- Provides a way to set and get a calculated fee value based on the price of the domain and the fee percentage set by the domain owner +- Provides ways to reconfigure pricing and fees on a live system based on the set of variables through their setters -## [ZNSTreasury](./contracts/distribution/ZNSTreasury.md) -This contract performs staking logic with the help of `ZNSPriceOracle`, which it uses to get pricing and fees for every domain registered. Treasury itself performs the actual stake transfers and stores their amounts mapped by `domainHash`. These amounts are used to unstake upon domain revocation later. +## [ZNSFixedPricer](./contracts/price/ZNSFixedPricer.md) +`ZNSFixedPricer` is another, more straightforward contract a domain owner can use to price their subdomains. It is based on a fixed price that is set by the owner of the parent domain. +If a parent domain is using `ZNSFixedPricer`, the prices returned for subdomains will be fixed and always the same, until the owner changes the price on the contract. -It also moves fees to `zeroVault` address specified by the ZNS Admin along with `stakingToken` which represents any ERC-20 that is chosen to use as the token for domain payments (staking). The original `stakingToken` will be `$ZERO`, but the contract is made to support any other standard ERC-20 token in the future, which can easily be re-set in state. +This contract also includes the possibility to set a certain `feePercentage` that will be applied to the calculated price and will be sent to the domain owner. +The `feePercentage` is set by the domain owner and can be changed at any point in time, but will **ONLY** be taken into account if the distribution type of the parent domain is `STAKE`. ### Key responsibilities -- Perform actual stake transfers based on the prices and fees acquired from ZNSPriceOracle as a part of the register transaction (locked to ZNSRegistrar only) -- Perform stake withdrawals for users who are removing their domains from ZNS as a part of the revoke transaction (locked to ZNSRegistrar only) -- Store staked amount in state (and possibly token address), tied to the domain hash and not a specific owner to be more adaptable to owner changes without the need to perform extra logic -- Store the address of the ERC-20 staking token and provide ways to re-set it in production -- Store the address of the ZNSPriceOracle contract in order to perform calls to get prices and fees. +- Provides a more straightforward way to set a fixed price that will be used for all subdomains +- Provides a way to set and get a calculated fee value based on the price of the domain and the fee percentage set by the domain owner +- Provides ways to reconfigure pricing and fees on a live system based on the set of variables through their setters -## [ZNSRegistrar](./contracts/distribution/ZNSRegistrar.md) -While Registrars in general can have arbitrary distribution logic (e.g. sales, auctions, giveaways, etc.) `ZNSRegistrar` is specifically designed to distribute all Root Domains of ZNS. It will do it through staking logic in conjunctions with other possible SCs. +## [ZNSTreasury](./contracts/treasury/ZNSTreasury.md) +This contract is responsible for all payments in the system, regardless of the domain depth and currently supports 2 types of payments: +1. `DIRECT` Payment Type - the most straighforward way where `ZNSTreasury` withdraws funds from the buyer's wallet and sends them to the parent domain owner's `beneficiary`. +2. `STAKE` Payment Type - here the buyer is required to stake the parent's `price` taken from one of the Pricer contracts onto `ZNSTreasury` contract itself. +In this case, a parent is allowed to set a certain `feePercentage` that will be applied to the calculated price and will be sent to the domain owner. That payment must also include an additional fee charged by Zer0's protocol. This is taken on top of the above both on invest and devest of the stake. The `STAKE` payment will be refunded back upon domain revocation +minus the fees. The treasury itself performs the actual stake transfers and stores their amounts along with the token address used, +mapped by `domainHash`. These amounts are used to unstake upon domain revocation later. -`ZNSRegistrar` is the entry point to the ZNS system for most main domain operations (register, reclaim, revoke) and is connected to all other contracts besides `ZNSPriceOracle`. It combines multiple operations into atomic transactions and routes the logic inside ZNS to achieve proper results for main domain operations. It also ensures proper sequences in which operations should be performed. +The treasury will send any generated protocol fees to the Zer0 Vault address specified by the zNS Admin. -`ZNSRegistrar` is the only contract in the system that has a proper ROLE assigned to it in `ZNSAccessController` to use it as a way to protect other contracts to be called only by the ZNSRegistrar, which protects the data in the system and ensures proper operation execution. Many other contract functions have `onlyRegistrar()` modifiers which make sure that the caller is a contract with REGISTRAR_ROLE. +`ZNSTreasury`, besides stake data, also stores the `PaymentConfigs` for each domain, set by the domain owner, which is a struct that contains the following data: +- `token` - the token to be used for payments +- `beneficiary` - the address that will receive the funds upon domain registration, if `STAKE` is used as `paymentType` on `ZNSSubRegistrar` +the `beneficiary` will **ONLY** receive the `stakeFee` set by the domain owner, if `DIRECT` is used, the `beneficiary` will receive the whole `price` + +The above configs are used to determine how to charge the buyer and where to send funds. ### Key responsibilities -- Store all system crucial modules (beside ZNSPriceOracle) in state to be able to call required contracts for any flow. -- Provide the main function for registering Root Domains, make sure that operations, especially ones using other contracts are performed properly and in proper sequence. Combine logic of other contracts in one atomic transaction. Check name existence, take the stake from the user, mint a domain token, set the data in ZNSRegistry. -- Provide the main function for reclaiming full domain ownership for owners of the specific Domain Token. Ensure that ONLY the owner of the actual token (tokenId) can do this, call ZNSRegistry to update the owner in records. -- Provide the main function for revoking domains. Make sure that the only address allowed to do that is both: owner of the Name and owner of the Token. Call ZNSRegistry to delete record, call ZNSDomainToken to burn the token, call ZNSTreasury to unstake. \ No newline at end of file +- Perform stake transfers based on the prices and fees acquired from the pricer contract as a part of the register transaction +- Perform stake withdrawals for users who are removing their domains from zNS as a part of the revoke transaction +- Perform direct transfers of price and all fees for registration +- Store staked amount and token used in state, tied to the domain hash and not a specific owner to be more adaptable to owner changes without the need to perform extra logic + +## [ZNSRootRegistrar](./contracts/registrar/ZNSRootRegistrar.md) +This contract is the entry point for 3 main operations: +1. Registering a new **Root** Domain +2. Reclaiming a Domain of any level +3. Revoking a Domain of any level + +`ZNSRootRegistrar` is connected to all other contracts and combines multiple operations into larger logical, atomic transactions. The root registrar routes the logic to other contracts inside zNS to achieve proper results for domain operations. In doing this, proper sequence is kept in ordering certain operations with different contracts. + + +`ZNSRegistrar` is the only contract in the system that has a proper role assigned to it. It is given the `REGISTRAR_ROLE` in `ZNSAccessController` to use it +as a way to protect other contracts to be called by any other address. This protects the data in the system and ensures proper operation execution. +Many other contract functions have `onlyRegistrar()` modifiers which make sure that the caller can only be a contract with that specific role. + +### Key responsibilities +- Store all system crucial modules in state to be able to call required contracts for any flow. +- Provide the main function for registering Root Domains, make sure that operations, especially ones using other contracts are performed properly and in proper sequence. Combine logic of other contracts in one atomic transaction. Check name existence, take the stake from the user, mint a domain token, set the data in `ZNSRegistry`. +- Provide the main function for reclaiming full domain ownership for owners of the specific Domain Token. Ensure that only the owner of the actual ERC-721 token owner can do this, call `ZNSRegistry` to update the owner in records. +- Provide the main function for revoking domains. Make sure that the only address allowed to revoke owns both the name, in the domain record held by the `ZNSRegistry` and the token, held by`ZNSDomainToken`. This will call `ZNSRegistry` to delete record, `ZNSDomainToken` to burn the token, and `ZNSTreasury` to unstake if needed. + +## [ZNSSubRegistrar](./contracts/registrar/ZNSSubRegistrar.md) +Contract responsible for the registration of subdomains and distribution configs for domains of all levels that are used to set and determine +how subdomains of any domain will be distributed. + +This contract is only connected to `ZNSRegistry` and `ZNSRootRegistrar` and uses its common functions to finalize subdomain registration. It stores `DistributionConfig`s for each domain in state, mapped by domain hash. +It also manages mintlists for each domain, where the owner of the domain can add and remove addresses that will be allowed or disallowed to mint subdomains of this domain. + +This contract is also assigned the `REGISTRAR_ROLE` at deploy time to be able to call other contracts with `onlyRegistrar()` modifiers. +All the state variables on this contract are able to be reset by either the domain owner (for domain related setters) or Zer0 Admin for the setters of system variables. + +For more information on Distribution Configs and Mintlists, please refer to the contract docs [ZNSSubRegistrar](./contracts/registrar/ZNSSubRegistrar.md). + +### Key responsibilities +- Provide a way to register subdomains of any level. +- Provide a way to set and get Distribution Rules (configs) for any domain. +- Provide a way to set and get Mintlists for any domain. +- Work together with `ZNSRootRegistrar` to finalize registration of subdomains. + +For any additional contract specific documentation, see the ["docs/contracts" folder](./contracts/) \ No newline at end of file diff --git a/docs/contracts/access/ZNSAccessController.md b/docs/contracts/access/ZNSAccessController.md index 298c71579..e01a1837c 100644 --- a/docs/contracts/access/ZNSAccessController.md +++ b/docs/contracts/access/ZNSAccessController.md @@ -9,7 +9,7 @@ Uses a role-based access control scheme with levels: - EXECUTOR: Can be here to future proof, if we need a new role (managed by Governor) - REGISTRAR: This role is here specifically for the ZNSRootRegistrar.sol contract (managed by Admin) -> This contract is NOT proxied. When new implementation is needed, a new contract will be deployed +> This contract is not proxied. When new implementation is needed, a new contract will be deployed and all modules will be updated to use the new address, since they all inherit from `AAccessControlled.sol`. ### constructor diff --git a/docs/flows.md b/docs/flows.md index 3d5507d22..c4b78acba 100644 --- a/docs/flows.md +++ b/docs/flows.md @@ -1,13 +1,16 @@ # ZNS Flow Diagrams ## Domain Content Discovery -![pic](./img/discovery.jpg) +![Domain content discovery flow](./img/discovery.jpg) ## Domain Registration -![pic](./img/register.jpg) +![Domain registration flow](./img/distribution.jpg) ## Domain Transfer -![pic](./img/transfer.jpg) +![Domain transfer flow](./img/transfer.jpg) + +## Domain Reclamation +![Domain reclaim flow](./img/reclamation.jpg) ## Domain Revocation -![pic](./img/revoke.jpg) \ No newline at end of file +![Domain revoke flow](./img/revoke.jpg) \ No newline at end of file diff --git a/docs/img/distribution.jpg b/docs/img/distribution.jpg new file mode 100644 index 000000000..dd9beef6b Binary files /dev/null and b/docs/img/distribution.jpg differ diff --git a/docs/img/full-architecture.jpg b/docs/img/full-architecture.jpg new file mode 100644 index 000000000..e42c7892f Binary files /dev/null and b/docs/img/full-architecture.jpg differ diff --git a/docs/img/full.jpg b/docs/img/full.jpg deleted file mode 100644 index d15a6993a..000000000 Binary files a/docs/img/full.jpg and /dev/null differ diff --git a/docs/img/reclamation.jpg b/docs/img/reclamation.jpg new file mode 100644 index 000000000..387cec21a Binary files /dev/null and b/docs/img/reclamation.jpg differ diff --git a/docs/img/revoke.jpg b/docs/img/revoke.jpg index 4d5b5c8c6..e34623f2e 100644 Binary files a/docs/img/revoke.jpg and b/docs/img/revoke.jpg differ diff --git a/hardhat.config.ts b/hardhat.config.ts index 3259b20ae..e26733e27 100644 --- a/hardhat.config.ts +++ b/hardhat.config.ts @@ -1,8 +1,8 @@ /* eslint-disable @typescript-eslint/no-var-requires, @typescript-eslint/no-unused-vars */ +require("dotenv").config(); import { mochaGlobalSetup, mochaGlobalTeardown } from "./test/mocha-global"; -require("dotenv").config(); import * as tenderly from "@tenderly/hardhat-tenderly"; import "@nomicfoundation/hardhat-toolbox"; @@ -43,11 +43,11 @@ const config : HardhatUserConfig = { solidity: { compilers: [ { - version: "0.8.18", + version: "0.8.26", settings: { optimizer: { enabled: true, - runs: 200, + runs: 20000, }, }, }, @@ -56,27 +56,27 @@ const config : HardhatUserConfig = { settings: { optimizer: { enabled: true, - runs: 200, + runs: 20000, }, }, }, ], overrides: { "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol": { - version: "0.8.9", + version: "0.8.20", settings: { optimizer: { enabled: true, - runs: 200, + runs: 20000, }, }, }, "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol": { - version: "0.8.9", + version: "0.8.20", settings: { optimizer: { enabled: true, - runs: 200, + runs: 20000, }, }, }, @@ -121,15 +121,26 @@ const config : HardhatUserConfig = { url: `${process.env.DEVNET_RPC_URL}`, chainId: 1, }, + // meowtestnet: { + // url: `${process.env.MEOWTESTNET_RPC_URL}`, + // accounts: [ + // `${process.env.DEPLOYER_PRIVATE_KEY}`, + // ], + // }, }, - defender: { - useDefenderDeploy: false, - apiKey: `${process.env.DEFENDER_KEY}`, - apiSecret: `${process.env.DEFENDER_SECRET}`, - }, - etherscan: { - apiKey: `${process.env.ETHERSCAN_API_KEY}`, - }, + // etherscan: { + // apiKey: `${process.env.ETHERSCAN_API_KEY}`, + // customChains: [ + // { + // network: "meowtestnet", + // chainId: 883424730, + // urls: { + // apiURL: "https://meowchain-testnet-blockscout.eu-north-2.gateway.fm/api/", + // browserURL: "https://meowchain-testnet-blockscout.eu-north-2.gateway.fm/", + // }, + // }, + // ], + // }, sourcify: { // If set to "true", will try to verify the contracts after deployment enabled: false, @@ -150,6 +161,20 @@ const config : HardhatUserConfig = { "oz-proxies/", ], }, + // meowtestnet: { + // url: `${process.env.MEOWTESTNET_RPC_URL}`, + // chainId: 883424730, + // accounts: [ // Comment out for CI, uncomment this when using Sepolia + // `${process.env.DEPLOYER_PRIVATE_KEY}`, + // `${process.env.ZERO_VAULT_PRIVATE_KEY}`, + // `${process.env.TESTNET_PRIVATE_KEY_A}`, + // `${process.env.TESTNET_PRIVATE_KEY_B}`, + // `${process.env.TESTNET_PRIVATE_KEY_C}`, + // `${process.env.TESTNET_PRIVATE_KEY_D}`, + // `${process.env.TESTNET_PRIVATE_KEY_E}`, + // `${process.env.TESTNET_PRIVATE_KEY_F}`, + // ], + // }, }; export default config; diff --git a/package.json b/package.json index 0bdc0ac49..7c6f36d73 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,7 @@ "repository": "https://github.com/zer0-os/zNS.git", "engines": { "node": ">=18", - "npm": ">=9" + "npm": ">=10" }, "scripts": { "compile": "hardhat compile", @@ -15,7 +15,7 @@ "lint-ts": "yarn eslint ./test/** ./src/**", "lint": "yarn lint-sol & yarn lint-ts --no-error-on-unmatched-pattern", "clean": "hardhat clean", - "build": "yarn run clean && yarn run compile", + "build": "yarn run clean && yarn run compile && tsc", "postbuild": "yarn save-tag", "typechain": "hardhat typechain", "pretest": "yarn mongo:start", @@ -42,16 +42,16 @@ "devDependencies": { "@ensdomains/ensjs": "2.1.0", "@nomicfoundation/hardhat-chai-matchers": "^2.0.2", - "@nomicfoundation/hardhat-ethers": "^3.0.5", - "@nomicfoundation/hardhat-network-helpers": "^1.0.9", + "@nomicfoundation/hardhat-ethers": "^3.0.8", + "@nomicfoundation/hardhat-network-helpers": "^1.0.11", "@nomicfoundation/hardhat-toolbox": "^4.0.0", - "@nomicfoundation/hardhat-verify": "^2.0.0", - "@openzeppelin/contracts": "4.9.3", + "@nomicfoundation/hardhat-verify": "^2.0.8", + "@openzeppelin/contracts": "^5.0.2", "@openzeppelin/contracts-400": "npm:@openzeppelin/contracts@4.0.0", - "@openzeppelin/contracts-upgradeable": "4.9.3", + "@openzeppelin/contracts-upgradeable": "^5.0.2", "@openzeppelin/contracts-upgradeable-400": "npm:@openzeppelin/contracts-upgradeable@4.0.0", "@openzeppelin/defender-sdk": "^1.7.0", - "@openzeppelin/hardhat-upgrades": "2.5.0", + "@openzeppelin/hardhat-upgrades": "^3.2.1", "@semantic-release/git": "^10.0.1", "@tenderly/hardhat-tenderly": "^2.0.1", "@typechain/ethers-v6": "^0.5.1", @@ -59,22 +59,23 @@ "@types/chai": "^4.3.11", "@types/mocha": "^9.1.0", "@types/node": "^18.15.11", - "@zero-tech/eslint-config-cpt": "0.2.7", - "@zero-tech/ztoken": "2.0.0", + "@zero-tech/eslint-config-cpt": "0.2.8", + "@zero-tech/ztoken": "2.1.0", "chai": "^4.3.10", - "eslint": "^8.37.0", - "ethers": "^6.9.0", - "hardhat": "^2.19.1", + "eslint": "^8.56.0", + "ethers": "^6.13.2", + "hardhat": "^2.22.10", "hardhat-gas-reporter": "^1.0.9", "semantic-release": "^21.0.1", - "solhint": "^4.0.0", - "solidity-coverage": "^0.8.5", + "solhint": "^5.0.1", + "solidity-coverage": "^0.8.12", "solidity-docgen": "^0.6.0-beta.36", "ts-node": "10.9.1", "typechain": "^8.3.2", "typescript": "^5.0.2" }, "dependencies": { + "@zero-tech/zdc": "../zDC/zero-tech-zdc-0.1.7.tgz", "axios": "^1.4.0", "dotenv": "16.0.3", "mongodb": "^6.1.0", diff --git a/src/deploy/campaign/deploy-campaign.ts b/src/deploy/campaign/deploy-campaign.ts deleted file mode 100644 index 24e26c2d8..000000000 --- a/src/deploy/campaign/deploy-campaign.ts +++ /dev/null @@ -1,153 +0,0 @@ -import { - ICampaignArgs, - ICampaignState, - IDeployCampaignConfig, - TLogger, - IMissionInstances, - TZNSContractState, - ContractV6, -} from "./types"; -import { HardhatDeployer } from "../deployer/hardhat-deployer"; -import { ITenderlyContractData, TDeployMissionCtor } from "../missions/types"; -import { BaseDeployMission } from "../missions/base-deploy-mission"; -import { MongoDBAdapter } from "../db/mongo-adapter/mongo-adapter"; - - -export class DeployCampaign { - state : ICampaignState; - deployer : HardhatDeployer; - dbAdapter : MongoDBAdapter; - logger : TLogger; - config : IDeployCampaignConfig; - - // TODO dep: improve typing here so that methods of each contract type are resolved in Mission classes! - // eslint-disable-next-line @typescript-eslint/no-explicit-any - [name : string | symbol] : any; - - private static indexedHandler : ProxyHandler = { - get: (target, prop) => { - if (typeof prop === "string") { - if (!!target.state.contracts[prop]) { - return target.state.contracts[prop]; - } - - if (!!target[prop]) { - return target[prop]; - } - } - }, - }; - - constructor ({ - missions, - deployer, - dbAdapter, - logger, - config, - } : ICampaignArgs) { - this.state = { - missions, - instances: {}, - contracts: {} as TZNSContractState, - }; - this.deployer = deployer; - this.dbAdapter = dbAdapter; - this.logger = logger; - this.config = config; - - const campaignProxy = new Proxy(this, DeployCampaign.indexedHandler); - - // instantiate all missions - this.state.instances = missions.reduce( - (acc : IMissionInstances, mission : TDeployMissionCtor) => { - const instance = new mission({ - campaign: campaignProxy, - logger, - config, - }); - - acc[instance.instanceName] = instance; - return acc; - }, - {} - ); - - this.logger.info("Deploy Campaign initialized."); - - return campaignProxy; - } - - async execute () { - this.logger.info("Deploy Campaign execution started."); - - await Object.values(this.state.instances).reduce( - async ( - acc : Promise, - missionInstance : BaseDeployMission, - ) : Promise => { - await acc; - return missionInstance.execute(); - }, - Promise.resolve() - ); - - if (this.config.postDeploy.verifyContracts) { - await this.verify(); - } - - if (this.config.postDeploy.monitorContracts) { - await this.monitor(); - } - - this.logger.info("Deploy Campaign execution finished successfully."); - } - - updateStateContract (instanceName : string, contractName : string, contract : ContractV6) { - this.state.contracts[instanceName] = contract; - this.logger.debug(`Data of deployed contract '${contractName}' is added to Campaign state at '${instanceName}'.`); - } - - async verify () { - return Object.values(this.state.instances).reduce( - async ( - acc : Promise, - missionInstance : BaseDeployMission, - ) => { - await acc; - return missionInstance.verify(); - }, - Promise.resolve() - ); - } - - async monitor () { - this.logger.info("Pushing contracts to Tenderly..."); - - const contracts = await Object.values(this.state.instances).reduce( - async ( - acc : Promise>, - missionInstance : BaseDeployMission, - ) : Promise> => { - const newAcc = await acc; - const data = await missionInstance.getMonitoringData(); - - return [...newAcc, ...data]; - }, - Promise.resolve([]) - ); - - try { - const response = await this.deployer.tenderlyPush(contracts); - this.logger.info( - `Tenderly push finished successfully for Project ${this.config.postDeploy.tenderlyProjectSlug} - with data: ${JSON.stringify(response, null, "\t")}` - ); - /* eslint-disable-next-line @typescript-eslint/no-explicit-any */ - } catch (e : any) { - this.logger.error("Tenderly push failed."); - this.logger.error(e.message); - this.logger.debug("Continuing..."); - } - - } -} diff --git a/src/deploy/campaign/environments.ts b/src/deploy/campaign/environments.ts index f8b064a99..d80ee72a0 100644 --- a/src/deploy/campaign/environments.ts +++ b/src/deploy/campaign/environments.ts @@ -1,267 +1,274 @@ -import { HardhatEthersSigner, SignerWithAddress } from "@nomicfoundation/hardhat-ethers/signers"; - -import { IDeployCampaignConfig } from "./types"; -import { - DEFAULT_PROTOCOL_FEE_PERCENT, - DEFAULT_ROYALTY_FRACTION, - ZNS_DOMAIN_TOKEN_NAME, - ZNS_DOMAIN_TOKEN_SYMBOL, - DEFAULT_DECIMALS, - DECAULT_PRECISION, - DEFAULT_PRICE_CONFIG, - getCurvePrice, - NO_MOCK_PROD_ERR, - STAKING_TOKEN_ERR, - INVALID_CURVE_ERR, - MONGO_URI_ERR, - INVALID_ENV_ERR, NO_ZERO_VAULT_ERR, -} from "../../../test/helpers"; -import { ethers } from "ethers"; -import { ICurvePriceConfig } from "../missions/types"; -import { MeowMainnet } from "../missions/contracts/meow-token/mainnet-data"; -import { DefenderRelaySigner } from "@openzeppelin/defender-sdk-relay-signer-client/lib/ethers"; - - -const getCustomAddresses = ( - key : string, - deployerAddress : string, - accounts ?: Array -) => { - const addresses = []; - - if (process.env[key]) { - /* eslint-disable @typescript-eslint/no-non-null-assertion */ - const decoded = atob(process.env[key]!); - - // Check if there is more than one custom governor - if (decoded.includes(",")) { - addresses.push(...decoded.split(",")); - } else { - addresses.push(decoded); - } - } - - if (accounts && accounts.length > 0) { - addresses.push(...accounts); // The user provided custom governors / admins as a param for testing - } - - if (!addresses.includes(deployerAddress)) { - // No custom governors / admins provided, use the deployer as the default - addresses.push(deployerAddress); - } - - - return addresses; -}; - -// This function builds a config with default values but overrides them with any values that are set -export const getConfig = async ({ - deployer, - governors, - admins, - zeroVaultAddress, - env, // this is ONLY used for tests! -} : { - deployer : SignerWithAddress | DefenderRelaySigner; - governors ?: Array; - admins ?: Array; - zeroVaultAddress ?: string; - env ?: string; -}) : Promise => { - // Will throw an error based on any invalid setup, given the `ENV_LEVEL` set - const priceConfig = validateEnv(env); - - let deployerAddress; - if (deployer && Object.keys(deployer).includes("address")) { - deployerAddress = (deployer as HardhatEthersSigner).address; - } else { - deployerAddress = await deployer.getAddress(); - } - - if (process.env.ENV_LEVEL === "dev") { - requires(!!zeroVaultAddress, "Must pass `zeroVaultAddress` to `getConfig()` for `dev` environment"); - } - - const zeroVaultAddressConf = process.env.ENV_LEVEL === "dev" - ? zeroVaultAddress! - : process.env.ZERO_VAULT_ADDRESS!; - - // Domain Token Values - const royaltyReceiver = process.env.ENV_LEVEL !== "dev" ? process.env.ROYALTY_RECEIVER! : zeroVaultAddressConf; - const royaltyFraction = - process.env.ROYALTY_FRACTION - ? BigInt(process.env.ROYALTY_FRACTION) - : DEFAULT_ROYALTY_FRACTION; - - // Get governor addresses set through env, if any - const governorAddresses = getCustomAddresses("GOVERNOR_ADDRESSES", deployerAddress, governors); - - // Get admin addresses set through env, if any - const adminAddresses = getCustomAddresses("ADMIN_ADDRESSES", deployerAddress, admins); - - const config : IDeployCampaignConfig = { - env: process.env.ENV_LEVEL!, - deployAdmin: deployer, - governorAddresses, - adminAddresses, - domainToken: { - name: process.env.DOMAIN_TOKEN_NAME ? process.env.DOMAIN_TOKEN_NAME : ZNS_DOMAIN_TOKEN_NAME, - symbol: process.env.DOMAIN_TOKEN_SYMBOL ? process.env.DOMAIN_TOKEN_SYMBOL : ZNS_DOMAIN_TOKEN_SYMBOL, - defaultRoyaltyReceiver: royaltyReceiver, - defaultRoyaltyFraction: royaltyFraction, - }, - rootPriceConfig: priceConfig, - zeroVaultAddress: zeroVaultAddressConf, - mockMeowToken: process.env.MOCK_MEOW_TOKEN === "true", - stakingTokenAddress: process.env.STAKING_TOKEN_ADDRESS!, - postDeploy: { - tenderlyProjectSlug: process.env.TENDERLY_PROJECT_SLUG!, - monitorContracts: process.env.MONITOR_CONTRACTS === "true", - verifyContracts: process.env.VERIFY_CONTRACTS === "true", - }, - }; - - return config; -}; - -// For testing the behaviour when we manipulate, we have an optional "env" string param -export const validateEnv = ( - env ?: string, // this is ONLY used for tests! -) : ICurvePriceConfig => { - // Prioritize reading from the env variable first, and only then fallback to the param - let envLevel = process.env.ENV_LEVEL; - - if (env) { - // We only ever specify an `env` param in tests - // So if there is a value we must use that instead - // otherwise only ever use the ENV_LEVEL above - envLevel = env; - } - - // Validate price config first since we have to return it - const priceConfig = getValidateRootPriceConfig(); - - if (envLevel === "dev") return priceConfig; - - if (envLevel === "test" || envLevel === "dev") { - if (process.env.MOCK_MEOW_TOKEN === "false" && !process.env.STAKING_TOKEN_ADDRESS) { - throw new Error("Must provide a staking token address if not mocking MEOW token in `dev` environment"); - } - } - - if (envLevel !== "test" && envLevel !== "prod") { - // If we reach this code, there is an env variable, but it's not valid. - throw new Error(INVALID_ENV_ERR); - } - - if (!process.env.ROYALTY_RECEIVER) { - throw new Error("Must provide a default royalty receiver"); - } - - if (!process.env.ROYALTY_FRACTION) { - throw new Error("Must provide a default royalty fraction"); - } - - if (!process.env.MONGO_DB_URI) { - throw new Error(`Must provide a Mongo URI used for ${envLevel} environment!`); - } - - requires(!!process.env.ZERO_VAULT_ADDRESS, NO_ZERO_VAULT_ERR); - - // Mainnet - if (envLevel === "prod") { - requires(process.env.MOCK_MEOW_TOKEN === "false", NO_MOCK_PROD_ERR); - requires(process.env.STAKING_TOKEN_ADDRESS === MeowMainnet.address, STAKING_TOKEN_ERR); - requires(!process.env.MONGO_DB_URI.includes("localhost"), MONGO_URI_ERR); - } - - if (process.env.VERIFY_CONTRACTS === "true") { - requires(!!process.env.ETHERSCAN_API_KEY, "Must provide an Etherscan API Key to verify contracts"); - } - - if (process.env.MONITOR_CONTRACTS === "true") { - requires(!!process.env.TENDERLY_PROJECT_SLUG, "Must provide a Tenderly Project Slug to monitor contracts"); - requires(!!process.env.TENDERLY_ACCOUNT_ID, "Must provide a Tenderly Account ID to monitor contracts"); - requires(!!process.env.TENDERLY_ACCESS_KEY, "Must provide a Tenderly Access Key to monitor contracts"); - } - - return priceConfig; -}; - -const getValidateRootPriceConfig = () => { - - if (process.env.ENV_LEVEL === "prod") { - requires( - !!process.env.MAX_PRICE - && !!process.env.MIN_PRICE - && !!process.env.MAX_LENGTH - && !!process.env.BASE_LENGTH - && !!process.env.DECIMALS - && !!process.env.PRECISION - && !!process.env.PROTOCOL_FEE_PERC, - "Must provide all price config variables for prod environment!" - ); - } - - // Price config variables - const maxPrice = - process.env.MAX_PRICE - ? ethers.parseEther(process.env.MAX_PRICE) - : DEFAULT_PRICE_CONFIG.maxPrice; - - const minPrice = - process.env.MIN_PRICE - ? ethers.parseEther(process.env.MIN_PRICE) - : DEFAULT_PRICE_CONFIG.minPrice; - - const maxLength = - process.env.MAX_LENGTH - ? BigInt(process.env.MAX_LENGTH) - : DEFAULT_PRICE_CONFIG.maxLength; - - const baseLength = - process.env.BASE_LENGTH - ? BigInt(process.env.BASE_LENGTH) - : DEFAULT_PRICE_CONFIG.baseLength; - - const decimals = process.env.DECIMALS ? BigInt(process.env.DECIMALS) : DEFAULT_DECIMALS; - const precision = process.env.PRECISION ? BigInt(process.env.PRECISION) : DECAULT_PRECISION; - const precisionMultiplier = BigInt(10) ** (decimals - precision); - - const feePercentage = - process.env.PROTOCOL_FEE_PERC - ? BigInt(process.env.PROTOCOL_FEE_PERC) - : DEFAULT_PROTOCOL_FEE_PERCENT; - - const priceConfig : ICurvePriceConfig = { - maxPrice, - minPrice, - maxLength, - baseLength, - precisionMultiplier, - feePercentage, - isSet: true, - }; - - requires(validatePrice(priceConfig), INVALID_CURVE_ERR); - - return priceConfig; -}; - -const requires = (condition : boolean, message : string) => { - if (!condition) { - throw new Error(message); - } -}; - -// No price spike before `minPrice` kicks in at `maxLength` -const validatePrice = (config : ICurvePriceConfig) => { - const strA = "a".repeat(Number(config.maxLength)); - const strB = "b".repeat(Number(config.maxLength + 1n)); - - const priceA = getCurvePrice(strA, config); - const priceB = getCurvePrice(strB, config); - - // if B > A, then the price spike is invalid - return (priceB <= priceA); -}; +import { SignerWithAddress } from "@nomicfoundation/hardhat-ethers/signers"; +import { IZNSCampaignConfig } from "./types"; +import { + DEFAULT_PROTOCOL_FEE_PERCENT, + DEFAULT_ROYALTY_FRACTION, + ZNS_DOMAIN_TOKEN_NAME, + ZNS_DOMAIN_TOKEN_SYMBOL, + DEFAULT_DECIMALS, + DECAULT_PRECISION, + DEFAULT_PRICE_CONFIG, + getCurvePrice, + NO_MOCK_PROD_ERR, + STAKING_TOKEN_ERR, + INVALID_CURVE_ERR, + MONGO_URI_ERR, + INVALID_ENV_ERR, NO_ZERO_VAULT_ERR, +} from "../../../test/helpers"; +import { ethers } from "ethers"; +import { ICurvePriceConfig } from "../missions/types"; +import { MeowMainnet } from "../missions/contracts/meow-token/mainnet-data"; + + +const getCustomAddresses = ( + key : string, + deployerAddress : string, + accounts ?: Array +) => { + const addresses = []; + + if (process.env[key]) { + /* eslint-disable @typescript-eslint/no-non-null-assertion */ + const decoded = atob(process.env[key]!); + + // Check if there is more than one custom governor + if (decoded.includes(",")) { + addresses.push(...decoded.split(",")); + } else { + addresses.push(decoded); + } + } + + if (accounts && accounts.length > 0) { + addresses.push(...accounts); // The user provided custom governors / admins as a param for testing + } + + if (!addresses.includes(deployerAddress)) { + // No custom governors / admins provided, use the deployer as the default + addresses.push(deployerAddress); + } + + + return addresses; +}; + +// This function builds a config with default values but overrides them with any values that are set +export const getCampaignConfig = async ({ + deployer, + governors, + admins, + zeroVaultAddress, + env, // this is ONLY used for tests! +} : { + deployer : SignerWithAddress; + governors ?: Array; + admins ?: Array; + zeroVaultAddress ?: string; + env ?: string; +}) : Promise => { + // Will throw an error based on any invalid setup, given the `ENV_LEVEL` set + const priceConfig = validateEnv(env); + + let deployerAddress; + if (deployer && Object.keys(deployer).includes("address")) { + deployerAddress = deployer.address; + } else { + deployerAddress = await deployer.getAddress(); + } + + let zeroVaultAddressConf; + + if (process.env.ENV_LEVEL === "dev") { + requires( + !!zeroVaultAddress || !!process.env.ZERO_VAULT_ADDRESS, + "Must pass `zeroVaultAddress` to `getConfig()` for `dev` environment" + ); + zeroVaultAddressConf = zeroVaultAddress || process.env.ZERO_VAULT_ADDRESS; + } else { + zeroVaultAddressConf = process.env.ZERO_VAULT_ADDRESS; + } + + // Domain Token Values + const royaltyReceiver = process.env.ENV_LEVEL !== "dev" ? process.env.ROYALTY_RECEIVER! : zeroVaultAddressConf; + const royaltyFraction = + process.env.ROYALTY_FRACTION + ? BigInt(process.env.ROYALTY_FRACTION) + : DEFAULT_ROYALTY_FRACTION; + + // Get governor addresses set through env, if any + const governorAddresses = getCustomAddresses("GOVERNOR_ADDRESSES", deployerAddress, governors); + + // Get admin addresses set through env, if any + const adminAddresses = getCustomAddresses("ADMIN_ADDRESSES", deployerAddress, admins); + + const config : IZNSCampaignConfig = { + env: process.env.ENV_LEVEL!, + upgrade: process.env.UPGRADE === "true", + deployAdmin: deployer, + governorAddresses, + adminAddresses, + domainToken: { + name: process.env.DOMAIN_TOKEN_NAME ? process.env.DOMAIN_TOKEN_NAME : ZNS_DOMAIN_TOKEN_NAME, + symbol: process.env.DOMAIN_TOKEN_SYMBOL ? process.env.DOMAIN_TOKEN_SYMBOL : ZNS_DOMAIN_TOKEN_SYMBOL, + defaultRoyaltyReceiver: royaltyReceiver!, + defaultRoyaltyFraction: royaltyFraction, + }, + rootPriceConfig: priceConfig, + zeroVaultAddress: zeroVaultAddressConf as string, + mockMeowToken: process.env.MOCK_MEOW_TOKEN === "true", + stakingTokenAddress: process.env.STAKING_TOKEN_ADDRESS!, + postDeploy: { + tenderlyProjectSlug: process.env.TENDERLY_PROJECT_SLUG!, + monitorContracts: process.env.MONITOR_CONTRACTS === "true", + verifyContracts: process.env.VERIFY_CONTRACTS === "true", + }, + }; + + return config; +}; + +// For testing the behaviour when we manipulate, we have an optional "env" string param +export const validateEnv = ( + env ?: string, // this is ONLY used for tests! +) : ICurvePriceConfig => { + // Prioritize reading from the env variable first, and only then fallback to the param + let envLevel = process.env.ENV_LEVEL; + + if (env) { + // We only ever specify an `env` param in tests + // So if there is a value we must use that instead + // otherwise only ever use the ENV_LEVEL above + envLevel = env; + } + + // Validate price config first since we have to return it + const priceConfig = getValidateRootPriceConfig(); + + if (envLevel === "dev") return priceConfig; + + if (envLevel === "test" || envLevel === "dev") { + if (process.env.MOCK_MEOW_TOKEN === "false" && !process.env.STAKING_TOKEN_ADDRESS) { + throw new Error("Must provide a staking token address if not mocking MEOW token in `dev` environment"); + } + } + + if (envLevel !== "test" && envLevel !== "prod") { + // If we reach this code, there is an env variable, but it's not valid. + throw new Error(INVALID_ENV_ERR); + } + + if (!process.env.ROYALTY_RECEIVER) { + throw new Error("Must provide a default royalty receiver"); + } + + if (!process.env.ROYALTY_FRACTION) { + throw new Error("Must provide a default royalty fraction"); + } + + if (!process.env.MONGO_DB_URI) { + throw new Error(`Must provide a Mongo URI used for ${envLevel} environment!`); + } + + requires(!!process.env.ZERO_VAULT_ADDRESS, NO_ZERO_VAULT_ERR); + + // Mainnet + if (envLevel === "prod") { + requires( + process.env.UPGRADE === "true", + "Production contracts can ONLY be upgraded! Set UPGRADE='true' in .env" + ); + requires(process.env.MOCK_MEOW_TOKEN === "false", NO_MOCK_PROD_ERR); + requires(process.env.STAKING_TOKEN_ADDRESS === MeowMainnet.address, STAKING_TOKEN_ERR); + requires(!process.env.MONGO_DB_URI.includes("localhost"), MONGO_URI_ERR); + } + + if (process.env.VERIFY_CONTRACTS === "true") { + requires(!!process.env.ETHERSCAN_API_KEY, "Must provide an Etherscan API Key to verify contracts"); + } + + if (process.env.MONITOR_CONTRACTS === "true") { + requires(!!process.env.TENDERLY_PROJECT_SLUG, "Must provide a Tenderly Project Slug to monitor contracts"); + requires(!!process.env.TENDERLY_ACCOUNT_ID, "Must provide a Tenderly Account ID to monitor contracts"); + requires(!!process.env.TENDERLY_ACCESS_KEY, "Must provide a Tenderly Access Key to monitor contracts"); + } + + return priceConfig; +}; + +const getValidateRootPriceConfig = () => { + + if (process.env.ENV_LEVEL === "prod") { + requires( + !!process.env.MAX_PRICE + && !!process.env.MIN_PRICE + && !!process.env.MAX_LENGTH + && !!process.env.BASE_LENGTH + && !!process.env.DECIMALS + && !!process.env.PRECISION + && !!process.env.PROTOCOL_FEE_PERC, + "Must provide all price config variables for prod environment!" + ); + } + + // Price config variables + const maxPrice = + process.env.MAX_PRICE + ? ethers.parseEther(process.env.MAX_PRICE) + : DEFAULT_PRICE_CONFIG.maxPrice; + + const minPrice = + process.env.MIN_PRICE + ? ethers.parseEther(process.env.MIN_PRICE) + : DEFAULT_PRICE_CONFIG.minPrice; + + const maxLength = + process.env.MAX_LENGTH + ? BigInt(process.env.MAX_LENGTH) + : DEFAULT_PRICE_CONFIG.maxLength; + + const baseLength = + process.env.BASE_LENGTH + ? BigInt(process.env.BASE_LENGTH) + : DEFAULT_PRICE_CONFIG.baseLength; + + const decimals = process.env.DECIMALS ? BigInt(process.env.DECIMALS) : DEFAULT_DECIMALS; + const precision = process.env.PRECISION ? BigInt(process.env.PRECISION) : DECAULT_PRECISION; + const precisionMultiplier = BigInt(10) ** (decimals - precision); + + const feePercentage = + process.env.PROTOCOL_FEE_PERC + ? BigInt(process.env.PROTOCOL_FEE_PERC) + : DEFAULT_PROTOCOL_FEE_PERCENT; + + const priceConfig : ICurvePriceConfig = { + maxPrice, + minPrice, + maxLength, + baseLength, + precisionMultiplier, + feePercentage, + isSet: true, + }; + + requires(validatePrice(priceConfig), INVALID_CURVE_ERR); + + return priceConfig; +}; + +const requires = (condition : boolean, message : string) => { + if (!condition) { + throw new Error(message); + } +}; + +// No price spike before `minPrice` kicks in at `maxLength` +const validatePrice = (config : ICurvePriceConfig) => { + const strA = "a".repeat(Number(config.maxLength)); + const strB = "b".repeat(Number(config.maxLength + 1n)); + + const priceA = getCurvePrice(strA, config); + const priceB = getCurvePrice(strB, config); + + // if B > A, then the price spike is invalid + return (priceB <= priceA); +}; diff --git a/src/deploy/campaign/types.ts b/src/deploy/campaign/types.ts index 1bee5a3cd..55c77d59d 100644 --- a/src/deploy/campaign/types.ts +++ b/src/deploy/campaign/types.ts @@ -1,18 +1,21 @@ -import { BaseDeployMission } from "../missions/base-deploy-mission"; -import { BaseContract } from "ethers"; -import { ICurvePriceConfig, TDeployMissionCtor } from "../missions/types"; -import { HardhatDeployer } from "../deployer/hardhat-deployer"; -import { HardhatEthersSigner } from "@nomicfoundation/hardhat-ethers/signers"; -import { IZNSContracts } from "../../../test/helpers/types"; -import { Logger as WinstonLogger } from "winston"; -import { MongoDBAdapter } from "../db/mongo-adapter/mongo-adapter"; -import { DefenderRelaySigner } from "@openzeppelin/defender-sdk-relay-signer-client/lib/ethers"; - -export type ContractV6 = BaseContract & Omit; - -export interface IDeployCampaignConfig { - env : string; - deployAdmin : HardhatEthersSigner | DefenderRelaySigner; +import { ICurvePriceConfig } from "../missions/types"; +import { IContractState, IDeployCampaignConfig } from "@zero-tech/zdc"; +import { + MeowTokenMock, + ZNSAccessController, + ZNSAddressResolver, + ZNSCurvePricer, + ZNSDomainToken, + ZNSFixedPricer, + ZNSRegistry, + ZNSRootRegistrar, + ZNSSubRegistrar, + ZNSTreasury, +} from "../../../typechain"; +import { MeowToken } from "@zero-tech/ztoken/typechain-js"; + + +export interface IZNSCampaignConfig extends IDeployCampaignConfig { governorAddresses : Array; adminAddresses : Array; domainToken : { @@ -25,35 +28,30 @@ export interface IDeployCampaignConfig { zeroVaultAddress : string; mockMeowToken : boolean; stakingTokenAddress : string; - postDeploy : { - tenderlyProjectSlug : string; - monitorContracts : boolean; - verifyContracts : boolean; - }; -} - -export type TLogger = WinstonLogger | Console; - -export interface IContractState { - [key : string] : ContractV6; } -export interface IMissionInstances { - [key : string] : BaseDeployMission; +export type ZNSContract = + ZNSAccessController | + ZNSRegistry | + ZNSDomainToken | + MeowTokenMock | + MeowToken | + ZNSAddressResolver | + ZNSCurvePricer | + ZNSTreasury | + ZNSRootRegistrar | + ZNSFixedPricer | + ZNSSubRegistrar; + +export interface IZNSContracts extends IContractState { + accessController : ZNSAccessController; + registry : ZNSRegistry; + domainToken : ZNSDomainToken; + meowToken : MeowTokenMock; + addressResolver : ZNSAddressResolver; + curvePricer : ZNSCurvePricer; + treasury : ZNSTreasury; + rootRegistrar : ZNSRootRegistrar; + fixedPricer : ZNSFixedPricer; + subRegistrar : ZNSSubRegistrar; } - -export interface ICampaignState { - missions : Array; - instances : IMissionInstances; - contracts : TZNSContractState; -} - -export interface ICampaignArgs { - missions : Array; - deployer : HardhatDeployer; - dbAdapter : MongoDBAdapter; - logger : TLogger; - config : IDeployCampaignConfig; -} - -export type TZNSContractState = IContractState & IZNSContracts; \ No newline at end of file diff --git a/src/deploy/constants.ts b/src/deploy/constants.ts index 23758db41..3b0bdad4d 100644 --- a/src/deploy/constants.ts +++ b/src/deploy/constants.ts @@ -1,5 +1,6 @@ +import { IProxyKinds } from "@zero-tech/zdc"; import { ethers } from "ethers"; -import { IProxyKinds } from "./missions/types"; + export const ProxyKinds : IProxyKinds = { uups: "uups", diff --git a/src/deploy/db/mongo-adapter/constants.ts b/src/deploy/db/mongo-adapter/constants.ts deleted file mode 100644 index 1b0e4ded9..000000000 --- a/src/deploy/db/mongo-adapter/constants.ts +++ /dev/null @@ -1,14 +0,0 @@ - -export const COLL_NAMES = { - contracts: "contracts", - versions: "versions", -}; - -export const VERSION_TYPES = { - temp: "TEMP", - deployed: "DEPLOYED", - archived: "ARCHIVED", -}; - -export const DEFAULT_MONGO_URI = "mongodb://localhost:27018"; -export const DEFAULT_MONGO_DB_NAME = "zns-campaign"; diff --git a/src/deploy/db/mongo-adapter/get-adapter.ts b/src/deploy/db/mongo-adapter/get-adapter.ts deleted file mode 100644 index ea571f105..000000000 --- a/src/deploy/db/mongo-adapter/get-adapter.ts +++ /dev/null @@ -1,66 +0,0 @@ -import { MongoDBAdapter } from "./mongo-adapter"; -import { getLogger } from "../../logger/create-logger"; -import { DEFAULT_MONGO_DB_NAME, DEFAULT_MONGO_URI } from "./constants"; -import { TLogger } from "../../campaign/types"; - -let mongoAdapter : MongoDBAdapter | null = null; - -export const resetMongoAdapter = () => { - mongoAdapter = null; -}; - - -export const getMongoAdapter = async (logger ?: TLogger) : Promise => { - const checkParams = { - dbUri: process.env.MONGO_DB_URI - ? process.env.MONGO_DB_URI - : DEFAULT_MONGO_URI, - dbName: process.env.MONGO_DB_NAME - ? process.env.MONGO_DB_NAME - : DEFAULT_MONGO_DB_NAME, - }; - - logger = !logger ? getLogger() : logger; - - const params = { - logger, - clientOpts: process.env.MONGO_DB_CLIENT_OPTS - ? JSON.parse(process.env.MONGO_DB_CLIENT_OPTS) - : undefined, - version: process.env.MONGO_DB_VERSION - ? process.env.MONGO_DB_VERSION - : undefined, - archive: process.env.ARCHIVE_PREVIOUS_DB_VERSION === "true", - }; - - let createNew = false; - if (mongoAdapter) { - Object.values(checkParams).forEach( - ([key, value]) => { - if (key === "version") key = "curVersion"; - - // if the existing adapter was created with different options than the currently needed one - // we create a new one and overwrite - if (JSON.stringify(mongoAdapter?.[key]) !== JSON.stringify(value)) { - createNew = true; - return; - } - } - ); - } else { - createNew = true; - } - - if (createNew) { - logger.debug("Creating new MongoDBAdapter instance"); - mongoAdapter = new MongoDBAdapter({ - ...checkParams, - ...params, - }); - await mongoAdapter.initialize(params.version); - } else { - logger.debug("Returning existing MongoDBAdapter instance"); - } - - return mongoAdapter as MongoDBAdapter; -}; diff --git a/src/deploy/db/mongo-adapter/mongo-adapter.ts b/src/deploy/db/mongo-adapter/mongo-adapter.ts deleted file mode 100644 index 18877c11c..000000000 --- a/src/deploy/db/mongo-adapter/mongo-adapter.ts +++ /dev/null @@ -1,288 +0,0 @@ -/* eslint-disable @typescript-eslint/no-non-null-assertion */ -import fs from "fs"; -import { TLogger } from "../../campaign/types"; -import { Collection, Db, MongoClient, MongoClientOptions } from "mongodb"; -import { IDBVersion, IMongoDBAdapterArgs } from "./types"; -import { COLL_NAMES, VERSION_TYPES } from "./constants"; -import { IContractDbData } from "../types"; -import { tagFilePath } from "../../../utils/git-tag/constants"; -// eslint-disable-next-line @typescript-eslint/no-var-requires -require("dotenv").config(); - - -export class MongoDBAdapter { - logger : TLogger; - client : MongoClient; - dbUri : string; - dbName : string; - db : Db; - curVersion : string; - clientOpts ?: MongoClientOptions; - archiveCurrentDeployed : boolean; - - // Collection pointers - contracts : Collection; - versions : Collection; - - // eslint-disable-next-line @typescript-eslint/no-explicit-any - [name : string | symbol] : any; - - constructor ({ - logger, - dbUri, - dbName, - clientOpts, - archive, - } : IMongoDBAdapterArgs) { - this.logger = logger; - this.client = new MongoClient(dbUri, clientOpts); - this.clientOpts = clientOpts; - this.dbUri = dbUri; - this.dbName = dbName; - this.db = {} as Db; - this.contracts = {} as Collection; - this.versions = {} as Collection; - this.curVersion = "0"; - this.archiveCurrentDeployed = !!archive; - } - - // call this to actually start the adapter - async initialize (version ?: string) { - try { - await this.client.connect(); - this.db = this.client.db(this.dbName); - - this.logger.info({ - message: "MongoDB connected", - }); - } catch (e) { - this.logger.error({ - message: "MongoDB connection failed", - error: e, - }); - throw e; - } - - this.contracts = this.db.collection(COLL_NAMES.contracts); - this.versions = this.db.collection(COLL_NAMES.versions); - - // TODO dep: can we use this prop in all the contract getters to not - // have to determine them dynamically every time ?? is this reliable enough? - this.curVersion = await this.configureVersioning(version); - - return this.db; - } - - async close (forceClose = false) { - try { - await this.client.close(forceClose); - this.logger.info("MongoDB connection closed"); - } catch (e) { - this.logger.error({ - message: "MongoDB connection failed to close", - error: e, - }); - throw e; - } - } - - // Contract methods - async getContract (contractName : string, version ?: string) { - if (!version) { - ({ dbVersion: version } = await this.getCheckLatestVersion()); - } - - return this.contracts.findOne({ - name: contractName, - version, - }); - } - - async writeContract (contractName : string, data : Omit, version ?: string) { - if (!version) { - ({ dbVersion: version } = await this.getCheckLatestVersion()); - } - - await this.contracts.insertOne({ - ...data, - version, - }); - - this.logger.debug(`Successfully wrote ${contractName} to DB.`); - } - - async dropDB () { - await this.db.dropDatabase(); - this.logger.info("Database dropped successfully."); - } - - // Versioning methods - async configureVersioning (version ?: string) { - const tempV = await this.getTempVersion(); - const deployedV = await this.getDeployedVersion(); - - let finalVersion : string; - if (version) { - finalVersion = version; - - if (!deployedV || version !== deployedV.dbVersion) { - // we should only have a single TEMP version at any given time - if (tempV && version !== tempV.dbVersion) { - await this.clearDBForVersion(tempV.dbVersion); - } - - await this.createUpdateTempVersion(finalVersion); - } - } else { - if (!tempV) { - // what to do with the current DEPLOYED version - if (this.archiveCurrentDeployed) { - this.logger.debug("Archiving enabled - Archiving current DEPLOYED DB version..."); - // archive the current DEPLOYED version - await this.versions.updateOne( - { - type: VERSION_TYPES.deployed, - }, - { - $set: { - type: VERSION_TYPES.archived, - }, - }); - } else { - this.logger.debug("Archiving disabled - Clearing current DEPLOYED DB version..."); - // get the current DEPLOYED and clear DB for that version - if (deployedV) await this.clearDBForVersion(deployedV.dbVersion); - } - - // create new TEMP version - finalVersion = Date.now().toString(); - // eslint-disable-next-line max-len - this.logger.info(`No version provided to MongoDBAdapter, using current timestamp as new TEMP version: ${finalVersion}`); - await this.createUpdateTempVersion(finalVersion); - } else { - finalVersion = tempV.dbVersion; - this.logger.info(`Using existing MongoDB TEMP version: ${finalVersion}`); - } - } - - return finalVersion; - } - - async finalizeDeployedVersion (version ?: string) { - const finalV = version || (await this.getTempVersion())?.dbVersion; - - if (!finalV) return; - - const deployedV = (await this.getDeployedVersion())?.dbVersion; - if (finalV !== deployedV) { - // archive the current DEPLOYED version - await this.versions.updateOne( - { - type: VERSION_TYPES.deployed, - }, - { - $set: { - type: VERSION_TYPES.archived, - }, - }); - - // create new DEPLOYED version - await this.versions.insertOne({ - type: VERSION_TYPES.deployed, - dbVersion: finalV, - contractsVersion: this.getContractsVersionFromFile(), - }); - - // now remove the TEMP version - await this.versions.deleteOne({ - type: VERSION_TYPES.temp, - dbVersion: finalV, - }); - } - - // archive the current TEMP version if any - await this.versions.updateOne( - { - type: VERSION_TYPES.temp, - }, - { - $set: { - type: VERSION_TYPES.archived, - }, - }); - - this.logger.info(`Successfully finalized DB version ${finalV} from TEMP to DEPLOYED.`); - } - - async getCheckLatestVersion () { - const v = await this.getLatestVersion(); - - if (!v) throw new Error("No version found in DB!"); - - return v; - } - - async getTempVersion () : Promise { - const v = await this.versions.findOne({ - type: VERSION_TYPES.temp, - }); - - if (!v) return null; - - return v; - } - - async getDeployedVersion () : Promise { - const v = await this.versions.findOne({ - type: VERSION_TYPES.deployed, - }); - - if (!v) return null; - - return v; - } - - async getLatestVersion () : Promise { - const v = await this.getTempVersion(); - - if (v) return v; - - return this.getDeployedVersion(); - } - - getContractsVersionFromFile () { - if (!fs.existsSync(tagFilePath)) { - throw Error(`No git tag found at ${tagFilePath}`); - } - - const tag = fs.readFileSync(tagFilePath, "utf8").trim(); - this.logger.info(`Git tag found at ${tagFilePath}: ${tag}`); - - return tag; - } - - async createUpdateTempVersion (version : string) { - const contractsVersion = this.getContractsVersionFromFile(); - - return this.versions.updateOne({ - type: VERSION_TYPES.temp, - }, { - $set: { - dbVersion: version, - contractsVersion, - }, - }, { - upsert: true, - }); - } - - async clearDBForVersion (version : string) { - await this.contracts.deleteMany({ - version, - }); - - return this.versions.deleteMany({ - dbVersion: version, - }); - } -} diff --git a/src/deploy/db/mongo-adapter/types.ts b/src/deploy/db/mongo-adapter/types.ts deleted file mode 100644 index 1e3f343a6..000000000 --- a/src/deploy/db/mongo-adapter/types.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { TLogger } from "../../campaign/types"; - - -export interface IMongoDBAdapterArgs { - logger : TLogger; - dbUri : string; - dbName : string; - version ?: string; - clientOpts ?: Record; - archive ?: boolean; -} - -export interface IDBVersion { - dbVersion : string; - contractsVersion : string; - type : string; -} diff --git a/src/deploy/db/types.ts b/src/deploy/db/types.ts deleted file mode 100644 index 547896642..000000000 --- a/src/deploy/db/types.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { WithId } from "mongodb"; - - -export interface IContractDbData { - name : string; - address : string; - abi : string; - bytecode : string; - implementation : string | null; - version : string; -} - -export type TContractDBDoc = WithId & IContractDbData; diff --git a/src/deploy/deployer/constants.ts b/src/deploy/deployer/constants.ts deleted file mode 100644 index 64761f7d7..000000000 --- a/src/deploy/deployer/constants.ts +++ /dev/null @@ -1,22 +0,0 @@ - -export interface INetworkData { - [env : string] : { - name : string; - id : string; - }; -} - -export const NetworkData : INetworkData = { - test: { - name: "sepolia", - id: "11155111", - }, - prod: { - name: "mainnet", - id: "1", - }, - dev: { - name: "hardhat", - id: "31337", - }, -}; diff --git a/src/deploy/deployer/hardhat-deployer.ts b/src/deploy/deployer/hardhat-deployer.ts deleted file mode 100644 index b6f54ffac..000000000 --- a/src/deploy/deployer/hardhat-deployer.ts +++ /dev/null @@ -1,132 +0,0 @@ -import * as hre from "hardhat"; -import { HardhatRuntimeEnvironment } from "hardhat/types"; -import { ITenderlyContractData, TDeployArgs, TProxyKind } from "../missions/types"; -import { SignerWithAddress } from "@nomicfoundation/hardhat-ethers/signers"; -import { ethers } from "ethers"; -import axios from "axios"; -import { - DefenderRelayProvider, - DefenderRelaySigner, -} from "@openzeppelin/defender-sdk-relay-signer-client/lib/ethers"; -import { ContractV6 } from "../campaign/types"; - -export class HardhatDeployer { - hre : HardhatRuntimeEnvironment; - signer : SignerWithAddress | DefenderRelaySigner; - env : string; - provider ?: DefenderRelayProvider; - - constructor ( - signer : SignerWithAddress | DefenderRelaySigner, - env : string, - provider ?: DefenderRelayProvider, - ) { - this.hre = hre; - this.signer = signer; - this.env = env; - this.provider = provider; - } - - async getFactory (contractName : string, signer ?: SignerWithAddress | DefenderRelaySigner) { - const attachedSigner = signer ?? this.signer; - return this.hre.ethers.getContractFactory(contractName, attachedSigner as ethers.Signer); - } - - async getContractObject (contractName : string, address : string) { - const factory = await this.getFactory(contractName); - - return factory.attach(address); - } - - async deployProxy ({ - contractName, - args, - kind, - } : { - contractName : string; - args : TDeployArgs; - kind : TProxyKind; - }) : Promise { - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-ignore - const contractFactory = await this.getFactory(contractName); - const deployment = await this.hre.upgrades.deployProxy(contractFactory, args, { - kind, - }); - - let receipt; - if (!this.provider) { - return deployment.waitForDeployment(); - } else { - const tx = await deployment.deploymentTransaction(); - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - receipt = await this.provider.waitForTransaction(tx!.hash, 3); - - return contractFactory.attach(receipt.contractAddress); - } - } - - async deployContract (contractName : string, args : TDeployArgs) : Promise { - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-ignore - const contractFactory = await this.getFactory(contractName); - const deployment = await contractFactory.deploy(...args); - - let receipt; - if (!this.provider) { - return deployment.waitForDeployment(); - } else { - const tx = await deployment.deploymentTransaction(); - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - receipt = await this.provider.waitForTransaction(tx!.hash, 3); - - return contractFactory.attach(receipt.contractAddress); - } - } - - getContractArtifact (contractName : string) { - return this.hre.artifacts.readArtifactSync(contractName); - } - - async getProxyImplAddress (proxyContract : string) { - return this.hre.upgrades.erc1967.getImplementationAddress(proxyContract); - } - - async getBytecodeFromChain (address : string) { - return this.hre.ethers.provider.getCode(address); - } - - async tenderlyPush (contracts : Array) { - const inst = axios.create({ - baseURL: "https://api.tenderly.co/", - headers: { - "Content-Type": "application/json", - "X-Access-Key": process.env.TENDERLY_ACCESS_KEY, - }, - }); - - const { data } = await inst.post( - `api/v2/accounts/${process.env.TENDERLY_ACCOUNT_ID}/projects/${process.env.TENDERLY_PROJECT_SLUG}/contracts`, - { - contracts, - } - ); - - return data; - } - - async etherscanVerify ({ - address, - ctorArgs, - } : { - address : string; - ctorArgs ?: TDeployArgs; - }) { - return this.hre.run("verify:verify", { - address, - // this should only be used for non-proxied contracts - // or proxy impls that have actual constructors - constructorArguments: ctorArgs, - }); - } -} diff --git a/src/deploy/logger/create-logger.ts b/src/deploy/logger/create-logger.ts deleted file mode 100644 index df45e91ca..000000000 --- a/src/deploy/logger/create-logger.ts +++ /dev/null @@ -1,40 +0,0 @@ -import winston from "winston"; -import { TLogger } from "../campaign/types"; - -let logger : TLogger | null = null; - - -export const createLogger = (logLevel ?: string, silent ?: boolean) => winston.createLogger({ - level: logLevel, - format: winston.format.combine( - winston.format.json(), - winston.format.timestamp(), - winston.format.prettyPrint(), - ), - transports: [ - new winston.transports.Console(), - ], - exitOnError: false, - silent, -}); - -export const getLogger = () : TLogger => { - if (logger) return logger; - - logger = createLogger( - process.env.LOG_LEVEL || "debug", - process.env.SILENT_LOGGER === "true" - ); - - const logFileName = `deploy-${Date.now()}.log`; - - if (process.env.ENV_LEVEL?.includes("prod") || process.env.ENV_LEVEL?.includes("test")) { - logger.add( - new winston.transports.File({ filename: logFileName }), - ); - - logger.debug(`The ENV_LEVEL is ${process.env.ENV_LEVEL}, logs will be saved in ${ logFileName } file`); - } - - return logger; -}; diff --git a/src/deploy/missions/base-deploy-mission.ts b/src/deploy/missions/base-deploy-mission.ts deleted file mode 100644 index d451cfbca..000000000 --- a/src/deploy/missions/base-deploy-mission.ts +++ /dev/null @@ -1,186 +0,0 @@ -/* eslint-disable camelcase */ -import { Contract } from "ethers"; -import { - TDeployArgs, - IProxyData, - IDeployMissionArgs, ITenderlyContractData, -} from "./types"; -import { DeployCampaign } from "../campaign/deploy-campaign"; -import { ContractV6, IDeployCampaignConfig, TLogger } from "../campaign/types"; -import { IContractDbData } from "../db/types"; -import { NetworkData } from "../deployer/constants"; - - -export class BaseDeployMission { - contractName! : string; - instanceName! : string; - proxyData! : IProxyData; - campaign : DeployCampaign; - logger : TLogger; - config : IDeployCampaignConfig; - implAddress! : string | null; - - constructor ({ - campaign, - logger, - config, - } : IDeployMissionArgs) { - this.campaign = campaign; - this.logger = logger; - this.config = config; - } - - async getFromDB () { - return this.campaign.dbAdapter.getContract(this.contractName); - } - - async saveToDB (contract : ContractV6) { - this.logger.debug(`Writing ${this.contractName} to DB...`); - - this.implAddress = this.proxyData.isProxy - ? await this.campaign.deployer.getProxyImplAddress(await contract.getAddress()) - : null; - - const contractDbDoc = await this.buildDbObject(contract, this.implAddress); - - return this.campaign.dbAdapter.writeContract(this.contractName, contractDbDoc); - } - - async needsDeploy () { - const dbContract = await this.getFromDB(); - - if (!dbContract) { - this.logger.info(`${this.contractName} not found in DB, proceeding to deploy...`); - } else { - this.logger.info(`${this.contractName} found in DB at ${dbContract.address}, no deployment needed.`); - - const contract = await this.campaign.deployer.getContractObject( - this.contractName, - dbContract.address, - ) as Contract; - - // eslint-disable-next-line max-len - this.logger.debug(`Updating ${this.contractName} in state from DB data with address ${await contract.getAddress()}`); - - this.campaign.updateStateContract(this.instanceName, this.contractName, contract); - } - - return !dbContract; - } - - async deployArgs () : Promise { - return []; - } - - getArtifact () { - return this.campaign.deployer.getContractArtifact(this.contractName); - } - - async buildDbObject ( - hhContract : ContractV6, - implAddress : string | null - ) : Promise> { - const { abi, bytecode } = this.getArtifact(); - return { - name: this.contractName, - address: await hhContract.getAddress(), - abi: JSON.stringify(abi), - bytecode, - implementation: implAddress, - }; - } - - async deploy () { - const deployArgs = await this.deployArgs(); - this.logger.info(`Deploying ${this.contractName} with arguments: ${deployArgs}`); - - let contract : ContractV6; - if (this.proxyData.isProxy) { - contract = await this.campaign.deployer.deployProxy({ - contractName: this.contractName, - args: deployArgs, - kind: this.proxyData.kind, - }); - } else { - contract = await this.campaign.deployer.deployContract(this.contractName, deployArgs); - } - - await this.saveToDB(contract); - - this.campaign.updateStateContract(this.instanceName, this.contractName, contract); - - this.logger.info(`Deployment success for ${this.contractName} at ${await contract.getAddress()}`); - } - - async needsPostDeploy () { - return Promise.resolve(false); - } - - async postDeploy () { - return Promise.resolve(); - } - - async execute () { - if (await this.needsDeploy()) { - await this.deploy(); - } else { - this.logger.info(`Skipping ${this.contractName} deployment...`); - } - - if (await this.needsPostDeploy()) { - await this.postDeploy(); - } - } - - async verify () { - this.logger.debug(`Verifying ${this.contractName} on Etherscan...`); - const address = await this.campaign[this.instanceName].getAddress(); - - const ctorArgs = !this.proxyData.isProxy ? await this.deployArgs() : undefined; - try { - await this.campaign.deployer.etherscanVerify({ - address, - ctorArgs, - }); - - this.logger.debug(`Etherscan verification for ${this.contractName} finished successfully.`); - /* eslint-disable-next-line @typescript-eslint/no-explicit-any */ - } catch (e : any) { - this.logger.error(`Etherscan verification for ${this.contractName} failed.`); - this.logger.error(e.message); - this.logger.debug("Continuing..."); - } - } - - async getMonitoringData () : Promise> { - const networkId = NetworkData[this.campaign.config.env].id; - const implName = this.contractName; - let implAddress = await this.campaign[this.instanceName].getAddress(); - - if (this.proxyData.isProxy) { - const proxyAddress = await this.campaign[this.instanceName].getAddress(); - implAddress = this.implAddress || await this.campaign.deployer.getProxyImplAddress(proxyAddress); - - return [ - { - display_name: `${this.contractName}Proxy`, - address: proxyAddress, - network_id: networkId, - }, - { - display_name: `${implName}Impl`, - address: implAddress, - network_id: networkId, - }, - ]; - } - - return [ - { - display_name: implName, - address: implAddress, - network_id: networkId, - }, - ]; - } -} diff --git a/src/deploy/missions/contracts/access-controller.ts b/src/deploy/missions/contracts/access-controller.ts index 7b09b2449..6c0349789 100644 --- a/src/deploy/missions/contracts/access-controller.ts +++ b/src/deploy/missions/contracts/access-controller.ts @@ -1,22 +1,27 @@ -import { BaseDeployMission } from "../base-deploy-mission"; - -import { znsNames } from "./names"; - - -export class ZNSAccessControllerDM extends BaseDeployMission { - proxyData = { - isProxy: false, - }; - - contractName = znsNames.accessController.contract; - instanceName = znsNames.accessController.instance; - - async deployArgs () { - const { - governorAddresses, - adminAddresses, - } = this.config; - - return [ governorAddresses, adminAddresses ]; - } -} +import { + BaseDeployMission, +} from "@zero-tech/zdc"; +import { znsNames } from "./names"; +import { IZNSContracts, IZNSCampaignConfig } from "../../campaign/types"; + + +export class ZNSAccessControllerDM extends BaseDeployMission< +IZNSCampaignConfig, +IZNSContracts +> { + proxyData = { + isProxy: false, + }; + + contractName = znsNames.accessController.contract; + instanceName = znsNames.accessController.instance; + + async deployArgs () { + const { + governorAddresses, + adminAddresses, + } = this.config; + + return [governorAddresses, adminAddresses]; + } +} diff --git a/src/deploy/missions/contracts/address-resolver.ts b/src/deploy/missions/contracts/address-resolver.ts index ef3565c07..791d154a9 100644 --- a/src/deploy/missions/contracts/address-resolver.ts +++ b/src/deploy/missions/contracts/address-resolver.ts @@ -1,56 +1,62 @@ -import { BaseDeployMission } from "../base-deploy-mission"; -import { ProxyKinds, ResolverTypes } from "../../constants"; -import { TDeployArgs } from "../types"; -import { znsNames } from "./names"; - - -export class ZNSAddressResolverDM extends BaseDeployMission { - proxyData = { - isProxy: true, - kind: ProxyKinds.uups, - }; - - contractName = znsNames.addressResolver.contract; - instanceName = znsNames.addressResolver.instance; - - async deployArgs () : Promise { - const { accessController, registry } = this.campaign; - - return [await accessController.getAddress(), await registry.getAddress()]; - } - - async needsPostDeploy () { - const { - registry, - addressResolver, - } = this.campaign; - - const resolverInReg = await registry.getResolverType( - ResolverTypes.address, - ); - - const needs = resolverInReg !== await addressResolver.getAddress(); - const msg = needs ? "needs" : "doesn't need"; - - this.logger.debug(`${this.contractName} ${msg} post deploy sequence`); - - return needs; - } - - async postDeploy () { - const { - registry, - addressResolver, - config: { - deployAdmin, - }, - } = this.campaign; - - await registry.connect(deployAdmin).addResolverType( - ResolverTypes.address, - await addressResolver.getAddress(), - ); - - this.logger.debug(`${this.contractName} post deploy sequence completed`); - } -} +import { + TDeployArgs, + BaseUpgradeMission, +} from "@zero-tech/zdc"; +import { ProxyKinds, ResolverTypes } from "../../constants"; +import { znsNames } from "./names"; +import { IZNSCampaignConfig, IZNSContracts } from "../../campaign/types"; + + +export class ZNSAddressResolverDM extends BaseUpgradeMission< +IZNSCampaignConfig, +IZNSContracts +> { + proxyData = { + isProxy: true, + kind: ProxyKinds.uups, + }; + + contractName = znsNames.addressResolver.contract; + instanceName = znsNames.addressResolver.instance; + + async deployArgs () : Promise { + const { accessController, registry } = this.campaign; + + return [await accessController.getAddress(), await registry.getAddress()]; + } + + async needsPostDeploy () { + const { + registry, + addressResolver, + } = this.campaign; + + const resolverInReg = await registry.getResolverType( + ResolverTypes.address, + ); + + const needs = resolverInReg !== await addressResolver.getAddress(); + const msg = needs ? "needs" : "doesn't need"; + + this.logger.debug(`${this.contractName} ${msg} post deploy sequence`); + + return needs; + } + + async postDeploy () { + const { + registry, + addressResolver, + config: { + deployAdmin, + }, + } = this.campaign; + + await registry.connect(deployAdmin).addResolverType( + ResolverTypes.address, + await addressResolver.getAddress(), + ); + + this.logger.debug(`${this.contractName} post deploy sequence completed`); + } +} diff --git a/src/deploy/missions/contracts/curve-pricer.ts b/src/deploy/missions/contracts/curve-pricer.ts index 717799b39..0508815d1 100644 --- a/src/deploy/missions/contracts/curve-pricer.ts +++ b/src/deploy/missions/contracts/curve-pricer.ts @@ -1,27 +1,33 @@ -import { BaseDeployMission } from "../base-deploy-mission"; -import { ProxyKinds } from "../../constants"; -import { TDeployArgs } from "../types"; -import { znsNames } from "./names"; - - -export class ZNSCurvePricerDM extends BaseDeployMission { - proxyData = { - isProxy: true, - kind: ProxyKinds.uups, - }; - - contractName = znsNames.curvePricer.contract; - instanceName = znsNames.curvePricer.instance; - - async deployArgs () : Promise { - const { - accessController, - registry, - config: { - rootPriceConfig, - }, - } = this.campaign; - - return [await accessController.getAddress(), await registry.getAddress(), rootPriceConfig]; - } -} +import { + BaseUpgradeMission, + TDeployArgs, +} from "@zero-tech/zdc"; +import { ProxyKinds } from "../../constants"; +import { znsNames } from "./names"; +import { IZNSCampaignConfig, IZNSContracts } from "../../campaign/types"; + + +export class ZNSCurvePricerDM extends BaseUpgradeMission< +IZNSCampaignConfig, +IZNSContracts +> { + proxyData = { + isProxy: true, + kind: ProxyKinds.uups, + }; + + contractName = znsNames.curvePricer.contract; + instanceName = znsNames.curvePricer.instance; + + async deployArgs () : Promise { + const { + accessController, + registry, + config: { + rootPriceConfig, + }, + } = this.campaign; + + return [await accessController.getAddress(), await registry.getAddress(), rootPriceConfig]; + } +} diff --git a/src/deploy/missions/contracts/domain-token.ts b/src/deploy/missions/contracts/domain-token.ts index 840ec8d86..15140e535 100644 --- a/src/deploy/missions/contracts/domain-token.ts +++ b/src/deploy/missions/contracts/domain-token.ts @@ -1,28 +1,35 @@ -import { BaseDeployMission } from "../base-deploy-mission"; -import { ProxyKinds } from "../../constants"; -import { TDeployArgs } from "../types"; -import { znsNames } from "./names"; - -export class ZNSDomainTokenDM extends BaseDeployMission { - proxyData = { - isProxy: true, - kind: ProxyKinds.uups, - }; - - contractName = znsNames.domainToken.contract; - instanceName = znsNames.domainToken.instance; - - async deployArgs () : Promise { - const { accessController } = this.campaign; - const { - domainToken: { - name, - symbol, - defaultRoyaltyReceiver, - defaultRoyaltyFraction, - }, - } = this.config; - - return [ await accessController.getAddress(), name, symbol, defaultRoyaltyReceiver, defaultRoyaltyFraction ]; - } -} +import { + BaseUpgradeMission, + TDeployArgs, +} from "@zero-tech/zdc"; +import { ProxyKinds } from "../../constants"; +import { znsNames } from "./names"; +import { IZNSCampaignConfig, IZNSContracts } from "../../campaign/types"; + + +export class ZNSDomainTokenDM extends BaseUpgradeMission< +IZNSCampaignConfig, +IZNSContracts +> { + proxyData = { + isProxy: true, + kind: ProxyKinds.uups, + }; + + contractName = znsNames.domainToken.contract; + instanceName = znsNames.domainToken.instance; + + async deployArgs () : Promise { + const { accessController } = this.campaign; + const { + domainToken: { + name, + symbol, + defaultRoyaltyReceiver, + defaultRoyaltyFraction, + }, + } = this.config; + + return [ await accessController.getAddress(), name, symbol, defaultRoyaltyReceiver, defaultRoyaltyFraction ]; + } +} diff --git a/src/deploy/missions/contracts/fixed-pricer.ts b/src/deploy/missions/contracts/fixed-pricer.ts index e205d1cce..fb9b59996 100644 --- a/src/deploy/missions/contracts/fixed-pricer.ts +++ b/src/deploy/missions/contracts/fixed-pricer.ts @@ -1,24 +1,30 @@ -import { ProxyKinds } from "../../constants"; -import { TDeployArgs } from "../types"; -import { BaseDeployMission } from "../base-deploy-mission"; -import { znsNames } from "./names"; - - -export class ZNSFixedPricerDM extends BaseDeployMission { - proxyData = { - isProxy: true, - kind: ProxyKinds.uups, - }; - - contractName = znsNames.fixedPricer.contract; - instanceName = znsNames.fixedPricer.instance; - - async deployArgs () : Promise { - const { - accessController, - registry, - } = this.campaign; - - return [await accessController.getAddress(), await registry.getAddress()]; - } -} +import { ProxyKinds } from "../../constants"; +import { + BaseUpgradeMission, + TDeployArgs, +} from "@zero-tech/zdc"; +import { znsNames } from "./names"; +import { IZNSCampaignConfig, IZNSContracts } from "../../campaign/types"; + + +export class ZNSFixedPricerDM extends BaseUpgradeMission< +IZNSCampaignConfig, +IZNSContracts +> { + proxyData = { + isProxy: true, + kind: ProxyKinds.uups, + }; + + contractName = znsNames.fixedPricer.contract; + instanceName = znsNames.fixedPricer.instance; + + async deployArgs () : Promise { + const { + accessController, + registry, + } = this.campaign; + + return [await accessController.getAddress(), await registry.getAddress()]; + } +} diff --git a/src/deploy/missions/contracts/meow-token/meow-token.ts b/src/deploy/missions/contracts/meow-token/meow-token.ts index bb92bfb25..d4fb14e88 100644 --- a/src/deploy/missions/contracts/meow-token/meow-token.ts +++ b/src/deploy/missions/contracts/meow-token/meow-token.ts @@ -1,97 +1,114 @@ -import { BaseDeployMission } from "../../base-deploy-mission"; -import { ProxyKinds } from "../../../constants"; -import { IDeployMissionArgs, TDeployArgs } from "../../types"; -import { Contract, ethers } from "ethers"; -import { znsNames } from "../names"; - - -export const meowTokenName = "MEOW"; -export const meowTokenSymbol = "MEOW"; - - -export class MeowTokenDM extends BaseDeployMission { - proxyData = { - isProxy: true, - kind: ProxyKinds.transparent, - }; - - contractName = znsNames.meowToken.contract; - instanceName = znsNames.meowToken.instance; - - constructor (args : IDeployMissionArgs) { - super(args); - - if (this.config.mockMeowToken) { - this.contractName = znsNames.meowToken.contractMock; - } else { - this.contractName = znsNames.meowToken.contract; - } - } - - async deploy () { - if (!this.config.mockMeowToken) { - this.logger.info("Using MEOW token from Mainnet"); - - // TODO dep: add proper bytecode comparison here and throw if different! - // const bytecodeFromChain = await this.campaign.deployer.getBytecodeFromChain(this.config.stakingTokenAddress); - - // const { - // bytecode, - // } = this.getArtifact(); - - // if (!compareBytecodeStrict(bytecode, bytecodeFromChain)) { - // this.logger.error("MEOW token bytecode compiled in this module differs from Mainnet"); - // throw new Error( - // "MEOW token bytecode compiled in this module differs from Mainnet" - // ); - // } - - this.logger.debug(`Writing ${this.contractName} to DB...`); - - const baseContract = await this.campaign.deployer.getContractObject( - this.contractName, - this.config.stakingTokenAddress, - ); - - const contract = new Contract(baseContract.target.toString(), baseContract.interface, baseContract.runner); - - await this.saveToDB(contract); - - this.campaign.updateStateContract(this.instanceName, this.contractName, contract); - - // eslint-disable-next-line max-len - this.logger.info(`Successfully created ${this.contractName} contract from Mainnet data at ${await baseContract.getAddress()}`); - } else { - await super.deploy(); - } - } - - async deployArgs () : Promise { - return [meowTokenName, meowTokenSymbol]; - } - - async needsPostDeploy () { - const msg = this.config.mockMeowToken ? "needs" : "doesn't need"; - - this.logger.debug(`${this.contractName} ${msg} post deploy sequence`); - - return this.config.mockMeowToken; - } - - async postDeploy () { - const { - meowToken, - config: { - deployAdmin, - }, - } = this.campaign; - - // Mint 100,000 MEOW to the deployer - await meowToken.connect(deployAdmin).mint( - await deployAdmin.getAddress(), - ethers.parseEther("100000") - ); - - this.logger.debug(`${this.contractName} post deploy sequence completed`); - } -} +import { + BaseUpgradeMission, + IDeployMissionArgs, + TDeployArgs, +} from "@zero-tech/zdc"; +import { ProxyKinds } from "../../../constants"; +import { ethers } from "ethers"; +import { znsNames } from "../names"; +import { IZNSCampaignConfig, IZNSContracts } from "../../../campaign/types"; +import { MeowToken__factory } from "@zero-tech/ztoken/typechain-js"; +import meowArtifact from "@zero-tech/ztoken/artifacts/contracts/MeowToken.sol/MeowToken.json"; + + +export const meowTokenName = "MEOW"; +export const meowTokenSymbol = "MEOW"; + + +export class MeowTokenDM extends BaseUpgradeMission< +IZNSCampaignConfig, +IZNSContracts +> { + proxyData = { + isProxy: true, + kind: ProxyKinds.transparent, + }; + + contractName = znsNames.meowToken.contract; + instanceName = znsNames.meowToken.instance; + + constructor (args : IDeployMissionArgs< + IZNSCampaignConfig, + IZNSContracts + >) { + super(args); + + if (this.config.mockMeowToken) { + this.contractName = znsNames.meowToken.contractMock; + } else { + this.contractName = znsNames.meowToken.contract; + } + } + + async deploy () { + if (!this.config.mockMeowToken) { + this.logger.info("Using MEOW token from Mainnet"); + + // TODO dep: add proper bytecode comparison here and throw if different! + // const bytecodeFromChain = await this.campaign.deployer.getBytecodeFromChain(this.config.stakingTokenAddress); + + // const { + // bytecode, + // } = this.getArtifact(); + + // if (!compareBytecodeStrict(bytecode, bytecodeFromChain)) { + // this.logger.error("MEOW token bytecode compiled in this module differs from Mainnet"); + // throw new Error( + // "MEOW token bytecode compiled in this module differs from Mainnet" + // ); + // } + + this.logger.debug(`Writing ${this.contractName} to DB...`); + + const factory = new MeowToken__factory(this.config.deployAdmin); + const baseContract = factory.attach(this.config.stakingTokenAddress); + // TODO remove! + // const baseContract = await this.campaign.deployer.getContractObject( + // this.contractName, + // this.config.stakingTokenAddress as string, + // ); + + await this.saveToDB(baseContract); + + this.campaign.updateStateContract(this.instanceName, this.contractName, baseContract); + + // eslint-disable-next-line max-len + this.logger.info(`Successfully created ${this.contractName} contract from Mainnet data at ${await baseContract.getAddress()}`); + } else { + await super.deploy(); + } + } + + getArtifact () { + return meowArtifact; + } + + async deployArgs () : Promise { + return [meowTokenName, meowTokenSymbol]; + } + + async needsPostDeploy () { + const msg = this.config.mockMeowToken ? "needs" : "doesn't need"; + + this.logger.debug(`${this.contractName} ${msg} post deploy sequence`); + + return this.config.mockMeowToken ; + } + + async postDeploy () { + const { + meowToken, + config: { + deployAdmin, + }, + } = this.campaign; + + // Mint 100,000 MEOW to the deployer + await meowToken.connect(deployAdmin).mint( + await deployAdmin.getAddress?.(), + ethers.parseEther("100000") + ); + + this.logger.debug(`${this.contractName} post deploy sequence completed`); + } +} diff --git a/src/deploy/missions/contracts/names.ts b/src/deploy/missions/contracts/names.ts index a5dd339d1..d92727652 100644 --- a/src/deploy/missions/contracts/names.ts +++ b/src/deploy/missions/contracts/names.ts @@ -1,7 +1,6 @@ export const erc1967ProxyName = "ERC1967Proxy"; export const transparentProxyName = "TransparentUpgradeableProxy"; - export const znsNames = { accessController: { contract: "ZNSAccessController", diff --git a/src/deploy/missions/contracts/registry.ts b/src/deploy/missions/contracts/registry.ts index 221ae9713..73a69dc9b 100644 --- a/src/deploy/missions/contracts/registry.ts +++ b/src/deploy/missions/contracts/registry.ts @@ -1,20 +1,26 @@ -import { BaseDeployMission } from "../base-deploy-mission"; -import { ProxyKinds } from "../../constants"; -import { TDeployArgs } from "../types"; -import { znsNames } from "./names"; - - -export class ZNSRegistryDM extends BaseDeployMission { - proxyData = { - isProxy: true, - kind: ProxyKinds.uups, - }; - - contractName = znsNames.registry.contract; - instanceName = znsNames.registry.instance; - - async deployArgs () : Promise { - const { accessController } = this.campaign; - return [ await accessController.getAddress() ]; - } -} +import { + BaseUpgradeMission, + TDeployArgs, +} from "@zero-tech/zdc"; +import { ProxyKinds } from "../../constants"; +import { znsNames } from "./names"; +import { IZNSCampaignConfig, IZNSContracts } from "../../campaign/types"; + + +export class ZNSRegistryDM extends BaseUpgradeMission< +IZNSCampaignConfig, +IZNSContracts +> { + proxyData = { + isProxy: true, + kind: ProxyKinds.uups, + }; + + contractName = znsNames.registry.contract; + instanceName = znsNames.registry.instance; + + async deployArgs () : Promise { + const { accessController } = this.campaign; + return [ await accessController.getAddress() ]; + } +} diff --git a/src/deploy/missions/contracts/root-registrar.ts b/src/deploy/missions/contracts/root-registrar.ts index 7cbd1d4b8..9b94db8ba 100644 --- a/src/deploy/missions/contracts/root-registrar.ts +++ b/src/deploy/missions/contracts/root-registrar.ts @@ -1,68 +1,74 @@ -import { BaseDeployMission } from "../base-deploy-mission"; -import { ProxyKinds, REGISTRAR_ROLE } from "../../constants"; -import { TDeployArgs } from "../types"; -import { znsNames } from "./names"; - - -export class ZNSRootRegistrarDM extends BaseDeployMission { - proxyData = { - isProxy: true, - kind: ProxyKinds.uups, - }; - - contractName = znsNames.rootRegistrar.contract; - instanceName = znsNames.rootRegistrar.instance; - - async deployArgs () : Promise { - const { - accessController, - registry, - curvePricer, - treasury, - domainToken, - } = this.campaign; - - return [ - await accessController.getAddress(), - await registry.getAddress(), - // we use CurvePricer as the IZNSPricer for root domains - await curvePricer.getAddress(), - await treasury.getAddress(), - await domainToken.getAddress(), - ]; - } - - async needsPostDeploy () { - const { - accessController, - rootRegistrar, - config: { deployAdmin }, - } = this.campaign; - - const isRegistrar = await accessController - .connect(deployAdmin) - .isRegistrar(await rootRegistrar.getAddress()); - - const msg = !isRegistrar ? "needs" : "doesn't need"; - - this.logger.debug(`${this.contractName} ${msg} post deploy sequence`); - - return !isRegistrar; - } - - async postDeploy () { - const { - accessController, - rootRegistrar, - config: { - deployAdmin, - }, - } = this.campaign; - - await accessController - .connect(deployAdmin) - .grantRole(REGISTRAR_ROLE, await rootRegistrar.getAddress()); - - this.logger.debug(`${this.contractName} post deploy sequence completed`); - } -} +import { + BaseUpgradeMission, + TDeployArgs, +} from "@zero-tech/zdc"; +import { ProxyKinds, REGISTRAR_ROLE } from "../../constants"; +import { znsNames } from "./names"; +import { IZNSCampaignConfig, IZNSContracts } from "../../campaign/types"; + + +export class ZNSRootRegistrarDM extends BaseUpgradeMission< +IZNSCampaignConfig, +IZNSContracts +> { + proxyData = { + isProxy: true, + kind: ProxyKinds.uups, + }; + + contractName = znsNames.rootRegistrar.contract; + instanceName = znsNames.rootRegistrar.instance; + + async deployArgs () : Promise { + const { + accessController, + registry, + curvePricer, + treasury, + domainToken, + } = this.campaign; + + return [ + await accessController.getAddress(), + await registry.getAddress(), + // we use CurvePricer as the IZNSPricer for root domains + await curvePricer.getAddress(), + await treasury.getAddress(), + await domainToken.getAddress(), + ]; + } + + async needsPostDeploy () { + const { + accessController, + rootRegistrar, + config: { deployAdmin }, + } = this.campaign; + + const isRegistrar = await accessController + .connect(deployAdmin) + .isRegistrar(await rootRegistrar.getAddress()); + + const msg = !isRegistrar ? "needs" : "doesn't need"; + + this.logger.debug(`${this.contractName} ${msg} post deploy sequence`); + + return !isRegistrar; + } + + async postDeploy () { + const { + accessController, + rootRegistrar, + config: { + deployAdmin, + }, + } = this.campaign; + + await accessController + .connect(deployAdmin) + .grantRole(REGISTRAR_ROLE, await rootRegistrar.getAddress()); + + this.logger.debug(`${this.contractName} post deploy sequence completed`); + } +} diff --git a/src/deploy/missions/contracts/sub-registrar.ts b/src/deploy/missions/contracts/sub-registrar.ts index 6a552197d..8dfd090fa 100644 --- a/src/deploy/missions/contracts/sub-registrar.ts +++ b/src/deploy/missions/contracts/sub-registrar.ts @@ -1,81 +1,87 @@ -import { BaseDeployMission } from "../base-deploy-mission"; -import { ProxyKinds, REGISTRAR_ROLE } from "../../constants"; -import { TDeployArgs } from "../types"; -import { znsNames } from "./names"; - - -export class ZNSSubRegistrarDM extends BaseDeployMission { - proxyData = { - isProxy: true, - kind: ProxyKinds.uups, - }; - - contractName = znsNames.subRegistrar.contract; - instanceName = znsNames.subRegistrar.instance; - - private hasRegistrarRole : boolean | undefined; - private isSetOnRoot : boolean | undefined; - - async deployArgs () : Promise { - const { - accessController, - registry, - rootRegistrar, - } = this.campaign; - - return [await accessController.getAddress(), await registry.getAddress(), await rootRegistrar.getAddress()]; - } - - async needsPostDeploy () { - const { - accessController, - subRegistrar, - rootRegistrar, - config: { deployAdmin }, - } = this.campaign; - - this.hasRegistrarRole = await accessController - .connect(deployAdmin) - .isRegistrar(await subRegistrar.getAddress()); - - const currentSubRegistrarOnRoot = await rootRegistrar.subRegistrar(); - this.isSetOnRoot = currentSubRegistrarOnRoot === await subRegistrar.getAddress(); - - const needs = !this.hasRegistrarRole || !this.isSetOnRoot; - const msg = needs ? "needs" : "doesn't need"; - - this.logger.debug(`${this.contractName} ${msg} post deploy sequence`); - - return needs; - } - - async postDeploy () { - if (typeof this.hasRegistrarRole === "undefined" || typeof this.isSetOnRoot === "undefined") { - throw new Error(` - Internal error, both options should be defined for ZNSSubRegistrar deploy. - Current values: 'this.hasRegistrarRole': ${this.hasRegistrarRole}, 'this.isSetOnRoot': ${this.isSetOnRoot} - `); - } - - const { - accessController, - subRegistrar, - rootRegistrar, - config: { - deployAdmin, - }, - } = this.campaign; - - if (!this.isSetOnRoot) { - await rootRegistrar.connect(deployAdmin).setSubRegistrar(await subRegistrar.getAddress()); - } - - if (!this.hasRegistrarRole) { - await accessController - .connect(deployAdmin) - .grantRole(REGISTRAR_ROLE, await subRegistrar.getAddress()); - } - - this.logger.debug(`${this.contractName} post deploy sequence completed`); - } -} +import { + BaseUpgradeMission, + TDeployArgs, +} from "@zero-tech/zdc"; +import { ProxyKinds, REGISTRAR_ROLE } from "../../constants"; +import { znsNames } from "./names"; +import { IZNSCampaignConfig, IZNSContracts } from "../../campaign/types"; + + +export class ZNSSubRegistrarDM extends BaseUpgradeMission< +IZNSCampaignConfig, +IZNSContracts +> { + proxyData = { + isProxy: true, + kind: ProxyKinds.uups, + }; + + contractName = znsNames.subRegistrar.contract; + instanceName = znsNames.subRegistrar.instance; + + private hasRegistrarRole : boolean | undefined; + private isSetOnRoot : boolean | undefined; + + async deployArgs () : Promise { + const { + accessController, + registry, + rootRegistrar, + } = this.campaign; + + return [await accessController.getAddress(), await registry.getAddress(), await rootRegistrar.getAddress()]; + } + + async needsPostDeploy () { + const { + accessController, + subRegistrar, + rootRegistrar, + config: { deployAdmin }, + } = this.campaign; + + this.hasRegistrarRole = await accessController + .connect(deployAdmin) + .isRegistrar(await subRegistrar.getAddress()); + + const currentSubRegistrarOnRoot = await rootRegistrar.subRegistrar(); + this.isSetOnRoot = currentSubRegistrarOnRoot === await subRegistrar.getAddress(); + + const needs = !this.hasRegistrarRole || !this.isSetOnRoot; + const msg = needs ? "needs" : "doesn't need"; + + this.logger.debug(`${this.contractName} ${msg} post deploy sequence`); + + return needs; + } + + async postDeploy () { + if (typeof this.hasRegistrarRole === "undefined" || typeof this.isSetOnRoot === "undefined") { + throw new Error(` + Internal error, both options should be defined for ZNSSubRegistrar deploy. + Current values: 'this.hasRegistrarRole': ${this.hasRegistrarRole}, 'this.isSetOnRoot': ${this.isSetOnRoot} + `); + } + + const { + accessController, + subRegistrar, + rootRegistrar, + config: { + deployAdmin, + }, + } = this.campaign; + + if (!this.isSetOnRoot) { + await rootRegistrar.connect(deployAdmin).setSubRegistrar(await subRegistrar.getAddress()); + } + + if (!this.hasRegistrarRole) { + await accessController + .connect(deployAdmin) + .grantRole(REGISTRAR_ROLE, await subRegistrar.getAddress()); + } + + this.logger.debug(`${this.contractName} post deploy sequence completed`); + } +} diff --git a/src/deploy/missions/contracts/treasury.ts b/src/deploy/missions/contracts/treasury.ts index f1eb111cf..d86043754 100644 --- a/src/deploy/missions/contracts/treasury.ts +++ b/src/deploy/missions/contracts/treasury.ts @@ -1,33 +1,39 @@ -import { BaseDeployMission } from "../base-deploy-mission"; -import { ProxyKinds } from "../../constants"; -import { TDeployArgs } from "../types"; -import { znsNames } from "./names"; - - -export class ZNSTreasuryDM extends BaseDeployMission { - proxyData = { - isProxy: true, - kind: ProxyKinds.uups, - }; - - contractName = znsNames.treasury.contract; - instanceName = znsNames.treasury.instance; - - async deployArgs () : Promise { - const { - accessController, - registry, - meowToken, - config: { - zeroVaultAddress, - }, - } = this.campaign; - - return [ - await accessController.getAddress(), - await registry.getAddress(), - await meowToken.getAddress(), - zeroVaultAddress, - ]; - } -} +import { + BaseUpgradeMission, + TDeployArgs, +} from "@zero-tech/zdc"; +import { ProxyKinds } from "../../constants"; +import { znsNames } from "./names"; +import { IZNSCampaignConfig, IZNSContracts } from "../../campaign/types"; + + +export class ZNSTreasuryDM extends BaseUpgradeMission< +IZNSCampaignConfig, +IZNSContracts +> { + proxyData = { + isProxy: true, + kind: ProxyKinds.uups, + }; + + contractName = znsNames.treasury.contract; + instanceName = znsNames.treasury.instance; + + async deployArgs () : Promise { + const { + accessController, + registry, + meowToken, + config: { + zeroVaultAddress, + }, + } = this.campaign; + + return [ + await accessController.getAddress(), + await registry.getAddress(), + await meowToken.getAddress(), + zeroVaultAddress, + ]; + } +} diff --git a/src/deploy/missions/types.ts b/src/deploy/missions/types.ts index a245dc6ae..70470545a 100644 --- a/src/deploy/missions/types.ts +++ b/src/deploy/missions/types.ts @@ -1,38 +1,3 @@ -import { BaseDeployMission } from "./base-deploy-mission"; -import { DeployCampaign } from "../campaign/deploy-campaign"; -import { IDeployCampaignConfig, TLogger } from "../campaign/types"; - - -export interface IDeployMissionArgs { - campaign : DeployCampaign; - logger : TLogger; - config : IDeployCampaignConfig; -} - -export type TDeployMissionCtor = new (args : IDeployMissionArgs) => BaseDeployMission; - -export type TDeployArg = string | Array | bigint | ICurvePriceConfig; - -export type TDeployArgs = Array; - -export type TProxyKind = "uups" | "transparent" | "beacon" | undefined; - -export interface ITenderlyContractData { - display_name : string; - address : string; - network_id : string; -} - -export interface IProxyKinds { - uups : TProxyKind; - transparent : TProxyKind; - beacon : TProxyKind; -} - -export interface IProxyData { - isProxy : boolean; - kind ?: TProxyKind; -} export interface ICurvePriceConfig { maxPrice : bigint; diff --git a/src/deploy/db/service/mongo-service.ts b/src/deploy/mongo.ts similarity index 68% rename from src/deploy/db/service/mongo-service.ts rename to src/deploy/mongo.ts index 1efbddf9e..f7835b55a 100644 --- a/src/deploy/db/service/mongo-service.ts +++ b/src/deploy/mongo.ts @@ -1,9 +1,29 @@ import { exec } from "child_process"; -import { getLogger } from "../../logger/create-logger"; +import { getLogger, getMongoAdapter, TLogger } from "@zero-tech/zdc"; import { promisify } from "util"; +import { getGitTag } from "../utils/git-tag/get-tag"; + const execAsync = promisify(exec); + +export const getZnsMongoAdapter = async ({ + contractsVersion, + logger, +} : { + contractsVersion ?: string; + logger ?: TLogger; +} = {}) => { + if (!contractsVersion) { + contractsVersion = getGitTag(); + } + + return getMongoAdapter({ + logger, + contractsVersion, + }); +}; + export const startMongo = async () => { const logger = getLogger(); diff --git a/src/deploy/run-campaign.ts b/src/deploy/run-campaign.ts index 78ff2e36d..bf086b3d6 100644 --- a/src/deploy/run-campaign.ts +++ b/src/deploy/run-campaign.ts @@ -1,31 +1,21 @@ -import { getConfig } from "./campaign/environments"; +import { getCampaignConfig } from "./campaign/environments"; import { runZnsCampaign } from "./zns-campaign"; -import { Defender } from "@openzeppelin/defender-sdk"; - -import { getLogger } from "./logger/create-logger"; +import * as hre from "hardhat"; +import { getLogger } from "@zero-tech/zdc"; +import { SignerWithAddress } from "@nomicfoundation/hardhat-ethers/signers"; const logger = getLogger(); const runCampaign = async () => { - const credentials = { - apiKey: process.env.DEFENDER_KEY, - apiSecret: process.env.DEFENDER_SECRET, - relayerApiKey: process.env.RELAYER_KEY, - relayerApiSecret: process.env.RELAYER_SECRET, - }; - - const client = new Defender(credentials); - const provider = client.relaySigner.getProvider(); - const deployer = client.relaySigner.getSigner(provider, { speed: "fast" }); + const [ deployer ] = await hre.ethers.getSigners(); - const config = await getConfig({ - deployer, + const config = await getCampaignConfig({ + deployer: deployer as unknown as SignerWithAddress, }); await runZnsCampaign({ config, - provider, }); }; diff --git a/src/deploy/zns-campaign.ts b/src/deploy/zns-campaign.ts index e7e4bd1d1..9fbbe1630 100644 --- a/src/deploy/zns-campaign.ts +++ b/src/deploy/zns-campaign.ts @@ -1,63 +1,68 @@ -import * as hre from "hardhat"; -import { DefenderRelayProvider } from "@openzeppelin/defender-sdk-relay-signer-client/lib/ethers"; - -import { IDeployCampaignConfig } from "./campaign/types"; -import { HardhatDeployer } from "./deployer/hardhat-deployer"; -import { DeployCampaign } from "./campaign/deploy-campaign"; -import { - MeowTokenDM, - ZNSAccessControllerDM, - ZNSAddressResolverDM, - ZNSDomainTokenDM, ZNSCurvePricerDM, ZNSRootRegistrarDM, - ZNSRegistryDM, ZNSTreasuryDM, ZNSFixedPricerDM, ZNSSubRegistrarDM, -} from "./missions/contracts"; -import { getMongoAdapter } from "./db/mongo-adapter/get-adapter"; -import { getLogger } from "./logger/create-logger"; - -// TODO how do we mock certain things for tests -export const runZnsCampaign = async ({ - config, - provider, - dbVersion, - deployer, -} : { - config : IDeployCampaignConfig; - provider ?: DefenderRelayProvider; - dbVersion ?: string; - deployer ?: HardhatDeployer; -}) => { - hre.upgrades.silenceWarnings(); - - const logger = getLogger(); - - if (!deployer) { - deployer = new HardhatDeployer(config.deployAdmin, config.env, provider); - } - - const dbAdapter = await getMongoAdapter(); - - const campaign = new DeployCampaign({ - missions: [ - ZNSAccessControllerDM, - ZNSRegistryDM, - ZNSDomainTokenDM, - MeowTokenDM, - ZNSAddressResolverDM, - ZNSCurvePricerDM, - ZNSTreasuryDM, - ZNSRootRegistrarDM, - ZNSFixedPricerDM, - ZNSSubRegistrarDM, - ], - deployer, - dbAdapter, - logger, - config, - }); - - await campaign.execute(); - - await dbAdapter.finalizeDeployedVersion(dbVersion); - - return campaign; -}; +import * as hre from "hardhat"; +import { + HardhatDeployer, + DeployCampaign, + getLogger, +} from "@zero-tech/zdc"; +import { + MeowTokenDM, + ZNSAccessControllerDM, + ZNSAddressResolverDM, + ZNSDomainTokenDM, ZNSCurvePricerDM, ZNSRootRegistrarDM, + ZNSRegistryDM, ZNSTreasuryDM, ZNSFixedPricerDM, ZNSSubRegistrarDM, +} from "./missions/contracts"; +import { IZNSCampaignConfig, IZNSContracts } from "./campaign/types"; +import { getZnsMongoAdapter } from "./mongo"; + + +export const runZnsCampaign = async ({ + config, + dbVersion, + deployer, +} : { + config : IZNSCampaignConfig; + dbVersion ?: string; + deployer ?: HardhatDeployer; +}) => { + hre.upgrades.silenceWarnings(); + + const logger = getLogger(); + + if (!deployer) { + deployer = new HardhatDeployer({ + hre, + signer: config.deployAdmin, + env: config.env, + }); + } + + const dbAdapter = await getZnsMongoAdapter(); + + const campaign = new DeployCampaign< + IZNSCampaignConfig, + IZNSContracts + >({ + missions: [ + ZNSAccessControllerDM, + ZNSRegistryDM, + ZNSDomainTokenDM, + MeowTokenDM, + ZNSAddressResolverDM, + ZNSCurvePricerDM, + ZNSTreasuryDM, + ZNSRootRegistrarDM, + ZNSFixedPricerDM, + ZNSSubRegistrarDM, + ], + deployer, + dbAdapter, + logger, + config, + }); + + await campaign.execute(); + + await dbAdapter.finalize(dbVersion); + + return campaign; +}; diff --git a/src/utils/convert-base64.ts b/src/utils/convert-base64.ts index 79a4a55b0..d9904982b 100644 --- a/src/utils/convert-base64.ts +++ b/src/utils/convert-base64.ts @@ -1,7 +1,9 @@ +// eslint-disable-next-line no-shadow const toBase64 = (str : string) => btoa(str); +// eslint-disable-next-line no-shadow const fromBase64 = (str : string) => atob(str); const [ diff --git a/src/utils/drop-db.ts b/src/utils/drop-db.ts index 0fd76541d..793c82ac3 100644 --- a/src/utils/drop-db.ts +++ b/src/utils/drop-db.ts @@ -1,13 +1,12 @@ -import { getMongoAdapter } from "../deploy/db/mongo-adapter/get-adapter"; -import { startMongo, stopMongo } from "../deploy/db/service/mongo-service"; -import { getLogger } from "../deploy/logger/create-logger"; +import { getLogger } from "@zero-tech/zdc"; +import { startMongo, stopMongo, getZnsMongoAdapter } from "../deploy/mongo"; const logger = getLogger(); export const dropDB = async () => { try { - const adapter = await getMongoAdapter(); + const adapter = await getZnsMongoAdapter(); await adapter.dropDB(); await stopMongo(); } catch (e) { diff --git a/src/utils/git-tag/get-tag.ts b/src/utils/git-tag/get-tag.ts index 486e0c2fe..d2b512229 100644 --- a/src/utils/git-tag/get-tag.ts +++ b/src/utils/git-tag/get-tag.ts @@ -1,6 +1,6 @@ import fs from "fs"; import { tagFilePath } from "./constants"; -import { getLogger } from "../../deploy/logger/create-logger"; +import { getLogger } from "@zero-tech/zdc"; const logger = getLogger(); diff --git a/src/utils/git-tag/save-tag.ts b/src/utils/git-tag/save-tag.ts index 2d04781bb..0b74952ce 100644 --- a/src/utils/git-tag/save-tag.ts +++ b/src/utils/git-tag/save-tag.ts @@ -1,6 +1,6 @@ import { exec } from "child_process"; import { promisify } from "util"; -import { getLogger } from "../../deploy/logger/create-logger"; +import { getLogger } from "@zero-tech/zdc"; import fs from "fs"; import { tagFilePath } from "./constants"; diff --git a/test/DeployCampaign.integration.test.ts b/test/DeployCampaign.integration.test.ts index 1ff978a2d..731395db8 100644 --- a/test/DeployCampaign.integration.test.ts +++ b/test/DeployCampaign.integration.test.ts @@ -1,337 +1,319 @@ -import * as hre from "hardhat"; -import { SignerWithAddress } from "@nomicfoundation/hardhat-ethers/signers"; -import { getConfig } from "../src/deploy/campaign/environments"; -import { getLogger } from "../src/deploy/logger/create-logger"; -import { runZnsCampaign } from "../src/deploy/zns-campaign"; -import { IDeployCampaignConfig, TZNSContractState } from "../src/deploy/campaign/types"; -import { ethers } from "ethers"; -import { IDistributionConfig } from "./helpers/types"; -import { expect } from "chai"; -import { hashDomainLabel, PaymentType, AccessType } from "./helpers"; -import { - approveBulk, - getPriceBulk, - mintBulk, - registerRootDomainBulk, - registerSubdomainBulk, -} from "./helpers/deploy-helpers"; -import { Defender } from "@openzeppelin/defender-sdk"; - -describe("DeployCampaign - Integration", () => { - // Minters - let deployAdmin : SignerWithAddress; - let zeroVault : SignerWithAddress; - let userA : SignerWithAddress; - let userB : SignerWithAddress; - let userC : SignerWithAddress; - let userD : SignerWithAddress; - let userE : SignerWithAddress; - let userF : SignerWithAddress; - - let config : IDeployCampaignConfig; - - let zns : TZNSContractState; - // let mongoAdapter : MongoDBAdapter; - - let users : Array; - let distConfig : IDistributionConfig; - - const logger = getLogger(); - - // Default baselength is 4, maxLength is 50 - const shortDomain = "mazz"; // Length 4 - const mediumDomain = "mesder"; // Length 6 - const longDomain = "mesderwilderwilderwilderwilderwilderwilderwilderwil"; // Length 51 - const shortHash = hashDomainLabel(shortDomain); - const mediumHash = hashDomainLabel(mediumDomain); - const longHash = hashDomainLabel(longDomain); - - const freeShortSubdomain = "pubj"; // Length 4 - const freeMediumSubdomain = "pubjer"; // Length 6 - const freeLongSubdomain = "pubjerwilderwilderwilderwilderwilderwilderwilderwil"; // Length 51 - - const paidShortSubdomain = "purf"; // Length 4 - const paidMediumSubdomain = "purfer"; // Length 6 - const paidLongSubdomain = "purferwilderwilderwilderwilderwilderwilderwilderwil"; // Length 51 - - // Resolve subdomain hashes through async call `hashWithParent` in `before` hook - let freeShortSubHash : string; - let freeMediumSubHash : string; - let freeLongSubHash : string; - let paidShortSubHash : string; - let paidMediumSubHash : string; - let paidLongSubHash : string; - - const mintAmount = ethers.parseEther("10000000"); - - const domains = [shortDomain, mediumDomain, longDomain]; - - before(async () => { - [ deployAdmin, zeroVault, userA, userB, userC, userD, userE, userF ] = await hre.ethers.getSigners(); - - // Reads `ENV_LEVEL` environment variable to determine rules to be enforced - - let deployer; - let provider; - - if (hre.network.name === "hardhat") { - deployer = deployAdmin; - provider = new hre.ethers.JsonRpcProvider(process.env.SEPOLIA_RPC_URL); - } else { - const credentials = { - apiKey: process.env.DEFENDER_KEY, - apiSecret: process.env.DEFENDER_SECRET, - relayerApiKey: process.env.RELAYER_KEY, - relayerApiSecret: process.env.RELAYER_SECRET, - }; - - const client = new Defender(credentials); - provider = client.relaySigner.getProvider(); - deployer = client.relaySigner.getSigner(provider, { speed: "fast" }); - } - - - config = await getConfig({ - deployer, - zeroVaultAddress: zeroVault.address, - }); - - config.mockMeowToken = hre.network.name === "hardhat"; - - // First run the `run-campaign` script, then modify the `MONGO_DB_VERSION` environment variable - // Then run this test. The campaign won't be run, but those addresses will be picked up from the DB - const campaign = await runZnsCampaign({ config }); - - // TODO the zns.zeroVaultAddress is not set internally by the treasury, fix this - // because not new deployment? - // Using config.zeroVaultAddress in funcs for now, which is set properly - zns = campaign.state.contracts; - - // Surprised this typing works for signer of tx - // await zns.treasury.connect(deployer as unknown as Signer) - // .setBeneficiary(ethers.ZeroHash, config.zeroVaultAddress); - - // CurvePricer, stake, open - distConfig = { - pricerContract: await zns.curvePricer.getAddress(), - paymentType: PaymentType.STAKE, - accessType: AccessType.OPEN, - }; - - users = [ - userA, - userB, - userC, - userD, - userE, - userF, - ]; - - freeShortSubHash = await zns.subRegistrar.hashWithParent(shortHash, freeShortSubdomain); - freeMediumSubHash = await zns.subRegistrar.hashWithParent(mediumHash, freeMediumSubdomain); - freeLongSubHash = await zns.subRegistrar.hashWithParent(longHash, freeLongSubdomain); - paidShortSubHash = await zns.subRegistrar.hashWithParent(shortHash, paidShortSubdomain); - paidMediumSubHash = await zns.subRegistrar.hashWithParent(mediumHash, paidMediumSubdomain); - paidLongSubHash = await zns.subRegistrar.hashWithParent(longHash, paidLongSubdomain); - - await approveBulk(users, zns); - - // Give the user funds - if (hre.network.name === "hardhat" && config.mockMeowToken) { - await mintBulk( - users, - mintAmount, - zns - ); - } - }); - - it("Successfully mints TLDs with varying length", async () => { - // Confirm the domains are available - expect(await zns.registry.exists(shortHash)).to.be.false; - expect(await zns.registry.exists(mediumHash)).to.be.false; - expect(await zns.registry.exists(longHash)).to.be.false; - - // Get domain prices, including stake and protocol fee - const [priceShort, priceMedium, priceLong] = await getPriceBulk(domains, zns); - - logger.info(`Price of ${shortDomain} is ${priceShort.toString()}`); - logger.info(`Price of ${mediumDomain} is ${priceMedium.toString()}`); - logger.info(`Price of ${longDomain} is ${priceLong.toString()}`); - - // 1. Register root domains - // Note that this calls `setPriceConfig` internally for each TLD minted so we can also mint subdomains - await registerRootDomainBulk( - users, - domains, - config, // domainAddress - "https://zns.domains/", // tokenUri - distConfig, - config.rootPriceConfig, - zns, - logger - ); - - logger.info(`Domain ${shortHash} registered for user ${userA.address}`); - logger.info(`Domain ${mediumHash} registered for user ${userB.address}`); - logger.info(`Domain ${longHash} registered for user ${userC.address}`); - }); - - it("Mints subdomains with varying length for free as the owner of parent domain", async () => { - // Get price of subdomains - const parents = [shortHash, mediumHash, longHash]; - const subdomains = [freeShortSubdomain, freeMediumSubdomain, freeLongSubdomain]; - - expect(await zns.registry.exists(freeShortSubHash)).to.be.false; - expect(await zns.registry.exists(freeMediumSubHash)).to.be.false; - expect(await zns.registry.exists(freeLongSubHash)).to.be.false; - - const subdomainHashes = [ - freeShortSubHash, - freeMediumSubHash, - freeLongSubHash, - ]; - - // 2. Register subdomains - await registerSubdomainBulk( - users, - parents, - subdomains, - subdomainHashes, - config.zeroVaultAddress, - "https://zns.domains/", - distConfig, - zns, - logger - ); - - logger.info(`Subdomain ${freeShortSubHash} registered for user ${userA.address}`); - logger.info(`Subdomain ${freeMediumSubHash} registered for user ${userB.address}`); - logger.info(`Subdomain ${freeLongSubHash} registered for user ${userC.address}`); - }); - - it("Mints subdomains with varying length for a cost", async () => { - // Get price of subdomains - const parents = [shortHash, mediumHash, longHash]; - const subdomains = [paidShortSubdomain, paidMediumSubdomain, paidLongSubdomain]; - - const balancePromises = [ - zns.meowToken.balanceOf(userD.address), - zns.meowToken.balanceOf(userE.address), - zns.meowToken.balanceOf(userF.address), - ]; - - const [ - balanceBeforeD, - balanceBeforeE, - balanceBeforeF, - ]= await Promise.all(balancePromises); - - const [ - priceShort, - priceMedium, - priceLong, - ] = await getPriceBulk(subdomains, zns, parents); - - const subdomainHashes = [ - paidShortSubHash, - paidMediumSubHash, - paidLongSubHash, - ]; - - expect(await zns.registry.exists(paidShortSubHash)).to.be.false; - expect(await zns.registry.exists(paidMediumSubHash)).to.be.false; - expect(await zns.registry.exists(paidLongSubHash)).to.be.false; - - // 2. Register subdomains - await registerSubdomainBulk( - [userD, userE, userF], - parents, - subdomains, - subdomainHashes, - config.zeroVaultAddress, - "https://zns.domains/", - distConfig, - zns, - logger - ); - - const balanceAfterPromises = [ - zns.meowToken.balanceOf(userD.address), - zns.meowToken.balanceOf(userE.address), - zns.meowToken.balanceOf(userF.address), - ]; - - const [ - balanceAfterD, - balanceAfterE, - balanceAfterF, - ]= await Promise.all(balanceAfterPromises); - - // Owners of parent domains can mint subdomains for free - expect(balanceAfterD).to.eq(balanceBeforeD - priceShort); - expect(balanceAfterE).to.eq(balanceBeforeE - priceMedium); - expect(balanceAfterF).to.eq(balanceBeforeF - priceLong); - - logger.info(`Subdomain ${freeShortSubHash} registered for user ${userA.address}`); - logger.info(`Subdomain ${freeMediumSubHash} registered for user ${userB.address}`); - logger.info(`Subdomain ${freeLongSubHash} registered for user ${userC.address}`); - }); - - // Checkpoint here, ran other three consecutively and it was successful - it("Revokes a domain correctly", async () => { - // 3. Revoke domain - // internal promise error somewhere? issue reading 'any'? - const tx = await zns.rootRegistrar.connect(userA).revokeDomain(freeShortSubHash); - - if (hre.network.name !== "hardhat") await tx.wait(1); - - await expect(tx).to.emit(zns.rootRegistrar, "DomainRevoked").withArgs(freeShortSubHash, userA.address, false); - logger.info( - "info", - `Subdomain ${freeShortSubHash} revoked by user ${userA.address}` - ); - }); - - it("Reclaims a domain correctly", async () => { - // 4. Reclaim domain - const tx = await zns.registry.connect(userB).updateDomainOwner(freeMediumSubHash, userA.address); - logger.info( - `Subdomain ${freeMediumSubHash} ownership given to user ${userA.address} from user ${userB.address}` - ); - - if (hre.network.name !== "hardhat") await tx.wait(1); - - const tx1 = await zns.rootRegistrar.connect(userB).reclaimDomain(freeMediumSubHash); - - if (hre.network.name !== "hardhat") await tx1.wait(1); - - await expect(tx1).to.emit(zns.rootRegistrar, "DomainReclaimed").withArgs(freeMediumSubHash, userB.address); - expect(await zns.registry.getDomainOwner(freeMediumSubHash)).to.equal(userB.address); - - logger.info(`Subdomain ${freeMediumSubHash} reclaimed by user ${userB.address} from user ${userA.address}`); - }); - - it("Reclaims then revokes correctly", async () => { - // 5. Reclaim and revoke domain - const tx = await zns.registry.connect(userC).updateDomainOwner(freeLongSubHash, userA.address); - await expect(tx).to.emit(zns.registry, "DomainOwnerSet").withArgs(freeLongSubHash, userA.address); - logger.info(`Subdomain ${freeLongSubHash} ownership given to user ${userA.address} from user ${userC.address}`); - - if (hre.network.name !== "hardhat") await tx.wait(1); - - const tx1 = await zns.rootRegistrar.connect(userC).reclaimDomain(freeLongSubHash); - await expect(tx1).to.emit(zns.rootRegistrar, "DomainReclaimed").withArgs(freeLongSubHash, userC.address); - - if (hre.network.name !== "hardhat") await tx1.wait(1); - - logger.info(`Subdomain ${freeLongSubHash} reclaimed by user ${userC.address}`); - expect(await zns.registry.getDomainOwner(freeLongSubHash)).to.equal(userC.address); - - const tx2 = await zns.rootRegistrar.connect(userC).revokeDomain(freeLongSubHash); - if (hre.network.name !== "hardhat") await tx2.wait(1); - - await expect(tx2).to.emit(zns.rootRegistrar, "DomainRevoked").withArgs(freeLongSubHash, userC.address, false); - logger.info(`Subdomain ${freeLongSubHash} revoked by user ${userC.address}`); - }); -}); +import { + getLogger, +} from "@zero-tech/zdc"; +import * as hre from "hardhat"; +import { SignerWithAddress } from "@nomicfoundation/hardhat-ethers/signers"; +import { getCampaignConfig } from "../src/deploy/campaign/environments"; +import { runZnsCampaign } from "../src/deploy/zns-campaign"; +import { ethers } from "ethers"; +import { IDistributionConfig } from "./helpers/types"; +import { expect } from "chai"; +import { hashDomainLabel, PaymentType, AccessType } from "./helpers"; +import { + approveBulk, + getPriceBulk, + mintBulk, + registerRootDomainBulk, + registerSubdomainBulk, +} from "./helpers/deploy-helpers"; +import { IZNSCampaignConfig, IZNSContracts } from "../src/deploy/campaign/types"; + + +describe("zNS + zDC Single Integration Test", () => { + // Minters + let deployAdmin : SignerWithAddress; + let zeroVault : SignerWithAddress; + let userA : SignerWithAddress; + let userB : SignerWithAddress; + let userC : SignerWithAddress; + let userD : SignerWithAddress; + let userE : SignerWithAddress; + let userF : SignerWithAddress; + + let config : IZNSCampaignConfig; + + let zns : IZNSContracts; + // let mongoAdapter : MongoDBAdapter; + + let users : Array; + let distConfig : IDistributionConfig; + + const logger = getLogger(); + + // Default baselength is 4, maxLength is 50 + const shortDomain = "mazz"; // Length 4 + const mediumDomain = "mesder"; // Length 6 + const longDomain = "mesderwilderwilderwilderwilderwilderwilderwilderwil"; // Length 51 + const shortHash = hashDomainLabel(shortDomain); + const mediumHash = hashDomainLabel(mediumDomain); + const longHash = hashDomainLabel(longDomain); + + const freeShortSubdomain = "pubj"; // Length 4 + const freeMediumSubdomain = "pubjer"; // Length 6 + const freeLongSubdomain = "pubjerwilderwilderwilderwilderwilderwilderwilderwil"; // Length 51 + + const paidShortSubdomain = "purf"; // Length 4 + const paidMediumSubdomain = "purfer"; // Length 6 + const paidLongSubdomain = "purferwilderwilderwilderwilderwilderwilderwilderwil"; // Length 51 + + // Resolve subdomain hashes through async call `hashWithParent` in `before` hook + let freeShortSubHash : string; + let freeMediumSubHash : string; + let freeLongSubHash : string; + let paidShortSubHash : string; + let paidMediumSubHash : string; + let paidLongSubHash : string; + + const mintAmount = ethers.parseEther("10000000"); + + const domains = [shortDomain, mediumDomain, longDomain]; + + before(async () => { + [ deployAdmin, zeroVault, userA, userB, userC, userD, userE, userF ] = await hre.ethers.getSigners(); + + // Reads `ENV_LEVEL` environment variable to determine rules to be enforced + + config = await getCampaignConfig({ + deployer: deployAdmin, + zeroVaultAddress: zeroVault.address, + }); + + config.mockMeowToken = hre.network.name === "hardhat"; + + // First run the `run-campaign` script, then modify the `MONGO_DB_VERSION` environment variable + // Then run this test. The campaign won't be run, but those addresses will be picked up from the DB + const campaign = await runZnsCampaign({ config }); + + // TODO the zns.zeroVaultAddress is not set internally by the treasury, fix this + // because not new deployment? + // Using config.zeroVaultAddress in funcs for now, which is set properly + zns = campaign.state.contracts; + + // Surprised this typing works for signer of tx + // await zns.treasury.connect(deployer as unknown as Signer) + // .setBeneficiary(ethers.ZeroHash, config.zeroVaultAddress); + + // CurvePricer, stake, open + distConfig = { + pricerContract: await zns.curvePricer.getAddress(), + paymentType: PaymentType.STAKE, + accessType: AccessType.OPEN, + }; + + users = [ + userA, + userB, + userC, + userD, + userE, + userF, + ]; + + freeShortSubHash = await zns.subRegistrar.hashWithParent(shortHash, freeShortSubdomain); + freeMediumSubHash = await zns.subRegistrar.hashWithParent(mediumHash, freeMediumSubdomain); + freeLongSubHash = await zns.subRegistrar.hashWithParent(longHash, freeLongSubdomain); + paidShortSubHash = await zns.subRegistrar.hashWithParent(shortHash, paidShortSubdomain); + paidMediumSubHash = await zns.subRegistrar.hashWithParent(mediumHash, paidMediumSubdomain); + paidLongSubHash = await zns.subRegistrar.hashWithParent(longHash, paidLongSubdomain); + + await approveBulk(users, zns); + + // Give the user funds + if (hre.network.name === "hardhat" && config.mockMeowToken) { + await mintBulk( + users, + mintAmount, + zns + ); + } + }); + + it("Successfully mints TLDs with varying length", async () => { + // Confirm the domains are available + expect(await zns.registry.exists(shortHash)).to.be.false; + expect(await zns.registry.exists(mediumHash)).to.be.false; + expect(await zns.registry.exists(longHash)).to.be.false; + + // Get domain prices, including stake and protocol fee + const [priceShort, priceMedium, priceLong] = await getPriceBulk(domains, zns); + + logger.info(`Price of ${shortDomain} is ${priceShort.toString()}`); + logger.info(`Price of ${mediumDomain} is ${priceMedium.toString()}`); + logger.info(`Price of ${longDomain} is ${priceLong.toString()}`); + + // 1. Register root domains + // Note that this calls `setPriceConfig` internally for each TLD minted so we can also mint subdomains + await registerRootDomainBulk( + users, + domains, + config, // domainAddress + "https://zns.domains/", // tokenUri + distConfig, + config.rootPriceConfig, + zns, + logger + ); + + logger.info(`Domain ${shortHash} registered for user ${userA.address}`); + logger.info(`Domain ${mediumHash} registered for user ${userB.address}`); + logger.info(`Domain ${longHash} registered for user ${userC.address}`); + }); + + it("Mints subdomains with varying length for free as the owner of parent domain", async () => { + // Get price of subdomains + const parents = [shortHash, mediumHash, longHash]; + const subdomains = [freeShortSubdomain, freeMediumSubdomain, freeLongSubdomain]; + + expect(await zns.registry.exists(freeShortSubHash)).to.be.false; + expect(await zns.registry.exists(freeMediumSubHash)).to.be.false; + expect(await zns.registry.exists(freeLongSubHash)).to.be.false; + + const subdomainHashes = [ + freeShortSubHash, + freeMediumSubHash, + freeLongSubHash, + ]; + + // 2. Register subdomains + await registerSubdomainBulk( + users, + parents, + subdomains, + subdomainHashes, + config.zeroVaultAddress, + "https://zns.domains/", + distConfig, + zns, + logger + ); + + logger.info(`Subdomain ${freeShortSubHash} registered for user ${userA.address}`); + logger.info(`Subdomain ${freeMediumSubHash} registered for user ${userB.address}`); + logger.info(`Subdomain ${freeLongSubHash} registered for user ${userC.address}`); + }); + + it("Mints subdomains with varying length for a cost", async () => { + // Get price of subdomains + const parents = [shortHash, mediumHash, longHash]; + const subdomains = [paidShortSubdomain, paidMediumSubdomain, paidLongSubdomain]; + + const balancePromises = [ + zns.meowToken.balanceOf(userD.address), + zns.meowToken.balanceOf(userE.address), + zns.meowToken.balanceOf(userF.address), + ]; + + const [ + balanceBeforeD, + balanceBeforeE, + balanceBeforeF, + ]= await Promise.all(balancePromises); + + const [ + priceShort, + priceMedium, + priceLong, + ] = await getPriceBulk(subdomains, zns, parents); + + const subdomainHashes = [ + paidShortSubHash, + paidMediumSubHash, + paidLongSubHash, + ]; + + expect(await zns.registry.exists(paidShortSubHash)).to.be.false; + expect(await zns.registry.exists(paidMediumSubHash)).to.be.false; + expect(await zns.registry.exists(paidLongSubHash)).to.be.false; + + // 2. Register subdomains + await registerSubdomainBulk( + [userD, userE, userF], + parents, + subdomains, + subdomainHashes, + config.zeroVaultAddress, + "https://zns.domains/", + distConfig, + zns, + logger + ); + + const balanceAfterPromises = [ + zns.meowToken.balanceOf(userD.address), + zns.meowToken.balanceOf(userE.address), + zns.meowToken.balanceOf(userF.address), + ]; + + const [ + balanceAfterD, + balanceAfterE, + balanceAfterF, + ]= await Promise.all(balanceAfterPromises); + + // Owners of parent domains can mint subdomains for free + expect(balanceAfterD).to.eq(balanceBeforeD - priceShort); + expect(balanceAfterE).to.eq(balanceBeforeE - priceMedium); + expect(balanceAfterF).to.eq(balanceBeforeF - priceLong); + + logger.info(`Subdomain ${freeShortSubHash} registered for user ${userA.address}`); + logger.info(`Subdomain ${freeMediumSubHash} registered for user ${userB.address}`); + logger.info(`Subdomain ${freeLongSubHash} registered for user ${userC.address}`); + }); + + // Checkpoint here, ran other three consecutively and it was successful + it("Revokes a domain correctly", async () => { + // 3. Revoke domain + // internal promise error somewhere? issue reading 'any'? + const tx = await zns.rootRegistrar.connect(userA).revokeDomain(freeShortSubHash); + + if (hre.network.name !== "hardhat") await tx.wait(1); + + await expect(tx).to.emit(zns.rootRegistrar, "DomainRevoked").withArgs(freeShortSubHash, userA.address, false); + logger.info( + "info", + `Subdomain ${freeShortSubHash} revoked by user ${userA.address}` + ); + }); + + it("Reclaims a domain correctly", async () => { + // 4. Reclaim domain + const tx = await zns.registry.connect(userB).updateDomainOwner(freeMediumSubHash, userA.address); + logger.info( + `Subdomain ${freeMediumSubHash} ownership given to user ${userA.address} from user ${userB.address}` + ); + + if (hre.network.name !== "hardhat") await tx.wait(1); + + const tx1 = await zns.rootRegistrar.connect(userB).reclaimDomain(freeMediumSubHash); + + if (hre.network.name !== "hardhat") await tx1.wait(1); + + await expect(tx1).to.emit(zns.rootRegistrar, "DomainReclaimed").withArgs(freeMediumSubHash, userB.address); + expect(await zns.registry.getDomainOwner(freeMediumSubHash)).to.equal(userB.address); + + logger.info(`Subdomain ${freeMediumSubHash} reclaimed by user ${userB.address} from user ${userA.address}`); + }); + + it("Reclaims then revokes correctly", async () => { + // 5. Reclaim and revoke domain + const tx = await zns.registry.connect(userC).updateDomainOwner(freeLongSubHash, userA.address); + await expect(tx).to.emit(zns.registry, "DomainOwnerSet").withArgs(freeLongSubHash, userA.address); + logger.info(`Subdomain ${freeLongSubHash} ownership given to user ${userA.address} from user ${userC.address}`); + + if (hre.network.name !== "hardhat") await tx.wait(1); + + const tx1 = await zns.rootRegistrar.connect(userC).reclaimDomain(freeLongSubHash); + await expect(tx1).to.emit(zns.rootRegistrar, "DomainReclaimed").withArgs(freeLongSubHash, userC.address); + + if (hre.network.name !== "hardhat") await tx1.wait(1); + + logger.info(`Subdomain ${freeLongSubHash} reclaimed by user ${userC.address}`); + expect(await zns.registry.getDomainOwner(freeLongSubHash)).to.equal(userC.address); + + const tx2 = await zns.rootRegistrar.connect(userC).revokeDomain(freeLongSubHash); + if (hre.network.name !== "hardhat") await tx2.wait(1); + + await expect(tx2).to.emit(zns.rootRegistrar, "DomainRevoked").withArgs(freeLongSubHash, userC.address, false); + logger.info(`Subdomain ${freeLongSubHash} revoked by user ${userC.address}`); + }); +}); diff --git a/test/DeployCampaignInt.test.ts b/test/DeployCampaignInt.test.ts index d2dded9d2..9c3a8c494 100644 --- a/test/DeployCampaignInt.test.ts +++ b/test/DeployCampaignInt.test.ts @@ -1,1120 +1,1162 @@ -/* eslint-disable @typescript-eslint/no-empty-function, @typescript-eslint/ban-ts-comment, max-classes-per-file */ -import * as hre from "hardhat"; -import { SignerWithAddress } from "@nomicfoundation/hardhat-ethers/signers"; -import { expect } from "chai"; -import { - DEFAULT_ROYALTY_FRACTION, - DEFAULT_PRICE_CONFIG, - ZNS_DOMAIN_TOKEN_NAME, - ZNS_DOMAIN_TOKEN_SYMBOL, - INVALID_ENV_ERR, - NO_MOCK_PROD_ERR, - STAKING_TOKEN_ERR, - INVALID_CURVE_ERR, - MONGO_URI_ERR, -} from "./helpers"; -import { - MeowTokenDM, - meowTokenName, - meowTokenSymbol, - ZNSAccessControllerDM, - ZNSAddressResolverDM, - ZNSCurvePricerDM, - ZNSDomainTokenDM, ZNSFixedPricerDM, - ZNSRegistryDM, ZNSRootRegistrarDM, ZNSSubRegistrarDM, ZNSTreasuryDM, -} from "../src/deploy/missions/contracts"; -import { znsNames } from "../src/deploy/missions/contracts/names"; -import { IDeployCampaignConfig, TZNSContractState, TLogger } from "../src/deploy/campaign/types"; -import { runZnsCampaign } from "../src/deploy/zns-campaign"; -import { MeowMainnet } from "../src/deploy/missions/contracts/meow-token/mainnet-data"; -import { HardhatDeployer } from "../src/deploy/deployer/hardhat-deployer"; -import { DeployCampaign } from "../src/deploy/campaign/deploy-campaign"; -import { getMongoAdapter, resetMongoAdapter } from "../src/deploy/db/mongo-adapter/get-adapter"; -import { BaseDeployMission } from "../src/deploy/missions/base-deploy-mission"; -import { ResolverTypes } from "../src/deploy/constants"; -import { MongoDBAdapter } from "../src/deploy/db/mongo-adapter/mongo-adapter"; -import { getConfig } from "../src/deploy/campaign/environments"; -import { ethers } from "ethers"; -import { promisify } from "util"; -import { exec } from "child_process"; -import { ITenderlyContractData, TDeployArgs } from "../src/deploy/missions/types"; -import { saveTag } from "../src/utils/git-tag/save-tag"; -import { VERSION_TYPES } from "../src/deploy/db/mongo-adapter/constants"; - - -const execAsync = promisify(exec); - -describe("Deploy Campaign Test", () => { - let deployAdmin : SignerWithAddress; - let admin : SignerWithAddress; - let governor : SignerWithAddress; - - // eslint-disable-next-line @typescript-eslint/no-unused-vars - let userA : SignerWithAddress; - let userB : SignerWithAddress; - let zeroVault : SignerWithAddress; - let campaignConfig : IDeployCampaignConfig; - - let mongoAdapter : MongoDBAdapter; - - const env = "dev"; - - before(async () => { - [deployAdmin, admin, governor, zeroVault, userA, userB] = await hre.ethers.getSigners(); - }); - - describe("MEOW Token Ops", () => { - before(async () => { - campaignConfig = { - env, - deployAdmin, - governorAddresses: [deployAdmin.address], - adminAddresses: [deployAdmin.address, admin.address], - domainToken: { - name: ZNS_DOMAIN_TOKEN_NAME, - symbol: ZNS_DOMAIN_TOKEN_SYMBOL, - defaultRoyaltyReceiver: deployAdmin.address, - defaultRoyaltyFraction: DEFAULT_ROYALTY_FRACTION, - }, - rootPriceConfig: DEFAULT_PRICE_CONFIG, - zeroVaultAddress: zeroVault.address, - stakingTokenAddress: MeowMainnet.address, - mockMeowToken: true, - postDeploy: { - tenderlyProjectSlug: "", - monitorContracts: false, - verifyContracts: false, - }, - }; - }); - - it("should deploy new MeowTokenMock when `mockMeowToken` is true", async () => { - const campaign = await runZnsCampaign({ - config: campaignConfig, - }); - - const { meowToken, dbAdapter } = campaign; - - const toMint = hre.ethers.parseEther("972315"); - - const balanceBefore = await meowToken.balanceOf(userA.address); - // `mint()` only exists on the Mocked contract - await meowToken.connect(deployAdmin).mint( - userA.address, - toMint - ); - - const balanceAfter = await meowToken.balanceOf(userA.address); - expect(balanceAfter - balanceBefore).to.equal(toMint); - - await dbAdapter.dropDB(); - }); - - it("should use existing deployed non-mocked MeowToken contract when `mockMeowToken` is false", async () => { - campaignConfig.mockMeowToken = false; - - // deploy MeowToken contract - const factory = await hre.ethers.getContractFactory("MeowToken"); - const meow = await hre.upgrades.deployProxy( - factory, - [meowTokenName, meowTokenSymbol], - { - kind: "transparent", - }); - - await meow.waitForDeployment(); - - campaignConfig.stakingTokenAddress = await meow.getAddress(); - - const campaign = await runZnsCampaign({ - config: campaignConfig, - }); - - const { - meowToken, - dbAdapter, - state: { - instances: { - meowToken: meowDMInstance, - }, - }, - } = campaign; - - expect(meowToken.address).to.equal(meow.address); - expect(meowDMInstance.contractName).to.equal(znsNames.meowToken.contract); - - const toMint = hre.ethers.parseEther("972315"); - // `mint()` only exists on the Mocked contract - try { - await meowToken.connect(deployAdmin).mint( - userA.address, - toMint - ); - } catch (e) { - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-ignore - expect(e.message).to.include( - ".mint is not a function" - ); - } - - // Cannot call to real db to - await dbAdapter.dropDB(); - }); - }); - - describe("Failure Recovery", () => { - const errorMsgDeploy = "FailMissionDeploy"; - const errorMsgPostDeploy = "FailMissionPostDeploy"; - - const loggerMock = { - info: () => { - }, - debug: () => { - }, - error: () => { - }, - }; - - interface IDeployedData { - contract : string; - instance : string; - address ?: string; - } - - const runTest = async ({ - missionList, - placeOfFailure, - deployedNames, - undeployedNames, - failingInstanceName, - callback, - } : { - missionList : Array; - placeOfFailure : string; - deployedNames : Array<{ contract : string; instance : string; }>; - undeployedNames : Array<{ contract : string; instance : string; }>; - failingInstanceName : string; - // eslint-disable-next-line no-shadow - callback ?: (failingCampaign : DeployCampaign) => Promise; - }) => { - const deployer = new HardhatDeployer(deployAdmin, env); - let dbAdapter = await getMongoAdapter(); - - let toMatchErr = errorMsgDeploy; - if (placeOfFailure === "postDeploy") { - toMatchErr = errorMsgPostDeploy; - } - - const failingCampaign = new DeployCampaign({ - missions: missionList, - deployer, - dbAdapter, - // @ts-ignore - logger: loggerMock, - config: campaignConfig, - }); - - try { - await failingCampaign.execute(); - } catch (e) { - // @ts-ignore - expect(e.message).to.include(toMatchErr); - } - - // check the correct amount of contracts in state - const { contracts } = failingCampaign.state; - expect(Object.keys(contracts).length).to.equal(deployedNames.length); - - if (placeOfFailure === "deploy") { - // it should not deploy AddressResolver - expect(contracts[failingInstanceName]).to.be.undefined; - } else { - // it should deploy AddressResolver - expect(await contracts[failingInstanceName].getAddress()).to.be.properAddress; - } - - // check DB to verify we only deployed half - const firstRunDeployed = await deployedNames.reduce( - async ( - acc : Promise>, - { contract, instance } : { contract : string; instance : string; } - ) : Promise> => { - const akk = await acc; - const fromDB = await dbAdapter.getContract(contract); - expect(fromDB?.address).to.be.properAddress; - - return [...akk, { contract, instance, address: fromDB?.address }]; - }, - Promise.resolve([]) - ); - - await undeployedNames.reduce( - async ( - acc : Promise, - { contract, instance } : { contract : string; instance : string; } - ) : Promise => { - await acc; - const fromDB = await dbAdapter.getContract(contract); - const fromState = failingCampaign[instance]; - - expect(fromDB).to.be.null; - expect(fromState).to.be.undefined; - }, - Promise.resolve() - ); - - // call whatever callback we passed before the next campaign run - await callback?.(failingCampaign); - - const { curVersion: initialDbVersion } = dbAdapter; - - // reset mongoAdapter instance to make sure we pick up the correct DB version - resetMongoAdapter(); - - // run Campaign again, but normally - const nextCampaign = await runZnsCampaign({ - config: campaignConfig, - }); - - ({ dbAdapter } = nextCampaign); - - // make sure MongoAdapter is using the correct TEMP version - const { curVersion: nextDbVersion } = dbAdapter; - expect(nextDbVersion).to.equal(initialDbVersion); - - // state should have 10 contracts in it - const { state } = nextCampaign; - expect(Object.keys(state.contracts).length).to.equal(10); - expect(Object.keys(state.instances).length).to.equal(10); - expect(state.missions.length).to.equal(10); - // it should deploy AddressResolver - expect(await state.contracts.addressResolver.getAddress()).to.be.properAddress; - - // check DB to verify we deployed everything - const allNames = deployedNames.concat(undeployedNames); - - await allNames.reduce( - async ( - acc : Promise, - { contract } : { contract : string; } - ) : Promise => { - await acc; - const fromDB = await dbAdapter.getContract(contract); - expect(fromDB?.address).to.be.properAddress; - }, - Promise.resolve() - ); - - // check that previously deployed contracts were NOT redeployed - await firstRunDeployed.reduce( - async (acc : Promise, { contract, instance, address } : IDeployedData) : Promise => { - await acc; - const fromDB = await nextCampaign.dbAdapter.getContract(contract); - const fromState = nextCampaign[instance]; - - expect(fromDB?.address).to.equal(address); - expect(await fromState.getAddress()).to.equal(address); - }, - Promise.resolve() - ); - - return { - failingCampaign, - nextCampaign, - firstRunDeployed, - }; - }; - - beforeEach(async () => { - [deployAdmin, admin, zeroVault] = await hre.ethers.getSigners(); - - campaignConfig = { - env, - deployAdmin, - governorAddresses: [deployAdmin.address], - adminAddresses: [deployAdmin.address, admin.address], - domainToken: { - name: ZNS_DOMAIN_TOKEN_NAME, - symbol: ZNS_DOMAIN_TOKEN_SYMBOL, - defaultRoyaltyReceiver: deployAdmin.address, - defaultRoyaltyFraction: DEFAULT_ROYALTY_FRACTION, - }, - rootPriceConfig: DEFAULT_PRICE_CONFIG, - zeroVaultAddress: zeroVault.address, - // TODO dep: what do we pass here for test flow? we don't have a deployed MeowToken contract - stakingTokenAddress: "", - mockMeowToken: true, // 1700083028872 - postDeploy: { - tenderlyProjectSlug: "", - monitorContracts: false, - verifyContracts: false, - }, - }; - - mongoAdapter = await getMongoAdapter(loggerMock as TLogger); - }); - - afterEach(async () => { - await mongoAdapter.dropDB(); - }); - - // eslint-disable-next-line max-len - it("[in AddressResolver.deploy() hook] should ONLY deploy undeployed contracts in the run following a failed run", async () => { - // ZNSAddressResolverDM sits in the middle of the Campaign deploy list - // we override this class to add a failure to the deploy() method - class FailingZNSAddressResolverDM extends ZNSAddressResolverDM { - async deploy () { - throw new Error(errorMsgDeploy); - } - } - - const deployedNames = [ - znsNames.accessController, - znsNames.registry, - znsNames.domainToken, - { - contract: znsNames.meowToken.contractMock, - instance: znsNames.meowToken.instance, - }, - ]; - - const undeployedNames = [ - znsNames.addressResolver, - znsNames.curvePricer, - znsNames.treasury, - znsNames.rootRegistrar, - znsNames.fixedPricer, - znsNames.subRegistrar, - ]; - - // call test flow runner - await runTest({ - missionList: [ - ZNSAccessControllerDM, - ZNSRegistryDM, - ZNSDomainTokenDM, - MeowTokenDM, - FailingZNSAddressResolverDM, // failing DM - ZNSCurvePricerDM, - ZNSTreasuryDM, - ZNSRootRegistrarDM, - ZNSFixedPricerDM, - ZNSSubRegistrarDM, - ], - placeOfFailure: "deploy", - deployedNames, - undeployedNames, - failingInstanceName: "addressResolver", - }); - }); - - // eslint-disable-next-line max-len - it("[in AddressResolver.postDeploy() hook] should start from post deploy sequence that failed on the previous run", async () => { - class FailingZNSAddressResolverDM extends ZNSAddressResolverDM { - async postDeploy () { - throw new Error(errorMsgPostDeploy); - } - } - - const deployedNames = [ - znsNames.accessController, - znsNames.registry, - znsNames.domainToken, - { - contract: znsNames.meowToken.contractMock, - instance: znsNames.meowToken.instance, - }, - znsNames.addressResolver, - ]; - - const undeployedNames = [ - znsNames.curvePricer, - znsNames.treasury, - znsNames.rootRegistrar, - znsNames.fixedPricer, - znsNames.subRegistrar, - ]; - - const checkPostDeploy = async (failingCampaign : DeployCampaign) => { - const { - // eslint-disable-next-line no-shadow - registry, - } = failingCampaign; - - // we are checking that postDeploy did not add resolverType to Registry - expect(await registry.getResolverType(ResolverTypes.address)).to.be.equal(ethers.ZeroAddress); - }; - - // check contracts are deployed correctly - const { - nextCampaign, - } = await runTest({ - missionList: [ - ZNSAccessControllerDM, - ZNSRegistryDM, - ZNSDomainTokenDM, - MeowTokenDM, - FailingZNSAddressResolverDM, // failing DM - ZNSCurvePricerDM, - ZNSTreasuryDM, - ZNSRootRegistrarDM, - ZNSFixedPricerDM, - ZNSSubRegistrarDM, - ], - placeOfFailure: "postDeploy", - deployedNames, - undeployedNames, - failingInstanceName: "addressResolver", - callback: checkPostDeploy, - }); - - // make sure postDeploy() ran properly on the next run - const { - registry, - addressResolver, - } = nextCampaign; - expect(await registry.getResolverType(ResolverTypes.address)).to.be.equal(await addressResolver.getAddress()); - }); - - // eslint-disable-next-line max-len - it("[in RootRegistrar.deploy() hook] should ONLY deploy undeployed contracts in the run following a failed run", async () => { - class FailingZNSRootRegistrarDM extends ZNSRootRegistrarDM { - async deploy () { - throw new Error(errorMsgDeploy); - } - } - - const deployedNames = [ - znsNames.accessController, - znsNames.registry, - znsNames.domainToken, - { - contract: znsNames.meowToken.contractMock, - instance: znsNames.meowToken.instance, - }, - znsNames.addressResolver, - znsNames.curvePricer, - znsNames.treasury, - ]; - - const undeployedNames = [ - znsNames.rootRegistrar, - znsNames.fixedPricer, - znsNames.subRegistrar, - ]; - - // call test flow runner - await runTest({ - missionList: [ - ZNSAccessControllerDM, - ZNSRegistryDM, - ZNSDomainTokenDM, - MeowTokenDM, - ZNSAddressResolverDM, - ZNSCurvePricerDM, - ZNSTreasuryDM, - FailingZNSRootRegistrarDM, // failing DM - ZNSFixedPricerDM, - ZNSSubRegistrarDM, - ], - placeOfFailure: "deploy", - deployedNames, - undeployedNames, - failingInstanceName: "rootRegistrar", - }); - }); - - // eslint-disable-next-line max-len - it("[in RootRegistrar.postDeploy() hook] should start from post deploy sequence that failed on the previous run", async () => { - class FailingZNSRootRegistrarDM extends ZNSRootRegistrarDM { - async postDeploy () { - throw new Error(errorMsgPostDeploy); - } - } - - const deployedNames = [ - znsNames.accessController, - znsNames.registry, - znsNames.domainToken, - { - contract: znsNames.meowToken.contractMock, - instance: znsNames.meowToken.instance, - }, - znsNames.addressResolver, - znsNames.curvePricer, - znsNames.treasury, - znsNames.rootRegistrar, - ]; - - const undeployedNames = [ - znsNames.fixedPricer, - znsNames.subRegistrar, - ]; - - const checkPostDeploy = async (failingCampaign : DeployCampaign) => { - const { - // eslint-disable-next-line no-shadow - accessController, - // eslint-disable-next-line no-shadow - rootRegistrar, - } = failingCampaign; - - // we are checking that postDeploy did not grant REGISTRAR_ROLE to RootRegistrar - expect(await accessController.isRegistrar(await rootRegistrar.getAddress())).to.be.false; - }; - - // check contracts are deployed correctly - const { - nextCampaign, - } = await runTest({ - missionList: [ - ZNSAccessControllerDM, - ZNSRegistryDM, - ZNSDomainTokenDM, - MeowTokenDM, - ZNSAddressResolverDM, - ZNSCurvePricerDM, - ZNSTreasuryDM, - FailingZNSRootRegistrarDM, // failing DM - ZNSFixedPricerDM, - ZNSSubRegistrarDM, - ], - placeOfFailure: "postDeploy", - deployedNames, - undeployedNames, - failingInstanceName: "rootRegistrar", - callback: checkPostDeploy, - }); - - // make sure postDeploy() ran properly on the next run - const { - accessController, - rootRegistrar, - } = nextCampaign; - expect(await accessController.isRegistrar(await rootRegistrar.getAddress())).to.be.true; - }); - }); - - describe("Configurable Environment & Validation", () => { - let envInitial : string; - - beforeEach(async () => { - envInitial = JSON.stringify(process.env); - }); - - afterEach(async () => { - process.env = JSON.parse(envInitial); - }); - - // The `validate` function accepts the environment parameter only for the - // purpose of testing here as manipulating actual environment variables - // like `process.env. = "value"` is not possible in a test environment - // because the Hardhat process for running these tests will not respect these - // changes. `getConfig` calls to `validate` on its own, but never passes a value - // for the environment specifically, that is ever only inferred from the `process.env.ENV_LEVEL` - it("Gets the default configuration correctly", async () => { - // set the environment to get the appropriate variables - const localConfig : IDeployCampaignConfig = await getConfig({ - deployer: deployAdmin, - zeroVaultAddress: zeroVault.address, - governors: [governor.address], - admins: [admin.address], - }); - - expect(await localConfig.deployAdmin.getAddress()).to.eq(deployAdmin.address); - expect(localConfig.governorAddresses[0]).to.eq(governor.address); - expect(localConfig.governorAddresses[1]).to.eq(deployAdmin.address); - expect(localConfig.adminAddresses[0]).to.eq(admin.address); - expect(localConfig.adminAddresses[1]).to.eq(deployAdmin.address); - expect(localConfig.domainToken.name).to.eq(ZNS_DOMAIN_TOKEN_NAME); - expect(localConfig.domainToken.symbol).to.eq(ZNS_DOMAIN_TOKEN_SYMBOL); - expect(localConfig.domainToken.defaultRoyaltyReceiver).to.eq(zeroVault.address); - expect(localConfig.domainToken.defaultRoyaltyFraction).to.eq(DEFAULT_ROYALTY_FRACTION); - expect(localConfig.rootPriceConfig).to.deep.eq(DEFAULT_PRICE_CONFIG); - }); - - it("Confirms encoding functionality works for env variables", async () => { - const sample = "0x123,0x456,0x789"; - const sampleFormatted = ["0x123", "0x456", "0x789"]; - const encoded = btoa(sample); - const decoded = atob(encoded).split(","); - expect(decoded).to.deep.eq(sampleFormatted); - }); - - it("Modifies config to use a random account as the deployer", async () => { - // Run the deployment a second time, clear the DB so everything is deployed - - let zns : TZNSContractState; - - const config : IDeployCampaignConfig = await getConfig({ - deployer: userB, - zeroVaultAddress: userA.address, - governors: [userB.address, admin.address], // governors - admins: [userB.address, governor.address], // admins - }); - - const campaign = await runZnsCampaign({ - config, - }); - - const { dbAdapter } = campaign; - - /* eslint-disable-next-line prefer-const */ - zns = campaign.state.contracts; - - const rootPaymentConfig = await zns.treasury.paymentConfigs(ethers.ZeroHash); - - expect(await zns.accessController.isAdmin(userB.address)).to.be.true; - expect(await zns.accessController.isAdmin(governor.address)).to.be.true; - expect(await zns.accessController.isGovernor(admin.address)).to.be.true; - expect(rootPaymentConfig.token).to.eq(await zns.meowToken.getAddress()); - expect(rootPaymentConfig.beneficiary).to.eq(userA.address); - - await dbAdapter.dropDB(); - }); - - it("Fails when governor or admin addresses are given wrong", async () => { - // Custom addresses must given as the base64 encoded string of comma separated addresses - // e.g. btoa("0x123,0x456,0x789") = 'MHgxMjMsMHg0NTYsMHg3ODk=', which is what should be provided - // We could manipulate envariables through `process.env.` for this test and call `getConfig()` - // but the async nature of HH mocha tests causes this to mess up other tests - // Instead we use the same encoding functions used in `getConfig()` to test the functionality - - /* eslint-disable @typescript-eslint/no-explicit-any */ - try { - atob("[0x123,0x456]"); - } catch (e : any) { - expect(e.message).includes("Invalid character"); - } - - try { - atob("0x123, 0x456"); - } catch (e : any) { - expect(e.message).includes("Invalid character"); - } - - try { - atob("0x123 0x456"); - } catch (e : any) { - expect(e.message).includes("Invalid character"); - } - - try { - atob("'MHgxM jMsMHg0 NTYs MHg3ODk='"); - } catch (e : any) { - expect(e.message).includes("Invalid character"); - } - }); - - it("Throws if env variable is invalid", async () => { - try { - await getConfig({ - deployer: deployAdmin, - zeroVaultAddress: zeroVault.address, - governors: [deployAdmin.address, governor.address], - admins: [deployAdmin.address, admin.address], - }); - - /* eslint-disable @typescript-eslint/no-explicit-any */ - } catch (e : any) { - expect(e.message).includes(INVALID_ENV_ERR); - } - }); - - it("Fails to validate when mocking MEOW on prod", async () => { - process.env.MOCK_MEOW_TOKEN = "true"; - - try { - await getConfig({ - deployer: deployAdmin, - zeroVaultAddress: zeroVault.address, - governors: [deployAdmin.address, governor.address], - admins: [deployAdmin.address, admin.address], - }); - - /* eslint-disable @typescript-eslint/no-explicit-any */ - } catch (e : any) { - expect(e.message).includes(NO_MOCK_PROD_ERR); - } - }); - - it("Fails to validate if not using the MEOW token on prod", async () => { - process.env.MOCK_MEOW_TOKEN = "false"; - process.env.STAKING_TOKEN_ADDRESS = "0x123"; - - try { - await getConfig({ - deployer: deployAdmin, - zeroVaultAddress: zeroVault.address, - governors: [deployAdmin.address, governor.address], - admins: [deployAdmin.address, admin.address], - }); - /* eslint-disable @typescript-eslint/no-explicit-any */ - } catch (e : any) { - expect(e.message).includes(STAKING_TOKEN_ERR); - } - }); - - it("Fails to validate if invalid curve for pricing", async () => { - process.env.MOCK_MEOW_TOKEN = "false"; - process.env.STAKING_TOKEN_ADDRESS = MeowMainnet.address; - process.env.BASE_LENGTH = "3"; - process.env.MAX_LENGTH = "5"; - process.env.MAX_PRICE = "0"; - process.env.MIN_PRICE = ethers.parseEther("3").toString(); - - try { - await getConfig({ - env: "prod", - deployer: deployAdmin, - zeroVaultAddress: zeroVault.address, - governors: [deployAdmin.address, governor.address], - admins: [deployAdmin.address, admin.address], - }); - /* eslint-disable @typescript-eslint/no-explicit-any */ - } catch (e : any) { - expect(e.message).includes(INVALID_CURVE_ERR); - } - }); - - it("Fails to validate if no mongo uri or local URI in prod", async () => { - process.env.MOCK_MEOW_TOKEN = "false"; - process.env.STAKING_TOKEN_ADDRESS = MeowMainnet.address; - // Falls back onto the default URI which is for localhost and fails in prod - process.env.MONGO_DB_URI = ""; - process.env.ROYALTY_RECEIVER = "0x123"; - process.env.ROYALTY_FRACTION = "100"; - - try { - await getConfig({ - env: "prod", - deployer: deployAdmin, - zeroVaultAddress: zeroVault.address, - governors: [deployAdmin.address, governor.address], - admins: [deployAdmin.address, admin.address], - }); - /* eslint-disable @typescript-eslint/no-explicit-any */ - } catch (e : any) { - expect(e.message).includes("Must provide a Mongo URI used for prod environment!"); - } - - process.env.MOCK_MEOW_TOKEN = "false"; - process.env.STAKING_TOKEN_ADDRESS = MeowMainnet.address; - process.env.MONGO_DB_URI = "mongodb://localhost:27018"; - process.env.ZERO_VAULT_ADDRESS = "0x123"; - - try { - await getConfig({ - env: "prod", - deployer: deployAdmin, - zeroVaultAddress: zeroVault.address, - governors: [deployAdmin.address, governor.address], - admins: [deployAdmin.address, admin.address], - }); - /* eslint-disable @typescript-eslint/no-explicit-any */ - } catch (e : any) { - expect(e.message).includes(MONGO_URI_ERR); - } - }); - }); - - describe("Versioning", () => { - let campaign : DeployCampaign; - - before(async () => { - await saveTag(); - - campaignConfig = { - env, - deployAdmin, - governorAddresses: [deployAdmin.address, governor.address], - adminAddresses: [deployAdmin.address, admin.address], - domainToken: { - name: ZNS_DOMAIN_TOKEN_NAME, - symbol: ZNS_DOMAIN_TOKEN_SYMBOL, - defaultRoyaltyReceiver: deployAdmin.address, - defaultRoyaltyFraction: DEFAULT_ROYALTY_FRACTION, - }, - rootPriceConfig: DEFAULT_PRICE_CONFIG, - zeroVaultAddress: zeroVault.address, - stakingTokenAddress: MeowMainnet.address, - mockMeowToken: true, - postDeploy: { - tenderlyProjectSlug: "", - monitorContracts: false, - verifyContracts: false, - }, - }; - - campaign = await runZnsCampaign({ - config: campaignConfig, - }); - }); - - it("should get the correct git tag + commit hash and write to DB", async () => { - const latestGitTag = (await execAsync("git describe --tags --abbrev=0")).stdout.trim(); - const latestCommit = (await execAsync(`git rev-list -n 1 ${latestGitTag}`)).stdout.trim(); - - const fullGitTag = `${latestGitTag}:${latestCommit}`; - - const { dbAdapter } = campaign; - - const versionDoc = await dbAdapter.getLatestVersion(); - expect(versionDoc?.contractsVersion).to.equal(fullGitTag); - - const deployedVersion = await dbAdapter.getDeployedVersion(); - expect(deployedVersion?.contractsVersion).to.equal(fullGitTag); - }); - - // eslint-disable-next-line max-len - it("should create new DB version and KEEP old data if ARCHIVE is true and no TEMP versions currently exist", async () => { - const { dbAdapter } = campaign; - - const versionDocInitial = await dbAdapter.getLatestVersion(); - const initialDBVersion = versionDocInitial?.dbVersion; - const registryDocInitial = await dbAdapter.getContract(znsNames.registry.contract); - - expect( - process.env.MONGO_DB_VERSION === undefined - || process.env.MONGO_DB_VERSION === "" - ).to.be.true; - - // set archiving for the new mongo adapter - const initialArchiveVal = process.env.ARCHIVE_PREVIOUS_DB_VERSION; - process.env.ARCHIVE_PREVIOUS_DB_VERSION = "true"; - - // run a new campaign - const { dbAdapter: newDbAdapter } = await runZnsCampaign({ - config: campaignConfig, - }); - - expect(newDbAdapter.curVersion).to.not.equal(initialDBVersion); - - // get some data from new DB version - const registryDocNew = await newDbAdapter.getContract(znsNames.registry.contract); - expect(registryDocNew?.version).to.not.equal(registryDocInitial?.version); - - const versionDocNew = await newDbAdapter.getLatestVersion(); - expect(versionDocNew?.dbVersion).to.not.equal(initialDBVersion); - expect(versionDocNew?.type).to.equal(VERSION_TYPES.deployed); - - // make sure old contracts from previous DB version are still there - const oldRegistryDocFromNewDB = await newDbAdapter.getContract( - znsNames.registry.contract, - initialDBVersion - ); - - expect(oldRegistryDocFromNewDB?.version).to.equal(registryDocInitial?.version); - expect(oldRegistryDocFromNewDB?.address).to.equal(registryDocInitial?.address); - expect(oldRegistryDocFromNewDB?.name).to.equal(registryDocInitial?.name); - expect(oldRegistryDocFromNewDB?.abi).to.equal(registryDocInitial?.abi); - expect(oldRegistryDocFromNewDB?.bytecode).to.equal(registryDocInitial?.bytecode); - - // reset back to default - process.env.ARCHIVE_PREVIOUS_DB_VERSION = initialArchiveVal; - }); - - // eslint-disable-next-line max-len - it("should create new DB version and WIPE all existing data if ARCHIVE is false and no TEMP versions currently exist", async () => { - const { dbAdapter } = campaign; - - const versionDocInitial = await dbAdapter.getLatestVersion(); - const initialDBVersion = versionDocInitial?.dbVersion; - const registryDocInitial = await dbAdapter.getContract(znsNames.registry.contract); - - expect( - process.env.MONGO_DB_VERSION === undefined - || process.env.MONGO_DB_VERSION === "" - ).to.be.true; - - // set archiving for the new mongo adapter - const initialArchiveVal = process.env.ARCHIVE_PREVIOUS_DB_VERSION; - process.env.ARCHIVE_PREVIOUS_DB_VERSION = "false"; - - // run a new campaign - const { dbAdapter: newDbAdapter } = await runZnsCampaign({ - config: campaignConfig, - }); - - expect(newDbAdapter.curVersion).to.not.equal(initialDBVersion); - - // get some data from new DB version - const registryDocNew = await newDbAdapter.getContract(znsNames.registry.contract); - expect(registryDocNew?.version).to.not.equal(registryDocInitial?.version); - - const versionDocNew = await newDbAdapter.getLatestVersion(); - expect(versionDocNew?.dbVersion).to.not.equal(initialDBVersion); - expect(versionDocNew?.type).to.equal(VERSION_TYPES.deployed); - - // make sure old contracts from previous DB version are NOT there - const oldRegistryDocFromNewDB = await newDbAdapter.getContract( - znsNames.registry.contract, - initialDBVersion - ); - - expect(oldRegistryDocFromNewDB).to.be.null; - - // reset back to default - process.env.ARCHIVE_PREVIOUS_DB_VERSION = initialArchiveVal; - }); - - // eslint-disable-next-line max-len - it("should pick up existing contracts and NOT deploy new ones into state if MONGO_DB_VERSION is specified", async () => { - const { dbAdapter } = campaign; - - const versionDocInitial = await dbAdapter.getLatestVersion(); - const initialDBVersion = versionDocInitial?.dbVersion; - const registryDocInitial = await dbAdapter.getContract(znsNames.registry.contract); - - // set DB version for the new mongo adapter - const initialDBVersionVal = process.env.MONGO_DB_VERSION; - process.env.MONGO_DB_VERSION = initialDBVersion; - - // run a new campaign - const { state: { contracts: newContracts } } = await runZnsCampaign({ - config: campaignConfig, - }); - - // make sure we picked up the correct DB version - const versionDocNew = await dbAdapter.getLatestVersion(); - expect(versionDocNew?.dbVersion).to.equal(initialDBVersion); - - // make sure old contracts from previous DB version are still there - const oldRegistryDocFromNewDB = await dbAdapter.getContract( - znsNames.registry.contract, - initialDBVersion - ); - - expect(oldRegistryDocFromNewDB?.version).to.equal(registryDocInitial?.version); - expect(oldRegistryDocFromNewDB?.address).to.equal(registryDocInitial?.address); - expect(oldRegistryDocFromNewDB?.name).to.equal(registryDocInitial?.name); - expect(oldRegistryDocFromNewDB?.abi).to.equal(registryDocInitial?.abi); - expect(oldRegistryDocFromNewDB?.bytecode).to.equal(registryDocInitial?.bytecode); - - // make sure contracts in state have been picked up correctly from DB - expect(await newContracts.registry.getAddress()).to.equal(registryDocInitial?.address); - - // reset back to default - process.env.MONGO_DB_VERSION = initialDBVersionVal; - }); - }); - - describe("Verify - Monitor", () => { - let config : IDeployCampaignConfig; - - before (async () => { - [deployAdmin, admin, governor, zeroVault] = await hre.ethers.getSigners(); - - config = { - env: "dev", - deployAdmin, - governorAddresses: [deployAdmin.address, governor.address], - adminAddresses: [deployAdmin.address, admin.address], - domainToken: { - name: ZNS_DOMAIN_TOKEN_NAME, - symbol: ZNS_DOMAIN_TOKEN_SYMBOL, - defaultRoyaltyReceiver: deployAdmin.address, - defaultRoyaltyFraction: DEFAULT_ROYALTY_FRACTION, - }, - rootPriceConfig: DEFAULT_PRICE_CONFIG, - zeroVaultAddress: zeroVault.address, - stakingTokenAddress: MeowMainnet.address, - mockMeowToken: true, - postDeploy: { - tenderlyProjectSlug: "", - monitorContracts: false, - verifyContracts: true, - }, - }; - }); - - afterEach(async () => { - await mongoAdapter.dropDB(); - }); - - it("should prepare the correct data for each contract when verifying on Etherscan", async () => { - const verifyData : Array<{ address : string; ctorArgs ?: TDeployArgs; }> = []; - class HardhatDeployerMock extends HardhatDeployer { - async etherscanVerify (args : { - address : string; - ctorArgs ?: TDeployArgs; - }) { - verifyData.push(args); - } - } - - const deployer = new HardhatDeployerMock(deployAdmin, env); - - const campaign = await runZnsCampaign({ - config, - deployer, - }); - - const { state: { contracts } } = campaign; - ({ dbAdapter: mongoAdapter } = campaign); - - await Object.values(contracts).reduce( - async (acc, contract, idx) => { - await acc; - - if (idx === 0) { - expect(verifyData[idx].ctorArgs).to.be.deep.eq([config.governorAddresses, config.adminAddresses]); - } - - expect(verifyData[idx].address).to.equal(await contract.getAddress()); - }, - Promise.resolve() - ); - }); - - it("should prepare the correct contract data when pushing to Tenderly Project", async () => { - let tenderlyData : Array = []; - class HardhatDeployerMock extends HardhatDeployer { - async tenderlyPush (contracts : Array) { - tenderlyData = contracts; - } - } - - const deployer = new HardhatDeployerMock(deployAdmin, env); - - config.postDeploy.monitorContracts = true; - config.postDeploy.verifyContracts = false; - - const campaign = await runZnsCampaign({ - config, - deployer, - }); - - const { state: { instances } } = campaign; - ({ dbAdapter: mongoAdapter } = campaign); - - let idx = 0; - await Object.values(instances).reduce( - async (acc, instance) => { - await acc; - - const dbData = await instance.getFromDB(); - - if (instance.proxyData.isProxy) { - // check proxy - expect(tenderlyData[idx].address).to.be.eq(dbData?.address); - expect(tenderlyData[idx].display_name).to.be.eq(`${instance.contractName}Proxy`); - - // check impl - expect(tenderlyData[idx + 1].address).to.be.eq(dbData?.implementation); - expect(tenderlyData[idx + 1].display_name).to.be.eq(`${dbData?.name}Impl`); - expect(tenderlyData[idx + 1].display_name).to.be.eq(`${instance.contractName}Impl`); - idx += 2; - } else { - expect(tenderlyData[idx].address).to.equal(dbData?.address); - expect(tenderlyData[idx].display_name).to.equal(dbData?.name); - expect(tenderlyData[idx].display_name).to.equal(instance.contractName); - idx++; - } - }, - Promise.resolve() - ); - }); - }); -}); +/* eslint-disable @typescript-eslint/no-empty-function, @typescript-eslint/ban-ts-comment, max-classes-per-file */ +import * as hre from "hardhat"; +import { SignerWithAddress } from "@nomicfoundation/hardhat-ethers/signers"; +import { expect } from "chai"; +import { + TLogger, + HardhatDeployer, + DeployCampaign, + resetMongoAdapter, + TDeployMissionCtor, + MongoDBAdapter, + ITenderlyContractData, + TDeployArgs, + VERSION_TYPES, +} from "@zero-tech/zdc"; +import { + DEFAULT_ROYALTY_FRACTION, + DEFAULT_PRICE_CONFIG, + ZNS_DOMAIN_TOKEN_NAME, + ZNS_DOMAIN_TOKEN_SYMBOL, + INVALID_ENV_ERR, + NO_MOCK_PROD_ERR, + STAKING_TOKEN_ERR, + INVALID_CURVE_ERR, + MONGO_URI_ERR, +} from "./helpers"; +import { + MeowTokenDM, + meowTokenName, + meowTokenSymbol, + ZNSAccessControllerDM, + ZNSAddressResolverDM, + ZNSCurvePricerDM, + ZNSDomainTokenDM, ZNSFixedPricerDM, + ZNSRegistryDM, ZNSRootRegistrarDM, ZNSSubRegistrarDM, ZNSTreasuryDM, +} from "../src/deploy/missions/contracts"; +import { znsNames } from "../src/deploy/missions/contracts/names"; +import { runZnsCampaign } from "../src/deploy/zns-campaign"; +import { MeowMainnet } from "../src/deploy/missions/contracts/meow-token/mainnet-data"; +import { ResolverTypes } from "../src/deploy/constants"; +import { getCampaignConfig } from "../src/deploy/campaign/environments"; +import { ethers } from "ethers"; +import { promisify } from "util"; +import { exec } from "child_process"; +import { saveTag } from "../src/utils/git-tag/save-tag"; +import { IZNSCampaignConfig, IZNSContracts } from "../src/deploy/campaign/types"; +import { HardhatRuntimeEnvironment } from "hardhat/types"; +import { getZnsMongoAdapter } from "../src/deploy/mongo"; + + +const execAsync = promisify(exec); + +describe("Deploy Campaign Test", () => { + let deployAdmin : SignerWithAddress; + let admin : SignerWithAddress; + let governor : SignerWithAddress; + + // eslint-disable-next-line @typescript-eslint/no-unused-vars + let userA : SignerWithAddress; + let userB : SignerWithAddress; + let zeroVault : SignerWithAddress; + let campaignConfig : IZNSCampaignConfig; + + let mongoAdapter : MongoDBAdapter; + + const env = "dev"; + + before(async () => { + [deployAdmin, admin, governor, zeroVault, userA, userB] = await hre.ethers.getSigners(); + }); + + describe("MEOW Token Ops", () => { + before(async () => { + campaignConfig = { + env, + deployAdmin, + upgrade: false, + governorAddresses: [deployAdmin.address], + adminAddresses: [deployAdmin.address, admin.address], + domainToken: { + name: ZNS_DOMAIN_TOKEN_NAME, + symbol: ZNS_DOMAIN_TOKEN_SYMBOL, + defaultRoyaltyReceiver: deployAdmin.address, + defaultRoyaltyFraction: DEFAULT_ROYALTY_FRACTION, + }, + rootPriceConfig: DEFAULT_PRICE_CONFIG, + zeroVaultAddress: zeroVault.address, + stakingTokenAddress: MeowMainnet.address, + mockMeowToken: true, + postDeploy: { + tenderlyProjectSlug: "", + monitorContracts: false, + verifyContracts: false, + }, + }; + }); + + it("should deploy new MeowTokenMock when `mockMeowToken` is true", async () => { + const campaign = await runZnsCampaign({ + config: campaignConfig, + }); + + const { meowToken, dbAdapter } = campaign; + + const toMint = hre.ethers.parseEther("972315"); + + const balanceBefore = await meowToken.balanceOf(userA.address); + // `mint()` only exists on the Mocked contract + await meowToken.connect(deployAdmin).mint( + userA.address, + toMint + ); + + const balanceAfter = await meowToken.balanceOf(userA.address); + expect(balanceAfter - balanceBefore).to.equal(toMint); + + await dbAdapter.dropDB(); + }); + + it("should use existing deployed non-mocked MeowToken contract when `mockMeowToken` is false", async () => { + campaignConfig.mockMeowToken = false; + + // deploy MeowToken contract + const factory = await hre.ethers.getContractFactory("MeowTokenMock"); + const meow = await hre.upgrades.deployProxy( + factory, + [meowTokenName, meowTokenSymbol], + { + kind: "transparent", + }); + + await meow.waitForDeployment(); + + campaignConfig.stakingTokenAddress = await meow.getAddress(); + + const campaign = await runZnsCampaign({ + config: campaignConfig, + }); + + const { + meowToken, + dbAdapter, + state: { + instances: { + meowToken: meowDMInstance, + }, + }, + } = campaign; + + expect(meowToken.address).to.equal(meow.address); + expect(meowDMInstance.contractName).to.equal(znsNames.meowToken.contract); + + const toMint = hre.ethers.parseEther("972315"); + // `mint()` only exists on the Mocked contract + try { + await meowToken.connect(deployAdmin).mint( + userA.address, + toMint + ); + } catch (e) { + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + expect(e.message).to.include( + ".mint is not a function" + ); + } + + // Cannot call to real db to + await dbAdapter.dropDB(); + }); + }); + + describe("Failure Recovery", () => { + const errorMsgDeploy = "FailMissionDeploy"; + const errorMsgPostDeploy = "FailMissionPostDeploy"; + + const loggerMock = { + info: () => { + }, + debug: () => { + }, + error: () => { + }, + }; + + interface IDeployedData { + contract : string; + instance : string; + address ?: string; + } + + const runTest = async ({ + missionList, + placeOfFailure, + deployedNames, + undeployedNames, + failingInstanceName, + callback, + } : { + missionList : Array>; + placeOfFailure : string; + deployedNames : Array<{ contract : string; instance : string; }>; + undeployedNames : Array<{ contract : string; instance : string; }>; + failingInstanceName : string; + // eslint-disable-next-line no-shadow + callback ?: (failingCampaign : DeployCampaign< + IZNSCampaignConfig, + IZNSContracts + >) => Promise; + }) => { + const deployer = new HardhatDeployer({ + hre, + signer: deployAdmin, + env, + }); + let dbAdapter = await getZnsMongoAdapter(); + + let toMatchErr = errorMsgDeploy; + if (placeOfFailure === "postDeploy") { + toMatchErr = errorMsgPostDeploy; + } + + const failingCampaign = new DeployCampaign< + IZNSCampaignConfig, + IZNSContracts + >({ + missions: missionList, + deployer, + dbAdapter, + // @ts-ignore + logger: loggerMock, + config: campaignConfig, + }); + + try { + await failingCampaign.execute(); + } catch (e) { + // @ts-ignore + expect(e.message).to.include(toMatchErr); + } + + // check the correct amount of contracts in state + const { contracts } = failingCampaign.state; + expect(Object.keys(contracts).length).to.equal(deployedNames.length); + + if (placeOfFailure === "deploy") { + // it should not deploy AddressResolver + expect(contracts[failingInstanceName]).to.be.undefined; + } else { + // it should deploy AddressResolver + expect(await contracts[failingInstanceName].getAddress()).to.be.properAddress; + } + + // check DB to verify we only deployed half + const firstRunDeployed = await deployedNames.reduce( + async ( + acc : Promise>, + { contract, instance } : { contract : string; instance : string; } + ) : Promise> => { + const akk = await acc; + const fromDB = await dbAdapter.getContract(contract); + expect(fromDB?.address).to.be.properAddress; + + return [...akk, { contract, instance, address: fromDB?.address }]; + }, + Promise.resolve([]) + ); + + await undeployedNames.reduce( + async ( + acc : Promise, + { contract, instance } : { contract : string; instance : string; } + ) : Promise => { + await acc; + const fromDB = await dbAdapter.getContract(contract); + const fromState = failingCampaign[instance]; + + expect(fromDB).to.be.null; + expect(fromState).to.be.undefined; + }, + Promise.resolve() + ); + + // call whatever callback we passed before the next campaign run + await callback?.(failingCampaign); + + const { curVersion: initialDbVersion } = dbAdapter; + + // reset mongoAdapter instance to make sure we pick up the correct DB version + resetMongoAdapter(); + + // run Campaign again, but normally + const nextCampaign = await runZnsCampaign({ + config: campaignConfig, + }); + + ({ dbAdapter } = nextCampaign); + + // make sure MongoAdapter is using the correct TEMP version + const { curVersion: nextDbVersion } = dbAdapter; + expect(nextDbVersion).to.equal(initialDbVersion); + + // state should have 10 contracts in it + const { state } = nextCampaign; + expect(Object.keys(state.contracts).length).to.equal(10); + expect(Object.keys(state.instances).length).to.equal(10); + expect(state.missions.length).to.equal(10); + // it should deploy AddressResolver + expect(await state.contracts.addressResolver.getAddress()).to.be.properAddress; + + // check DB to verify we deployed everything + const allNames = deployedNames.concat(undeployedNames); + + await allNames.reduce( + async ( + acc : Promise, + { contract } : { contract : string; } + ) : Promise => { + await acc; + const fromDB = await dbAdapter.getContract(contract); + expect(fromDB?.address).to.be.properAddress; + }, + Promise.resolve() + ); + + // check that previously deployed contracts were NOT redeployed + await firstRunDeployed.reduce( + async (acc : Promise, { contract, instance, address } : IDeployedData) : Promise => { + await acc; + const fromDB = await nextCampaign.dbAdapter.getContract(contract); + const fromState = nextCampaign[instance]; + + expect(fromDB?.address).to.equal(address); + expect(await fromState.getAddress()).to.equal(address); + }, + Promise.resolve() + ); + + return { + failingCampaign, + nextCampaign, + firstRunDeployed, + }; + }; + + beforeEach(async () => { + [deployAdmin, admin, zeroVault] = await hre.ethers.getSigners(); + + campaignConfig = { + env, + deployAdmin, + upgrade: false, + governorAddresses: [deployAdmin.address], + adminAddresses: [deployAdmin.address, admin.address], + domainToken: { + name: ZNS_DOMAIN_TOKEN_NAME, + symbol: ZNS_DOMAIN_TOKEN_SYMBOL, + defaultRoyaltyReceiver: deployAdmin.address, + defaultRoyaltyFraction: DEFAULT_ROYALTY_FRACTION, + }, + rootPriceConfig: DEFAULT_PRICE_CONFIG, + zeroVaultAddress: zeroVault.address, + // TODO dep: what do we pass here for test flow? we don't have a deployed MeowToken contract + stakingTokenAddress: "", + mockMeowToken: true, // 1700083028872 + postDeploy: { + tenderlyProjectSlug: "", + monitorContracts: false, + verifyContracts: false, + }, + }; + + mongoAdapter = await getZnsMongoAdapter({ + logger: loggerMock as TLogger, + }); + }); + + afterEach(async () => { + await mongoAdapter.dropDB(); + }); + + // eslint-disable-next-line max-len + it("[in AddressResolver.deploy() hook] should ONLY deploy undeployed contracts in the run following a failed run", async () => { + // ZNSAddressResolverDM sits in the middle of the Campaign deploy list + // we override this class to add a failure to the deploy() method + class FailingZNSAddressResolverDM extends ZNSAddressResolverDM { + async deploy () { + throw new Error(errorMsgDeploy); + } + } + + const deployedNames = [ + znsNames.accessController, + znsNames.registry, + znsNames.domainToken, + { + contract: znsNames.meowToken.contractMock, + instance: znsNames.meowToken.instance, + }, + ]; + + const undeployedNames = [ + znsNames.addressResolver, + znsNames.curvePricer, + znsNames.treasury, + znsNames.rootRegistrar, + znsNames.fixedPricer, + znsNames.subRegistrar, + ]; + + // call test flow runner + await runTest({ + missionList: [ + ZNSAccessControllerDM, + ZNSRegistryDM, + ZNSDomainTokenDM, + MeowTokenDM, + FailingZNSAddressResolverDM, // failing DM + ZNSCurvePricerDM, + ZNSTreasuryDM, + ZNSRootRegistrarDM, + ZNSFixedPricerDM, + ZNSSubRegistrarDM, + ], + placeOfFailure: "deploy", + deployedNames, + undeployedNames, + failingInstanceName: "addressResolver", + }); + }); + + // eslint-disable-next-line max-len + it("[in AddressResolver.postDeploy() hook] should start from post deploy sequence that failed on the previous run", async () => { + class FailingZNSAddressResolverDM extends ZNSAddressResolverDM { + async postDeploy () { + throw new Error(errorMsgPostDeploy); + } + } + + const deployedNames = [ + znsNames.accessController, + znsNames.registry, + znsNames.domainToken, + { + contract: znsNames.meowToken.contractMock, + instance: znsNames.meowToken.instance, + }, + znsNames.addressResolver, + ]; + + const undeployedNames = [ + znsNames.curvePricer, + znsNames.treasury, + znsNames.rootRegistrar, + znsNames.fixedPricer, + znsNames.subRegistrar, + ]; + + const checkPostDeploy = async (failingCampaign : DeployCampaign< + IZNSCampaignConfig, + IZNSContracts + >) => { + const { + // eslint-disable-next-line no-shadow + registry, + } = failingCampaign; + + // we are checking that postDeploy did not add resolverType to Registry + expect(await registry.getResolverType(ResolverTypes.address)).to.be.equal(ethers.ZeroAddress); + }; + + // check contracts are deployed correctly + const { + nextCampaign, + } = await runTest({ + missionList: [ + ZNSAccessControllerDM, + ZNSRegistryDM, + ZNSDomainTokenDM, + MeowTokenDM, + FailingZNSAddressResolverDM, // failing DM + ZNSCurvePricerDM, + ZNSTreasuryDM, + ZNSRootRegistrarDM, + ZNSFixedPricerDM, + ZNSSubRegistrarDM, + ], + placeOfFailure: "postDeploy", + deployedNames, + undeployedNames, + failingInstanceName: "addressResolver", + callback: checkPostDeploy, + }); + + // make sure postDeploy() ran properly on the next run + const { + registry, + addressResolver, + } = nextCampaign; + expect(await registry.getResolverType(ResolverTypes.address)).to.be.equal(await addressResolver.getAddress()); + }); + + // eslint-disable-next-line max-len + it("[in RootRegistrar.deploy() hook] should ONLY deploy undeployed contracts in the run following a failed run", async () => { + class FailingZNSRootRegistrarDM extends ZNSRootRegistrarDM { + async deploy () { + throw new Error(errorMsgDeploy); + } + } + + const deployedNames = [ + znsNames.accessController, + znsNames.registry, + znsNames.domainToken, + { + contract: znsNames.meowToken.contractMock, + instance: znsNames.meowToken.instance, + }, + znsNames.addressResolver, + znsNames.curvePricer, + znsNames.treasury, + ]; + + const undeployedNames = [ + znsNames.rootRegistrar, + znsNames.fixedPricer, + znsNames.subRegistrar, + ]; + + // call test flow runner + await runTest({ + missionList: [ + ZNSAccessControllerDM, + ZNSRegistryDM, + ZNSDomainTokenDM, + MeowTokenDM, + ZNSAddressResolverDM, + ZNSCurvePricerDM, + ZNSTreasuryDM, + FailingZNSRootRegistrarDM, // failing DM + ZNSFixedPricerDM, + ZNSSubRegistrarDM, + ], + placeOfFailure: "deploy", + deployedNames, + undeployedNames, + failingInstanceName: "rootRegistrar", + }); + }); + + // eslint-disable-next-line max-len + it("[in RootRegistrar.postDeploy() hook] should start from post deploy sequence that failed on the previous run", async () => { + class FailingZNSRootRegistrarDM extends ZNSRootRegistrarDM { + async postDeploy () { + throw new Error(errorMsgPostDeploy); + } + } + + const deployedNames = [ + znsNames.accessController, + znsNames.registry, + znsNames.domainToken, + { + contract: znsNames.meowToken.contractMock, + instance: znsNames.meowToken.instance, + }, + znsNames.addressResolver, + znsNames.curvePricer, + znsNames.treasury, + znsNames.rootRegistrar, + ]; + + const undeployedNames = [ + znsNames.fixedPricer, + znsNames.subRegistrar, + ]; + + const checkPostDeploy = async (failingCampaign : DeployCampaign< + IZNSCampaignConfig, + IZNSContracts + >) => { + const { + // eslint-disable-next-line no-shadow + accessController, + // eslint-disable-next-line no-shadow + rootRegistrar, + } = failingCampaign; + + // we are checking that postDeploy did not grant REGISTRAR_ROLE to RootRegistrar + expect(await accessController.isRegistrar(await rootRegistrar.getAddress())).to.be.false; + }; + + // check contracts are deployed correctly + const { + nextCampaign, + } = await runTest({ + missionList: [ + ZNSAccessControllerDM, + ZNSRegistryDM, + ZNSDomainTokenDM, + MeowTokenDM, + ZNSAddressResolverDM, + ZNSCurvePricerDM, + ZNSTreasuryDM, + FailingZNSRootRegistrarDM, // failing DM + ZNSFixedPricerDM, + ZNSSubRegistrarDM, + ], + placeOfFailure: "postDeploy", + deployedNames, + undeployedNames, + failingInstanceName: "rootRegistrar", + callback: checkPostDeploy, + }); + + // make sure postDeploy() ran properly on the next run + const { + accessController, + rootRegistrar, + } = nextCampaign; + expect(await accessController.isRegistrar(await rootRegistrar.getAddress())).to.be.true; + }); + }); + + describe("Configurable Environment & Validation", () => { + let envInitial : string; + + beforeEach(async () => { + envInitial = JSON.stringify(process.env); + }); + + afterEach(async () => { + process.env = JSON.parse(envInitial); + }); + + // The `validate` function accepts the environment parameter only for the + // purpose of testing here as manipulating actual environment variables + // like `process.env. = "value"` is not possible in a test environment + // because the Hardhat process for running these tests will not respect these + // changes. `getConfig` calls to `validate` on its own, but never passes a value + // for the environment specifically, that is ever only inferred from the `process.env.ENV_LEVEL` + it("Gets the default configuration correctly", async () => { + // set the environment to get the appropriate variables + const localConfig : IZNSCampaignConfig = await getCampaignConfig({ + deployer: deployAdmin, + zeroVaultAddress: zeroVault.address, + governors: [governor.address], + admins: [admin.address], + }); + + expect(await localConfig.deployAdmin.getAddress()).to.eq(deployAdmin.address); + expect(localConfig.governorAddresses[0]).to.eq(governor.address); + expect(localConfig.governorAddresses[1]).to.eq(deployAdmin.address); + expect(localConfig.adminAddresses[0]).to.eq(admin.address); + expect(localConfig.adminAddresses[1]).to.eq(deployAdmin.address); + expect(localConfig.domainToken.name).to.eq(ZNS_DOMAIN_TOKEN_NAME); + expect(localConfig.domainToken.symbol).to.eq(ZNS_DOMAIN_TOKEN_SYMBOL); + expect(localConfig.domainToken.defaultRoyaltyReceiver).to.eq(zeroVault.address); + expect(localConfig.domainToken.defaultRoyaltyFraction).to.eq(DEFAULT_ROYALTY_FRACTION); + expect(localConfig.rootPriceConfig).to.deep.eq(DEFAULT_PRICE_CONFIG); + }); + + it("Confirms encoding functionality works for env variables", async () => { + const sample = "0x123,0x456,0x789"; + const sampleFormatted = ["0x123", "0x456", "0x789"]; + const encoded = btoa(sample); + const decoded = atob(encoded).split(","); + expect(decoded).to.deep.eq(sampleFormatted); + }); + + it("Modifies config to use a random account as the deployer", async () => { + // Run the deployment a second time, clear the DB so everything is deployed + + let zns : IZNSContracts; + + const config : IZNSCampaignConfig = await getCampaignConfig({ + deployer: userB, + zeroVaultAddress: userA.address, + governors: [userB.address, admin.address], // governors + admins: [userB.address, governor.address], // admins + }); + + const campaign = await runZnsCampaign({ + config, + }); + + const { dbAdapter } = campaign; + + /* eslint-disable-next-line prefer-const */ + zns = campaign.state.contracts; + + const rootPaymentConfig = await zns.treasury.paymentConfigs(ethers.ZeroHash); + + expect(await zns.accessController.isAdmin(userB.address)).to.be.true; + expect(await zns.accessController.isAdmin(governor.address)).to.be.true; + expect(await zns.accessController.isGovernor(admin.address)).to.be.true; + expect(rootPaymentConfig.token).to.eq(await zns.meowToken.getAddress()); + expect(rootPaymentConfig.beneficiary).to.eq(userA.address); + + await dbAdapter.dropDB(); + }); + + it("Fails when governor or admin addresses are given wrong", async () => { + // Custom addresses must given as the base64 encoded string of comma separated addresses + // e.g. btoa("0x123,0x456,0x789") = 'MHgxMjMsMHg0NTYsMHg3ODk=', which is what should be provided + // We could manipulate envariables through `process.env.` for this test and call `getConfig()` + // but the async nature of HH mocha tests causes this to mess up other tests + // Instead we use the same encoding functions used in `getConfig()` to test the functionality + + /* eslint-disable @typescript-eslint/no-explicit-any */ + try { + atob("[0x123,0x456]"); + } catch (e : any) { + expect(e.message).includes("Invalid character"); + } + + try { + atob("0x123, 0x456"); + } catch (e : any) { + expect(e.message).includes("Invalid character"); + } + + try { + atob("0x123 0x456"); + } catch (e : any) { + expect(e.message).includes("Invalid character"); + } + + try { + atob("'MHgxM jMsMHg0 NTYs MHg3ODk='"); + } catch (e : any) { + expect(e.message).includes("Invalid character"); + } + }); + + it("Throws if env variable is invalid", async () => { + try { + await getCampaignConfig({ + deployer: deployAdmin, + zeroVaultAddress: zeroVault.address, + governors: [deployAdmin.address, governor.address], + admins: [deployAdmin.address, admin.address], + }); + + /* eslint-disable @typescript-eslint/no-explicit-any */ + } catch (e : any) { + expect(e.message).includes(INVALID_ENV_ERR); + } + }); + + it("Fails to validate when mocking MEOW on prod", async () => { + process.env.MOCK_MEOW_TOKEN = "true"; + + try { + await getCampaignConfig({ + deployer: deployAdmin, + zeroVaultAddress: zeroVault.address, + governors: [deployAdmin.address, governor.address], + admins: [deployAdmin.address, admin.address], + }); + + /* eslint-disable @typescript-eslint/no-explicit-any */ + } catch (e : any) { + expect(e.message).includes(NO_MOCK_PROD_ERR); + } + }); + + it("Fails to validate if not using the MEOW token on prod", async () => { + process.env.MOCK_MEOW_TOKEN = "false"; + process.env.STAKING_TOKEN_ADDRESS = "0x123"; + + try { + await getCampaignConfig({ + deployer: deployAdmin, + zeroVaultAddress: zeroVault.address, + governors: [deployAdmin.address, governor.address], + admins: [deployAdmin.address, admin.address], + }); + /* eslint-disable @typescript-eslint/no-explicit-any */ + } catch (e : any) { + expect(e.message).includes(STAKING_TOKEN_ERR); + } + }); + + it("Fails to validate if invalid curve for pricing", async () => { + process.env.MOCK_MEOW_TOKEN = "false"; + process.env.STAKING_TOKEN_ADDRESS = MeowMainnet.address; + process.env.BASE_LENGTH = "3"; + process.env.MAX_LENGTH = "5"; + process.env.MAX_PRICE = "0"; + process.env.MIN_PRICE = ethers.parseEther("3").toString(); + + try { + await getCampaignConfig({ + env: "prod", + deployer: deployAdmin, + zeroVaultAddress: zeroVault.address, + governors: [deployAdmin.address, governor.address], + admins: [deployAdmin.address, admin.address], + }); + /* eslint-disable @typescript-eslint/no-explicit-any */ + } catch (e : any) { + expect(e.message).includes(INVALID_CURVE_ERR); + } + }); + + it("Fails to validate if no mongo uri or local URI in prod", async () => { + process.env.MOCK_MEOW_TOKEN = "false"; + process.env.STAKING_TOKEN_ADDRESS = MeowMainnet.address; + // Falls back onto the default URI which is for localhost and fails in prod + process.env.MONGO_DB_URI = ""; + process.env.ROYALTY_RECEIVER = "0x123"; + process.env.ROYALTY_FRACTION = "100"; + + try { + await getCampaignConfig({ + env: "prod", + deployer: deployAdmin, + zeroVaultAddress: zeroVault.address, + governors: [deployAdmin.address, governor.address], + admins: [deployAdmin.address, admin.address], + }); + /* eslint-disable @typescript-eslint/no-explicit-any */ + } catch (e : any) { + expect(e.message).includes("Must provide a Mongo URI used for prod environment!"); + } + + process.env.MOCK_MEOW_TOKEN = "false"; + process.env.STAKING_TOKEN_ADDRESS = MeowMainnet.address; + process.env.MONGO_DB_URI = "mongodb://localhost:27018"; + process.env.ZERO_VAULT_ADDRESS = "0x123"; + + try { + await getCampaignConfig({ + env: "prod", + deployer: deployAdmin, + zeroVaultAddress: zeroVault.address, + governors: [deployAdmin.address, governor.address], + admins: [deployAdmin.address, admin.address], + }); + /* eslint-disable @typescript-eslint/no-explicit-any */ + } catch (e : any) { + expect(e.message).includes(MONGO_URI_ERR); + } + }); + }); + + describe("Versioning", () => { + let campaign : DeployCampaign< + IZNSCampaignConfig, + IZNSContracts + >; + + before(async () => { + await saveTag(); + + campaignConfig = { + env, + deployAdmin, + upgrade: false, + governorAddresses: [deployAdmin.address, governor.address], + adminAddresses: [deployAdmin.address, admin.address], + domainToken: { + name: ZNS_DOMAIN_TOKEN_NAME, + symbol: ZNS_DOMAIN_TOKEN_SYMBOL, + defaultRoyaltyReceiver: deployAdmin.address, + defaultRoyaltyFraction: DEFAULT_ROYALTY_FRACTION, + }, + rootPriceConfig: DEFAULT_PRICE_CONFIG, + zeroVaultAddress: zeroVault.address, + stakingTokenAddress: MeowMainnet.address, + mockMeowToken: true, + postDeploy: { + tenderlyProjectSlug: "", + monitorContracts: false, + verifyContracts: false, + }, + }; + + campaign = await runZnsCampaign({ + config: campaignConfig, + }); + }); + + it("should get the correct git tag + commit hash and write to DB", async () => { + const latestGitTag = (await execAsync("git describe --tags --abbrev=0")).stdout.trim(); + const latestCommit = (await execAsync(`git rev-list -n 1 ${latestGitTag}`)).stdout.trim(); + + const fullGitTag = `${latestGitTag}:${latestCommit}`; + + const { dbAdapter } = campaign; + + const versionDoc = await dbAdapter.versioner.getLatestVersion(); + expect(versionDoc?.contractsVersion).to.equal(fullGitTag); + + const deployedVersion = await dbAdapter.versioner.getDeployedVersion(); + expect(deployedVersion?.contractsVersion).to.equal(fullGitTag); + }); + + // eslint-disable-next-line max-len + it("should create new DB version and KEEP old data if ARCHIVE is true and no TEMP versions currently exist", async () => { + const { dbAdapter } = campaign; + + const versionDocInitial = await dbAdapter.versioner.getLatestVersion(); + const initialDBVersion = versionDocInitial?.dbVersion; + const registryDocInitial = await dbAdapter.getContract(znsNames.registry.contract); + + expect( + process.env.MONGO_DB_VERSION === undefined + || process.env.MONGO_DB_VERSION === "" + ).to.be.true; + + // set archiving for the new mongo adapter + const initialArchiveVal = process.env.ARCHIVE_PREVIOUS_DB_VERSION; + process.env.ARCHIVE_PREVIOUS_DB_VERSION = "true"; + + // run a new campaign + const { dbAdapter: newDbAdapter } = await runZnsCampaign({ + config: campaignConfig, + }); + + expect(newDbAdapter.curVersion).to.not.equal(initialDBVersion); + + // get some data from new DB version + const registryDocNew = await newDbAdapter.getContract(znsNames.registry.contract); + expect(registryDocNew?.version).to.not.equal(registryDocInitial?.version); + + const versionDocNew = await newDbAdapter.versioner.getLatestVersion(); + expect(versionDocNew?.dbVersion).to.not.equal(initialDBVersion); + expect(versionDocNew?.type).to.equal(VERSION_TYPES.deployed); + + // make sure old contracts from previous DB version are still there + const oldRegistryDocFromNewDB = await newDbAdapter.getContract( + znsNames.registry.contract, + initialDBVersion + ); + + expect(oldRegistryDocFromNewDB?.version).to.equal(registryDocInitial?.version); + expect(oldRegistryDocFromNewDB?.address).to.equal(registryDocInitial?.address); + expect(oldRegistryDocFromNewDB?.name).to.equal(registryDocInitial?.name); + expect(oldRegistryDocFromNewDB?.abi).to.equal(registryDocInitial?.abi); + expect(oldRegistryDocFromNewDB?.bytecode).to.equal(registryDocInitial?.bytecode); + + // reset back to default + process.env.ARCHIVE_PREVIOUS_DB_VERSION = initialArchiveVal; + }); + + // eslint-disable-next-line max-len + it("should create new DB version and WIPE all existing data if ARCHIVE is false and no TEMP versions currently exist", async () => { + const { dbAdapter } = campaign; + + const versionDocInitial = await dbAdapter.versioner.getLatestVersion(); + const initialDBVersion = versionDocInitial?.dbVersion; + const registryDocInitial = await dbAdapter.getContract(znsNames.registry.contract); + + expect( + process.env.MONGO_DB_VERSION === undefined + || process.env.MONGO_DB_VERSION === "" + ).to.be.true; + + // set archiving for the new mongo adapter + const initialArchiveVal = process.env.ARCHIVE_PREVIOUS_DB_VERSION; + process.env.ARCHIVE_PREVIOUS_DB_VERSION = "false"; + + // run a new campaign + const { dbAdapter: newDbAdapter } = await runZnsCampaign({ + config: campaignConfig, + }); + + expect(newDbAdapter.curVersion).to.not.equal(initialDBVersion); + + // get some data from new DB version + const registryDocNew = await newDbAdapter.getContract(znsNames.registry.contract); + expect(registryDocNew?.version).to.not.equal(registryDocInitial?.version); + + const versionDocNew = await newDbAdapter.versioner.getLatestVersion(); + expect(versionDocNew?.dbVersion).to.not.equal(initialDBVersion); + expect(versionDocNew?.type).to.equal(VERSION_TYPES.deployed); + + // make sure old contracts from previous DB version are NOT there + const oldRegistryDocFromNewDB = await newDbAdapter.getContract( + znsNames.registry.contract, + initialDBVersion + ); + + expect(oldRegistryDocFromNewDB).to.be.null; + + // reset back to default + process.env.ARCHIVE_PREVIOUS_DB_VERSION = initialArchiveVal; + }); + + // eslint-disable-next-line max-len + it("should pick up existing contracts and NOT deploy new ones into state if MONGO_DB_VERSION is specified", async () => { + const { dbAdapter } = campaign; + + const versionDocInitial = await dbAdapter.versioner.getLatestVersion(); + const initialDBVersion = versionDocInitial?.dbVersion; + const registryDocInitial = await dbAdapter.getContract(znsNames.registry.contract); + + // set DB version for the new mongo adapter + const initialDBVersionVal = process.env.MONGO_DB_VERSION; + process.env.MONGO_DB_VERSION = initialDBVersion; + + // run a new campaign + const { state: { contracts: newContracts } } = await runZnsCampaign({ + config: campaignConfig, + }); + + // make sure we picked up the correct DB version + const versionDocNew = await dbAdapter.versioner.getLatestVersion(); + expect(versionDocNew?.dbVersion).to.equal(initialDBVersion); + + // make sure old contracts from previous DB version are still there + const oldRegistryDocFromNewDB = await dbAdapter.getContract( + znsNames.registry.contract, + initialDBVersion + ); + + expect(oldRegistryDocFromNewDB?.version).to.equal(registryDocInitial?.version); + expect(oldRegistryDocFromNewDB?.address).to.equal(registryDocInitial?.address); + expect(oldRegistryDocFromNewDB?.name).to.equal(registryDocInitial?.name); + expect(oldRegistryDocFromNewDB?.abi).to.equal(registryDocInitial?.abi); + expect(oldRegistryDocFromNewDB?.bytecode).to.equal(registryDocInitial?.bytecode); + + // make sure contracts in state have been picked up correctly from DB + expect(await newContracts.registry.getAddress()).to.equal(registryDocInitial?.address); + + // reset back to default + process.env.MONGO_DB_VERSION = initialDBVersionVal; + }); + }); + + describe("Verify - Monitor", () => { + let config : IZNSCampaignConfig; + + before (async () => { + [deployAdmin, admin, governor, zeroVault] = await hre.ethers.getSigners(); + + config = { + env: "dev", + deployAdmin, + upgrade: false, + governorAddresses: [deployAdmin.address, governor.address], + adminAddresses: [deployAdmin.address, admin.address], + domainToken: { + name: ZNS_DOMAIN_TOKEN_NAME, + symbol: ZNS_DOMAIN_TOKEN_SYMBOL, + defaultRoyaltyReceiver: deployAdmin.address, + defaultRoyaltyFraction: DEFAULT_ROYALTY_FRACTION, + }, + rootPriceConfig: DEFAULT_PRICE_CONFIG, + zeroVaultAddress: zeroVault.address, + stakingTokenAddress: MeowMainnet.address, + mockMeowToken: true, + postDeploy: { + tenderlyProjectSlug: "", + monitorContracts: false, + verifyContracts: true, + }, + }; + }); + + afterEach(async () => { + await mongoAdapter.dropDB(); + }); + + it("should prepare the correct data for each contract when verifying on Etherscan", async () => { + const verifyData : Array<{ address : string; ctorArgs ?: TDeployArgs; }> = []; + class HardhatDeployerMock extends HardhatDeployer { + async etherscanVerify (args : { + address : string; + ctorArgs ?: TDeployArgs; + }) { + verifyData.push(args); + } + } + + const deployer = new HardhatDeployerMock({ + hre, + signer: deployAdmin, + env, + }); + + const campaign = await runZnsCampaign({ + config, + deployer, + }); + + const { state: { contracts } } = campaign; + ({ dbAdapter: mongoAdapter } = campaign); + + await Object.values(contracts).reduce( + async (acc, contract, idx) => { + await acc; + + if (idx === 0) { + expect(verifyData[idx].ctorArgs).to.be.deep.eq([config.governorAddresses, config.adminAddresses]); + } + + expect(verifyData[idx].address).to.equal(await contract.getAddress()); + }, + Promise.resolve() + ); + }); + + it("should prepare the correct contract data when pushing to Tenderly Project", async () => { + let tenderlyData : Array = []; + class HardhatDeployerMock extends HardhatDeployer { + async tenderlyPush (contracts : Array) { + tenderlyData = contracts; + } + } + + const deployer = new HardhatDeployerMock({ + hre, + signer: deployAdmin, + env, + }); + + config.postDeploy.monitorContracts = true; + config.postDeploy.verifyContracts = false; + + const campaign = await runZnsCampaign({ + config, + deployer, + }); + + const { state: { instances } } = campaign; + ({ dbAdapter: mongoAdapter } = campaign); + + let idx = 0; + await Object.values(instances).reduce( + async (acc, instance) => { + await acc; + + const dbData = await instance.getLatestFromDB(); + + if (instance.proxyData.isProxy) { + // check proxy + expect(tenderlyData[idx].address).to.be.eq(dbData?.address); + expect(tenderlyData[idx].display_name).to.be.eq(`${instance.contractName}Proxy`); + + // check impl + expect(tenderlyData[idx + 1].address).to.be.eq(dbData?.implementation); + expect(tenderlyData[idx + 1].display_name).to.be.eq(`${dbData?.name}Impl`); + expect(tenderlyData[idx + 1].display_name).to.be.eq(`${instance.contractName}Impl`); + idx += 2; + } else { + expect(tenderlyData[idx].address).to.equal(dbData?.address); + expect(tenderlyData[idx].display_name).to.equal(dbData?.name); + expect(tenderlyData[idx].display_name).to.equal(instance.contractName); + idx++; + } + }, + Promise.resolve() + ); + }); + }); +}); diff --git a/test/ZNSAccessController.test.ts b/test/ZNSAccessController.test.ts index c2791c6d2..63c1bff7d 100644 --- a/test/ZNSAccessController.test.ts +++ b/test/ZNSAccessController.test.ts @@ -1,9 +1,8 @@ import * as hre from "hardhat"; import { SignerWithAddress } from "@nomicfoundation/hardhat-ethers/signers"; import { ZNSAccessController } from "../typechain"; -import { deployAccessController } from "./helpers"; +import { AC_UNAUTHORIZED_ERR, deployAccessController, ZERO_ADDRESS_ERR } from "./helpers"; import { expect } from "chai"; -import { getAccessRevertMsg } from "./helpers/errors"; import { ADMIN_ROLE, EXECUTOR_ROLE, GOVERNOR_ROLE, REGISTRAR_ROLE } from "../src/deploy/constants"; import { ethers } from "hardhat"; @@ -55,7 +54,7 @@ describe("ZNSAccessController", () => { governorAddresses: [ ethers.ZeroAddress ], adminAddresses: [ ethers.ZeroAddress ], }) - ).to.be.revertedWith("ZNSAccessController: Can't grant role to zero address"); + ).to.be.revertedWithCustomError(accessController, ZERO_ADDRESS_ERR); }); }); @@ -101,9 +100,8 @@ describe("ZNSAccessController", () => { const [ { address: newAdmin } ] = randomAccs; await expect( accessController.connect(admin).grantRole(ADMIN_ROLE, newAdmin) - ).to.be.revertedWith( - getAccessRevertMsg(admin.address, GOVERNOR_ROLE) - ); + ).to.be.revertedWithCustomError(accessController, AC_UNAUTHORIZED_ERR) + .withArgs(admin.address, GOVERNOR_ROLE); }); it("ADMIN_ROLE should NOT be able to revoke ADMIN_ROLE", async () => { @@ -111,9 +109,8 @@ describe("ZNSAccessController", () => { const [ { address: existingAdmin } ] = adminAccs; await expect( accessController.connect(admin).revokeRole(ADMIN_ROLE, existingAdmin) - ).to.be.revertedWith( - getAccessRevertMsg(admin.address, GOVERNOR_ROLE) - ); + ).to.be.revertedWithCustomError(accessController, AC_UNAUTHORIZED_ERR) + .withArgs(admin.address, GOVERNOR_ROLE); }); it("ADMIN_ROLE should NOT be able to grant GOVERNOR_ROLE", async () => { @@ -121,9 +118,8 @@ describe("ZNSAccessController", () => { const [ { address: newGovernor } ] = randomAccs; await expect( accessController.connect(admin).grantRole(GOVERNOR_ROLE, newGovernor) - ).to.be.revertedWith( - getAccessRevertMsg(admin.address, GOVERNOR_ROLE) - ); + ).to.be.revertedWithCustomError(accessController, AC_UNAUTHORIZED_ERR) + .withArgs(admin.address, GOVERNOR_ROLE); }); it("ADMIN_ROLE should NOT be able to revoke GOVERNOR_ROLE", async () => { @@ -131,9 +127,8 @@ describe("ZNSAccessController", () => { const [ { address: existingGovernor } ] = governorAccs; await expect( accessController.connect(admin).revokeRole(GOVERNOR_ROLE, existingGovernor) - ).to.be.revertedWith( - getAccessRevertMsg(admin.address, GOVERNOR_ROLE) - ); + ).to.be.revertedWithCustomError(accessController, AC_UNAUTHORIZED_ERR) + .withArgs(admin.address, GOVERNOR_ROLE); }); it("ADMIN_ROLE should be able to grant REGISTRAR_ROLE", async () => { @@ -180,9 +175,8 @@ describe("ZNSAccessController", () => { const [ random ] = randomAccs; await expect( accessController.connect(random).setRoleAdmin(REGISTRAR_ROLE, EXECUTOR_ROLE) - ).to.be.revertedWith( - getAccessRevertMsg(random.address, GOVERNOR_ROLE) - ); + ).to.be.revertedWithCustomError(accessController, AC_UNAUTHORIZED_ERR) + .withArgs(random.address, GOVERNOR_ROLE); }); }); @@ -218,36 +212,32 @@ describe("ZNSAccessController", () => { const [ random ] = randomAccs; await expect( accessController.connect(random).checkGovernor(random.address) - ).to.be.revertedWith( - getAccessRevertMsg(random.address, GOVERNOR_ROLE) - ); + ).to.be.revertedWithCustomError(accessController, AC_UNAUTHORIZED_ERR) + .withArgs(random.address, GOVERNOR_ROLE); }); it("Should revert if account does not have ADMIN_ROLE", async () => { const [ random ] = randomAccs; await expect( accessController.connect(random).checkAdmin(random.address) - ).to.be.revertedWith( - getAccessRevertMsg(random.address, ADMIN_ROLE) - ); + ).to.be.revertedWithCustomError(accessController, AC_UNAUTHORIZED_ERR) + .withArgs(random.address, ADMIN_ROLE); }); it("Should revert if account does not have REGISTRAR_ROLE", async () => { const [ random ] = randomAccs; await expect( accessController.connect(random).checkRegistrar(random.address) - ).to.be.revertedWith( - getAccessRevertMsg(random.address, REGISTRAR_ROLE) - ); + ).to.be.revertedWithCustomError(accessController, AC_UNAUTHORIZED_ERR) + .withArgs(random.address, REGISTRAR_ROLE); }); it("Should revert if account does not have EXECUTOR_ROLE", async () => { const [ random ] = randomAccs; await expect( accessController.connect(random).checkExecutor(random.address) - ).to.be.revertedWith( - getAccessRevertMsg(random.address, EXECUTOR_ROLE) - ); + ).to.be.revertedWithCustomError(accessController, AC_UNAUTHORIZED_ERR) + .withArgs(random.address, EXECUTOR_ROLE); }); }); }); diff --git a/test/ZNSAddressResolver.test.ts b/test/ZNSAddressResolver.test.ts index 33d64c3aa..8c5f5af0f 100644 --- a/test/ZNSAddressResolver.test.ts +++ b/test/ZNSAddressResolver.test.ts @@ -5,7 +5,7 @@ import { ZNSAddressResolver__factory, ZNSAddressResolverUpgradeMock__factory, } from "../typechain"; -import { DeployZNSParams, IZNSContracts } from "./helpers/types"; +import { DeployZNSParams, IZNSContractsLocal } from "./helpers/types"; import { SignerWithAddress } from "@nomicfoundation/hardhat-ethers/signers"; import { hashDomainLabel, hashSubdomainName } from "./helpers/hashing"; import { @@ -14,14 +14,14 @@ import { GOVERNOR_ROLE, REGISTRAR_ROLE, deployZNS, - getAccessRevertMsg, - validateUpgrade, INITIALIZED_ERR, + validateUpgrade, INITIALIZED_ERR, AC_UNAUTHORIZED_ERR, NOT_AUTHORIZED_ERR, } from "./helpers"; import { getProxyImplAddress } from "./helpers/utils"; // eslint-disable-next-line @typescript-eslint/no-var-requires const { expect } = require("chai"); + describe("ZNSAddressResolver", () => { let deployer : SignerWithAddress; let mockRegistrar : SignerWithAddress; @@ -29,7 +29,7 @@ describe("ZNSAddressResolver", () => { let operator : SignerWithAddress; let wilderDomainHash : string; - let zns : IZNSContracts; + let zns : IZNSContractsLocal; beforeEach(async () => { [ @@ -71,7 +71,7 @@ describe("ZNSAddressResolver", () => { operator.address, mockRegistrar.address, ) - ).to.be.revertedWith(INITIALIZED_ERR); + ).to.be.revertedWithCustomError(implContract, INITIALIZED_ERR); }); it("Should get the AddressResolver", async () => { // Copy of registry tests @@ -104,9 +104,8 @@ describe("ZNSAddressResolver", () => { it("Should revert when setRegistry() without ADMIN_ROLE", async () => { await expect( zns.addressResolver.connect(operator).setRegistry(operator.address) - ).to.be.revertedWith( - getAccessRevertMsg(operator.address, ADMIN_ROLE) - ); + ).to.be.revertedWithCustomError(zns.accessController, AC_UNAUTHORIZED_ERR) + .withArgs(operator.address, ADMIN_ROLE); }); it("Should setAccessController() correctly with ADMIN_ROLE", async () => { @@ -120,15 +119,14 @@ describe("ZNSAddressResolver", () => { it("Should revert when setAccessController() without ADMIN_ROLE", async () => { await expect( zns.addressResolver.connect(operator).setAccessController(operator.address) - ).to.be.revertedWith( - getAccessRevertMsg(operator.address, ADMIN_ROLE) - ); + ).to.be.revertedWithCustomError(zns.accessController, AC_UNAUTHORIZED_ERR) + .withArgs(operator.address, ADMIN_ROLE); }); it("Should not allow non-owner address to setAddress", async () => { await expect( zns.addressResolver.connect(user).setAddress(wilderDomainHash, user.address) - ).to.be.revertedWith("ZNSAddressResolver: Not authorized for this domain"); + ).to.be.revertedWithCustomError(zns.addressResolver, NOT_AUTHORIZED_ERR); }); it("Should allow owner to setAddress and emit event", async () => { @@ -166,7 +164,6 @@ describe("ZNSAddressResolver", () => { const address = await zns.addressResolver.resolveDomainAddress(wilderDomainHash); expect(address).to.eq(hre.ethers.ZeroAddress); - }); it("Should resolve address correctly", async () => { @@ -218,7 +215,10 @@ describe("ZNSAddressResolver", () => { await zns.accessController.hasRole(GOVERNOR_ROLE, deployer.address) ).to.be.true; - const upgradeTx = zns.domainToken.connect(deployer).upgradeTo(await newAddressResolver.getAddress()); + const upgradeTx = zns.domainToken.connect(deployer).upgradeToAndCall( + await newAddressResolver.getAddress(), + "0x" + ); await expect(upgradeTx).to.not.be.reverted; }); @@ -233,15 +233,13 @@ describe("ZNSAddressResolver", () => { // Confirm the operator is not a governor await expect( zns.accessController.checkGovernor(operator.address) - ).to.be.revertedWith( - getAccessRevertMsg(operator.address, GOVERNOR_ROLE) - ); + ).to.be.revertedWithCustomError(zns.accessController, AC_UNAUTHORIZED_ERR) + .withArgs(operator.address, GOVERNOR_ROLE); - const upgradeTx = zns.domainToken.connect(operator).upgradeTo(await newAddressResolver.getAddress()); + const upgradeTx = zns.domainToken.connect(operator).upgradeToAndCall(await newAddressResolver.getAddress(), "0x"); - await expect(upgradeTx).to.be.revertedWith( - getAccessRevertMsg(operator.address, GOVERNOR_ROLE) - ); + await expect(upgradeTx).to.be.revertedWithCustomError(zns.accessController, AC_UNAUTHORIZED_ERR) + .withArgs(operator.address, GOVERNOR_ROLE); }); it("Verifies that variable values are not changed in the upgrade process", async () => { diff --git a/test/ZNSCurvePricer.test.ts b/test/ZNSCurvePricer.test.ts index 976a7d69e..8c2722889 100644 --- a/test/ZNSCurvePricer.test.ts +++ b/test/ZNSCurvePricer.test.ts @@ -2,18 +2,17 @@ import * as hre from "hardhat"; import { expect } from "chai"; import { SignerWithAddress } from "@nomicfoundation/hardhat-ethers/signers"; import { ethers } from "ethers"; -import { IZNSContracts } from "./helpers/types"; import { deployZNS, getCurvePrice, DEFAULT_PRECISION_MULTIPLIER, - CURVE_PRICE_CONFIG_ERR, + INVALID_PRICE_CONFIG_ERR, validateUpgrade, PaymentType, - NOT_AUTHORIZED_REG_WIRED_ERR, - CURVE_NO_ZERO_PRECISION_MULTIPLIER_ERR, + NOT_AUTHORIZED_ERR, + INVALID_MULTIPLIER_ERR, INVALID_LENGTH_ERR, - INVALID_NAME_ERR, INITIALIZED_ERR, + INVALID_LABEL_ERR, INITIALIZED_ERR, AC_UNAUTHORIZED_ERR, ZERO_ADDRESS_ERR, FEE_TOO_LARGE_ERR, } from "./helpers"; import { AccessType, @@ -21,25 +20,24 @@ import { DEFAULT_PRICE_CONFIG, DEFAULT_PROTOCOL_FEE_PERCENT, } from "./helpers/constants"; -import { - getAccessRevertMsg, -} from "./helpers/errors"; import { ADMIN_ROLE, GOVERNOR_ROLE } from "../src/deploy/constants"; import { ZNSCurvePricer, ZNSCurvePricerUpgradeMock__factory, ZNSCurvePricer__factory } from "../typechain"; import { registrationWithSetup } from "./helpers/register-setup"; import { getProxyImplAddress } from "./helpers/utils"; +import { IZNSContractsLocal } from "./helpers/types"; require("@nomicfoundation/hardhat-chai-matchers"); const { ZeroHash } = ethers; + describe("ZNSCurvePricer", () => { let deployer : SignerWithAddress; let user : SignerWithAddress; let admin : SignerWithAddress; let randomAcc : SignerWithAddress; - let zns : IZNSContracts; + let zns : IZNSContractsLocal; let domainHash : string; const defaultDomain = "wilder"; @@ -93,7 +91,7 @@ describe("ZNSCurvePricer", () => { await zns.registry.getAddress(), DEFAULT_PRICE_CONFIG ) - ).to.be.revertedWith(INITIALIZED_ERR); + ).to.be.revertedWithCustomError(implContract, INITIALIZED_ERR); }); it("Confirms values were initially set correctly", async () => { @@ -131,11 +129,17 @@ describe("ZNSCurvePricer", () => { }); it("Reverts for a label with no length if label validation is not skipped", async () => { - await expect(zns.curvePricer.getPrice(domainHash, "", false)).to.be.revertedWith(INVALID_LENGTH_ERR); + await expect(zns.curvePricer.getPrice(domainHash, "", false)).to.be.revertedWithCustomError( + zns.curvePricer, + INVALID_LENGTH_ERR + ); }); it("Reverts for invalid label if label validation is not skipped", async () => { - await expect(zns.curvePricer.getPrice(domainHash, "wilder!", false)).to.be.revertedWith(INVALID_NAME_ERR); + await expect(zns.curvePricer.getPrice(domainHash, "wilder!", false)).to.be.revertedWithCustomError( + zns.curvePricer, + INVALID_LABEL_ERR + ); }); it("Returns the base price for domains that are equal to the base length", async () => { @@ -281,10 +285,15 @@ describe("ZNSCurvePricer", () => { const labelC = "!%$#^*?!#👍3^29"; const labelD = "wo.rld"; - await expect(zns.curvePricer.getPrice(domainHash, labelA, false)).to.be.revertedWith(INVALID_NAME_ERR); - await expect(zns.curvePricer.getPrice(domainHash, labelB, false)).to.be.revertedWith(INVALID_NAME_ERR); - await expect(zns.curvePricer.getPrice(domainHash, labelC, false)).to.be.revertedWith(INVALID_NAME_ERR); - await expect(zns.curvePricer.getPrice(domainHash, labelD, false)).to.be.revertedWith(INVALID_NAME_ERR); + + await expect(zns.curvePricer.getPrice(domainHash, labelA, false)) + .to.be.revertedWithCustomError(zns.curvePricer, INVALID_LABEL_ERR); + await expect(zns.curvePricer.getPrice(domainHash, labelB, false)) + .to.be.revertedWithCustomError(zns.curvePricer, INVALID_LABEL_ERR); + await expect(zns.curvePricer.getPrice(domainHash, labelC, false)) + .to.be.revertedWithCustomError(zns.curvePricer, INVALID_LABEL_ERR); + await expect(zns.curvePricer.getPrice(domainHash, labelD, false)) + .to.be.revertedWithCustomError(zns.curvePricer, INVALID_LABEL_ERR); }); it("Should set the config for any existing domain hash, including 0x0", async () => { @@ -336,7 +345,10 @@ describe("ZNSCurvePricer", () => { await expect( zns.curvePricer.connect(user).setPriceConfig(domainHash, newConfig) - ).to.be.revertedWith(CURVE_PRICE_CONFIG_ERR); + ).to.be.revertedWithCustomError( + zns.curvePricer, + INVALID_PRICE_CONFIG_ERR + ); }); it("Cannot go below the set minPrice", async () => { @@ -353,7 +365,10 @@ describe("ZNSCurvePricer", () => { await expect( zns.curvePricer.connect(user).setPriceConfig(domainHash, newConfig) - ).to.be.revertedWith(CURVE_PRICE_CONFIG_ERR); + ).to.be.revertedWithCustomError( + zns.curvePricer, + INVALID_PRICE_CONFIG_ERR + ); }); it("Should revert if called by anyone other than owner or operator", async () => { @@ -369,11 +384,17 @@ describe("ZNSCurvePricer", () => { await expect( zns.curvePricer.connect(randomAcc).setPriceConfig(domainHash, newConfig) - ).to.be.revertedWith(NOT_AUTHORIZED_REG_WIRED_ERR); + ).to.be.revertedWithCustomError( + zns.curvePricer, + NOT_AUTHORIZED_ERR + ); await expect( zns.curvePricer.connect(randomAcc).setPriceConfig(ZeroHash, newConfig) - ).to.be.revertedWith(NOT_AUTHORIZED_REG_WIRED_ERR); + ).to.be.revertedWithCustomError( + zns.curvePricer, + NOT_AUTHORIZED_ERR + ); }); it("Should emit PriceConfigSet event with correct parameters", async () => { @@ -413,7 +434,7 @@ describe("ZNSCurvePricer", () => { const tx = zns.curvePricer.connect(user).setPriceConfig(domainHash, newConfig); - await expect(tx).to.be.revertedWith(CURVE_PRICE_CONFIG_ERR); + await expect(tx).to.be.revertedWithCustomError(zns.curvePricer, INVALID_PRICE_CONFIG_ERR); }); }); @@ -431,7 +452,7 @@ describe("ZNSCurvePricer", () => { const newMaxPrice = ethers.parseEther("0.7"); const tx = zns.curvePricer.connect(admin).setMaxPrice(domainHash, newMaxPrice); - await expect(tx).to.be.revertedWith(NOT_AUTHORIZED_REG_WIRED_ERR); + await expect(tx).to.be.revertedWithCustomError(zns.curvePricer, NOT_AUTHORIZED_ERR); }); it("Allows setting the max price to zero", async () => { @@ -455,7 +476,10 @@ describe("ZNSCurvePricer", () => { const newMaxPrice = ethers.parseEther("500"); await expect( zns.curvePricer.connect(user).setMaxPrice(domainHash, newMaxPrice) - ).to.be.revertedWith(CURVE_PRICE_CONFIG_ERR); + ).to.be.revertedWithCustomError( + zns.curvePricer, + INVALID_PRICE_CONFIG_ERR + ); }); it("Causes any length domain to have a price of 0 if the maxPrice is 0", async () => { @@ -511,7 +535,7 @@ describe("ZNSCurvePricer", () => { const newMinPrice = ethers.parseEther("0.1"); const tx = zns.curvePricer.connect(admin).setMinPrice(domainHash, newMinPrice); - await expect(tx).to.be.revertedWith(NOT_AUTHORIZED_REG_WIRED_ERR); + await expect(tx).to.be.revertedWithCustomError(zns.curvePricer, NOT_AUTHORIZED_ERR); }); it("Allows setting to zero", async () => { @@ -566,7 +590,10 @@ describe("ZNSCurvePricer", () => { const newMinPrice = DEFAULT_PRICE_CONFIG.minPrice + ethers.parseEther("231"); await expect( zns.curvePricer.connect(user).setMinPrice(domainHash, newMinPrice) - ).to.be.revertedWith(CURVE_PRICE_CONFIG_ERR); + ).to.be.revertedWithCustomError( + zns.curvePricer, + INVALID_PRICE_CONFIG_ERR + ); }); }); @@ -585,14 +612,14 @@ describe("ZNSCurvePricer", () => { const tx = zns.curvePricer.connect(admin).setMinPrice(domainHash, newMultiplier); - await expect(tx).to.be.revertedWith(NOT_AUTHORIZED_REG_WIRED_ERR); + await expect(tx).to.be.revertedWithCustomError(zns.curvePricer, NOT_AUTHORIZED_ERR); }); it("Fails when setting to zero", async () => { const zeroMultiplier = BigInt("0"); const tx = zns.curvePricer.connect(user).setPrecisionMultiplier(domainHash, zeroMultiplier); - await expect(tx).to.be.revertedWith(CURVE_NO_ZERO_PRECISION_MULTIPLIER_ERR); + await expect(tx).to.be.revertedWithCustomError(zns.curvePricer, INVALID_MULTIPLIER_ERR); }); it("Successfuly sets the precision multiplier when above 0", async () => { @@ -629,8 +656,9 @@ describe("ZNSCurvePricer", () => { const newMultiplier = ethers.parseEther("100"); await expect( zns.curvePricer.connect(user).setPrecisionMultiplier(domainHash, newMultiplier) - ).to.be.revertedWith( - "ZNSCurvePricer: precisionMultiplier cannot be greater than 10^18" + ).to.be.revertedWithCustomError( + zns.curvePricer, + INVALID_MULTIPLIER_ERR ); }); }); @@ -649,7 +677,7 @@ describe("ZNSCurvePricer", () => { const newLength = 5; const tx = zns.curvePricer.connect(admin).setBaseLength(domainHash, newLength); - await expect(tx).to.be.revertedWith(NOT_AUTHORIZED_REG_WIRED_ERR); + await expect(tx).to.be.revertedWithCustomError(zns.curvePricer, NOT_AUTHORIZED_ERR); }); it("Allows setting the base length to zero", async () => { @@ -803,7 +831,10 @@ describe("ZNSCurvePricer", () => { const newBaseLength = DEFAULT_PRICE_CONFIG.baseLength - 1n; await expect( zns.curvePricer.connect(user).setBaseLength(domainHash, newBaseLength) - ).to.be.revertedWith(CURVE_PRICE_CONFIG_ERR); + ).to.be.revertedWithCustomError( + zns.curvePricer, + INVALID_PRICE_CONFIG_ERR + ); }); }); @@ -821,7 +852,7 @@ describe("ZNSCurvePricer", () => { const newLength = 5; const tx = zns.curvePricer.connect(admin).setMaxLength(domainHash, newLength); - await expect(tx).to.be.revertedWith(NOT_AUTHORIZED_REG_WIRED_ERR); + await expect(tx).to.be.revertedWithCustomError(zns.curvePricer, NOT_AUTHORIZED_ERR); }); it("Allows setting the max length to zero", async () => { @@ -860,7 +891,10 @@ describe("ZNSCurvePricer", () => { const newMaxLength = DEFAULT_PRICE_CONFIG.maxLength + 10n; await expect( zns.curvePricer.connect(user).setMaxLength(domainHash, newMaxLength) - ).to.be.revertedWith(CURVE_PRICE_CONFIG_ERR); + ).to.be.revertedWithCustomError( + zns.curvePricer, + INVALID_PRICE_CONFIG_ERR + ); }); }); @@ -877,14 +911,17 @@ describe("ZNSCurvePricer", () => { const newFeePerc = BigInt(222); const tx = zns.curvePricer.connect(admin) .setFeePercentage(domainHash, newFeePerc); - await expect(tx).to.be.revertedWith(NOT_AUTHORIZED_REG_WIRED_ERR); + await expect(tx).to.be.revertedWithCustomError(zns.curvePricer, NOT_AUTHORIZED_ERR); }); it("should revert when trying to set feePercentage higher than PERCENTAGE_BASIS", async () => { const newFeePerc = BigInt(10001); await expect( zns.curvePricer.connect(user).setFeePercentage(domainHash, newFeePerc) - ).to.be.revertedWith("ZNSCurvePricer: feePercentage cannot be greater than PERCENTAGE_BASIS"); + ).to.be.revertedWithCustomError( + zns.curvePricer, + FEE_TOO_LARGE_ERR + ).withArgs(newFeePerc, 10000n); }); }); @@ -913,15 +950,15 @@ describe("ZNSCurvePricer", () => { it("Disallows an unauthorized user to set the access controller", async () => { const tx = zns.curvePricer.connect(user).setAccessController(randomAcc.address); - await expect(tx).to.be.revertedWith( - getAccessRevertMsg(user.address, ADMIN_ROLE) - ); + await expect(tx).to.be.revertedWithCustomError(zns.accessController, AC_UNAUTHORIZED_ERR) + .withArgs(user.address,ADMIN_ROLE); }); it("Disallows setting the access controller to the zero address", async () => { const tx = zns.curvePricer.connect(admin).setAccessController(ethers.ZeroAddress); - await expect(tx).to.be.revertedWith( - "AC: _accessController is 0x0 address" + await expect(tx).to.be.revertedWithCustomError( + zns.curvePricer, + ZERO_ADDRESS_ERR ); }); }); @@ -941,9 +978,8 @@ describe("ZNSCurvePricer", () => { it("Should NOT set the registry if called by anyone other than ADMIN_ROLE", async () => { const tx = zns.curvePricer.connect(user).setRegistry(randomAcc.address); - await expect(tx).to.be.revertedWith( - getAccessRevertMsg(user.address, ADMIN_ROLE) - ); + await expect(tx).to.be.revertedWithCustomError(zns.accessController, AC_UNAUTHORIZED_ERR) + .withArgs(user.address,ADMIN_ROLE); }); }); @@ -973,7 +1009,10 @@ describe("ZNSCurvePricer", () => { // Confirm the deployer is a governor, as set in `deployZNS` helper await expect(zns.accessController.checkGovernor(deployer.address)).to.not.be.reverted; - const tx = zns.curvePricer.connect(deployer).upgradeTo(await newCurvePricer.getAddress()); + const tx = zns.curvePricer.connect(deployer).upgradeToAndCall( + await newCurvePricer.getAddress(), + "0x" + ); await expect(tx).to.not.be.reverted; }); @@ -986,11 +1025,13 @@ describe("ZNSCurvePricer", () => { // Confirm the account is not a governor await expect(zns.accessController.checkGovernor(randomAcc.address)).to.be.reverted; - const tx = zns.curvePricer.connect(randomAcc).upgradeTo(await newCurvePricer.getAddress()); - - await expect(tx).to.be.revertedWith( - getAccessRevertMsg(randomAcc.address, GOVERNOR_ROLE) + const tx = zns.curvePricer.connect(randomAcc).upgradeToAndCall( + await newCurvePricer.getAddress(), + "0x" ); + + await expect(tx).to.be.revertedWithCustomError(zns.accessController, AC_UNAUTHORIZED_ERR) + .withArgs(randomAcc.address, GOVERNOR_ROLE); }); it("Verifies that variable values are not changed in the upgrade process", async () => { diff --git a/test/ZNSDomainToken.test.ts b/test/ZNSDomainToken.test.ts index ac18de7dd..fc0fe73f8 100644 --- a/test/ZNSDomainToken.test.ts +++ b/test/ZNSDomainToken.test.ts @@ -10,16 +10,15 @@ import { ADMIN_ROLE, REGISTRAR_ROLE, GOVERNOR_ROLE, - getAccessRevertMsg, - INVALID_TOKENID_ERC_ERR, + NONEXISTENT_TOKEN_ERC_ERR, deployZNS, validateUpgrade, ZNS_DOMAIN_TOKEN_NAME, ZNS_DOMAIN_TOKEN_SYMBOL, INITIALIZED_ERR, - DEFAULT_PERCENTAGE_BASIS, DEFAULT_ROYALTY_FRACTION, + DEFAULT_PERCENTAGE_BASIS, DEFAULT_ROYALTY_FRACTION, AC_UNAUTHORIZED_ERR, } from "./helpers"; -import { DeployZNSParams, IZNSContracts } from "./helpers/types"; +import { DeployZNSParams, IZNSContractsLocal } from "./helpers/types"; import { getProxyImplAddress } from "./helpers/utils"; @@ -29,7 +28,7 @@ describe("ZNSDomainToken", () => { let mockRegistrar : SignerWithAddress; let beneficiary : SignerWithAddress; - let zns : IZNSContracts; + let zns : IZNSContractsLocal; let deployParams : DeployZNSParams; const randomTokenURI = "https://www.zNS.domains/1a3c2f5"; @@ -64,7 +63,7 @@ describe("ZNSDomainToken", () => { ZNS_DOMAIN_TOKEN_SYMBOL, zns.zeroVaultAddress, DEFAULT_ROYALTY_FRACTION - )).to.be.revertedWith(INITIALIZED_ERR); + )).to.be.revertedWithCustomError(zns.domainToken, INITIALIZED_ERR); }); it("Should NOT let initialize the implementation contract", async () => { @@ -80,7 +79,7 @@ describe("ZNSDomainToken", () => { zns.zeroVaultAddress, DEFAULT_ROYALTY_FRACTION ) - ).to.be.revertedWith(INITIALIZED_ERR); + ).to.be.revertedWithCustomError(implContract, INITIALIZED_ERR); }); describe("External functions", () => { @@ -130,13 +129,11 @@ describe("ZNSDomainToken", () => { it("Should revert when registering (minting) if caller does not have REGISTRAR_ROLE", async () => { const tokenId = BigInt("1"); - await expect( - zns.domainToken - .connect(caller) - .register(caller.address, tokenId, randomTokenURI) - ).to.be.revertedWith( - getAccessRevertMsg(caller.address, REGISTRAR_ROLE) - ); + await expect(zns.domainToken + .connect(caller) + .register(caller.address, tokenId, randomTokenURI)) + .to.be.revertedWithCustomError(zns.accessController, AC_UNAUTHORIZED_ERR) + .withArgs(caller.address,REGISTRAR_ROLE); }); it("Revokes a token", async () => { @@ -161,7 +158,10 @@ describe("ZNSDomainToken", () => { ); // Verify token has been burned - await expect(zns.domainToken.ownerOf(tokenId)).to.be.revertedWith(INVALID_TOKENID_ERC_ERR); + await expect(zns.domainToken.ownerOf(tokenId)).to.be.revertedWithCustomError( + zns.domainToken, + NONEXISTENT_TOKEN_ERC_ERR + ); }); }); @@ -172,9 +172,8 @@ describe("ZNSDomainToken", () => { .connect(caller) .register(caller.address, tokenId, randomTokenURI); - await expect(registerTx).to.be.revertedWith( - getAccessRevertMsg(caller.address, REGISTRAR_ROLE) - ); + await expect(registerTx).to.be.revertedWithCustomError(zns.accessController, AC_UNAUTHORIZED_ERR) + .withArgs(caller.address,REGISTRAR_ROLE); }); it("Only authorized can revoke a token", async () => { @@ -193,9 +192,8 @@ describe("ZNSDomainToken", () => { // Revoke domain const tx = zns.domainToken.connect(caller).revoke(tokenId); - await expect(tx).to.be.revertedWith( - getAccessRevertMsg(caller.address, REGISTRAR_ROLE) - ); + await expect(tx).to.be.revertedWithCustomError(zns.accessController, AC_UNAUTHORIZED_ERR) + .withArgs(caller.address,REGISTRAR_ROLE); // Verify token has not been burned expect(await zns.domainToken.ownerOf(tokenId)).to.equal(caller.address); @@ -207,11 +205,9 @@ describe("ZNSDomainToken", () => { }); it("Should revert when setting access controller if caller does not have ADMIN_ROLE", async () => { - await expect( - zns.domainToken.connect(caller).setAccessController(caller.address) - ).to.be.revertedWith( - getAccessRevertMsg(caller.address, ADMIN_ROLE) - ); + await expect(zns.domainToken.connect(caller).setAccessController(caller.address)) + .to.be.revertedWithCustomError(zns.accessController, AC_UNAUTHORIZED_ERR) + .withArgs(caller.address,ADMIN_ROLE); }); }); @@ -293,11 +289,9 @@ describe("ZNSDomainToken", () => { }); it("#setDefaultRoyalty() should revert if called by anyone other than ADMIN_ROLE", async () => { - await expect( - zns.domainToken.connect(caller).setDefaultRoyalty(beneficiary.address, 100) - ).to.be.revertedWith( - getAccessRevertMsg(caller.address, ADMIN_ROLE) - ); + await expect(zns.domainToken.connect(caller).setDefaultRoyalty(beneficiary.address, 100)) + .to.be.revertedWithCustomError(zns.accessController, AC_UNAUTHORIZED_ERR) + .withArgs(caller.address,ADMIN_ROLE); }); it("#setTokenRoyalty() should revert if called by anyone other than ADMIN_ROLE", async () => { @@ -305,11 +299,9 @@ describe("ZNSDomainToken", () => { const tokenId = BigInt("777356"); await zns.domainToken.connect(mockRegistrar).register(deployer.address, tokenId, randomTokenURI); - await expect( - zns.domainToken.connect(caller).setTokenRoyalty(tokenId, beneficiary.address, 100) - ).to.be.revertedWith( - getAccessRevertMsg(caller.address, ADMIN_ROLE) - ); + await expect(zns.domainToken.connect(caller).setTokenRoyalty(tokenId, beneficiary.address, 100)) + .to.be.revertedWithCustomError(zns.accessController, AC_UNAUTHORIZED_ERR) + .withArgs(caller.address, ADMIN_ROLE); }); }); @@ -441,21 +433,17 @@ describe("ZNSDomainToken", () => { await zns.domainToken.connect(mockRegistrar).register(caller.address, tokenId, tokenURI); - await expect( - zns.domainToken.connect(caller).setTokenURI(tokenId, newTokenURI) - ).to.be.revertedWith( - getAccessRevertMsg(caller.address, ADMIN_ROLE) - ); + await expect(zns.domainToken.connect(caller).setTokenURI(tokenId, newTokenURI)) + .to.be.revertedWithCustomError(zns.accessController, AC_UNAUTHORIZED_ERR) + .withArgs(caller.address, ADMIN_ROLE); }); it("#setBaseURI() should revert when called by anyone other than ADMIN_ROLE", async () => { const baseURI = "https://www.zNS.domains/"; - await expect( - zns.domainToken.connect(caller).setBaseURI(baseURI) - ).to.be.revertedWith( - getAccessRevertMsg(caller.address, ADMIN_ROLE) - ); + await expect(zns.domainToken.connect(caller).setBaseURI(baseURI)) + .to.be.revertedWithCustomError(zns.accessController, AC_UNAUTHORIZED_ERR) + .withArgs(caller.address, ADMIN_ROLE); }); }); @@ -492,7 +480,10 @@ describe("ZNSDomainToken", () => { await zns.accessController.hasRole(GOVERNOR_ROLE, deployer.address) ).to.be.true; - const upgradeTx = zns.domainToken.connect(deployer).upgradeTo(await newDomainToken.getAddress()); + const upgradeTx = zns.domainToken.connect(deployer).upgradeToAndCall( + await newDomainToken.getAddress(), + "0x" + ); await expect(upgradeTx).to.not.be.reverted; }); @@ -529,15 +520,17 @@ describe("ZNSDomainToken", () => { await newDomainToken.waitForDeployment(); // Confirm the caller is not a governor - await expect(zns.accessController.checkGovernor(caller.address)).to.be.revertedWith( - getAccessRevertMsg(caller.address, GOVERNOR_ROLE) - ); - - const upgradeTx = zns.domainToken.connect(caller).upgradeTo(await newDomainToken.getAddress()); + await expect(zns.accessController.checkGovernor(caller.address)) + .to.be.revertedWithCustomError(zns.accessController, AC_UNAUTHORIZED_ERR) + .withArgs(caller.address, GOVERNOR_ROLE); - await expect(upgradeTx).to.be.revertedWith( - getAccessRevertMsg(caller.address, GOVERNOR_ROLE) + const upgradeTx = zns.domainToken.connect(caller).upgradeToAndCall( + await newDomainToken.getAddress(), + "0x" ); + + await expect(upgradeTx).to.be.revertedWithCustomError(zns.accessController, AC_UNAUTHORIZED_ERR) + .withArgs(caller.address, GOVERNOR_ROLE); }); }); }); \ No newline at end of file diff --git a/test/ZNSFixedPricer.test.ts b/test/ZNSFixedPricer.test.ts index 6e802b401..9f956fb1e 100644 --- a/test/ZNSFixedPricer.test.ts +++ b/test/ZNSFixedPricer.test.ts @@ -2,23 +2,22 @@ import { ADMIN_ROLE, deployFixedPricer, deployZNS, - getAccessRevertMsg, GOVERNOR_ROLE, - INITIALIZED_ERR, INVALID_NAME_ERR, - NOT_AUTHORIZED_REG_WIRED_ERR, + INITIALIZED_ERR, INVALID_LABEL_ERR, + NOT_AUTHORIZED_ERR, PaymentType, DEFAULT_PERCENTAGE_BASIS, DEFAULT_PRICE_CONFIG, - validateUpgrade, AccessType, + validateUpgrade, AccessType, AC_UNAUTHORIZED_ERR, FEE_TOO_LARGE_ERR, } from "./helpers"; import * as hre from "hardhat"; import { SignerWithAddress } from "@nomicfoundation/hardhat-ethers/signers"; -import { IZNSContracts } from "./helpers/types"; import * as ethers from "ethers"; import { registrationWithSetup } from "./helpers/register-setup"; import { expect } from "chai"; import { ZNSFixedPricer__factory, ZNSFixedPricer, ZNSFixedPricerUpgradeMock__factory } from "../typechain"; import { getProxyImplAddress } from "./helpers/utils"; +import { IZNSContractsLocal } from "./helpers/types"; describe("ZNSFixedPricer", () => { @@ -28,7 +27,7 @@ describe("ZNSFixedPricer", () => { let random : SignerWithAddress; let zeroVault : SignerWithAddress; - let zns : IZNSContracts; + let zns : IZNSContractsLocal; let domainHash : string; let parentPrice : bigint; let parentFeePercentage : bigint; @@ -82,7 +81,7 @@ describe("ZNSFixedPricer", () => { await expect(zns.fixedPricer.initialize( await zns.accessController.getAddress(), await zns.registry.getAddress(), - )).to.be.revertedWith(INITIALIZED_ERR); + )).to.be.revertedWithCustomError(zns.fixedPricer, INITIALIZED_ERR); }); it("Should NOT let initialize the implementation contract", async () => { @@ -95,7 +94,7 @@ describe("ZNSFixedPricer", () => { deployer.address, random.address, ) - ).to.be.revertedWith(INITIALIZED_ERR); + ).to.be.revertedWithCustomError(implContract, INITIALIZED_ERR); }); it("should set config for 0x0 hash", async () => { @@ -136,9 +135,8 @@ describe("ZNSFixedPricer", () => { acAddress: await zns.accessController.getAddress(), regAddress: await zns.registry.getAddress(), }), - ).to.be.revertedWith( - getAccessRevertMsg(random.address, ADMIN_ROLE) - ); + ).to.be.revertedWithCustomError(zns.accessController, AC_UNAUTHORIZED_ERR) + .withArgs(random.address, ADMIN_ROLE); }); it("#setPrice() should work correctly and emit #PriceSet event", async () => { @@ -164,7 +162,7 @@ describe("ZNSFixedPricer", () => { it("#getPrice() should revert for invalid label when not skipping the label validation", async () => { await expect( zns.fixedPricer.getPrice(domainHash, "tEstname", false) - ).to.be.revertedWith(INVALID_NAME_ERR); + ).to.be.revertedWithCustomError(zns.fixedPricer, INVALID_LABEL_ERR); }); it("#getPriceAndFee() should return the correct price and fee", async () => { @@ -185,8 +183,9 @@ describe("ZNSFixedPricer", () => { it("#setPrice() should revert if called by anyone other than domain owner", async () => { await expect( zns.fixedPricer.connect(random).setPrice(domainHash, ethers.parseEther("1")) - ).to.be.revertedWith( - NOT_AUTHORIZED_REG_WIRED_ERR + ).to.be.revertedWithCustomError( + zns.fixedPricer, + NOT_AUTHORIZED_ERR ); }); @@ -205,16 +204,18 @@ describe("ZNSFixedPricer", () => { it("#setFeePercentage() should revert if called by anyone other than domain owner", async () => { await expect( zns.fixedPricer.connect(random).setFeePercentage(domainHash, BigInt(1)) - ).to.be.revertedWith( - NOT_AUTHORIZED_REG_WIRED_ERR + ).to.be.revertedWithCustomError( + zns.fixedPricer, + NOT_AUTHORIZED_ERR ); }); it("#setFeePercentage() should revert when trying to set feePercentage higher than PERCENTAGE_BASIS", async () => { await expect( zns.fixedPricer.connect(user).setFeePercentage(domainHash, DEFAULT_PERCENTAGE_BASIS + 1n) - ).to.be.revertedWith( - "ZNSFixedPricer: feePercentage cannot be greater than PERCENTAGE_BASIS" + ).to.be.revertedWithCustomError( + zns.fixedPricer, + FEE_TOO_LARGE_ERR ); }); @@ -244,16 +245,14 @@ describe("ZNSFixedPricer", () => { it("#setPriceConfig() should revert if called by anyone other than domain owner or operator", async () => { await expect( - zns.fixedPricer.connect(random).setPriceConfig( - domainHash, - { - price: BigInt(1), - feePercentage: BigInt(1), - isSet: true, - } - ) - ).to.be.revertedWith( - NOT_AUTHORIZED_REG_WIRED_ERR + zns.fixedPricer.connect(random).setPriceConfig(domainHash, { + price: BigInt(1), + feePercentage: BigInt(1), + isSet: true, + }) + ).to.be.revertedWithCustomError( + zns.fixedPricer, + NOT_AUTHORIZED_ERR ); }); @@ -271,17 +270,15 @@ describe("ZNSFixedPricer", () => { it("#setRegistry() should revert if called by anyone other than ADMIN_ROLE", async () => { await expect( zns.fixedPricer.connect(random).setRegistry(random.address) - ).to.be.revertedWith( - getAccessRevertMsg(random.address, ADMIN_ROLE) - ); + ).to.be.revertedWithCustomError(zns.accessController, AC_UNAUTHORIZED_ERR) + .withArgs(random.address, ADMIN_ROLE); }); it("#setAccessController() should revert if called by anyone other than ADMIN_ROLE", async () => { await expect( zns.fixedPricer.connect(random).setAccessController(random.address) - ).to.be.revertedWith( - getAccessRevertMsg(random.address, ADMIN_ROLE) - ); + ).to.be.revertedWithCustomError(zns.accessController, AC_UNAUTHORIZED_ERR) + .withArgs(random.address, ADMIN_ROLE); }); // keep this as the last test @@ -339,7 +336,10 @@ describe("ZNSFixedPricer", () => { // Confirm the deployer is a governor, as set in `deployZNS` helper await expect(zns.accessController.checkGovernor(deployer.address)).to.not.be.reverted; - const tx = zns.fixedPricer.connect(deployer).upgradeTo(await newFixedPricer.getAddress()); + const tx = zns.fixedPricer.connect(deployer).upgradeToAndCall( + await newFixedPricer.getAddress(), + "0x" + ); await expect(tx).to.not.be.reverted; await expect( @@ -347,7 +347,7 @@ describe("ZNSFixedPricer", () => { await zns.accessController.getAddress(), await zns.registry.getAddress(), ) - ).to.be.revertedWith(INITIALIZED_ERR); + ).to.be.revertedWithCustomError(zns.fixedPricer, INITIALIZED_ERR); }); it("Fails to upgrade if the caller is not authorized", async () => { @@ -359,11 +359,13 @@ describe("ZNSFixedPricer", () => { // Confirm the account is not a governor await expect(zns.accessController.checkGovernor(random.address)).to.be.reverted; - const tx = zns.fixedPricer.connect(random).upgradeTo(await newFixedPricer.getAddress()); - - await expect(tx).to.be.revertedWith( - getAccessRevertMsg(random.address, GOVERNOR_ROLE) + const tx = zns.fixedPricer.connect(random).upgradeToAndCall( + await newFixedPricer.getAddress(), + "0x" ); + + await expect(tx).to.be.revertedWithCustomError(zns.accessController, AC_UNAUTHORIZED_ERR) + .withArgs(random.address, GOVERNOR_ROLE); }); it("Verifies that variable values are not changed in the upgrade process", async () => { diff --git a/test/ZNSRegistry.test.ts b/test/ZNSRegistry.test.ts index 7afdff16a..801ba8c32 100644 --- a/test/ZNSRegistry.test.ts +++ b/test/ZNSRegistry.test.ts @@ -3,7 +3,7 @@ import { expect } from "chai"; import { SignerWithAddress } from "@nomicfoundation/hardhat-ethers/signers"; import { deployZNS } from "./helpers/deploy/deploy-zns"; import { hashDomainLabel, hashSubdomainName } from "./helpers/hashing"; -import { IZNSContracts, DeployZNSParams } from "./helpers/types"; +import { DeployZNSParams, IZNSContractsLocal } from "./helpers/types"; import { ZNSRegistry, ZNSRegistry__factory, ZNSRegistryUpgradeMock__factory } from "../typechain"; import { ethers } from "ethers"; import { @@ -11,16 +11,12 @@ import { GOVERNOR_ROLE, REGISTRAR_ROLE, INITIALIZED_ERR, - getAccessRevertMsg, validateUpgrade, - NOT_AUTHORIZED_REG_ERR, DEFAULT_RESOLVER_TYPE, + AC_UNAUTHORIZED_ERR, + NOT_AUTHORIZED_ERR, + ZERO_ADDRESS_ERR, } from "./helpers"; -import { - ONLY_NAME_OWNER_REG_ERR, - ONLY_OWNER_REGISTRAR_REG_ERR, - OWNER_NOT_ZERO_REG_ERR, -} from "./helpers/errors"; import { getProxyImplAddress } from "./helpers/utils"; // eslint-disable-next-line @typescript-eslint/no-var-requires @@ -36,7 +32,7 @@ describe("ZNSRegistry", () => { let mockResolver : SignerWithAddress; let mockRegistrar : SignerWithAddress; - let zns : IZNSContracts; + let zns : IZNSContractsLocal; let wilderDomainHash : string; beforeEach(async () => { @@ -68,7 +64,8 @@ describe("ZNSRegistry", () => { zns.registry.initialize( await zns.accessController.getAddress() ) - ).to.be.revertedWith( + ).to.be.revertedWithCustomError( + zns.registry, INITIALIZED_ERR ); }); @@ -82,7 +79,7 @@ describe("ZNSRegistry", () => { implContract.initialize( deployer.address, ) - ).to.be.revertedWith(INITIALIZED_ERR); + ).to.be.revertedWithCustomError(implContract, INITIALIZED_ERR); }); // eslint-disable-next-line max-len @@ -121,9 +118,8 @@ describe("ZNSRegistry", () => { it("Should revert when setting access controller without ADMIN_ROLE", async () => { await expect( zns.registry.connect(randomUser).setAccessController(deployer.address) - ).to.be.revertedWith( - getAccessRevertMsg(randomUser.address, ADMIN_ROLE) - ); + ).to.be.revertedWithCustomError(zns.accessController, AC_UNAUTHORIZED_ERR) + .withArgs(randomUser.address, ADMIN_ROLE); }); describe("Audit fix with approved address resolvers", () => { @@ -233,12 +229,12 @@ describe("ZNSRegistry", () => { await zns.registry.connect(deployer).setOwnersOperator(operator.address, false); const tx = zns.registry.connect(operator).updateDomainResolver(wilderDomainHash, operator.address); - await expect(tx).to.be.revertedWith("ZNSRegistry: Not authorized"); + await expect(tx).to.be.revertedWithCustomError(zns.registry, NOT_AUTHORIZED_ERR); }); it("Does not permit an operator that's never been allowed to modify a record", async () => { const tx = zns.registry.connect(operator).updateDomainResolver(wilderDomainHash, operator.address); - await expect(tx).to.be.revertedWith("ZNSRegistry: Not authorized"); + await expect(tx).to.be.revertedWithCustomError(zns.registry, NOT_AUTHORIZED_ERR); }); it("#isOperatorFor() should return true for an operator", async () => { @@ -315,9 +311,8 @@ describe("ZNSRegistry", () => { DEFAULT_RESOLVER_TYPE ); - await expect(tx).to.be.revertedWith( - `AccessControl: account ${deployer.address.toLowerCase()} is missing role ${REGISTRAR_ROLE}` - ); + await expect(tx).to.be.revertedWithCustomError(zns.accessController, AC_UNAUTHORIZED_ERR) + .withArgs(deployer.address, REGISTRAR_ROLE); }); }); @@ -328,7 +323,7 @@ describe("ZNSRegistry", () => { const tx = zns.registry.updateDomainRecord(domainHash, deployer.address, mockResolver.address); // Because nobody owns a non-existing record, the error is caught by the `onlyOwnerOrOperator` first - await expect(tx).to.be.revertedWith(ONLY_NAME_OWNER_REG_ERR); + await expect(tx).to.be.revertedWithCustomError(zns.registry, NOT_AUTHORIZED_ERR); }); it("Can update a domain record if the domain exists", async () => { @@ -352,7 +347,7 @@ describe("ZNSRegistry", () => { const tx = zns.registry.updateDomainOwner(domainHash, deployer.address); // Because nobody owns a non-existing record, the error is caught by the `onlyOwnerOrOperator` first - await expect(tx).to.be.revertedWith(ONLY_OWNER_REGISTRAR_REG_ERR); + await expect(tx).to.be.revertedWithCustomError(zns.registry, NOT_AUTHORIZED_ERR); }); it("Can update a domain owner if the domain exists", async () => { @@ -371,7 +366,7 @@ describe("ZNSRegistry", () => { const tx = zns.registry.updateDomainResolver(domainHash, mockResolver.address); // Because nobody owns a non-existing record, the error is caught by the `onlyOwnerOrOperator` first - await expect(tx).to.be.revertedWith(NOT_AUTHORIZED_REG_ERR); + await expect(tx).to.be.revertedWithCustomError(zns.registry, NOT_AUTHORIZED_ERR); }); it("Can update a domain resolver if the domain exists", async () => { @@ -394,7 +389,7 @@ describe("ZNSRegistry", () => { await zns.registry.connect(mockRegistrar).createDomainRecord(domainHash, deployer.address, DEFAULT_RESOLVER_TYPE); const tx = zns.registry.updateDomainRecord(domainHash, ethers.ZeroAddress, mockResolver.address); - await expect(tx).to.be.revertedWith(OWNER_NOT_ZERO_REG_ERR); + await expect(tx).to.be.revertedWithCustomError(zns.registry, ZERO_ADDRESS_ERR); }); it("Can update a domain record if the resolver is zero address", async () => { @@ -414,7 +409,7 @@ describe("ZNSRegistry", () => { ethers.ZeroAddress ); - await expect(tx).to.be.revertedWith(OWNER_NOT_ZERO_REG_ERR); + await expect(tx).to.be.revertedWithCustomError(zns.registry, ZERO_ADDRESS_ERR); }); it("Can update a domain resolver if resolver is zero address", async () => { @@ -438,7 +433,7 @@ describe("ZNSRegistry", () => { operator.address, mockResolver.address ); - await expect(tx).to.be.revertedWith(ONLY_NAME_OWNER_REG_ERR); + await expect(tx).to.be.revertedWithCustomError(zns.registry, NOT_AUTHORIZED_ERR); }); it("cannot update a domain's record if not an owner or operator", async () => { @@ -451,7 +446,7 @@ describe("ZNSRegistry", () => { deployer.address ); - await expect(tx).to.be.revertedWith(ONLY_NAME_OWNER_REG_ERR); + await expect(tx).to.be.revertedWithCustomError(zns.registry, NOT_AUTHORIZED_ERR); }); it("cannot update an domain's owner if not an owner or operator", async () => { @@ -460,9 +455,7 @@ describe("ZNSRegistry", () => { await zns.registry.connect(mockRegistrar).createDomainRecord(domainHash, deployer.address, DEFAULT_RESOLVER_TYPE); const tx = zns.registry.connect(randomUser).updateDomainOwner(domainHash, mockResolver.address); - await expect(tx).to.be.revertedWith( - ONLY_OWNER_REGISTRAR_REG_ERR - ); + await expect(tx).to.be.revertedWithCustomError(zns.registry, NOT_AUTHORIZED_ERR); }); it("cannot update a domain's resolver if not an owner or operator", async () => { @@ -471,7 +464,7 @@ describe("ZNSRegistry", () => { await zns.registry.connect(mockRegistrar).createDomainRecord(domainHash, deployer.address, DEFAULT_RESOLVER_TYPE); const tx = zns.registry.connect(randomUser).updateDomainResolver(domainHash, deployer.address); - await expect(tx).to.be.revertedWith(NOT_AUTHORIZED_REG_ERR); + await expect(tx).to.be.revertedWithCustomError(zns.registry, NOT_AUTHORIZED_ERR); }); it("Can delete record with REGISTRAR_ROLE", async () => { @@ -491,9 +484,8 @@ describe("ZNSRegistry", () => { await zns.registry.connect(mockRegistrar).createDomainRecord(domainHash, deployer.address, DEFAULT_RESOLVER_TYPE); const tx = zns.registry.connect(randomUser).deleteRecord(domainHash); - await expect(tx).to.be.revertedWith( - getAccessRevertMsg(randomUser.address, REGISTRAR_ROLE) - ); + await expect(tx).to.be.revertedWithCustomError(zns.accessController, AC_UNAUTHORIZED_ERR) + .withArgs(randomUser.address,REGISTRAR_ROLE); }); }); @@ -595,7 +587,10 @@ describe("ZNSRegistry", () => { await registry.waitForDeployment(); // To control the signer we call manually here instead of through hardhat - const upgradeTx = zns.registry.connect(deployer).upgradeTo(await registry.getAddress()); + const upgradeTx = zns.registry.connect(deployer).upgradeToAndCall( + await registry.getAddress(), + "0x" + ); await expect(upgradeTx).to.be.not.be.reverted; }); @@ -605,8 +600,13 @@ describe("ZNSRegistry", () => { await registry.waitForDeployment(); // To control the signer we call manually here instead of through hardhat - const upgradeTx = zns.registry.connect(randomUser).upgradeTo(await registry.getAddress()); - await expect(upgradeTx).to.be.revertedWith(getAccessRevertMsg(randomUser.address, GOVERNOR_ROLE)); + const upgradeTx = zns.registry.connect(randomUser).upgradeToAndCall( + await registry.getAddress(), + "0x" + ); + + await expect(upgradeTx).to.be.revertedWithCustomError(zns.accessController, AC_UNAUTHORIZED_ERR) + .withArgs(randomUser.address, GOVERNOR_ROLE); }); it("Verifies that variable values are not changed in the upgrade process", async () => { diff --git a/test/ZNSRootRegistrar.test.ts b/test/ZNSRootRegistrar.test.ts index bbb3f2c91..4176dc208 100644 --- a/test/ZNSRootRegistrar.test.ts +++ b/test/ZNSRootRegistrar.test.ts @@ -1,38 +1,36 @@ import * as hre from "hardhat"; import { expect } from "chai"; import { SignerWithAddress } from "@nomicfoundation/hardhat-ethers/signers"; +import { + MongoDBAdapter, +} from "@zero-tech/zdc"; import { normalizeName, validateUpgrade, AccessType, OwnerOf, PaymentType, - getAccessRevertMsg, hashDomainLabel, DEFAULT_TOKEN_URI, distrConfigEmpty, INVALID_LENGTH_ERR, INITIALIZED_ERR, - INVALID_TOKENID_ERC_ERR, + NONEXISTENT_TOKEN_ERC_ERR, REGISTRAR_ROLE, DEFAULT_PRECISION_MULTIPLIER, DEFAULT_PRICE_CONFIG, DEFAULT_PROTOCOL_FEE_PERCENT, - NOT_AUTHORIZED_REG_ERR, - NOT_BOTH_OWNER_RAR_ERR, - NOT_TOKEN_OWNER_RAR_ERR, - ONLY_NAME_OWNER_REG_ERR, - ONLY_OWNER_REGISTRAR_REG_ERR, - INVALID_NAME_ERR, - paymentConfigEmpty, + NOT_OWNER_OF_ERR, + NOT_AUTHORIZED_ERR, + INVALID_LABEL_ERR, + paymentConfigEmpty, AC_UNAUTHORIZED_ERR, INSUFFICIENT_BALANCE_ERC_ERR, ZERO_ADDRESS_ERR, DOMAIN_EXISTS_ERR, } from "./helpers"; import { IDistributionConfig } from "./helpers/types"; import * as ethers from "ethers"; import { defaultRootRegistration } from "./helpers/register-setup"; import { checkBalance } from "./helpers/balances"; -import { getPriceObject } from "./helpers/pricing"; +import { getPriceObject, getStakingOrProtocolFee } from "./helpers/pricing"; import { getDomainHashFromEvent } from "./helpers/events"; -import { IDeployCampaignConfig, TZNSContractState } from "../src/deploy/campaign/types"; import { ADMIN_ROLE, GOVERNOR_ROLE } from "../src/deploy/constants"; import { IERC20, @@ -44,8 +42,9 @@ import { PaymentConfigStruct } from "../typechain/contracts/treasury/IZNSTreasur import { runZnsCampaign } from "../src/deploy/zns-campaign"; import { getProxyImplAddress } from "./helpers/utils"; import { upgrades } from "hardhat"; -import { MongoDBAdapter } from "../src/deploy/db/mongo-adapter/mongo-adapter"; -import { getConfig } from "../src/deploy/campaign/environments"; +import { getCampaignConfig } from "../src/deploy/campaign/environments"; +import { IZNSContracts } from "../src/deploy/campaign/types"; +import { ZeroHash } from "ethers"; require("@nomicfoundation/hardhat-chai-matchers"); @@ -59,7 +58,7 @@ describe("ZNSRootRegistrar", () => { let admin : SignerWithAddress; let randomUser : SignerWithAddress; - let zns : TZNSContractState; + let zns : IZNSContracts; let zeroVault : SignerWithAddress; let operator : SignerWithAddress; let userBalanceInitial : bigint; @@ -72,7 +71,7 @@ describe("ZNSRootRegistrar", () => { // zeroVault address is used to hold the fee charged to the user when registering [deployer, zeroVault, user, operator, governor, admin, randomUser] = await hre.ethers.getSigners(); - const config : IDeployCampaignConfig = await getConfig({ + const config = await getCampaignConfig({ deployer, zeroVaultAddress: zeroVault.address, governors: [deployer.address, governor.address], @@ -92,7 +91,7 @@ describe("ZNSRootRegistrar", () => { ethers.MaxUint256 ); - userBalanceInitial = ethers.parseEther("100000000000"); + userBalanceInitial = ethers.parseEther("1000000000000000000"); // Give funds to user await zns.meowToken.connect(user).approve(await zns.treasury.getAddress(), ethers.MaxUint256); await zns.meowToken.mint(user.address, userBalanceInitial); @@ -220,7 +219,7 @@ describe("ZNSRootRegistrar", () => { operator.address, operator.address, ) - ).to.be.revertedWith(INITIALIZED_ERR); + ).to.be.revertedWithCustomError(implContract, INITIALIZED_ERR); }); it("Allows transfer of 0x0 domain ownership after deployment", async () => { @@ -309,7 +308,8 @@ describe("ZNSRootRegistrar", () => { } ); - await expect(tx).to.be.revertedWith(getAccessRevertMsg(user.address, ADMIN_ROLE)); + await expect(tx).to.be.revertedWithCustomError(zns.accessController, AC_UNAUTHORIZED_ERR) + .withArgs(user.address, ADMIN_ROLE); }); it("Should NOT initialize twice", async () => { @@ -321,7 +321,10 @@ describe("ZNSRootRegistrar", () => { randomUser.address, ); - await expect(tx).to.be.revertedWith("Initializable: contract is already initialized"); + await expect(tx).to.be.revertedWithCustomError( + zns.rootRegistrar, + INITIALIZED_ERR + ); }); describe("General functionality", () => { @@ -329,22 +332,19 @@ describe("ZNSRootRegistrar", () => { const isRegistrar = await zns.accessController.hasRole(REGISTRAR_ROLE, randomUser.address); expect(isRegistrar).to.be.false; - await expect( - zns.rootRegistrar.connect(randomUser).coreRegister({ - parentHash: ethers.ZeroHash, - domainHash: ethers.ZeroHash, - label: "randomname", - registrant: ethers.ZeroAddress, - price: "0", - stakeFee: "0", - domainAddress: ethers.ZeroAddress, - tokenURI: "", - isStakePayment: false, - paymentConfig: paymentConfigEmpty, - }) - ).to.be.revertedWith( - getAccessRevertMsg(randomUser.address, REGISTRAR_ROLE) - ); + await expect(zns.rootRegistrar.connect(randomUser).coreRegister({ + parentHash: ethers.ZeroHash, + domainHash: ethers.ZeroHash, + label: "randomname", + registrant: ethers.ZeroAddress, + price: "0", + stakeFee: "0", + domainAddress: ethers.ZeroAddress, + tokenURI: "", + isStakePayment: false, + paymentConfig: paymentConfigEmpty, + })).to.be.revertedWithCustomError(zns.accessController, AC_UNAUTHORIZED_ERR) + .withArgs(randomUser.address,REGISTRAR_ROLE); }); it("#isOwnerOf() returns correct bools", async () => { @@ -408,15 +408,19 @@ describe("ZNSRootRegistrar", () => { ).to.be.reverted; }); + it("#isOwnerOf() should revert if wrong enum value is passed", async () => { + await expect( + zns.rootRegistrar.isOwnerOf(ethers.ZeroHash, user.address, 3) + ).to.be.reverted; + }); + it("#setSubRegistrar() should revert if called by address without ADMIN_ROLE", async () => { const isAdmin = await zns.accessController.hasRole(ADMIN_ROLE, randomUser.address); expect(isAdmin).to.be.false; - await expect( - zns.rootRegistrar.connect(randomUser).setSubRegistrar(randomUser.address) - ).to.be.revertedWith( - getAccessRevertMsg(randomUser.address, ADMIN_ROLE) - ); + await expect(zns.rootRegistrar.connect(randomUser).setSubRegistrar(randomUser.address)) + .to.be.revertedWithCustomError(zns.accessController, AC_UNAUTHORIZED_ERR) + .withArgs(randomUser.address, ADMIN_ROLE); }); it("#setSubRegistrar() should set the correct address", async () => { @@ -430,8 +434,9 @@ describe("ZNSRootRegistrar", () => { it("#setSubRegistrar() should NOT set the address to zero address", async () => { await expect( zns.rootRegistrar.connect(admin).setSubRegistrar(ethers.ZeroAddress) - ).to.be.revertedWith( - "ZNSRootRegistrar: subRegistrar_ is 0x0 address" + ).to.be.revertedWithCustomError( + zns.rootRegistrar, + ZERO_ADDRESS_ERR ); }); }); @@ -446,7 +451,7 @@ describe("ZNSRootRegistrar", () => { zns, domainName: emptyName, }) - ).to.be.revertedWith(INVALID_LENGTH_ERR); + ).to.be.revertedWithCustomError(zns.curvePricer, INVALID_LENGTH_ERR); }); it("Can register a TLD with characters [a-z0-9-]", async () => { @@ -536,7 +541,7 @@ describe("ZNSRootRegistrar", () => { zns, domainName: nameA, }) - ).to.be.revertedWith(INVALID_NAME_ERR); + ).to.be.revertedWithCustomError(zns.curvePricer, INVALID_LABEL_ERR); await expect( defaultRootRegistration({ @@ -544,7 +549,7 @@ describe("ZNSRootRegistrar", () => { zns, domainName: nameB, }) - ).to.be.revertedWith(INVALID_NAME_ERR); + ).to.be.revertedWithCustomError(zns.curvePricer, INVALID_LABEL_ERR); await expect( defaultRootRegistration({ @@ -552,7 +557,7 @@ describe("ZNSRootRegistrar", () => { zns, domainName: nameC, }) - ).to.be.revertedWith(INVALID_NAME_ERR); + ).to.be.revertedWithCustomError(zns.curvePricer, INVALID_LABEL_ERR); await expect( defaultRootRegistration({ @@ -560,7 +565,7 @@ describe("ZNSRootRegistrar", () => { zns, domainName: nameD, }) - ).to.be.revertedWith(INVALID_NAME_ERR); + ).to.be.revertedWithCustomError(zns.curvePricer, INVALID_LABEL_ERR); }); // eslint-disable-next-line max-len @@ -706,7 +711,13 @@ describe("ZNSRootRegistrar", () => { zns, domainName: defaultDomain, }); - await expect(tx).to.be.revertedWith("ERC20: transfer amount exceeds balance"); + const { price, stakeFee } = await zns.curvePricer.getPriceAndFee(ZeroHash, defaultDomain, true); + + await expect(tx).to.be.revertedWithCustomError( + zns.meowToken, + INSUFFICIENT_BALANCE_ERC_ERR + ) + .withArgs(user.address, 0n, price + stakeFee); }); it("Disallows creation of a duplicate domain", async () => { @@ -721,7 +732,7 @@ describe("ZNSRootRegistrar", () => { domainName: defaultDomain, }); - await expect(failTx).to.be.revertedWith("ZNSRootRegistrar: Domain already exists"); + await expect(failTx).to.be.revertedWithCustomError(zns.rootRegistrar, DOMAIN_EXISTS_ERR); }); it("Successfully registers a domain without resolver content", async () => { @@ -891,9 +902,10 @@ describe("ZNSRootRegistrar", () => { }); // Reclaim the Domain const tx = zns.rootRegistrar.connect(user).reclaimDomain(domainHash); - - // Verify Domain is not reclaimed - await expect(tx).to.be.revertedWith(NOT_TOKEN_OWNER_RAR_ERR); + await expect(tx).to.be.revertedWithCustomError( + zns.rootRegistrar, + NOT_OWNER_OF_ERR + ).withArgs(1n, user.address, domainHash); // Verify domain is not owned in registrar const registryOwner = await zns.registry.connect(user).getDomainOwner(domainHash); @@ -906,7 +918,10 @@ describe("ZNSRootRegistrar", () => { const tx = zns.rootRegistrar.connect(user).reclaimDomain(domainHash); // Verify Domain is not reclaimed - await expect(tx).to.be.revertedWith(INVALID_TOKENID_ERC_ERR); + await expect(tx).to.be.revertedWithCustomError( + zns.domainToken, + NONEXISTENT_TOKEN_ERC_ERR + ).withArgs(BigInt(domainHash)); }); it("Domain Token can be reclaimed, transferred, and then reclaimed again", async () => { @@ -984,14 +999,46 @@ describe("ZNSRootRegistrar", () => { expect(finalstaked).to.equal(BigInt("0")); expect(finalToken).to.equal(ethers.ZeroAddress); + const protocolFee = getStakingOrProtocolFee(staked); + // Verify final balances - const computedFinalBalance = balance + staked; + const computedFinalBalance = balance + staked - protocolFee; const finalBalance = await zns.meowToken.balanceOf(user.address); expect(computedFinalBalance).to.equal(finalBalance); }); }); describe("Revoking Domains", () => { + it("Charges a protocol fee to the owner as part of the revoke flow", async () => { + await defaultRootRegistration({ + user, + zns, + domainName: defaultDomain, + distrConfig: { + pricerContract: await zns.curvePricer.getAddress(), + paymentType: PaymentType.STAKE, + accessType: AccessType.OPEN, + }, + }); + + const domainHash = await getDomainHashFromEvent({ + zns, + user, + }); + + const price = await zns.curvePricer.getPrice(ethers.ZeroHash, defaultDomain, false); + const protocolFee = await zns.curvePricer.getFeeForPrice(ethers.ZeroHash, price); + + const balanceBefore = await zns.meowToken.balanceOf(user.address); + + // is revoke meant to be free if owner of parent? register subdomain is + await zns.rootRegistrar.connect(user).revokeDomain(domainHash); + + const balanceAfter = await zns.meowToken.balanceOf(user.address); + + expect(balanceAfter).to.eq(balanceBefore + price - protocolFee); + }); + it("Revokes a Top level Domain, locks distribution and removes mintlist", async () => { // Register Top level await defaultRootRegistration({ @@ -1040,9 +1087,10 @@ describe("ZNSRootRegistrar", () => { // Verify token has been burned const ownerOfTx = zns.domainToken.connect(user).ownerOf(tokenId); - await expect(ownerOfTx).to.be.revertedWith( - INVALID_TOKENID_ERC_ERR - ); + await expect(ownerOfTx).to.be.revertedWithCustomError( + zns.domainToken, + NONEXISTENT_TOKEN_ERC_ERR + ).withArgs(BigInt(domainHash)); // Verify Domain Record Deleted const exists = await zns.registry.exists(domainHash); @@ -1065,7 +1113,10 @@ describe("ZNSRootRegistrar", () => { // Verify transaction is reverted const tx = zns.rootRegistrar.connect(user).revokeDomain(fakeHash); - await expect(tx).to.be.revertedWith(NOT_BOTH_OWNER_RAR_ERR); + await expect(tx).to.be.revertedWithCustomError( + zns.rootRegistrar, + NOT_OWNER_OF_ERR + ); }); it("Revoking domain unstakes", async () => { @@ -1095,17 +1146,20 @@ describe("ZNSRootRegistrar", () => { // Revoke the domain await zns.rootRegistrar.connect(user).revokeDomain(domainHash); + // Validated funds are unstaked const { amount: finalstaked, token: finalToken } = await zns.treasury.stakedForDomain(domainHash); expect(finalstaked).to.equal(BigInt("0")); expect(finalToken).to.equal(ethers.ZeroAddress); + const protocolFee = getStakingOrProtocolFee(staked); + // Verify final balances const computedBalanceAfterStaking = balanceAfterStaking + staked; const balanceMinusFee = balance - expectedStakeFee; expect(computedBalanceAfterStaking).to.equal(balanceMinusFee); const finalBalance = await zns.meowToken.balanceOf(user.address); - expect(computedBalanceAfterStaking).to.equal(finalBalance); + expect(computedBalanceAfterStaking - protocolFee).to.equal(finalBalance); }); it("Cannot revoke if Name is owned by another user", async () => { @@ -1120,7 +1174,10 @@ describe("ZNSRootRegistrar", () => { // Try to revoke domain const tx = zns.rootRegistrar.connect(user).revokeDomain(parentDomainHash); - await expect(tx).to.be.revertedWith(NOT_BOTH_OWNER_RAR_ERR); + await expect(tx).to.be.revertedWithCustomError( + zns.rootRegistrar, + NOT_OWNER_OF_ERR + ).withArgs(2n, user.address, parentDomainHash); }); it("No one can revoke if Token and Name have different owners", async () => { @@ -1139,10 +1196,13 @@ describe("ZNSRootRegistrar", () => { // Try to revoke domain as a new owner of the token const tx = zns.rootRegistrar.connect(user).revokeDomain(parentDomainHash); - await expect(tx).to.be.revertedWith(NOT_BOTH_OWNER_RAR_ERR); + await expect(tx).to.be.revertedWithCustomError( + zns.rootRegistrar, + NOT_OWNER_OF_ERR + ); const tx2 = zns.rootRegistrar.connect(deployer).revokeDomain(parentDomainHash); - await expect(tx2).to.be.revertedWith(NOT_BOTH_OWNER_RAR_ERR); + await expect(tx2).to.be.revertedWithCustomError(zns.rootRegistrar, NOT_OWNER_OF_ERR); }); it("After domain has been revoked, an old operator can NOT access Registry", async () => { @@ -1166,8 +1226,9 @@ describe("ZNSRootRegistrar", () => { domainHash, operator.address ); - await expect(tx2).to.be.revertedWith( - ONLY_OWNER_REGISTRAR_REG_ERR + await expect(tx2).to.be.revertedWithCustomError( + zns.registry, + NOT_AUTHORIZED_ERR ); const tx3 = zns.registry @@ -1177,9 +1238,7 @@ describe("ZNSRootRegistrar", () => { user.address, operator.address ); - await expect(tx3).to.be.revertedWith( - ONLY_NAME_OWNER_REG_ERR - ); + await expect(tx3).to.be.revertedWithCustomError(zns.registry, NOT_AUTHORIZED_ERR); const tx4 = zns.registry .connect(operator) @@ -1187,9 +1246,7 @@ describe("ZNSRootRegistrar", () => { domainHash, zeroVault.address ); - await expect(tx4).to.be.revertedWith( - NOT_AUTHORIZED_REG_ERR - ); + await expect(tx4).to.be.revertedWithCustomError(zns.registry, NOT_AUTHORIZED_ERR); }); }); @@ -1208,14 +1265,16 @@ describe("ZNSRootRegistrar", () => { it("Should revert if not called by ADMIN", async () => { const tx = zns.rootRegistrar.connect(user).setAccessController(randomUser.address); - await expect(tx).to.be.revertedWith( - getAccessRevertMsg(user.address, ADMIN_ROLE) - ); + await expect(tx).to.be.revertedWithCustomError(zns.accessController, AC_UNAUTHORIZED_ERR) + .withArgs(user.address,ADMIN_ROLE); }); it("Should revert if new AccessController is address zero", async () => { const tx = zns.rootRegistrar.connect(deployer).setAccessController(ethers.ZeroAddress); - await expect(tx).to.be.revertedWith("AC: _accessController is 0x0 address"); + await expect(tx).to.be.revertedWithCustomError( + zns.rootRegistrar, + ZERO_ADDRESS_ERR + ); }); }); @@ -1233,14 +1292,16 @@ describe("ZNSRootRegistrar", () => { it("Should revert if not called by ADMIN", async () => { const tx = zns.rootRegistrar.connect(user).setRegistry(randomUser.address); - await expect(tx).to.be.revertedWith( - getAccessRevertMsg(user.address, ADMIN_ROLE) - ); + await expect(tx).to.be.revertedWithCustomError(zns.accessController, AC_UNAUTHORIZED_ERR) + .withArgs(user.address,ADMIN_ROLE); }); it("Should revert if ZNSRegistry is address zero", async () => { const tx = zns.rootRegistrar.connect(deployer).setRegistry(ethers.ZeroAddress); - await expect(tx).to.be.revertedWith("ARegistryWired: _registry can not be 0x0 address"); + await expect(tx).to.be.revertedWithCustomError( + zns.rootRegistrar, + ZERO_ADDRESS_ERR + ); }); }); @@ -1258,14 +1319,16 @@ describe("ZNSRootRegistrar", () => { it("Should revert if not called by ADMIN", async () => { const tx = zns.rootRegistrar.connect(user).setTreasury(randomUser.address); - await expect(tx).to.be.revertedWith( - getAccessRevertMsg(user.address, ADMIN_ROLE) - ); + await expect(tx).to.be.revertedWithCustomError(zns.accessController, AC_UNAUTHORIZED_ERR) + .withArgs(user.address,ADMIN_ROLE); }); it("Should revert if Treasury is address zero", async () => { const tx = zns.rootRegistrar.connect(deployer).setTreasury(ethers.ZeroAddress); - await expect(tx).to.be.revertedWith("ZNSRootRegistrar: treasury_ is 0x0 address"); + await expect(tx).to.be.revertedWithCustomError( + zns.rootRegistrar, + ZERO_ADDRESS_ERR + ); }); }); @@ -1283,14 +1346,37 @@ describe("ZNSRootRegistrar", () => { it("Should revert if not called by ADMIN", async () => { const tx = zns.rootRegistrar.connect(user).setDomainToken(randomUser.address); - await expect(tx).to.be.revertedWith( - getAccessRevertMsg(user.address, ADMIN_ROLE) - ); + await expect(tx).to.be.revertedWithCustomError(zns.accessController, AC_UNAUTHORIZED_ERR) + .withArgs(user.address,ADMIN_ROLE); }); it("Should revert if DomainToken is address zero", async () => { const tx = zns.rootRegistrar.connect(deployer).setDomainToken(ethers.ZeroAddress); - await expect(tx).to.be.revertedWith("ZNSRootRegistrar: domainToken_ is 0x0 address"); + await expect(tx).to.be.revertedWithCustomError( + zns.rootRegistrar, + ZERO_ADDRESS_ERR + ); + }); + }); + + describe("#setRootPricer", () => { + it("#setRootPricer() should set the rootPricer correctly", async () => { + const newPricer = zns.fixedPricer.target; + await zns.rootRegistrar.connect(admin).setRootPricer(newPricer); + + expect(await zns.rootRegistrar.rootPricer()).to.eq(newPricer); + + // set back + await zns.rootRegistrar.connect(admin).setRootPricer(zns.curvePricer.target); + }); + + it("#setRootPricer() should NOT let set 0x0 address as the new pricer", async () => { + await expect( + zns.rootRegistrar.connect(admin).setRootPricer(ethers.ZeroAddress) + ).to.be.revertedWithCustomError( + zns.subRegistrar, + ZERO_ADDRESS_ERR + ); }); }); }); @@ -1304,7 +1390,10 @@ describe("ZNSRootRegistrar", () => { const registrar = await registrarFactory.deploy(); await registrar.waitForDeployment(); - const upgradeTx = zns.rootRegistrar.connect(deployer).upgradeTo(await registrar.getAddress()); + const upgradeTx = zns.rootRegistrar.connect(deployer).upgradeToAndCall( + await registrar.getAddress(), + "0x" + ); await expect(upgradeTx).to.not.be.reverted; }); @@ -1313,11 +1402,13 @@ describe("ZNSRootRegistrar", () => { const registrar = await registrarFactory.deploy(); await registrar.waitForDeployment(); - const tx = zns.rootRegistrar.connect(randomUser).upgradeTo(await registrar.getAddress()); - - await expect(tx).to.be.revertedWith( - getAccessRevertMsg(randomUser.address, GOVERNOR_ROLE) + const tx = zns.rootRegistrar.connect(randomUser).upgradeToAndCall( + await registrar.getAddress(), + "0x" ); + + await expect(tx).to.be.revertedWithCustomError(zns.accessController, AC_UNAUTHORIZED_ERR) + .withArgs(randomUser.address, GOVERNOR_ROLE); }); it("Verifies that variable values are not changed in the upgrade process", async () => { diff --git a/test/ZNSSubRegistrar.test.ts b/test/ZNSSubRegistrar.test.ts index cf1592bd0..ac20e9803 100644 --- a/test/ZNSSubRegistrar.test.ts +++ b/test/ZNSSubRegistrar.test.ts @@ -1,5 +1,5 @@ import { SignerWithAddress } from "@nomicfoundation/hardhat-ethers/signers"; -import { IDomainConfigForTest, IFixedPriceConfig, IPathRegResult, IZNSContracts } from "./helpers/types"; +import { IDomainConfigForTest, IFixedPriceConfig, IPathRegResult, IZNSContractsLocal } from "./helpers/types"; import { AccessType, ADMIN_ROLE, @@ -8,18 +8,24 @@ import { distrConfigEmpty, DISTRIBUTION_LOCKED_NOT_EXIST_ERR, fullDistrConfigEmpty, - getAccessRevertMsg, getPriceObject, getStakingOrProtocolFee, GOVERNOR_ROLE, INITIALIZED_ERR, - INVALID_NAME_ERR, - INVALID_TOKENID_ERC_ERR, NO_BENEFICIARY_ERR, - ONLY_NAME_OWNER_REG_ERR, paymentConfigEmpty, + INVALID_LABEL_ERR, + NONEXISTENT_TOKEN_ERC_ERR, + NO_BENEFICIARY_ERR, + NOT_AUTHORIZED_ERR, + paymentConfigEmpty, PaymentType, DECAULT_PRECISION, DEFAULT_PRICE_CONFIG, validateUpgrade, + AC_UNAUTHORIZED_ERR, + INSUFFICIENT_BALANCE_ERC_ERR, + INSUFFICIENT_ALLOWANCE_ERC_ERR, + NOT_OWNER_OF_ERR, + ZERO_ADDRESS_ERR, PARENT_CONFIG_NOT_SET_ERR, DOMAIN_EXISTS_ERR, SENDER_NOT_APPROVED_ERR, } from "./helpers"; import * as hre from "hardhat"; import * as ethers from "ethers"; @@ -56,7 +62,7 @@ describe("ZNSSubRegistrar", () => { let operator : SignerWithAddress; let multiOwner : SignerWithAddress; - let zns : IZNSContracts; + let zns : IZNSContractsLocal; let zeroVault : SignerWithAddress; describe("Single Subdomain Registration", () => { @@ -193,10 +199,10 @@ describe("ZNSSubRegistrar", () => { { token: await zns.meowToken.getAddress(), beneficiary: rootOwner.address, - }, - ) - ).to.be.revertedWith( - "ZNSFixedPricer: parent's price config has not been set properly through IZNSPricer.setPriceConfig()" + }) + ).to.be.revertedWithCustomError( + zns.curvePricer, + PARENT_CONFIG_NOT_SET_ERR ); }); @@ -229,10 +235,11 @@ describe("ZNSSubRegistrar", () => { lvl2SubOwner.address, subTokenURI, distrConfigEmpty, - paymentConfigEmpty, + paymentConfigEmpty ) - ).to.be.revertedWith( - "ZNSCurvePricer: parent's price config has not been set properly through IZNSPricer.setPriceConfig()" + ).to.be.revertedWithCustomError( + zns.curvePricer, + PARENT_CONFIG_NOT_SET_ERR ); }); @@ -293,53 +300,57 @@ describe("ZNSSubRegistrar", () => { const nameC = "!%$#^*?!#👍3^29"; const nameD = "wo.rld"; - await expect(defaultSubdomainRegistration( - { - user: lvl2SubOwner, - zns, - parentHash: rootHash, - subdomainLabel: nameA, - domainContent: lvl2SubOwner.address, - tokenURI: subTokenURI, - distrConfig: distrConfigEmpty, - } - )).to.be.revertedWith(INVALID_NAME_ERR); + await expect( + defaultSubdomainRegistration( + { + user: lvl2SubOwner, + zns, + parentHash: rootHash, + subdomainLabel: nameA, + domainContent: lvl2SubOwner.address, + tokenURI: subTokenURI, + distrConfig: distrConfigEmpty, + } + )).to.be.revertedWithCustomError(zns.curvePricer, INVALID_LABEL_ERR); - await expect(defaultSubdomainRegistration( - { - user: lvl2SubOwner, - zns, - parentHash: rootHash, - subdomainLabel: nameB, - domainContent: lvl2SubOwner.address, - tokenURI: subTokenURI, - distrConfig: distrConfigEmpty, - } - )).to.be.revertedWith(INVALID_NAME_ERR); + await expect( + defaultSubdomainRegistration( + { + user: lvl2SubOwner, + zns, + parentHash: rootHash, + subdomainLabel: nameB, + domainContent: lvl2SubOwner.address, + tokenURI: subTokenURI, + distrConfig: distrConfigEmpty, + } + )).to.be.revertedWithCustomError(zns.curvePricer, INVALID_LABEL_ERR); - await expect(defaultSubdomainRegistration( - { - user: lvl2SubOwner, - zns, - parentHash: rootHash, - subdomainLabel: nameC, - domainContent: lvl2SubOwner.address, - tokenURI: subTokenURI, - distrConfig: distrConfigEmpty, - } - )).to.be.revertedWith(INVALID_NAME_ERR); + await expect( + defaultSubdomainRegistration( + { + user: lvl2SubOwner, + zns, + parentHash: rootHash, + subdomainLabel: nameC, + domainContent: lvl2SubOwner.address, + tokenURI: subTokenURI, + distrConfig: distrConfigEmpty, + } + )).to.be.revertedWithCustomError(zns.curvePricer, INVALID_LABEL_ERR); - await expect(defaultSubdomainRegistration( - { - user: lvl2SubOwner, - zns, - parentHash: rootHash, - subdomainLabel: nameD, - domainContent: lvl2SubOwner.address, - tokenURI: subTokenURI, - distrConfig: distrConfigEmpty, - } - )).to.be.revertedWith(INVALID_NAME_ERR); + await expect( + defaultSubdomainRegistration( + { + user: lvl2SubOwner, + zns, + parentHash: rootHash, + subdomainLabel: nameD, + domainContent: lvl2SubOwner.address, + tokenURI: subTokenURI, + distrConfig: distrConfigEmpty, + } + )).to.be.revertedWithCustomError(zns.curvePricer, INVALID_LABEL_ERR); }); it("should revert when trying to register a subdomain under a non-existent parent", async () => { @@ -351,9 +362,10 @@ describe("ZNSSubRegistrar", () => { lvl2SubOwner.address, subTokenURI, distrConfigEmpty, - paymentConfigEmpty, + paymentConfigEmpty ) - ).to.be.revertedWith( + ).to.be.revertedWithCustomError( + zns.subRegistrar, DISTRIBUTION_LOCKED_NOT_EXIST_ERR ); @@ -366,9 +378,10 @@ describe("ZNSSubRegistrar", () => { lvl2SubOwner.address, subTokenURI, distrConfigEmpty, - paymentConfigEmpty, + paymentConfigEmpty ) - ).to.be.revertedWith( + ).to.be.revertedWithCustomError( + zns.subRegistrar, DISTRIBUTION_LOCKED_NOT_EXIST_ERR ); }); @@ -408,7 +421,7 @@ describe("ZNSSubRegistrar", () => { }); // ! this value can change based on the block gas limit ! - it("should register subdomain with a label length of 100000 chars", async () => { + it("should register subdomain with a label length of 100000 chars [ @skip-on-coverage ]", async () => { const subHash = await registrationWithSetup({ zns, user: lvl2SubOwner, @@ -447,8 +460,9 @@ describe("ZNSSubRegistrar", () => { distrConfigEmpty, paymentConfigEmpty, ) - ).to.be.revertedWith( - "ERC20: transfer amount exceeds balance" + ).to.be.revertedWithCustomError( + zns.meowToken, + INSUFFICIENT_BALANCE_ERC_ERR ); // transfer back for other tests @@ -471,8 +485,9 @@ describe("ZNSSubRegistrar", () => { distrConfigEmpty, paymentConfigEmpty, ) - ).to.be.revertedWith( - "ERC20: insufficient allowance" + ).to.be.revertedWithCustomError( + zns.meowToken, + INSUFFICIENT_ALLOWANCE_ERC_ERR ); }); @@ -523,7 +538,7 @@ describe("ZNSSubRegistrar", () => { parentHash: parentHash1, domainLabel: "sub1", }) - ).to.be.revertedWith(NO_BENEFICIARY_ERR); + ).to.be.revertedWithCustomError(zns.treasury, NO_BENEFICIARY_ERR); await expect( registrationWithSetup({ @@ -532,7 +547,7 @@ describe("ZNSSubRegistrar", () => { parentHash: parentHash2, domainLabel: "sub2", }) - ).to.be.revertedWith(NO_BENEFICIARY_ERR); + ).to.be.revertedWithCustomError(zns.treasury, NO_BENEFICIARY_ERR); // change stakeFee to 0 await zns.curvePricer.connect(rootOwner).setFeePercentage( @@ -937,9 +952,10 @@ describe("ZNSSubRegistrar", () => { lvl6SubOwner.address, DEFAULT_TOKEN_URI, distrConfigEmpty, - paymentConfigEmpty, + paymentConfigEmpty ) - ).to.be.revertedWith( + ).to.be.revertedWithCustomError( + zns.subRegistrar, DISTRIBUTION_LOCKED_NOT_EXIST_ERR ); @@ -950,13 +966,17 @@ describe("ZNSSubRegistrar", () => { const tokenId = BigInt(domainHash).toString(); await expect( zns.domainToken.ownerOf(tokenId) - ).to.be.revertedWith( - INVALID_TOKENID_ERC_ERR - ); + ).to.be.revertedWithCustomError( + zns.domainToken, + NONEXISTENT_TOKEN_ERC_ERR + ).withArgs(tokenId); await expect( zns.registry.connect(lvl6SubOwner).updateDomainRecord(domainHash, rootOwner.address, lvl6SubOwner.address) - ).to.be.revertedWith(ONLY_NAME_OWNER_REG_ERR); + ).to.be.revertedWithCustomError( + zns.registry, + NOT_AUTHORIZED_ERR + ); }); it("should revoke lvl 5 domain with refund", async () => { @@ -966,6 +986,11 @@ describe("ZNSSubRegistrar", () => { const parentBalBefore = await zns.meowToken.balanceOf(lvl4SubOwner.address); const paymentContractBalBefore = await zns.meowToken.balanceOf(await zns.treasury.getAddress()); + const stake = await zns.treasury.stakedForDomain(domainHash); + const protocolFee = getStakingOrProtocolFee(stake.amount); + + await zns.meowToken.connect(lvl5SubOwner).approve(await zns.treasury.getAddress(), protocolFee); + await zns.rootRegistrar.connect(lvl5SubOwner).revokeDomain(domainHash); const userBalAfter = await zns.meowToken.balanceOf(lvl5SubOwner.address); @@ -977,7 +1002,7 @@ describe("ZNSSubRegistrar", () => { expect( userBalAfter - userBalanceBefore ).to.eq( - expectedPrice + expectedPrice - protocolFee ); expect( parentBalBefore - parentBalAfter @@ -1002,9 +1027,10 @@ describe("ZNSSubRegistrar", () => { lvl6SubOwner.address, DEFAULT_TOKEN_URI, distrConfigEmpty, - paymentConfigEmpty, + paymentConfigEmpty ) - ).to.be.revertedWith( + ).to.be.revertedWithCustomError( + zns.subRegistrar, DISTRIBUTION_LOCKED_NOT_EXIST_ERR ); @@ -1015,13 +1041,17 @@ describe("ZNSSubRegistrar", () => { const tokenId = BigInt(domainHash).toString(); await expect( zns.domainToken.ownerOf(tokenId) - ).to.be.revertedWith( - INVALID_TOKENID_ERC_ERR - ); + ).to.be.revertedWithCustomError( + zns.domainToken, + NONEXISTENT_TOKEN_ERC_ERR + ).withArgs(tokenId); await expect( - zns.registry.connect(lvl5SubOwner).updateDomainRecord(domainHash, rootOwner.address, lvl6SubOwner.address) - ).to.be.revertedWith(ONLY_NAME_OWNER_REG_ERR); + zns.registry.connect(lvl5SubOwner).updateDomainRecord(domainHash,rootOwner.address,lvl6SubOwner.address) + ).to.be.revertedWithCustomError( + zns.registry, + NOT_AUTHORIZED_ERR + ); }); it("should register a new 2 lvl path at lvl 3 of the existing path", async () => { @@ -1080,6 +1110,11 @@ describe("ZNSSubRegistrar", () => { const childExists = await zns.registry.exists(lvl3Hash); assert.ok(childExists); + const stake = await zns.treasury.stakedForDomain(lvl2Hash); + const protocolFee = getStakingOrProtocolFee(stake.amount); + + await zns.meowToken.connect(lvl2SubOwner).approve(await zns.treasury.getAddress(), protocolFee); + // revoke parent await zns.rootRegistrar.connect(lvl2SubOwner).revokeDomain( lvl2Hash, @@ -1126,6 +1161,11 @@ describe("ZNSSubRegistrar", () => { const userBalBefore = await zns.meowToken.balanceOf(lvl3SubOwner.address); + const subStake = await zns.treasury.stakedForDomain(lvl3Hash); + const subProtocolFee = getStakingOrProtocolFee(subStake.amount); + + await zns.meowToken.connect(lvl3SubOwner).approve(await zns.treasury.getAddress(), subProtocolFee); + // revoke child await zns.rootRegistrar.connect(lvl3SubOwner).revokeDomain( lvl3Hash, @@ -1133,7 +1173,7 @@ describe("ZNSSubRegistrar", () => { const userBalAfter = await zns.meowToken.balanceOf(lvl3SubOwner.address); - expect(userBalAfter - userBalBefore).to.eq(expectedPrice); + expect(userBalAfter - userBalBefore).to.eq(expectedPrice - subProtocolFee); const childExistsAfter = await zns.registry.exists(lvl3Hash); assert.ok(!childExistsAfter); @@ -1148,13 +1188,17 @@ describe("ZNSSubRegistrar", () => { const tokenId = BigInt(lvl3Hash).toString(); await expect( zns.domainToken.ownerOf(tokenId) - ).to.be.revertedWith( - INVALID_TOKENID_ERC_ERR - ); + ).to.be.revertedWithCustomError( + zns.domainToken, + NONEXISTENT_TOKEN_ERC_ERR + ).withArgs(tokenId); await expect( zns.registry.connect(lvl3SubOwner).updateDomainRecord(lvl3Hash, rootOwner.address, lvl4SubOwner.address) - ).to.be.revertedWith(ONLY_NAME_OWNER_REG_ERR); + ).to.be.revertedWithCustomError( + zns.registry, + NOT_AUTHORIZED_ERR + ); }); it("should let anyone register a previously revoked domain", async () => { @@ -1230,9 +1274,12 @@ describe("ZNSSubRegistrar", () => { branchLvl1Owner.address, DEFAULT_TOKEN_URI, distrConfigEmpty, - paymentConfigEmpty, + paymentConfigEmpty ) - ).to.be.revertedWith(DISTRIBUTION_LOCKED_NOT_EXIST_ERR); + ).to.be.revertedWithCustomError( + zns.subRegistrar, + DISTRIBUTION_LOCKED_NOT_EXIST_ERR + ); // register root back for other tests await registrationWithSetup({ @@ -1262,9 +1309,12 @@ describe("ZNSSubRegistrar", () => { branchLvl2Owner.address, DEFAULT_TOKEN_URI, distrConfigEmpty, - paymentConfigEmpty, + paymentConfigEmpty ) - ).to.be.revertedWith(DISTRIBUTION_LOCKED_NOT_EXIST_ERR); + ).to.be.revertedWithCustomError( + zns.subRegistrar, + DISTRIBUTION_LOCKED_NOT_EXIST_ERR + ); }); // eslint-disable-next-line max-len @@ -1479,7 +1529,7 @@ describe("ZNSSubRegistrar", () => { ); // send future child some tokens - await token5.connect(deployer).transfer(lvl3SubOwner.address, expectedPrice + stakeFee + protocolFee); + await token5.connect(deployer).transfer(lvl3SubOwner.address, expectedPrice + stakeFee + (protocolFee * 2n)); const contractBalBefore = await token5.balanceOf(await zns.treasury.getAddress()); const parentBalBefore = await token5.balanceOf(lvl2SubOwner.address); @@ -1504,6 +1554,11 @@ describe("ZNSSubRegistrar", () => { expect(contractBalAfter - contractBalBefore).to.eq(expectedPrice); expect(zeroVaultBalanceAfter - zeroVaultBalanceBefore).to.eq(protocolFee); + const stake = await zns.treasury.stakedForDomain(childHash); + const protocolFeeOut = getStakingOrProtocolFee(stake.amount); + + await token5.connect(lvl3SubOwner).approve(await zns.treasury.getAddress(), ethers.MaxUint256); + // revoke await zns.rootRegistrar.connect(lvl3SubOwner).revokeDomain( childHash, @@ -1516,9 +1571,25 @@ describe("ZNSSubRegistrar", () => { const zeroVaultBalanceAfterRevoke = await token5.balanceOf(zeroVault.address); expect(contractBalAfter - contractBalAfterRevoke).to.eq(expectedPrice); - expect(childBalAfterRevoke - childBalAfter).to.eq(expectedPrice); + expect(childBalAfterRevoke - childBalAfter).to.eq(expectedPrice - protocolFeeOut); expect(parentBalAfterRevoke - parentBalAfter).to.eq(0); - expect(zeroVaultBalanceAfterRevoke - zeroVaultBalanceAfter).to.eq(0); + expect(zeroVaultBalanceAfterRevoke - zeroVaultBalanceAfter - protocolFeeOut).to.eq(0); + }); + + it("Does not charge the owner of a parent domain when they revoke a subdomain", async () => { + const subdomainHash = await registrationWithSetup({ + zns, + user: rootOwner, + parentHash: rootHash, + domainLabel: "subdomain", + }); + + const balanceBefore = await zns.meowToken.balanceOf(rootOwner.address); + + await zns.rootRegistrar.connect(rootOwner).revokeDomain(subdomainHash); + + const balanceAfter = await zns.meowToken.balanceOf(rootOwner.address); + expect(balanceBefore).to.eq(balanceAfter); }); it("FixedPricer - StakePayment - no fee - 18 decimals", async () => { @@ -1554,7 +1625,7 @@ describe("ZNSSubRegistrar", () => { // send future child some tokens await token18.connect(deployer).transfer( lvl3SubOwner.address, - expectedPrice + protocolFee + expectedPrice + (protocolFee * 2n) ); const contractBalBefore = await token18.balanceOf(await zns.treasury.getAddress()); @@ -1579,6 +1650,8 @@ describe("ZNSSubRegistrar", () => { expect(contractBalAfter - contractBalBefore).to.eq(expectedPrice); expect(zeroVaultBalanceAfter - zeroVaultBalanceBefore).to.eq(protocolFee); + await token18.connect(lvl3SubOwner).approve(await zns.treasury.getAddress(), protocolFee); + // revoke await zns.rootRegistrar.connect(lvl3SubOwner).revokeDomain( childHash, @@ -1591,9 +1664,9 @@ describe("ZNSSubRegistrar", () => { const zeroVaultBalanceAfterRevoke = await token18.balanceOf(zeroVault.address); expect(contractBalAfter - contractBalAfterRevoke).to.eq(expectedPrice); - expect(childBalAfterRevoke - childBalAfter).to.eq(expectedPrice); + expect(childBalAfterRevoke - childBalAfter).to.eq(expectedPrice - protocolFee); expect(parentBalAfterRevoke - parentBalAfter).to.eq(0); - expect(zeroVaultBalanceAfterRevoke - zeroVaultBalanceAfter).to.eq(0); + expect(zeroVaultBalanceAfterRevoke - zeroVaultBalanceAfter - protocolFee).to.eq(0); }); it("FixedPricer - DirectPayment - no fee - 8 decimals", async () => { @@ -1718,7 +1791,7 @@ describe("ZNSSubRegistrar", () => { // send future child some tokens await token13.connect(deployer).transfer( lvl3SubOwner.address, - expectedPrice + stakeFee + protocolFee + expectedPrice + stakeFee + (protocolFee * 2n) ); const contractBalBefore = await token13.balanceOf(await zns.treasury.getAddress()); @@ -1744,10 +1817,11 @@ describe("ZNSSubRegistrar", () => { expect(contractBalAfter - contractBalBefore).to.eq(expectedPrice); expect(zeroVaultBalanceAfter - zeroVaultBalanceBefore).to.eq(protocolFee); + const protocolFeeOut = getStakingOrProtocolFee(expectedPrice); + await token13.connect(lvl3SubOwner).approve(await zns.treasury.getAddress(), protocolFeeOut); + // revoke - await zns.rootRegistrar.connect(lvl3SubOwner).revokeDomain( - childHash, - ); + await zns.rootRegistrar.connect(lvl3SubOwner).revokeDomain(childHash); // should offer refund ! const contractBalAfterRevoke = await token13.balanceOf(await zns.treasury.getAddress()); @@ -1756,9 +1830,9 @@ describe("ZNSSubRegistrar", () => { const zeroVaultBalanceAfterRevoke = await token13.balanceOf(zeroVault.address); expect(contractBalAfter - contractBalAfterRevoke).to.eq(expectedPrice); - expect(childBalAfterRevoke - childBalAfter).to.eq(expectedPrice); + expect(childBalAfterRevoke - childBalAfter).to.eq(expectedPrice - protocolFeeOut); expect(parentBalAfterRevoke - parentBalAfter).to.eq(0); - expect(zeroVaultBalanceAfterRevoke - zeroVaultBalanceAfter).to.eq(0); + expect(zeroVaultBalanceAfterRevoke - zeroVaultBalanceAfter - protocolFeeOut).to.eq(0); }); it("CurvePricer - StakePayment - no fee - 2 decimals", async () => { @@ -1799,7 +1873,7 @@ describe("ZNSSubRegistrar", () => { // send future child some tokens await token2.connect(deployer).transfer( lvl3SubOwner.address, - expectedPrice + protocolFee + expectedPrice + (protocolFee * 2n) ); const contractBalBefore = await token2.balanceOf(await zns.treasury.getAddress()); @@ -1824,6 +1898,8 @@ describe("ZNSSubRegistrar", () => { expect(contractBalAfter - contractBalBefore).to.eq(expectedPrice); expect(zeroVaultBalanceAfter - zeroVaultBalanceBefore).to.eq(protocolFee); + await token2.connect(lvl3SubOwner).approve(await zns.treasury.getAddress(), protocolFee); + // revoke await zns.rootRegistrar.connect(lvl3SubOwner).revokeDomain( childHash, @@ -1836,9 +1912,9 @@ describe("ZNSSubRegistrar", () => { const zeroVaultBalanceAfterRevoke = await token2.balanceOf(zeroVault.address); expect(contractBalAfter - contractBalAfterRevoke).to.eq(expectedPrice); - expect(childBalAfterRevoke - childBalAfter).to.eq(expectedPrice); + expect(childBalAfterRevoke - childBalAfter).to.eq(expectedPrice - protocolFee); expect(parentBalAfterRevoke - parentBalAfter).to.eq(0); - expect(zeroVaultBalanceAfterRevoke - zeroVaultBalanceAfter).to.eq(0); + expect(zeroVaultBalanceAfterRevoke - zeroVaultBalanceAfter - protocolFee).to.eq(0); }); it("CurvePricer - DirectPayment - no fee - 18 decimals", async () => { @@ -2362,7 +2438,10 @@ describe("ZNSSubRegistrar", () => { distrConfigEmpty, paymentConfigEmpty, ) - ).to.be.revertedWith("ERC20: insufficient allowance"); + ).to.be.revertedWithCustomError( + zns.meowToken, + INSUFFICIENT_ALLOWANCE_ERC_ERR + ); // let's try to buy with the incorrect price const userBalanceBefore = await token5.balanceOf(lvl3SubOwner.address); @@ -2541,9 +2620,10 @@ describe("ZNSSubRegistrar", () => { ethers.ZeroAddress, DEFAULT_TOKEN_URI, distrConfigEmpty, - paymentConfigEmpty, + paymentConfigEmpty ) - ).to.be.revertedWith( + ).to.be.revertedWithCustomError( + zns.subRegistrar, DISTRIBUTION_LOCKED_NOT_EXIST_ERR ); }); @@ -2648,10 +2728,11 @@ describe("ZNSSubRegistrar", () => { ethers.ZeroAddress, DEFAULT_TOKEN_URI, distrConfigEmpty, - paymentConfigEmpty, + paymentConfigEmpty ) - ).to.be.revertedWith( - "ZNSSubRegistrar: Sender is not approved for purchase" + ).to.be.revertedWithCustomError( + zns.subRegistrar, + SENDER_NOT_APPROVED_ERR ); // remove user from mintlist @@ -2669,10 +2750,11 @@ describe("ZNSSubRegistrar", () => { ethers.ZeroAddress, DEFAULT_TOKEN_URI, distrConfigEmpty, - paymentConfigEmpty, + paymentConfigEmpty ) - ).to.be.revertedWith( - "ZNSSubRegistrar: Sender is not approved for purchase" + ).to.be.revertedWithCustomError( + zns.subRegistrar, + SENDER_NOT_APPROVED_ERR ); }); @@ -2702,13 +2784,10 @@ describe("ZNSSubRegistrar", () => { // try with non-authorized await expect( - zns.subRegistrar.connect(lvl5SubOwner).updateMintlistForDomain( - domainHash, - [lvl5SubOwner.address], - [true], - ) - ).to.be.revertedWith( - "ZNSSubRegistrar: Not authorized" + zns.subRegistrar.connect(lvl5SubOwner).updateMintlistForDomain(domainHash, [lvl5SubOwner.address], [true]) + ).to.be.revertedWithCustomError( + zns.subRegistrar, + NOT_AUTHORIZED_ERR ); }); @@ -2765,9 +2844,10 @@ describe("ZNSSubRegistrar", () => { ethers.ZeroAddress, DEFAULT_TOKEN_URI, distrConfigEmpty, - paymentConfigEmpty, + paymentConfigEmpty ) - ).to.be.revertedWith( + ).to.be.revertedWithCustomError( + zns.subRegistrar, DISTRIBUTION_LOCKED_NOT_EXIST_ERR ); @@ -2847,9 +2927,10 @@ describe("ZNSSubRegistrar", () => { ethers.ZeroAddress, DEFAULT_TOKEN_URI, distrConfigEmpty, - paymentConfigEmpty, + paymentConfigEmpty ) - ).to.be.revertedWith( + ).to.be.revertedWithCustomError( + zns.subRegistrar, DISTRIBUTION_LOCKED_NOT_EXIST_ERR ); }); @@ -2968,10 +3049,11 @@ describe("ZNSSubRegistrar", () => { lvl2SubOwner.address, DEFAULT_TOKEN_URI, domainConfigs[1].fullConfig.distrConfig, - paymentConfigEmpty, + paymentConfigEmpty ) - ).to.be.revertedWith( - "ZNSSubRegistrar: Subdomain already exists" + ).to.be.revertedWithCustomError( + zns.subRegistrar, + DOMAIN_EXISTS_ERR ); }); @@ -2984,12 +3066,11 @@ describe("ZNSSubRegistrar", () => { // fail await expect( - zns.rootRegistrar.connect(lvl3SubOwner).revokeDomain( - regResults[1].domainHash, - ) - ).to.be.revertedWith( - "ZNSRootRegistrar: Not the owner of both Name and Token" - ); + zns.rootRegistrar.connect(lvl3SubOwner).revokeDomain(regResults[1].domainHash) + ).to.be.revertedWithCustomError( + zns.rootRegistrar, + NOT_OWNER_OF_ERR + ).withArgs(2n, lvl3SubOwner.address, regResults[1].domainHash); // change owner back await zns.registry.connect(rootOwner).updateDomainOwner( @@ -3009,9 +3090,10 @@ describe("ZNSSubRegistrar", () => { zns.rootRegistrar.connect(lvl2SubOwner).revokeDomain( regResults[1].domainHash, ) - ).to.be.revertedWith( - "ZNSRootRegistrar: Not the owner of both Name and Token" - ); + ).to.be.revertedWithCustomError( + zns.rootRegistrar, + NOT_OWNER_OF_ERR + ).withArgs(2n, lvl2SubOwner.address, regResults[1].domainHash); // give token back await zns.domainToken.connect(lvl3SubOwner).transferFrom( @@ -3112,12 +3194,10 @@ describe("ZNSSubRegistrar", () => { }; await expect( - zns.subRegistrar.connect(lvl3SubOwner).setDistributionConfigForDomain( - domainHash, - newConfig, - ) - ).to.be.revertedWith( - "ZNSSubRegistrar: Not authorized" + zns.subRegistrar.connect(lvl3SubOwner).setDistributionConfigForDomain(domainHash, newConfig) + ).to.be.revertedWithCustomError( + zns.subRegistrar, + NOT_AUTHORIZED_ERR ); }); @@ -3131,12 +3211,10 @@ describe("ZNSSubRegistrar", () => { }; await expect( - zns.subRegistrar.connect(lvl3SubOwner).setDistributionConfigForDomain( - domainHash, - newConfig, - ) - ).to.be.revertedWith( - "ZNSSubRegistrar: pricerContract can not be 0x0 address" + zns.subRegistrar.connect(lvl3SubOwner).setDistributionConfigForDomain(domainHash, newConfig) + ).to.be.revertedWithCustomError( + zns.subRegistrar, + ZERO_ADDRESS_ERR ); }); }); @@ -3169,10 +3247,11 @@ describe("ZNSSubRegistrar", () => { await expect( zns.subRegistrar.connect(lvl2SubOwner).setPricerContractForDomain( domainHash, - await zns.curvePricer.getAddress(), + await zns.curvePricer.getAddress() ) - ).to.be.revertedWith( - "ZNSSubRegistrar: Not authorized" + ).to.be.revertedWithCustomError( + zns.subRegistrar, + NOT_AUTHORIZED_ERR ); }); @@ -3180,12 +3259,10 @@ describe("ZNSSubRegistrar", () => { const domainHash = regResults[2].domainHash; await expect( - zns.subRegistrar.connect(lvl3SubOwner).setPricerContractForDomain( - domainHash, - ethers.ZeroAddress, - ) - ).to.be.revertedWith( - "ZNSSubRegistrar: pricerContract can not be 0x0 address" + zns.subRegistrar.connect(lvl3SubOwner).setPricerContractForDomain(domainHash, ethers.ZeroAddress) + ).to.be.revertedWithCustomError( + zns.subRegistrar, + ZERO_ADDRESS_ERR ); }); }); @@ -3216,12 +3293,10 @@ describe("ZNSSubRegistrar", () => { const domainHash = regResults[2].domainHash; await expect( - zns.subRegistrar.connect(lvl2SubOwner).setPaymentTypeForDomain( - domainHash, - PaymentType.STAKE, - ) - ).to.be.revertedWith( - "ZNSSubRegistrar: Not authorized" + zns.subRegistrar.connect(lvl2SubOwner).setPaymentTypeForDomain(domainHash, PaymentType.STAKE) + ).to.be.revertedWithCustomError( + zns.subRegistrar, + NOT_AUTHORIZED_ERR ); }); @@ -3281,6 +3356,9 @@ describe("ZNSSubRegistrar", () => { const userBalbefore = await zns.meowToken.balanceOf(lvl3SubOwner.address); + const protocolFee = getStakingOrProtocolFee(stakedAfter); + + await zns.meowToken.connect(lvl3SubOwner).approve(await zns.treasury.getAddress(), protocolFee); // try revoking await zns.rootRegistrar.connect(lvl3SubOwner).revokeDomain( regResults[1].domainHash, @@ -3288,7 +3366,7 @@ describe("ZNSSubRegistrar", () => { // verify that refund has been acquired by the new owner const userBalAfter = await zns.meowToken.balanceOf(lvl3SubOwner.address); - expect(userBalAfter - userBalbefore).to.eq(fixedPrice); + expect(userBalAfter - userBalbefore).to.eq(fixedPrice - protocolFee); }); }); @@ -3318,7 +3396,7 @@ describe("ZNSSubRegistrar", () => { deployer.address, deployer.address, ) - ).to.be.revertedWith(INITIALIZED_ERR); + ).to.be.revertedWithCustomError(implContract, INITIALIZED_ERR); }); it("#setRootRegistrar() should set the new root registrar correctly and emit #RootRegistrarSet event", async () => { @@ -3330,18 +3408,17 @@ describe("ZNSSubRegistrar", () => { }); it("#setRootRegistrar() should NOT be callable by anyone other than ADMIN_ROLE", async () => { - await expect( - zns.subRegistrar.connect(random).setRootRegistrar(random.address), - ).to.be.revertedWith( - getAccessRevertMsg(random.address, ADMIN_ROLE), - ); + await expect(zns.subRegistrar.connect(random).setRootRegistrar(random.address)) + .to.be.revertedWithCustomError(zns.accessController, AC_UNAUTHORIZED_ERR) + .withArgs(random.address, ADMIN_ROLE); }); it("#setRootRegistrar should NOT set registrar as 0x0 address", async () => { await expect( - zns.subRegistrar.connect(admin).setRootRegistrar(ethers.ZeroAddress), - ).to.be.revertedWith( - "ZNSSubRegistrar: _registrar can not be 0x0 address", + zns.subRegistrar.connect(admin).setRootRegistrar(ethers.ZeroAddress) + ).to.be.revertedWithCustomError( + zns.subRegistrar, + ZERO_ADDRESS_ERR ); }); @@ -3354,19 +3431,15 @@ describe("ZNSSubRegistrar", () => { }); it("#setRegistry() should not be callable by anyone other than ADMIN_ROLE", async () => { - await expect( - zns.subRegistrar.connect(random).setRegistry(random.address), - ).to.be.revertedWith( - getAccessRevertMsg(random.address, ADMIN_ROLE), - ); + await expect(zns.subRegistrar.connect(random).setRegistry(random.address)) + .to.be.revertedWithCustomError(zns.accessController, AC_UNAUTHORIZED_ERR) + .withArgs(random.address, ADMIN_ROLE); }); it("#setAccessController() should not be callable by anyone other than ADMIN_ROLE", async () => { - await expect( - zns.subRegistrar.connect(random).setAccessController(random.address), - ).to.be.revertedWith( - getAccessRevertMsg(random.address, ADMIN_ROLE), - ); + await expect(zns.subRegistrar.connect(random).setAccessController(random.address)) + .to.be.revertedWithCustomError(zns.accessController, AC_UNAUTHORIZED_ERR) + .withArgs(random.address, ADMIN_ROLE); }); it("#getAccessController() should return the correct access controller", async () => { @@ -3450,7 +3523,10 @@ describe("ZNSSubRegistrar", () => { // Confirm the deployer is a governor, as set in `deployZNS` helper await expect(zns.accessController.checkGovernor(deployer.address)).to.not.be.reverted; - const tx = zns.subRegistrar.connect(deployer).upgradeTo(await newRegistrar.getAddress()); + const tx = zns.subRegistrar.connect(deployer).upgradeToAndCall( + await newRegistrar.getAddress(), + "0x" + ); await expect(tx).to.not.be.reverted; await expect( @@ -3459,7 +3535,7 @@ describe("ZNSSubRegistrar", () => { await zns.registry.getAddress(), await zns.rootRegistrar.getAddress(), ) - ).to.be.revertedWith(INITIALIZED_ERR); + ).to.be.revertedWithCustomError(zns.subRegistrar, INITIALIZED_ERR); }); it("Fails to upgrade if the caller is not authorized", async () => { @@ -3471,11 +3547,13 @@ describe("ZNSSubRegistrar", () => { // Confirm the account is not a governor await expect(zns.accessController.checkGovernor(lvl2SubOwner.address)).to.be.reverted; - const tx = zns.subRegistrar.connect(lvl2SubOwner).upgradeTo(await newRegistrar.getAddress()); - - await expect(tx).to.be.revertedWith( - getAccessRevertMsg(lvl2SubOwner.address, GOVERNOR_ROLE) + const tx = zns.subRegistrar.connect(lvl2SubOwner).upgradeToAndCall( + await newRegistrar.getAddress(), + "0x" ); + + await expect(tx).to.be.revertedWithCustomError(zns.accessController, AC_UNAUTHORIZED_ERR) + .withArgs(lvl2SubOwner.address, GOVERNOR_ROLE); }); it("Verifies that variable values are not changed in the upgrade process", async () => { @@ -3535,7 +3613,10 @@ describe("ZNSSubRegistrar", () => { const newRegistrar = await factory.deploy(); await newRegistrar.waitForDeployment(); - const tx = zns.subRegistrar.connect(deployer).upgradeTo(await newRegistrar.getAddress()); + const tx = zns.subRegistrar.connect(deployer).upgradeToAndCall( + await newRegistrar.getAddress(), + "0x" + ); await expect(tx).to.not.be.reverted; // create new proxy object diff --git a/test/ZNSTreasury.test.ts b/test/ZNSTreasury.test.ts index a223487dd..fcb589997 100644 --- a/test/ZNSTreasury.test.ts +++ b/test/ZNSTreasury.test.ts @@ -7,16 +7,16 @@ import { distrConfigEmpty, getPriceObject, NO_BENEFICIARY_ERR, - NOT_AUTHORIZED_REG_WIRED_ERR, INITIALIZED_ERR, DEFAULT_PRICE_CONFIG, - validateUpgrade, NOT_AUTHORIZED_TREASURY_ERR, + validateUpgrade, + NOT_AUTHORIZED_ERR, + getStakingOrProtocolFee, AC_UNAUTHORIZED_ERR, ZERO_ADDRESS_ERR, } from "./helpers"; -import { DeployZNSParams, IZNSContracts } from "./helpers/types"; +import { DeployZNSParams, IZNSContractsLocal } from "./helpers/types"; import * as ethers from "ethers"; import { hashDomainLabel, hashSubdomainName } from "./helpers/hashing"; import { ADMIN_ROLE, REGISTRAR_ROLE, GOVERNOR_ROLE } from "../src/deploy/constants"; -import { getAccessRevertMsg } from "./helpers/errors"; import { ZNSTreasury, ZNSTreasury__factory, ZNSTreasuryUpgradeMock__factory } from "../typechain"; import { getProxyImplAddress } from "./helpers/utils"; @@ -31,7 +31,7 @@ describe("ZNSTreasury", () => { let zeroVault : SignerWithAddress; let mockRegistrar : SignerWithAddress; let randomAcc : SignerWithAddress; - let zns : IZNSContracts; + let zns : IZNSContractsLocal; const domainName = "wilderrr"; const domainHash = hashDomainLabel(domainName); @@ -103,7 +103,10 @@ describe("ZNSTreasury", () => { zns.zeroVaultAddress, await zns.accessController.getAddress() ); - await expect(tx).to.be.revertedWith("Initializable: contract is already initialized"); + await expect(tx).to.be.revertedWithCustomError( + zns.treasury, + INITIALIZED_ERR + ); }); it("Should NOT let initialize the implementation contract", async () => { @@ -118,7 +121,7 @@ describe("ZNSTreasury", () => { zns.zeroVaultAddress, await zns.accessController.getAddress() ) - ).to.be.revertedWith(INITIALIZED_ERR); + ).to.be.revertedWithCustomError(implContract, INITIALIZED_ERR); }); it("should NOT deploy/initialize with 0x0 addresses as args", async () => { @@ -184,18 +187,15 @@ describe("ZNSTreasury", () => { }); it("Should revert if called from an address without REGISTRAR_ROLE", async () => { - await expect( - zns.treasury.connect(randomAcc).stakeForDomain( - ethers.ZeroHash, - domainHash, - user.address, - BigInt(0), - BigInt(0), - BigInt(0) - ) - ).to.be.revertedWith( - getAccessRevertMsg(randomAcc.address, REGISTRAR_ROLE) - ); + await expect(zns.treasury.connect(randomAcc).stakeForDomain( + ethers.ZeroHash, + domainHash, + user.address, + BigInt(0), + BigInt(0), + BigInt(0) + )).to.be.revertedWithCustomError(zns.accessController, AC_UNAUTHORIZED_ERR) + .withArgs(randomAcc.address,REGISTRAR_ROLE); }); it("Should fire StakeDeposited event with correct params", async () => { @@ -247,27 +247,27 @@ describe("ZNSTreasury", () => { const balanceBeforeUnstake = await zns.meowToken.balanceOf(user.address); const { token, amount: stake } = await zns.treasury.stakedForDomain(domainHash); - await zns.treasury.connect(mockRegistrar).unstakeForDomain(domainHash, user.address); + await zns.treasury.connect(mockRegistrar).unstakeForDomain(domainHash, user.address, protocolFee); await checkBalance({ token: zns.meowToken, balanceBefore: balanceBeforeUnstake, userAddress: user.address, - target: stake, + target: stake - protocolFee, shouldDecrease: false, }); expect(token).to.eq(await zns.meowToken.getAddress()); }); it("Should revert if called from an address without REGISTRAR_ROLE", async () => { - await expect( - zns.treasury.connect(user).unstakeForDomain( - domainHash, - user.address - ) - ).to.be.revertedWith( - getAccessRevertMsg(user.address, REGISTRAR_ROLE) - ); + const { amount } = await zns.treasury.stakedForDomain(domainHash); + const protocolFee = getStakingOrProtocolFee(amount); + await expect(zns.treasury.connect(user).unstakeForDomain( + domainHash, + user.address, + protocolFee + )).to.be.revertedWithCustomError(zns.accessController, AC_UNAUTHORIZED_ERR) + .withArgs(user.address,REGISTRAR_ROLE); }); }); @@ -338,21 +338,21 @@ describe("ZNSTreasury", () => { paymentAmt, protocolFee ) - ).to.be.revertedWith(NO_BENEFICIARY_ERR); + ).to.be.revertedWithCustomError( + zns.treasury, + NO_BENEFICIARY_ERR + ); }); it("should revert if called by anyone other than REGISTRAR_ROLE", async () => { - await expect( - zns.treasury.connect(randomAcc).processDirectPayment( - ethers.ZeroHash, - domainHash, - mockRegistrar.address, - "0", - "0" - ) - ).to.be.revertedWith( - getAccessRevertMsg(randomAcc.address, REGISTRAR_ROLE) - ); + await expect(zns.treasury.connect(randomAcc).processDirectPayment( + ethers.ZeroHash, + domainHash, + mockRegistrar.address, + "0", + "0" + )).to.be.revertedWithCustomError(zns.accessController, AC_UNAUTHORIZED_ERR) + .withArgs(randomAcc.address,REGISTRAR_ROLE); }); it("should emit DirectPaymentProcessed event with correct params", async () => { @@ -424,12 +424,10 @@ describe("ZNSTreasury", () => { }; await expect( - zns.treasury.connect(randomAcc).setPaymentConfig( - domainHash, - configToSet, - ) - ).to.be.revertedWith( - NOT_AUTHORIZED_TREASURY_ERR + zns.treasury.connect(randomAcc).setPaymentConfig(domainHash, configToSet) + ).to.be.revertedWithCustomError( + zns.treasury, + NOT_AUTHORIZED_ERR ); }); @@ -440,12 +438,10 @@ describe("ZNSTreasury", () => { }; await expect( - zns.treasury.connect(user).setPaymentConfig( - domainHash, - zeroBeneficiaryConf - ) - ).to.be.revertedWith( - "ZNSTreasury: beneficiary passed as 0x0 address" + zns.treasury.connect(user).setPaymentConfig(domainHash, zeroBeneficiaryConf) + ).to.be.revertedWithCustomError( + zns.treasury, + ZERO_ADDRESS_ERR ); const meowTokenConf = { @@ -454,12 +450,10 @@ describe("ZNSTreasury", () => { }; await expect( - zns.treasury.connect(user).setPaymentConfig( - domainHash, - meowTokenConf - ) - ).to.be.revertedWith( - "ZNSTreasury: paymentToken passed as 0x0 address" + zns.treasury.connect(user).setPaymentConfig(domainHash, meowTokenConf) + ).to.be.revertedWithCustomError( + zns.treasury, + ZERO_ADDRESS_ERR ); }); }); @@ -490,9 +484,7 @@ describe("ZNSTreasury", () => { ethers.ZeroHash, mockRegistrar.address ); - await expect(tx).to.be.revertedWith( - NOT_AUTHORIZED_REG_WIRED_ERR - ); + await expect(tx).to.be.revertedWithCustomError(zns.treasury, NOT_AUTHORIZED_ERR); }); it("Should revert when beneficiary is address 0", async () => { @@ -500,7 +492,7 @@ describe("ZNSTreasury", () => { ethers.ZeroHash, ethers.ZeroAddress ); - await expect(tx).to.be.revertedWith("ZNSTreasury: beneficiary passed as 0x0 address"); + await expect(tx).to.be.revertedWithCustomError(zns.treasury, ZERO_ADDRESS_ERR); }); }); @@ -528,14 +520,15 @@ describe("ZNSTreasury", () => { domainHash, randomAcc.address ); - await expect(tx).to.be.revertedWith( - NOT_AUTHORIZED_REG_WIRED_ERR + await expect(tx).to.be.revertedWithCustomError( + zns.treasury, + NOT_AUTHORIZED_ERR ); }); it("Should revert when paymentToken is address 0", async () => { const tx = zns.treasury.connect(user).setPaymentToken(domainHash, ethers.ZeroAddress); - await expect(tx).to.be.revertedWith("ZNSTreasury: paymentToken passed as 0x0 address"); + await expect(tx).to.be.revertedWithCustomError(zns.treasury, ZERO_ADDRESS_ERR); }); }); @@ -554,14 +547,13 @@ describe("ZNSTreasury", () => { it("Should revert when called from any address without ADMIN_ROLE", async () => { const tx = zns.treasury.connect(user).setAccessController(randomAcc.address); - await expect(tx).to.be.revertedWith( - getAccessRevertMsg(user.address, ADMIN_ROLE) - ); + await expect(tx).to.be.revertedWithCustomError(zns.accessController, AC_UNAUTHORIZED_ERR) + .withArgs(user.address,ADMIN_ROLE); }); it("Should revert when accessController is address 0", async () => { const tx = zns.treasury.setAccessController(ethers.ZeroAddress); - await expect(tx).to.be.revertedWith("AC: _accessController is 0x0 address"); + await expect(tx).to.be.revertedWithCustomError(zns.treasury, ZERO_ADDRESS_ERR); }); }); @@ -580,14 +572,13 @@ describe("ZNSTreasury", () => { it("Should revert when called from any address without ADMIN_ROLE", async () => { const tx = zns.treasury.connect(user).setRegistry(randomAcc.address); - await expect(tx).to.be.revertedWith( - getAccessRevertMsg(user.address, ADMIN_ROLE) - ); + await expect(tx).to.be.revertedWithCustomError(zns.accessController, AC_UNAUTHORIZED_ERR) + .withArgs(user.address,ADMIN_ROLE); }); it("Should revert when registry is address 0", async () => { const tx = zns.treasury.setRegistry(ethers.ZeroAddress); - await expect(tx).to.be.revertedWith("ARegistryWired: _registry can not be 0x0 address"); + await expect(tx).to.be.revertedWithCustomError(zns.treasury, ZERO_ADDRESS_ERR); }); }); @@ -602,7 +593,10 @@ describe("ZNSTreasury", () => { const treasury = await treasuryFactory.deploy(); await treasury.waitForDeployment(); - await expect(zns.treasury.connect(deployer).upgradeTo(await treasury.getAddress())).to.not.be.reverted; + await expect(zns.treasury.connect(deployer).upgradeToAndCall( + await treasury.getAddress(), + "0x" + )).to.not.be.reverted; }); it("Fails when an unauthorized user tries to upgrade the contract", async () => { @@ -614,8 +608,12 @@ describe("ZNSTreasury", () => { const treasury = await treasuryFactory.deploy(); await treasury.waitForDeployment(); - const deployTx = zns.treasury.connect(user).upgradeTo(await treasury.getAddress()); - await expect(deployTx).to.be.revertedWith(getAccessRevertMsg(user.address, GOVERNOR_ROLE)); + const deployTx = zns.treasury.connect(user).upgradeToAndCall( + await treasury.getAddress(), + "0x" + ); + await expect(deployTx).to.be.revertedWithCustomError(zns.accessController, AC_UNAUTHORIZED_ERR) + .withArgs(user.address, GOVERNOR_ROLE); }); it("Verifies that variable values are not changed in the upgrade process", async () => { diff --git a/test/gas/TransactionGasCosts.test.ts b/test/gas/TransactionGasCosts.test.ts index 7ef814a67..d27dd3200 100644 --- a/test/gas/TransactionGasCosts.test.ts +++ b/test/gas/TransactionGasCosts.test.ts @@ -1,4 +1,4 @@ -import { IDistributionConfig, IZNSContracts } from "../helpers/types"; +import { IDistributionConfig, IZNSContractsLocal } from "../helpers/types"; import * as hre from "hardhat"; import { AccessType, DEFAULT_TOKEN_URI, deployZNS, PaymentType, DEFAULT_PRICE_CONFIG } from "../helpers"; import * as ethers from "ethers"; @@ -18,7 +18,7 @@ describe("Transaction Gas Costs Test", () => { let lvl2SubOwner : SignerWithAddress; let zeroVault : SignerWithAddress; - let zns : IZNSContracts; + let zns : IZNSContractsLocal; let rootHashDirect : string; // let rootHashStake : string; diff --git a/test/gas/gas-costs.json b/test/gas/gas-costs.json index 0e8224f11..c533f9173 100644 --- a/test/gas/gas-costs.json +++ b/test/gas/gas-costs.json @@ -1,4 +1,4 @@ { - "Root Domain Price": "475352", - "Subdomain Price": "469054" + "Root Domain Price": "470041", + "Subdomain Price": "463156" } \ No newline at end of file diff --git a/test/helpers/constants.ts b/test/helpers/constants.ts index 994f4ebbb..a3adc1bc1 100644 --- a/test/helpers/constants.ts +++ b/test/helpers/constants.ts @@ -2,8 +2,8 @@ import { ethers } from "hardhat"; import { ICurvePriceConfig } from "../../src/deploy/missions/types"; export const DEFAULT_RESOLVER_TYPE = "address"; -export const ZNS_DOMAIN_TOKEN_NAME = "ZERO NAME ADDRESS"; -export const ZNS_DOMAIN_TOKEN_SYMBOL = "ZNA"; +export const ZNS_DOMAIN_TOKEN_NAME = "ZERO ID"; +export const ZNS_DOMAIN_TOKEN_SYMBOL = "ZID"; export const DEFAULT_ROYALTY_FRACTION = BigInt("200"); export const DEFAULT_TOKEN_URI = "https://www.zns.domains/7c654a5f"; diff --git a/test/helpers/deploy-helpers.ts b/test/helpers/deploy-helpers.ts index 5484981ab..9018532d1 100644 --- a/test/helpers/deploy-helpers.ts +++ b/test/helpers/deploy-helpers.ts @@ -2,16 +2,17 @@ // For use in inegration test of deployment campaign import * as hre from "hardhat"; import { SignerWithAddress } from "@nomicfoundation/hardhat-ethers/signers"; -import { IDeployCampaignConfig, TLogger, TZNSContractState } from "../../src/deploy/campaign/types"; +import { IZNSCampaignConfig, IZNSContracts } from "../../src/deploy/campaign/types"; import { ethers } from "ethers"; -import { IDistributionConfig } from "./types"; +import { IDistributionConfig, IZNSContractsLocal } from "./types"; import { expect } from "chai"; import { hashDomainLabel, paymentConfigEmpty } from "."; import { ICurvePriceConfig } from "../../src/deploy/missions/types"; +import { TLogger } from "@zero-tech/zdc"; export const approveBulk = async ( signers : Array, - zns : TZNSContractState, + zns : IZNSContractsLocal | IZNSContracts, ) => { for (const signer of signers) { // if (hre.network.name === "hardhat") { @@ -32,7 +33,7 @@ export const approveBulk = async ( export const mintBulk = async ( signers : Array, amount : bigint, - zns : TZNSContractState, + zns : IZNSContractsLocal | IZNSContracts, ) => { for (const signer of signers) { await zns.meowToken.connect(signer).mint( @@ -44,7 +45,7 @@ export const mintBulk = async ( export const getPriceBulk = async ( domains : Array, - zns : TZNSContractState, + zns : IZNSContractsLocal | IZNSContracts, parentHashes ?: Array, ) => { let index = 0; @@ -83,11 +84,11 @@ export const getPriceBulk = async ( export const registerRootDomainBulk = async ( signers : Array, domains : Array, - config : IDeployCampaignConfig, + config : IZNSCampaignConfig, tokenUri : string, distConfig : IDistributionConfig, priceConfig : ICurvePriceConfig, - zns : TZNSContractState, + zns : IZNSContractsLocal | IZNSContracts, logger : TLogger, ) : Promise => { let index = 0; @@ -133,7 +134,7 @@ export const registerSubdomainBulk = async ( domainAddress : string, tokenUri : string, distConfig : IDistributionConfig, - zns : TZNSContractState, + zns : IZNSContractsLocal | IZNSContracts, logger : TLogger, ) => { let index = 0; diff --git a/test/helpers/deploy/deploy-zns.ts b/test/helpers/deploy/deploy-zns.ts index 21f361720..c2006a9d5 100644 --- a/test/helpers/deploy/deploy-zns.ts +++ b/test/helpers/deploy/deploy-zns.ts @@ -20,7 +20,7 @@ import { ZNSSubRegistrar, MeowTokenMock, } from "../../../typechain"; -import { DeployZNSParams, RegistrarConfig, IZNSContracts } from "../types"; +import { DeployZNSParams, RegistrarConfig, IZNSContractsLocal } from "../types"; import * as hre from "hardhat"; import { ethers, upgrades } from "hardhat"; import { SignerWithAddress } from "@nomicfoundation/hardhat-ethers/signers"; @@ -522,7 +522,7 @@ export const deployZNS = async ({ priceConfig = DEFAULT_PRICE_CONFIG, zeroVaultAddress = deployer.address, isTenderlyRun = false, -} : DeployZNSParams) : Promise => { +} : DeployZNSParams) : Promise => { // 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 @@ -614,7 +614,7 @@ export const deployZNS = async ({ isTenderlyRun, }); - const znsContracts : IZNSContracts = { + const znsContracts : IZNSContractsLocal = { accessController, registry, domainToken, diff --git a/test/helpers/env.ts b/test/helpers/env.ts new file mode 100644 index 000000000..5457ffa7a --- /dev/null +++ b/test/helpers/env.ts @@ -0,0 +1,34 @@ + +interface EnvConfig { + [key : string] : string; +} + +let defaults : EnvConfig | null = null; + +export const clearEnvDefaults = () => { + if (defaults) { + Object.keys(defaults).forEach(key => { + delete defaults?.[key]; + }); + } +}; + +export const setEnvVars = (config : EnvConfig) => { + Object.keys(config).forEach(key => { + if (!defaults) defaults = {}; + + defaults[key] = process.env[key]?.toString() || ""; + }); + + Object.keys(config).forEach(key => { + process.env[key] = config[key]; + }); +}; + +export const setDefaultEnv = () => { + if (defaults) { + Object.keys(defaults).forEach(key => { + process.env[key] = defaults?.[key]; + }); + } +}; diff --git a/test/helpers/errors.ts b/test/helpers/errors.ts index 2d6cdf0e9..cbb42de14 100644 --- a/test/helpers/errors.ts +++ b/test/helpers/errors.ts @@ -5,40 +5,44 @@ export const getAccessRevertMsg = (addr : string, role : string) : string => // When adding a revert test, check if this message is already present in other tests // if it is, add a new constant here and use it in all tests +// AccessControl +export const AC_UNAUTHORIZED_ERR = "AccessControlUnauthorizedAccount"; + +// ERC20 +export const INSUFFICIENT_BALANCE_ERC_ERR = "ERC20InsufficientBalance"; +export const INSUFFICIENT_ALLOWANCE_ERC_ERR = "ERC20InsufficientAllowance"; + +// CommonErrors.sol +export const ZERO_ADDRESS_ERR = "ZeroAddressPassed"; +export const DOMAIN_EXISTS_ERR = "DomainAlreadyExists"; +export const NOT_AUTHORIZED_ERR = "NotAuthorizedForDomain"; + +// IZNSPricer.sol +export const PARENT_CONFIG_NOT_SET_ERR = "ParentPriceConfigNotSet"; +export const FEE_TOO_LARGE_ERR = "FeePercentageValueTooLarge"; + // ZNSCurvePricer.sol -export const MULTIPLIER_BELOW_MIN_ERR = "ZNSCurvePricer: Multiplier must be >= baseLength + 1"; -export const NO_ZERO_MULTIPLIER_ERR = "ZNSCurvePricer: Multiplier cannot be 0"; -export const MULTIPLIER_OUT_OF_RANGE_ORA_ERR = "ZNSCurvePricer: Multiplier out of range"; -export const CURVE_NO_ZERO_PRECISION_MULTIPLIER_ERR = "ZNSCurvePricer: precisionMultiplier cannot be 0"; -export const CURVE_PRICE_CONFIG_ERR = "ZNSCurvePricer: incorrect value set causes the price spike at maxLength."; - -// ZNSRegistry -export const ONLY_NAME_OWNER_REG_ERR = "ZNSRegistry: Not the Name Owner"; -export const ONLY_OWNER_REGISTRAR_REG_ERR = "ZNSRegistry: Only Name Owner or Registrar allowed to call"; -export const NOT_AUTHORIZED_REG_WIRED_ERR = "ARegistryWired: Not authorized. Only Owner or Operator allowed"; -export const NOT_AUTHORIZED_REG_ERR = "ZNSRegistry: Not authorized"; -export const OWNER_NOT_ZERO_REG_ERR = "ZNSRegistry: Owner cannot be zero address"; +export const INVALID_MULTIPLIER_ERR = "InvalidMultiplierPassed"; +export const INVALID_PRICE_CONFIG_ERR = "InvalidConfigCausingPriceSpikes"; // ZNSRootRegistrar.sol -export const NOT_NAME_OWNER_RAR_ERR = "ZNSRootRegistrar: Not the owner of the Name"; -export const NOT_TOKEN_OWNER_RAR_ERR = "ZNSRootRegistrar: Not the owner of the Token"; -export const NOT_BOTH_OWNER_RAR_ERR = "ZNSRootRegistrar: Not the owner of both Name and Token"; +export const NOT_OWNER_OF_ERR = "NotTheOwnerOf"; // Subdomain Registrar // eslint-disable-next-line max-len -export const DISTRIBUTION_LOCKED_NOT_EXIST_ERR = "ZNSSubRegistrar: Parent domain's distribution is locked or parent does not exist"; +export const DISTRIBUTION_LOCKED_NOT_EXIST_ERR = "ParentLockedOrDoesntExist"; +export const SENDER_NOT_APPROVED_ERR = "SenderNotApprovedForPurchase"; // StringUtils -export const INVALID_NAME_ERR = "StringUtils: Invalid domain label"; -export const INVALID_LENGTH_ERR = "StringUtils: Domain label too long or nonexistent"; +export const INVALID_LABEL_ERR = "DomainLabelContainsInvalidCharacters"; +export const INVALID_LENGTH_ERR = "DomainLabelTooLongOrNonexistent"; // Treasury -export const NO_BENEFICIARY_ERR = "ZNSTreasury: parent domain has no beneficiary set"; -export const NOT_AUTHORIZED_TREASURY_ERR = "ZNSTreasury: Not authorized."; +export const NO_BENEFICIARY_ERR = "NoBeneficiarySetForParent"; // OpenZeppelin -export const INVALID_TOKENID_ERC_ERR = "ERC721: invalid token ID"; -export const INITIALIZED_ERR = "Initializable: contract is already initialized"; +export const NONEXISTENT_TOKEN_ERC_ERR = "ERC721NonexistentToken"; +export const INITIALIZED_ERR = "InvalidInitialization"; // Environment validation export const INVALID_ENV_ERR = "Invalid environment value. Must set env to one of `dev`, `test`, or `prod`"; diff --git a/test/helpers/events.ts b/test/helpers/events.ts index 0fb5ddff8..d94501ace 100644 --- a/test/helpers/events.ts +++ b/test/helpers/events.ts @@ -1,7 +1,8 @@ -import { IZNSContracts } from "./types"; import { SignerWithAddress } from "@nomicfoundation/hardhat-ethers/signers"; import { time } from "@nomicfoundation/hardhat-toolbox/network-helpers"; import { TypedContractEvent, TypedEventLog } from "../../typechain/common"; +import { IZNSContractsLocal } from "./types"; +import { IZNSContracts } from "../../src/deploy/campaign/types"; export const getDomainRegisteredEvents = async ({ @@ -11,7 +12,7 @@ export const getDomainRegisteredEvents = async ({ registrant = undefined, blockRange = 50, } : { - zns : IZNSContracts; + zns : IZNSContractsLocal; domainHash ?: string | undefined; tokenId ?: bigint | undefined; registrant ?: string | undefined; @@ -35,7 +36,7 @@ export const getDomainHashFromEvent = async ({ zns, user, } : { - zns : IZNSContracts; + zns : IZNSContractsLocal | IZNSContracts; user : SignerWithAddress; }) : Promise => { const latestBlock = await time.latestBlock(); diff --git a/test/helpers/flows/registration.ts b/test/helpers/flows/registration.ts index 58954e683..7cef8dfa2 100644 --- a/test/helpers/flows/registration.ts +++ b/test/helpers/flows/registration.ts @@ -1,4 +1,4 @@ -import { IDomainConfigForTest, IZNSContracts, IPathRegResult } from "../types"; +import { IDomainConfigForTest, IPathRegResult, IZNSContractsLocal } from "../types"; import { registrationWithSetup } from "../register-setup"; import { ethers } from "ethers"; import { getPriceObject, getStakingOrProtocolFee } from "../pricing"; @@ -12,7 +12,7 @@ export const registerDomainPath = async ({ zns, domainConfigs, } : { - zns : IZNSContracts; + zns : IZNSContractsLocal; domainConfigs : Array; }) => domainConfigs.reduce( async ( @@ -93,7 +93,7 @@ export const validatePathRegistration = async ({ domainConfigs, regResults, } : { - zns : IZNSContracts; + zns : IZNSContractsLocal; domainConfigs : Array; regResults : Array; }) => domainConfigs.reduce( diff --git a/test/helpers/register-setup.ts b/test/helpers/register-setup.ts index 3a9c765bc..ba8342943 100644 --- a/test/helpers/register-setup.ts +++ b/test/helpers/register-setup.ts @@ -2,8 +2,8 @@ import { SignerWithAddress } from "@nomicfoundation/hardhat-ethers/signers"; import { IDistributionConfig, IFixedPriceConfig, - IFullDistributionConfig, - IZNSContracts, + IFullDistributionConfig, IZNSContractsLocal, + } from "./types"; import { ContractTransactionReceipt, ethers } from "ethers"; import { getDomainHashFromEvent } from "./events"; @@ -11,6 +11,7 @@ import { distrConfigEmpty, fullDistrConfigEmpty, DEFAULT_TOKEN_URI, paymentConfi import { getTokenContract } from "./tokens"; import { ICurvePriceConfig } from "../../src/deploy/missions/types"; import { expect } from "chai"; +import { IZNSContracts } from "../../src/deploy/campaign/types"; const { ZeroAddress } = ethers; @@ -24,7 +25,7 @@ export const defaultRootRegistration = async ({ distrConfig = distrConfigEmpty, } : { user : SignerWithAddress; - zns : IZNSContracts; + zns : IZNSContractsLocal | IZNSContracts; domainName : string; domainContent ?: string; tokenURI ?: string; @@ -52,7 +53,7 @@ export const approveForParent = async ({ user, domainLabel, } : { - zns : IZNSContracts; + zns : IZNSContractsLocal | IZNSContracts; parentHash : string; user : SignerWithAddress; domainLabel : string; @@ -91,7 +92,7 @@ export const defaultSubdomainRegistration = async ({ distrConfig, } : { user : SignerWithAddress; - zns : IZNSContracts; + zns : IZNSContractsLocal | IZNSContracts; parentHash : string; subdomainLabel : string; domainContent ?: string; @@ -125,7 +126,7 @@ export const registrationWithSetup = async ({ fullConfig = fullDistrConfigEmpty, setConfigs = true, } : { - zns : IZNSContracts; + zns : IZNSContractsLocal | IZNSContracts; user : SignerWithAddress; parentHash ?: string; domainLabel : string; diff --git a/test/helpers/types.ts b/test/helpers/types.ts index 1d7dfd997..49b03016a 100644 --- a/test/helpers/types.ts +++ b/test/helpers/types.ts @@ -1,4 +1,5 @@ import { + MeowTokenMock, ZNSAccessController, ZNSAddressResolver, ZNSAddressResolverUpgradeMock, @@ -24,7 +25,6 @@ import { ZNSTreasury, ZNSTreasuryUpgradeMock, ZNSTreasuryUpgradeMock__factory, - MeowTokenMock, } from "../../typechain"; import { SignerWithAddress } from "@nomicfoundation/hardhat-ethers/signers"; import { ICurvePriceConfig } from "../../src/deploy/missions/types"; @@ -65,16 +65,6 @@ export type ZNSContractMock = ZNSAddressResolverUpgradeMock | ZNSDomainTokenUpgradeMock; -export type ZNSContract = - ZNSRootRegistrar | - ZNSSubRegistrar | - ZNSCurvePricer | - ZNSFixedPricer | - ZNSTreasury | - ZNSRegistry | - ZNSAddressResolver | - ZNSDomainToken; - export interface IFixedPriceConfig { price : bigint; feePercentage : bigint; @@ -87,7 +77,7 @@ export interface RegistrarConfig { domainTokenAddress : string; } -export interface IZNSContracts { +export interface IZNSContractsLocal { accessController : ZNSAccessController; registry : ZNSRegistry; domainToken : ZNSDomainToken; @@ -148,4 +138,3 @@ export interface IPathRegResult { zeroVaultBalanceBefore : bigint; zeroVaultBalanceAfter : bigint; } - diff --git a/test/helpers/upgrade/mock-dms.ts b/test/helpers/upgrade/mock-dms.ts new file mode 100644 index 000000000..3c56aea83 --- /dev/null +++ b/test/helpers/upgrade/mock-dms.ts @@ -0,0 +1,28 @@ +/* eslint-disable max-classes-per-file */ +import { ZNSDomainTokenDM, ZNSRegistryDM, ZNSRootRegistrarDM } from "../../../src/deploy/missions/contracts"; + + +export class ZNSRegistryUpgradeMockDM extends ZNSRegistryDM { + contractName = "ZNSRegistryUpgradeMock"; // point to the mocked modified contract in `upgrade-test-mocks` dir + + get dbName () : string { + // TODO upg: import actual contract names map from zDC and use it here in all below DMs! + return "ZNSRegistry"; + } +} + +export class ZNSRootRegistrarUpgradeMockDM extends ZNSRootRegistrarDM { + contractName = "ZNSRootRegistrarUpgradeMock"; + + get dbName () : string { + return "ZNSRootRegistrar"; + } +} + +export class ZNSDomainTokenUpgradeMockDM extends ZNSDomainTokenDM { + contractName = "ZNSDomainTokenUpgradeMock"; + + get dbName () : string { + return "ZNSDomainToken"; + } +} diff --git a/test/helpers/validate-upgrade.ts b/test/helpers/validate-upgrade.ts index d0db5bfd9..1cace9578 100644 --- a/test/helpers/validate-upgrade.ts +++ b/test/helpers/validate-upgrade.ts @@ -1,18 +1,23 @@ import { expect } from "chai"; import { SignerWithAddress } from "@nomicfoundation/hardhat-ethers/signers"; -import { ZNSContract, ZNSContractMock, ZNSContractMockFactory, GeneralContractGetter } from "./types"; +import { ZNSContractMock, ZNSContractMockFactory, GeneralContractGetter } from "./types"; +import { ZNSContract } from "../../src/deploy/campaign/types"; +import { ZNSAccessController } from "../../typechain"; +import { MeowToken } from "@zero-tech/ztoken/typechain-js"; export const validateUpgrade = async ( deployer : SignerWithAddress, - contract : ZNSContract, + contract : Exclude, MeowToken>, upgradeContract : ZNSContractMock, upgradeContractFactory : ZNSContractMockFactory, getters : Array ) => { const preVals = await Promise.all(getters); - await contract.connect(deployer).upgradeTo(await upgradeContract.getAddress()); + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + await contract.connect(deployer).upgradeToAndCall(await upgradeContract.getAddress(), "0x"); // Typechain doesn't update the generated interface for the contract after upgrading // so we use the new factory to attach to the existing address instead diff --git a/test/mocha-global.ts b/test/mocha-global.ts index 47592e86b..eea91c45a 100644 --- a/test/mocha-global.ts +++ b/test/mocha-global.ts @@ -1,12 +1,12 @@ -import { getMongoAdapter } from "../src/deploy/db/mongo-adapter/get-adapter"; +import { getZnsMongoAdapter } from "../src/deploy/mongo"; export const mochaGlobalSetup = async () => { - await getMongoAdapter(); + await getZnsMongoAdapter(); }; export const mochaGlobalTeardown = async () => { - const mongoAdapter = await getMongoAdapter(); + const mongoAdapter = await getZnsMongoAdapter(); // the next line can be commented out to leave the DB after test to manually test await mongoAdapter.dropDB(); await mongoAdapter.close(); diff --git a/test/zns-upgrade-smoke.test.ts b/test/zns-upgrade-smoke.test.ts new file mode 100644 index 000000000..05c605c12 --- /dev/null +++ b/test/zns-upgrade-smoke.test.ts @@ -0,0 +1,157 @@ +import * as hre from "hardhat"; +import { SignerWithAddress } from "@nomicfoundation/hardhat-ethers/signers"; +import { IZNSCampaignConfig, IZNSContracts } from "../src/deploy/campaign/types"; +import { getCampaignConfig } from "../src/deploy/campaign/environments"; +import { runZnsCampaign } from "../src/deploy/zns-campaign"; +import { setDefaultEnv, setEnvVars } from "./helpers/env"; +import { DeployCampaign, getLogger, HardhatDeployer, MongoDBAdapter, resetMongoAdapter } from "@zero-tech/zdc"; +import { getZnsMongoAdapter } from "../src/deploy/mongo"; +import { + MeowTokenDM, + ZNSAccessControllerDM, + ZNSAddressResolverDM, ZNSCurvePricerDM, + ZNSFixedPricerDM, + ZNSSubRegistrarDM, ZNSTreasuryDM, +} from "../src/deploy/missions/contracts"; +import { + ZNSDomainTokenUpgradeMockDM, + ZNSRootRegistrarUpgradeMockDM, + ZNSRegistryUpgradeMockDM, +} from "./helpers/upgrade/mock-dms"; +import { expect } from "chai"; + + +describe("ZNS Upgrade Smoke Test", () => { + let deployAdmin : SignerWithAddress; + let user : SignerWithAddress; + let governor : SignerWithAddress; + let admin : SignerWithAddress; + let zeroVault : SignerWithAddress; + + let znsInitial : IZNSContracts; + let znsUpgraded : IZNSContracts; + + let dbAdapter : MongoDBAdapter; + let campaignInitial : DeployCampaign; + let campaignUpgraded : DeployCampaign; + + before(async () => { + setEnvVars({ + UPGRADE: "false", + ARCHIVE_PREVIOUS_DB_VERSION: "true", + }); + + [deployAdmin, zeroVault, user, governor, admin] = await hre.ethers.getSigners(); + + let config = await getCampaignConfig({ + deployer: deployAdmin, + zeroVaultAddress: zeroVault.address, + governors: [deployAdmin.address, governor.address], + admins: [deployAdmin.address, admin.address], + }); + + campaignInitial = await runZnsCampaign({ + config, + }); + + znsInitial = campaignInitial.state.contracts; + + process.env.UPGRADE = "true"; + resetMongoAdapter(); + + // make upgrade campaign + config = await getCampaignConfig({ + deployer: deployAdmin, + zeroVaultAddress: zeroVault.address, + governors: [deployAdmin.address, governor.address], + admins: [deployAdmin.address, admin.address], + }); + + const logger = getLogger(); + + const deployer = new HardhatDeployer({ + hre, + signer: config.deployAdmin, + env: config.env, + }); + + dbAdapter = await getZnsMongoAdapter(); + + campaignUpgraded = new DeployCampaign< + IZNSCampaignConfig, + IZNSContracts + >({ + missions: [ + ZNSAccessControllerDM, + ZNSRegistryUpgradeMockDM, // this is new contract + ZNSDomainTokenUpgradeMockDM, // this is new contract + MeowTokenDM, + ZNSAddressResolverDM, + ZNSCurvePricerDM, + ZNSTreasuryDM, + ZNSRootRegistrarUpgradeMockDM, // this is new contract + ZNSFixedPricerDM, + ZNSSubRegistrarDM, + ], + deployer, + dbAdapter, + logger, + config, + }); + + await campaignUpgraded.execute(); + + await dbAdapter.finalize(); + + znsUpgraded = campaignUpgraded.state.contracts; + }); + + after(async () => { + setDefaultEnv(); + }); + + it.only("smoke test", async () => { + await [ + "registry", + "domainToken", + "rootRegistrar", + ].reduce(async (acc, instName) => { + await acc; + + expect(await znsInitial[instName].getAddress()).to.equal(await znsUpgraded[instName].getAddress()); + + const { + state: { + instances : { + [instName]: { + contractName: contractNameInitial, + }, + }, + }, + } = campaignInitial; + + const { + state: { + instances : { + [instName]: { + contractName: contractNameUpgraded, + }, + }, + }, + } = campaignUpgraded; + + expect(contractNameInitial).to.equal(contractNameUpgraded); + + const versions = await campaignUpgraded.dbAdapter.versioner.getAllVersions(); + console.log(versions); + + // const { + // implementation: implAddressInitial, + // } = await campaignInitial.dbAdapter.getContract(contractNameInitial); + // + // expect(await dbAdapter.getContract(contractNameInitial)).to.equal(); + }, + Promise.resolve() + ); + }); +}); diff --git a/tsconfig.json b/tsconfig.json index 89d3cb260..949eb6c22 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -5,6 +5,7 @@ } }, "compilerOptions": { + "outDir": "dist", "target": "es2022", "module": "node16", "moduleResolution": "node16", diff --git a/yarn.lock b/yarn.lock index 9a1d19870..2a7cab49e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,15 +2,10 @@ # yarn lockfile v1 -"@aashutoshrathi/word-wrap@^1.2.3": - version "1.2.6" - resolved "https://registry.yarnpkg.com/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz#bd9154aec9983f77b3a034ecaa015c2e4201f6cf" - integrity sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA== - -"@adraffy/ens-normalize@1.10.0": - version "1.10.0" - resolved "https://registry.yarnpkg.com/@adraffy/ens-normalize/-/ens-normalize-1.10.0.tgz#d2a39395c587e092d77cbbc80acf956a54f38bf7" - integrity sha512-nA9XHtlAkYfJxY7bce8DcN7eKxWWCWkU+1GR9d+U6MbNpfwQp8TI7vqOsBsMcHoT4mBu2kypKoSKnghEzOOq5Q== +"@adraffy/ens-normalize@1.10.1": + version "1.10.1" + resolved "https://registry.yarnpkg.com/@adraffy/ens-normalize/-/ens-normalize-1.10.1.tgz#63430d04bd8c5e74f8d7d049338f1cd9d4f02069" + integrity sha512-96Z2IP3mYmF1Xg2cDm8f1gWGf/HUVedQ3FMifV4kG/PQ4yEP51xDtRAEfhVNt5f/uzpNkZHwWQuUcu6D6K+Ekw== "@aws-crypto/sha256-js@1.2.2": version "1.2.2" @@ -31,12 +26,12 @@ tslib "^1.11.1" "@aws-sdk/types@^3.1.0": - version "3.468.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/types/-/types-3.468.0.tgz#f97b34fc92a800d1d8b866f47693ae8f3d46517b" - integrity sha512-rx/9uHI4inRbp2tw3Y4Ih4PNZkVj32h7WneSg3MVgVjAoVD5Zti9KhS5hkvsBxfgmQmg0AQbE+b1sy5WGAgntA== + version "3.649.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/types/-/types-3.649.0.tgz#a6828e6338dc755e0c30b5f77321e63425a88aed" + integrity sha512-PuPw8RysbhJNlaD2d/PzOTf8sbf4Dsn2b7hwyGh7YVG3S75yTpxSAZxrnhKsz9fStgqFmnw/jUfV/G+uQAeTVw== dependencies: - "@smithy/types" "^2.7.0" - tslib "^2.5.0" + "@smithy/types" "^3.4.0" + tslib "^2.6.2" "@aws-sdk/util-utf8-browser@^3.0.0": version "3.259.0" @@ -46,70 +41,35 @@ tslib "^2.3.1" "@babel/code-frame@^7.0.0", "@babel/code-frame@^7.21.4": - version "7.23.5" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.23.5.tgz#9009b69a8c602293476ad598ff53e4562e15c244" - integrity sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA== + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.24.7.tgz#882fd9e09e8ee324e496bd040401c6f046ef4465" + integrity sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA== dependencies: - "@babel/highlight" "^7.23.4" - chalk "^2.4.2" + "@babel/highlight" "^7.24.7" + picocolors "^1.0.0" -"@babel/helper-validator-identifier@^7.22.20": - version "7.22.20" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz#c4ae002c61d2879e724581d96665583dbc1dc0e0" - integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A== +"@babel/helper-validator-identifier@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz#75b889cfaf9e35c2aaf42cf0d72c8e91719251db" + integrity sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w== -"@babel/highlight@^7.23.4": - version "7.23.4" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.23.4.tgz#edaadf4d8232e1a961432db785091207ead0621b" - integrity sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A== +"@babel/highlight@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.24.7.tgz#a05ab1df134b286558aae0ed41e6c5f731bf409d" + integrity sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw== dependencies: - "@babel/helper-validator-identifier" "^7.22.20" + "@babel/helper-validator-identifier" "^7.24.7" chalk "^2.4.2" js-tokens "^4.0.0" + picocolors "^1.0.0" "@babel/runtime@^7.4.4": - version "7.23.6" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.23.6.tgz#c05e610dc228855dc92ef1b53d07389ed8ab521d" - integrity sha512-zHd0eUrf5GZoOWVCXp6koAKQTfZV07eit6bGPmJgnZdnSAvvZee6zniW2XMF7Cmc4ISOOnPy3QaSiIJGJkVEDQ== + version "7.25.6" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.25.6.tgz#9afc3289f7184d8d7f98b099884c26317b9264d2" + integrity sha512-VBj9MYyDb9tuLq7yzqjgzt6Q+IBQLrGZfdjOekyEirZPHxXWoTSGUTMrpsfi58Up73d13NfYLv8HT9vmznjzhQ== dependencies: regenerator-runtime "^0.14.0" -"@chainsafe/as-sha256@^0.3.1": - version "0.3.1" - resolved "https://registry.yarnpkg.com/@chainsafe/as-sha256/-/as-sha256-0.3.1.tgz#3639df0e1435cab03f4d9870cc3ac079e57a6fc9" - integrity sha512-hldFFYuf49ed7DAakWVXSJODuq3pzJEguD8tQ7h+sGkM18vja+OFoJI9krnGmgzyuZC2ETX0NOIcCTy31v2Mtg== - -"@chainsafe/persistent-merkle-tree@^0.4.2": - version "0.4.2" - resolved "https://registry.yarnpkg.com/@chainsafe/persistent-merkle-tree/-/persistent-merkle-tree-0.4.2.tgz#4c9ee80cc57cd3be7208d98c40014ad38f36f7ff" - integrity sha512-lLO3ihKPngXLTus/L7WHKaw9PnNJWizlOF1H9NNzHP6Xvh82vzg9F2bzkXhYIFshMZ2gTCEz8tq6STe7r5NDfQ== - dependencies: - "@chainsafe/as-sha256" "^0.3.1" - -"@chainsafe/persistent-merkle-tree@^0.5.0": - version "0.5.0" - resolved "https://registry.yarnpkg.com/@chainsafe/persistent-merkle-tree/-/persistent-merkle-tree-0.5.0.tgz#2b4a62c9489a5739dedd197250d8d2f5427e9f63" - integrity sha512-l0V1b5clxA3iwQLXP40zYjyZYospQLZXzBVIhhr9kDg/1qHZfzzHw0jj4VPBijfYCArZDlPkRi1wZaV2POKeuw== - dependencies: - "@chainsafe/as-sha256" "^0.3.1" - -"@chainsafe/ssz@^0.10.0": - version "0.10.2" - resolved "https://registry.yarnpkg.com/@chainsafe/ssz/-/ssz-0.10.2.tgz#c782929e1bb25fec66ba72e75934b31fd087579e" - integrity sha512-/NL3Lh8K+0q7A3LsiFq09YXS9fPE+ead2rr7vM2QK8PLzrNsw3uqrif9bpRX5UxgeRjM+vYi+boCM3+GM4ovXg== - dependencies: - "@chainsafe/as-sha256" "^0.3.1" - "@chainsafe/persistent-merkle-tree" "^0.5.0" - -"@chainsafe/ssz@^0.9.2": - version "0.9.4" - resolved "https://registry.yarnpkg.com/@chainsafe/ssz/-/ssz-0.9.4.tgz#696a8db46d6975b600f8309ad3a12f7c0e310497" - integrity sha512-77Qtg2N1ayqs4Bg/wvnWfg5Bta7iy7IRh8XqXh7oNMeP2HBbBwx8m6yTpA8p0EHItWPEBkgZd5S5/LSlp3GXuQ== - dependencies: - "@chainsafe/as-sha256" "^0.3.1" - "@chainsafe/persistent-merkle-tree" "^0.4.2" - case "^1.6.3" - "@colors/colors@1.5.0": version "1.5.0" resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.5.0.tgz#bb504579c1cae923e6576a4f5da43d25f97bdbd9" @@ -179,14 +139,14 @@ resolved "https://registry.yarnpkg.com/@ensdomains/resolver/-/resolver-0.2.4.tgz#c10fe28bf5efbf49bff4666d909aed0265efbc89" integrity sha512-bvaTH34PMCbv6anRa9I/0zjLJgY4EuznbEMgbV77JBCQ9KNC46rzi0avuxpOfu+xDjPEtSFGqVEOr5GlUSGudA== -"@es-joy/jsdoccomment@~0.37.0": - version "0.37.1" - resolved "https://registry.yarnpkg.com/@es-joy/jsdoccomment/-/jsdoccomment-0.37.1.tgz#fa32a41ba12097452693343e09ad4d26d157aedd" - integrity sha512-5vxWJ1gEkEF0yRd0O+uK6dHJf7adrxwQSX8PuRiPfFSAbNLnY0ZJfXaZucoz14Jj2N11xn2DnlEPwWRpYpvRjg== +"@es-joy/jsdoccomment@~0.48.0": + version "0.48.0" + resolved "https://registry.yarnpkg.com/@es-joy/jsdoccomment/-/jsdoccomment-0.48.0.tgz#5d9dc1a295cf5d1ed224dffafb4800d5c7206c27" + integrity sha512-G6QUWIcC+KvSwXNsJyDTHvqUdNoAVJPPgkc3+Uk4WBKqZvoXhlvazOgm9aL0HwihJLQf0l+tOE2UFzXBqCqgDw== dependencies: - comment-parser "1.3.1" - esquery "^1.5.0" - jsdoc-type-pratt-parser "~4.0.0" + comment-parser "1.4.1" + esquery "^1.6.0" + jsdoc-type-pratt-parser "~4.1.0" "@eslint-community/eslint-utils@^4.2.0": version "4.4.0" @@ -196,9 +156,9 @@ eslint-visitor-keys "^3.3.0" "@eslint-community/regexpp@^4.4.0", "@eslint-community/regexpp@^4.6.1": - version "4.10.0" - resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.10.0.tgz#548f6de556857c8bb73bbee70c35dc82a2e74d63" - integrity sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA== + version "4.11.0" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.11.0.tgz#b0ffd0312b4a3fd2d6f77237e7248a5ad3a680ae" + integrity sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A== "@eslint/eslintrc@^2.1.4": version "2.1.4" @@ -215,10 +175,10 @@ minimatch "^3.1.2" strip-json-comments "^3.1.1" -"@eslint/js@8.56.0": - version "8.56.0" - resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.56.0.tgz#ef20350fec605a7f7035a01764731b2de0f3782b" - integrity sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A== +"@eslint/js@8.57.0": + version "8.57.0" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.57.0.tgz#a5417ae8427873f1dd08b70b3574b453e67b5f7f" + integrity sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g== "@ethereumjs/rlp@^4.0.1": version "4.0.1" @@ -273,6 +233,17 @@ "@ethersproject/logger" "^5.7.0" "@ethersproject/properties" "^5.7.0" +"@ethersproject/address@5.6.1": + version "5.6.1" + resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.6.1.tgz#ab57818d9aefee919c5721d28cd31fd95eff413d" + integrity sha512-uOgF0kS5MJv9ZvCz7x6T2EXJSzotiybApn4XlOgoTX0xdtyVIJ7pF+6cGPxiEq/dpBiTfMiw7Yc81JcwhSYA0Q== + dependencies: + "@ethersproject/bignumber" "^5.6.2" + "@ethersproject/bytes" "^5.6.1" + "@ethersproject/keccak256" "^5.6.1" + "@ethersproject/logger" "^5.6.0" + "@ethersproject/rlp" "^5.6.1" + "@ethersproject/address@5.7.0", "@ethersproject/address@^5.0.2", "@ethersproject/address@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.7.0.tgz#19b56c4d74a3b0a46bfdbb6cfcc0a153fc697f37" @@ -299,7 +270,7 @@ "@ethersproject/bytes" "^5.7.0" "@ethersproject/properties" "^5.7.0" -"@ethersproject/bignumber@5.7.0", "@ethersproject/bignumber@^5.7.0": +"@ethersproject/bignumber@5.7.0", "@ethersproject/bignumber@^5.6.2", "@ethersproject/bignumber@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.7.0.tgz#e2f03837f268ba655ffba03a57853e18a18dc9c2" integrity sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw== @@ -308,7 +279,7 @@ "@ethersproject/logger" "^5.7.0" bn.js "^5.2.1" -"@ethersproject/bytes@5.7.0", "@ethersproject/bytes@^5.7.0": +"@ethersproject/bytes@5.7.0", "@ethersproject/bytes@^5.6.1", "@ethersproject/bytes@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.7.0.tgz#a00f6ea8d7e7534d6d87f47188af1148d71f155d" integrity sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A== @@ -390,7 +361,7 @@ aes-js "3.0.0" scrypt-js "3.0.1" -"@ethersproject/keccak256@5.7.0", "@ethersproject/keccak256@^5.7.0": +"@ethersproject/keccak256@5.7.0", "@ethersproject/keccak256@^5.6.1", "@ethersproject/keccak256@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.7.0.tgz#3186350c6e1cd6aba7940384ec7d6d9db01f335a" integrity sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg== @@ -398,7 +369,7 @@ "@ethersproject/bytes" "^5.7.0" js-sha3 "0.8.0" -"@ethersproject/logger@5.7.0", "@ethersproject/logger@^5.7.0": +"@ethersproject/logger@5.7.0", "@ethersproject/logger@^5.6.0", "@ethersproject/logger@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.7.0.tgz#6ce9ae168e74fecf287be17062b590852c311892" integrity sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig== @@ -425,7 +396,7 @@ dependencies: "@ethersproject/logger" "^5.7.0" -"@ethersproject/providers@5.7.2", "@ethersproject/providers@^5.7.1", "@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== @@ -459,7 +430,7 @@ "@ethersproject/bytes" "^5.7.0" "@ethersproject/logger" "^5.7.0" -"@ethersproject/rlp@5.7.0", "@ethersproject/rlp@^5.7.0": +"@ethersproject/rlp@5.7.0", "@ethersproject/rlp@^5.6.1", "@ethersproject/rlp@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/rlp/-/rlp-5.7.0.tgz#de39e4d5918b9d74d46de93af80b7685a9c21304" integrity sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w== @@ -577,22 +548,22 @@ "@ethersproject/strings" "^5.7.0" "@fastify/busboy@^2.0.0": - version "2.1.0" - resolved "https://registry.yarnpkg.com/@fastify/busboy/-/busboy-2.1.0.tgz#0709e9f4cb252351c609c6e6d8d6779a8d25edff" - integrity sha512-+KpH+QxZU7O4675t3mnkQKcZZg56u+K/Ct2K+N2AZYNVK8kyeo/bI18tI8aPm3tvNNRyTWfj6s5tnGNlcbQRsA== + version "2.1.1" + resolved "https://registry.yarnpkg.com/@fastify/busboy/-/busboy-2.1.1.tgz#b9da6a878a371829a0502c9b6c1c143ef6663f4d" + integrity sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA== "@gar/promisify@^1.1.3": version "1.1.3" resolved "https://registry.yarnpkg.com/@gar/promisify/-/promisify-1.1.3.tgz#555193ab2e3bb3b6adc3d551c9c030d9e860daf6" integrity sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw== -"@humanwhocodes/config-array@^0.11.13": - version "0.11.13" - resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.13.tgz#075dc9684f40a531d9b26b0822153c1e832ee297" - integrity sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ== +"@humanwhocodes/config-array@^0.11.14": + version "0.11.14" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.14.tgz#d78e481a039f7566ecc9660b4ea7fe6b1fec442b" + integrity sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg== dependencies: - "@humanwhocodes/object-schema" "^2.0.1" - debug "^4.1.1" + "@humanwhocodes/object-schema" "^2.0.2" + debug "^4.3.1" minimatch "^3.0.5" "@humanwhocodes/module-importer@^1.0.1": @@ -600,10 +571,10 @@ resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== -"@humanwhocodes/object-schema@^2.0.1": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz#e5211452df060fa8522b55c7b3c0c4d1981cb044" - integrity sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw== +"@humanwhocodes/object-schema@^2.0.2": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz#4a2868d75d6d6963e423bcf90b7fd1be343409d3" + integrity sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA== "@isaacs/cliui@^8.0.2": version "8.0.2" @@ -623,14 +594,14 @@ integrity sha512-SQ7Kzhh9+D+ZW9MA0zkYv3VXhIDNx+LzM6EJ+/65I3QY+enU6Itte7E5XX7EWrqLW2FN4n06GWzBnPoC3th2aQ== "@jridgewell/resolve-uri@^3.0.3": - version "3.1.1" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz#c08679063f279615a3326583ba3a90d1d82cc721" - integrity sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA== + version "3.1.2" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" + integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== "@jridgewell/sourcemap-codec@^1.4.10": - version "1.4.15" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" - integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== + version "1.5.0" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz#3188bcb273a414b0d215fd22a58540b989b9409a" + integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ== "@jridgewell/trace-mapping@0.3.9": version "0.3.9" @@ -651,20 +622,13 @@ tweetnacl "^1.0.3" tweetnacl-util "^0.15.1" -"@mongodb-js/saslprep@^1.1.0": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@mongodb-js/saslprep/-/saslprep-1.1.1.tgz#9a6c2516bc9188672c4d953ec99760ba49970da7" - integrity sha512-t7c5K033joZZMspnHg/gWPE4kandgc2OxE74aYOtGKfgB9VPuVJPix0H6fhmm2erj5PBJ21mqcx34lpIGtUCsQ== +"@mongodb-js/saslprep@^1.1.5": + version "1.1.9" + resolved "https://registry.yarnpkg.com/@mongodb-js/saslprep/-/saslprep-1.1.9.tgz#e974bab8eca9faa88677d4ea4da8d09a52069004" + integrity sha512-tVkljjeEaAhCqTzajSdgbQ6gE6f3oneVwa3iXR6csiEwXXOFsiC6Uh9iAjAhXPtqa/XMDHWjjeNH/77m/Yq2dw== dependencies: sparse-bitfield "^3.0.3" -"@noble/curves@1.1.0", "@noble/curves@~1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.1.0.tgz#f13fc667c89184bc04cccb9b11e8e7bae27d8c3d" - integrity sha512-091oBExgENk/kGj3AZmtBDMpxQPDtxQABR2B9lb1JbVTs6ytdzZNwvhxQ4MWasRNEzlbEH8jCWFCwhF/Obj5AA== - dependencies: - "@noble/hashes" "1.3.1" - "@noble/curves@1.2.0": version "1.2.0" resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.2.0.tgz#92d7e12e4e49b23105a2555c6984d41733d65c35" @@ -672,25 +636,32 @@ dependencies: "@noble/hashes" "1.3.2" +"@noble/curves@1.4.2", "@noble/curves@~1.4.0": + version "1.4.2" + resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.4.2.tgz#40309198c76ed71bc6dbf7ba24e81ceb4d0d1fe9" + integrity sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw== + dependencies: + "@noble/hashes" "1.4.0" + "@noble/hashes@1.2.0", "@noble/hashes@~1.2.0": version "1.2.0" resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.2.0.tgz#a3150eeb09cc7ab207ebf6d7b9ad311a9bdbed12" integrity sha512-FZfhjEDbT5GRswV3C6uvLPHMiVD6lQBmpoX5+eSiPaMTXte/IKqI5dykDxzZB/WBeK/CDuQRBWarPdi3FNY2zQ== -"@noble/hashes@1.3.1": - version "1.3.1" - resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.3.1.tgz#8831ef002114670c603c458ab8b11328406953a9" - integrity sha512-EbqwksQwz9xDRGfDST86whPBgM65E0OH/pCgqW0GBVzO22bNE+NuIbeTb714+IfSjU3aRk47EUvXIb5bTsenKA== - "@noble/hashes@1.3.2": version "1.3.2" resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.3.2.tgz#6f26dbc8fbc7205873ce3cee2f690eba0d421b39" integrity sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ== -"@noble/hashes@~1.3.0", "@noble/hashes@~1.3.1": - version "1.3.3" - resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.3.3.tgz#39908da56a4adc270147bb07968bf3b16cfe1699" - integrity sha512-V7/fPHgl+jsVPXqqeOzT8egNj2iBIVt+ECeMMG8TdcnTikP3oaBtUVqpT/gYCR68aEBJSF+XbYUxStjbFMqIIA== +"@noble/hashes@1.4.0", "@noble/hashes@~1.4.0": + version "1.4.0" + resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.4.0.tgz#45814aa329f30e4fe0ba49426f49dfccdd066426" + integrity sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg== + +"@noble/hashes@^1.4.0": + version "1.5.0" + resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.5.0.tgz#abadc5ca20332db2b1b2aa3e496e9af1213570b0" + integrity sha512-1j6kQFb7QRru7eKN3ZDvRcP13rugwdxZqCjbiAVZfIJwgj2A65UmT4TgARXGlXgnRkORLTDTrO19ZErt7+QXgA== "@noble/secp256k1@1.7.1", "@noble/secp256k1@~1.7.0": version "1.7.1" @@ -718,162 +689,118 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" -"@nomicfoundation/ethereumjs-block@5.0.2": - version "5.0.2" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-block/-/ethereumjs-block-5.0.2.tgz#13a7968f5964f1697da941281b7f7943b0465d04" - integrity sha512-hSe6CuHI4SsSiWWjHDIzWhSiAVpzMUcDRpWYzN0T9l8/Rz7xNn3elwVOJ/tAyS0LqL6vitUD78Uk7lQDXZun7Q== - dependencies: - "@nomicfoundation/ethereumjs-common" "4.0.2" - "@nomicfoundation/ethereumjs-rlp" "5.0.2" - "@nomicfoundation/ethereumjs-trie" "6.0.2" - "@nomicfoundation/ethereumjs-tx" "5.0.2" - "@nomicfoundation/ethereumjs-util" "9.0.2" - ethereum-cryptography "0.1.3" - ethers "^5.7.1" - -"@nomicfoundation/ethereumjs-blockchain@7.0.2": - version "7.0.2" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-blockchain/-/ethereumjs-blockchain-7.0.2.tgz#45323b673b3d2fab6b5008535340d1b8fea7d446" - integrity sha512-8UUsSXJs+MFfIIAKdh3cG16iNmWzWC/91P40sazNvrqhhdR/RtGDlFk2iFTGbBAZPs2+klZVzhRX8m2wvuvz3w== - dependencies: - "@nomicfoundation/ethereumjs-block" "5.0.2" - "@nomicfoundation/ethereumjs-common" "4.0.2" - "@nomicfoundation/ethereumjs-ethash" "3.0.2" - "@nomicfoundation/ethereumjs-rlp" "5.0.2" - "@nomicfoundation/ethereumjs-trie" "6.0.2" - "@nomicfoundation/ethereumjs-tx" "5.0.2" - "@nomicfoundation/ethereumjs-util" "9.0.2" - abstract-level "^1.0.3" - debug "^4.3.3" - ethereum-cryptography "0.1.3" - level "^8.0.0" - lru-cache "^5.1.1" - memory-level "^1.0.0" - -"@nomicfoundation/ethereumjs-common@4.0.2": - version "4.0.2" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-common/-/ethereumjs-common-4.0.2.tgz#a15d1651ca36757588fdaf2a7d381a150662a3c3" - integrity sha512-I2WGP3HMGsOoycSdOTSqIaES0ughQTueOsddJ36aYVpI3SN8YSusgRFLwzDJwRFVIYDKx/iJz0sQ5kBHVgdDwg== - dependencies: - "@nomicfoundation/ethereumjs-util" "9.0.2" - crc-32 "^1.2.0" - -"@nomicfoundation/ethereumjs-ethash@3.0.2": - version "3.0.2" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-ethash/-/ethereumjs-ethash-3.0.2.tgz#da77147f806401ee996bfddfa6487500118addca" - integrity sha512-8PfoOQCcIcO9Pylq0Buijuq/O73tmMVURK0OqdjhwqcGHYC2PwhbajDh7GZ55ekB0Px197ajK3PQhpKoiI/UPg== - dependencies: - "@nomicfoundation/ethereumjs-block" "5.0.2" - "@nomicfoundation/ethereumjs-rlp" "5.0.2" - "@nomicfoundation/ethereumjs-util" "9.0.2" - abstract-level "^1.0.3" - bigint-crypto-utils "^3.0.23" - ethereum-cryptography "0.1.3" - -"@nomicfoundation/ethereumjs-evm@2.0.2": - version "2.0.2" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-evm/-/ethereumjs-evm-2.0.2.tgz#4c2f4b84c056047102a4fa41c127454e3f0cfcf6" - integrity sha512-rBLcUaUfANJxyOx9HIdMX6uXGin6lANCulIm/pjMgRqfiCRMZie3WKYxTSd8ZE/d+qT+zTedBF4+VHTdTSePmQ== - dependencies: - "@ethersproject/providers" "^5.7.1" - "@nomicfoundation/ethereumjs-common" "4.0.2" - "@nomicfoundation/ethereumjs-tx" "5.0.2" - "@nomicfoundation/ethereumjs-util" "9.0.2" - debug "^4.3.3" - ethereum-cryptography "0.1.3" - mcl-wasm "^0.7.1" - rustbn.js "~0.2.0" - -"@nomicfoundation/ethereumjs-rlp@5.0.2": - version "5.0.2" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-rlp/-/ethereumjs-rlp-5.0.2.tgz#4fee8dc58a53ac6ae87fb1fca7c15dc06c6b5dea" - integrity sha512-QwmemBc+MMsHJ1P1QvPl8R8p2aPvvVcKBbvHnQOKBpBztEo0omN0eaob6FeZS/e3y9NSe+mfu3nNFBHszqkjTA== - -"@nomicfoundation/ethereumjs-statemanager@2.0.2": - version "2.0.2" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-statemanager/-/ethereumjs-statemanager-2.0.2.tgz#3ba4253b29b1211cafe4f9265fee5a0d780976e0" - integrity sha512-dlKy5dIXLuDubx8Z74sipciZnJTRSV/uHG48RSijhgm1V7eXYFC567xgKtsKiVZB1ViTP9iFL4B6Je0xD6X2OA== +"@nomicfoundation/edr-darwin-arm64@0.5.2": + version "0.5.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-darwin-arm64/-/edr-darwin-arm64-0.5.2.tgz#72f7a826c9f0f2c91308edca562de3b9484ac079" + integrity sha512-Gm4wOPKhbDjGTIRyFA2QUAPfCXA1AHxYOKt3yLSGJkQkdy9a5WW+qtqKeEKHc/+4wpJSLtsGQfpzyIzggFfo/A== + +"@nomicfoundation/edr-darwin-x64@0.5.2": + version "0.5.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-darwin-x64/-/edr-darwin-x64-0.5.2.tgz#6d0fedb219d664631c6feddc596ab8c3bbc36fa8" + integrity sha512-ClyABq2dFCsrYEED3/UIO0c7p4H1/4vvlswFlqUyBpOkJccr75qIYvahOSJRM62WgUFRhbSS0OJXFRwc/PwmVg== + +"@nomicfoundation/edr-linux-arm64-gnu@0.5.2": + version "0.5.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-linux-arm64-gnu/-/edr-linux-arm64-gnu-0.5.2.tgz#60e4d52d963141bc2bb4a02639dc590a7fbdda2f" + integrity sha512-HWMTVk1iOabfvU2RvrKLDgtFjJZTC42CpHiw2h6rfpsgRqMahvIlx2jdjWYzFNy1jZKPTN1AStQ/91MRrg5KnA== + +"@nomicfoundation/edr-linux-arm64-musl@0.5.2": + version "0.5.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-linux-arm64-musl/-/edr-linux-arm64-musl-0.5.2.tgz#6676a09eab57c435a16ffc144658c896acca9baa" + integrity sha512-CwsQ10xFx/QAD5y3/g5alm9+jFVuhc7uYMhrZAu9UVF+KtVjeCvafj0PaVsZ8qyijjqVuVsJ8hD1x5ob7SMcGg== + +"@nomicfoundation/edr-linux-x64-gnu@0.5.2": + version "0.5.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-linux-x64-gnu/-/edr-linux-x64-gnu-0.5.2.tgz#f558d9697ce961410e7a7468f9ab8c8a601b9df6" + integrity sha512-CWVCEdhWJ3fmUpzWHCRnC0/VLBDbqtqTGTR6yyY1Ep3S3BOrHEAvt7h5gx85r2vLcztisu2vlDq51auie4IU1A== + +"@nomicfoundation/edr-linux-x64-musl@0.5.2": + version "0.5.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-linux-x64-musl/-/edr-linux-x64-musl-0.5.2.tgz#c9c9cbb2997499f75c1d022be724b0551d44569f" + integrity sha512-+aJDfwhkddy2pP5u1ISg3IZVAm0dO836tRlDTFWtvvSMQ5hRGqPcWwlsbobhDQsIxhPJyT7phL0orCg5W3WMeA== + +"@nomicfoundation/edr-win32-x64-msvc@0.5.2": + version "0.5.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-win32-x64-msvc/-/edr-win32-x64-msvc-0.5.2.tgz#f16db88bf4fe09a996af0a25096e09deecb72bfa" + integrity sha512-CcvvuA3sAv7liFNPsIR/68YlH6rrybKzYttLlMr80d4GKJjwJ5OKb3YgE6FdZZnOfP19HEHhsLcE0DPLtY3r0w== + +"@nomicfoundation/edr@^0.5.2": + version "0.5.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/edr/-/edr-0.5.2.tgz#e8c7b3d3dd4a312432ab3930dec60f76dc5c4926" + integrity sha512-hW/iLvUQZNTVjFyX/I40rtKvvDOqUEyIi96T28YaLfmPL+3LW2lxmYLUXEJ6MI14HzqxDqrLyhf6IbjAa2r3Dw== + dependencies: + "@nomicfoundation/edr-darwin-arm64" "0.5.2" + "@nomicfoundation/edr-darwin-x64" "0.5.2" + "@nomicfoundation/edr-linux-arm64-gnu" "0.5.2" + "@nomicfoundation/edr-linux-arm64-musl" "0.5.2" + "@nomicfoundation/edr-linux-x64-gnu" "0.5.2" + "@nomicfoundation/edr-linux-x64-musl" "0.5.2" + "@nomicfoundation/edr-win32-x64-msvc" "0.5.2" + +"@nomicfoundation/ethereumjs-common@4.0.4": + version "4.0.4" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-common/-/ethereumjs-common-4.0.4.tgz#9901f513af2d4802da87c66d6f255b510bef5acb" + integrity sha512-9Rgb658lcWsjiicr5GzNCjI1llow/7r0k50dLL95OJ+6iZJcVbi15r3Y0xh2cIO+zgX0WIHcbzIu6FeQf9KPrg== dependencies: - "@nomicfoundation/ethereumjs-common" "4.0.2" - "@nomicfoundation/ethereumjs-rlp" "5.0.2" - debug "^4.3.3" - ethereum-cryptography "0.1.3" - ethers "^5.7.1" - js-sdsl "^4.1.4" + "@nomicfoundation/ethereumjs-util" "9.0.4" -"@nomicfoundation/ethereumjs-trie@6.0.2": - version "6.0.2" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-trie/-/ethereumjs-trie-6.0.2.tgz#9a6dbd28482dca1bc162d12b3733acab8cd12835" - integrity sha512-yw8vg9hBeLYk4YNg5MrSJ5H55TLOv2FSWUTROtDtTMMmDGROsAu+0tBjiNGTnKRi400M6cEzoFfa89Fc5k8NTQ== - dependencies: - "@nomicfoundation/ethereumjs-rlp" "5.0.2" - "@nomicfoundation/ethereumjs-util" "9.0.2" - "@types/readable-stream" "^2.3.13" - ethereum-cryptography "0.1.3" - readable-stream "^3.6.0" +"@nomicfoundation/ethereumjs-rlp@5.0.4": + version "5.0.4" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-rlp/-/ethereumjs-rlp-5.0.4.tgz#66c95256fc3c909f6fb18f6a586475fc9762fa30" + integrity sha512-8H1S3s8F6QueOc/X92SdrA4RDenpiAEqMg5vJH99kcQaCy/a3Q6fgseo75mgWlbanGJXSlAPtnCeG9jvfTYXlw== -"@nomicfoundation/ethereumjs-tx@5.0.2": - version "5.0.2" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-tx/-/ethereumjs-tx-5.0.2.tgz#117813b69c0fdc14dd0446698a64be6df71d7e56" - integrity sha512-T+l4/MmTp7VhJeNloMkM+lPU3YMUaXdcXgTGCf8+ZFvV9NYZTRLFekRwlG6/JMmVfIfbrW+dRRJ9A6H5Q/Z64g== +"@nomicfoundation/ethereumjs-tx@5.0.4": + version "5.0.4" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-tx/-/ethereumjs-tx-5.0.4.tgz#b0ceb58c98cc34367d40a30d255d6315b2f456da" + integrity sha512-Xjv8wAKJGMrP1f0n2PeyfFCCojHd7iS3s/Ab7qzF1S64kxZ8Z22LCMynArYsVqiFx6rzYy548HNVEyI+AYN/kw== dependencies: - "@chainsafe/ssz" "^0.9.2" - "@ethersproject/providers" "^5.7.2" - "@nomicfoundation/ethereumjs-common" "4.0.2" - "@nomicfoundation/ethereumjs-rlp" "5.0.2" - "@nomicfoundation/ethereumjs-util" "9.0.2" + "@nomicfoundation/ethereumjs-common" "4.0.4" + "@nomicfoundation/ethereumjs-rlp" "5.0.4" + "@nomicfoundation/ethereumjs-util" "9.0.4" ethereum-cryptography "0.1.3" -"@nomicfoundation/ethereumjs-util@9.0.2": - version "9.0.2" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-util/-/ethereumjs-util-9.0.2.tgz#16bdc1bb36f333b8a3559bbb4b17dac805ce904d" - integrity sha512-4Wu9D3LykbSBWZo8nJCnzVIYGvGCuyiYLIJa9XXNVt1q1jUzHdB+sJvx95VGCpPkCT+IbLecW6yfzy3E1bQrwQ== +"@nomicfoundation/ethereumjs-util@9.0.4": + version "9.0.4" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-util/-/ethereumjs-util-9.0.4.tgz#84c5274e82018b154244c877b76bc049a4ed7b38" + integrity sha512-sLOzjnSrlx9Bb9EFNtHzK/FJFsfg2re6bsGqinFinH1gCqVfz9YYlXiMWwDM4C/L4ywuHFCYwfKTVr/QHQcU0Q== dependencies: - "@chainsafe/ssz" "^0.10.0" - "@nomicfoundation/ethereumjs-rlp" "5.0.2" + "@nomicfoundation/ethereumjs-rlp" "5.0.4" ethereum-cryptography "0.1.3" -"@nomicfoundation/ethereumjs-vm@7.0.2": - version "7.0.2" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-vm/-/ethereumjs-vm-7.0.2.tgz#3b0852cb3584df0e18c182d0672a3596c9ca95e6" - integrity sha512-Bj3KZT64j54Tcwr7Qm/0jkeZXJMfdcAtRBedou+Hx0dPOSIgqaIr0vvLwP65TpHbak2DmAq+KJbW2KNtIoFwvA== - dependencies: - "@nomicfoundation/ethereumjs-block" "5.0.2" - "@nomicfoundation/ethereumjs-blockchain" "7.0.2" - "@nomicfoundation/ethereumjs-common" "4.0.2" - "@nomicfoundation/ethereumjs-evm" "2.0.2" - "@nomicfoundation/ethereumjs-rlp" "5.0.2" - "@nomicfoundation/ethereumjs-statemanager" "2.0.2" - "@nomicfoundation/ethereumjs-trie" "6.0.2" - "@nomicfoundation/ethereumjs-tx" "5.0.2" - "@nomicfoundation/ethereumjs-util" "9.0.2" - debug "^4.3.3" - ethereum-cryptography "0.1.3" - mcl-wasm "^0.7.1" - rustbn.js "~0.2.0" - "@nomicfoundation/hardhat-chai-matchers@^2.0.2": - version "2.0.2" - resolved "https://registry.yarnpkg.com/@nomicfoundation/hardhat-chai-matchers/-/hardhat-chai-matchers-2.0.2.tgz#a0e5dbca43ba9560c096da162c0e3245303479d1" - integrity sha512-9Wu9mRtkj0U9ohgXYFbB/RQDa+PcEdyBm2suyEtsJf3PqzZEEjLUZgWnMjlFhATMk/fp3BjmnYVPrwl+gr8oEw== + version "2.0.7" + resolved "https://registry.yarnpkg.com/@nomicfoundation/hardhat-chai-matchers/-/hardhat-chai-matchers-2.0.7.tgz#89d90b2d77a00f6fd8fe42eabe40a82b5e065075" + integrity sha512-RQfsiTwdf0SP+DtuNYvm4921X6VirCQq0Xyh+mnuGlTwEFSPZ/o27oQC+l+3Y/l48DDU7+ZcYBR+Fp+Rp94LfQ== dependencies: "@types/chai-as-promised" "^7.1.3" chai-as-promised "^7.1.1" deep-eql "^4.0.1" ordinal "^1.0.3" -"@nomicfoundation/hardhat-ethers@^3.0.4", "@nomicfoundation/hardhat-ethers@^3.0.5": - version "3.0.5" - resolved "https://registry.yarnpkg.com/@nomicfoundation/hardhat-ethers/-/hardhat-ethers-3.0.5.tgz#0422c2123dec7c42e7fb2be8e1691f1d9708db56" - integrity sha512-RNFe8OtbZK6Ila9kIlHp0+S80/0Bu/3p41HUpaRIoHLm6X3WekTd83vob3rE54Duufu1edCiBDxspBzi2rxHHw== +"@nomicfoundation/hardhat-ethers@^3.0.8": + version "3.0.8" + resolved "https://registry.yarnpkg.com/@nomicfoundation/hardhat-ethers/-/hardhat-ethers-3.0.8.tgz#af078f566373abeb77e11cbe69fe3dd47f8bfc27" + integrity sha512-zhOZ4hdRORls31DTOqg+GmEZM0ujly8GGIuRY7t7szEk2zW/arY1qDug/py8AEktT00v5K+b6RvbVog+va51IA== dependencies: debug "^4.1.1" lodash.isequal "^4.5.0" -"@nomicfoundation/hardhat-network-helpers@^1.0.9": - version "1.0.10" - resolved "https://registry.yarnpkg.com/@nomicfoundation/hardhat-network-helpers/-/hardhat-network-helpers-1.0.10.tgz#c61042ceb104fdd6c10017859fdef6529c1d6585" - integrity sha512-R35/BMBlx7tWN5V6d/8/19QCwEmIdbnA4ZrsuXgvs8i2qFx5i7h6mH5pBS4Pwi4WigLH+upl6faYusrNPuzMrQ== +"@nomicfoundation/hardhat-ignition@^0.15.5": + version "0.15.5" + resolved "https://registry.yarnpkg.com/@nomicfoundation/hardhat-ignition/-/hardhat-ignition-0.15.5.tgz#6da613732a3d9829a40f6ee6c95fb2db012ebdce" + integrity sha512-Y5nhFXFqt4owA6Ooag8ZBFDF2RAZElMXViknVIsi3m45pbQimS50ti6FU8HxfRkDnBARa40CIn7UGV0hrelzDw== + dependencies: + "@nomicfoundation/ignition-core" "^0.15.5" + "@nomicfoundation/ignition-ui" "^0.15.5" + chalk "^4.0.0" + debug "^4.3.2" + fs-extra "^10.0.0" + prompts "^2.4.2" + +"@nomicfoundation/hardhat-network-helpers@^1.0.11": + version "1.0.11" + resolved "https://registry.yarnpkg.com/@nomicfoundation/hardhat-network-helpers/-/hardhat-network-helpers-1.0.11.tgz#64096829661b960b88679bd5c4fbcb50654672d1" + integrity sha512-uGPL7QSKvxrHRU69dx8jzoBvuztlLCtyFsbgfXIwIjnO3dqZRz2GNMHJoO3C3dIiUNM6jdNF4AUnoQKDscdYrA== dependencies: ethereumjs-util "^7.1.4" @@ -882,10 +809,10 @@ resolved "https://registry.yarnpkg.com/@nomicfoundation/hardhat-toolbox/-/hardhat-toolbox-4.0.0.tgz#eb1f619218dd1414fa161dfec92d3e5e53a2f407" integrity sha512-jhcWHp0aHaL0aDYj8IJl80v4SZXWMS1A2XxXa1CA6pBiFfJKuZinCkO6wb+POAt0LIfXB3gA3AgdcOccrcwBwA== -"@nomicfoundation/hardhat-verify@^2.0.0": - version "2.0.3" - resolved "https://registry.yarnpkg.com/@nomicfoundation/hardhat-verify/-/hardhat-verify-2.0.3.tgz#173557f8cfa53c8c9da23a326f54d24fe459ae68" - integrity sha512-ESbRu9by53wu6VvgwtMtm108RSmuNsVqXtzg061D+/4R7jaWh/Wl/8ve+p6SdDX7vA1Z3L02hDO1Q3BY4luLXQ== +"@nomicfoundation/hardhat-verify@^2.0.8": + version "2.0.10" + resolved "https://registry.yarnpkg.com/@nomicfoundation/hardhat-verify/-/hardhat-verify-2.0.10.tgz#e9bae0949c17d5cc77bb5f97c273263048c69550" + integrity sha512-3zoTZGQhpeOm6piJDdsGb6euzZAd7N5Tk0zPQvGnfKQ0+AoxKz/7i4if12goi8IDTuUGElAUuZyQB8PMQoXA5g== dependencies: "@ethersproject/abi" "^5.1.2" "@ethersproject/address" "^5.0.2" @@ -897,76 +824,138 @@ table "^6.8.0" undici "^5.14.0" -"@nomicfoundation/solidity-analyzer-darwin-arm64@0.1.1": - version "0.1.1" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-darwin-arm64/-/solidity-analyzer-darwin-arm64-0.1.1.tgz#4c858096b1c17fe58a474fe81b46815f93645c15" - integrity sha512-KcTodaQw8ivDZyF+D76FokN/HdpgGpfjc/gFCImdLUyqB6eSWVaZPazMbeAjmfhx3R0zm/NYVzxwAokFKgrc0w== - -"@nomicfoundation/solidity-analyzer-darwin-x64@0.1.1": - version "0.1.1" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-darwin-x64/-/solidity-analyzer-darwin-x64-0.1.1.tgz#6e25ccdf6e2d22389c35553b64fe6f3fdaec432c" - integrity sha512-XhQG4BaJE6cIbjAVtzGOGbK3sn1BO9W29uhk9J8y8fZF1DYz0Doj8QDMfpMu+A6TjPDs61lbsmeYodIDnfveSA== - -"@nomicfoundation/solidity-analyzer-freebsd-x64@0.1.1": - version "0.1.1" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-freebsd-x64/-/solidity-analyzer-freebsd-x64-0.1.1.tgz#0a224ea50317139caeebcdedd435c28a039d169c" - integrity sha512-GHF1VKRdHW3G8CndkwdaeLkVBi5A9u2jwtlS7SLhBc8b5U/GcoL39Q+1CSO3hYqePNP+eV5YI7Zgm0ea6kMHoA== - -"@nomicfoundation/solidity-analyzer-linux-arm64-gnu@0.1.1": - version "0.1.1" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-arm64-gnu/-/solidity-analyzer-linux-arm64-gnu-0.1.1.tgz#dfa085d9ffab9efb2e7b383aed3f557f7687ac2b" - integrity sha512-g4Cv2fO37ZsUENQ2vwPnZc2zRenHyAxHcyBjKcjaSmmkKrFr64yvzeNO8S3GBFCo90rfochLs99wFVGT/0owpg== +"@nomicfoundation/ignition-core@^0.15.5": + version "0.15.5" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ignition-core/-/ignition-core-0.15.5.tgz#38d19d29ffd425f7cc2810c45d7a51b31c626067" + integrity sha512-FgvuoIXhakRSP524JzNQ4BviyzBBKpsFaOWubPZ4XACLT4/7vGqlJ/7DIn0D2NL2anQ2qs98/BNBY9WccXUX1Q== + dependencies: + "@ethersproject/address" "5.6.1" + "@nomicfoundation/solidity-analyzer" "^0.1.1" + cbor "^9.0.0" + debug "^4.3.2" + ethers "^6.7.0" + fs-extra "^10.0.0" + immer "10.0.2" + lodash "4.17.21" + ndjson "2.0.0" + +"@nomicfoundation/ignition-ui@^0.15.5": + version "0.15.5" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ignition-ui/-/ignition-ui-0.15.5.tgz#ef9e11ccbffccc2360c02b20f12713756dfc37da" + integrity sha512-ZcE4rIn10qKahR4OqS8rl8NM2Fbg2QYiBXgMgj74ZI0++LlCcZgB5HyaBbX+lsnKHjTXtjYD3b+2mtg7jFbAMQ== + +"@nomicfoundation/slang-darwin-arm64@0.17.0": + version "0.17.0" + resolved "https://registry.yarnpkg.com/@nomicfoundation/slang-darwin-arm64/-/slang-darwin-arm64-0.17.0.tgz#8cded3c24322624e3b6618760caba8e840bd1c1d" + integrity sha512-O0q94EUtoWy9A5kOTOa9/khtxXDYnLqmuda9pQELurSiwbQEVCPQL8kb34VbOW+ifdre66JM/05Xw9JWhIZ9sA== + +"@nomicfoundation/slang-darwin-x64@0.17.0": + version "0.17.0" + resolved "https://registry.yarnpkg.com/@nomicfoundation/slang-darwin-x64/-/slang-darwin-x64-0.17.0.tgz#6ebeb33a2ced89fc6023f6cda4af96403486038a" + integrity sha512-IaDbHzvT08sBK2HyGzonWhq1uu8IxdjmTqAWHr25Oh/PYnamdi8u4qchZXXYKz/DHLoYN3vIpBXoqLQIomhD/g== + +"@nomicfoundation/slang-linux-arm64-gnu@0.17.0": + version "0.17.0" + resolved "https://registry.yarnpkg.com/@nomicfoundation/slang-linux-arm64-gnu/-/slang-linux-arm64-gnu-0.17.0.tgz#41c7e57a9b1a3aee6911f0cab22e683c149fb470" + integrity sha512-Lj4anvOsQZxs1SycG8VyT2Rl2oqIhyLSUCgGepTt3CiJ/bM+8r8bLJIgh8vKkki4BWz49YsYIgaJB2IPv8FFTw== + +"@nomicfoundation/slang-linux-arm64-musl@0.17.0": + version "0.17.0" + resolved "https://registry.yarnpkg.com/@nomicfoundation/slang-linux-arm64-musl/-/slang-linux-arm64-musl-0.17.0.tgz#9c4b51689274ae75c2c8a4cddd2e1cc0a79c191d" + integrity sha512-/xkTCa9d5SIWUBQE3BmLqDFfJRr4yUBwbl4ynPiGUpRXrD69cs6pWKkwjwz/FdBpXqVo36I+zY95qzoTj/YhOA== + +"@nomicfoundation/slang-linux-x64-gnu@0.17.0": + version "0.17.0" + resolved "https://registry.yarnpkg.com/@nomicfoundation/slang-linux-x64-gnu/-/slang-linux-x64-gnu-0.17.0.tgz#c3a3b6a7b775fc617832958d10e6664bf86d39d0" + integrity sha512-oe5IO5vntOqYvTd67deCHPIWuSuWm6aYtT2/0Kqz2/VLtGz4ClEulBSRwfnNzBVtw2nksWipE1w8BzhImI7Syg== + +"@nomicfoundation/slang-linux-x64-musl@0.17.0": + version "0.17.0" + resolved "https://registry.yarnpkg.com/@nomicfoundation/slang-linux-x64-musl/-/slang-linux-x64-musl-0.17.0.tgz#725118ff99a7217b9f1d1bd84411d9442084077d" + integrity sha512-PpYCI5K/kgLAMXaPY0V4VST5gCDprEOh7z/47tbI8kJQumI5odjsj/Cs8MpTo7/uRH6flKYbVNgUzcocWVYrAQ== + +"@nomicfoundation/slang-win32-arm64-msvc@0.17.0": + version "0.17.0" + resolved "https://registry.yarnpkg.com/@nomicfoundation/slang-win32-arm64-msvc/-/slang-win32-arm64-msvc-0.17.0.tgz#9c8bc4ccf21eaaac0cfcb6d3954ede4e2dea4c02" + integrity sha512-u/Mkf7OjokdBilP7QOJj6QYJU4/mjkbKnTX21wLyCIzeVWS7yafRPYpBycKIBj2pRRZ6ceAY5EqRpb0aiCq+0Q== + +"@nomicfoundation/slang-win32-ia32-msvc@0.17.0": + version "0.17.0" + resolved "https://registry.yarnpkg.com/@nomicfoundation/slang-win32-ia32-msvc/-/slang-win32-ia32-msvc-0.17.0.tgz#3fc5d00a3f8c1d85a5e94146af78a5526a4f3d27" + integrity sha512-XJBVQfNnZQUv0tP2JSJ573S+pmgrLWgqSZOGaMllnB/TL1gRci4Z7dYRJUF2s82GlRJE+FHSI2Ro6JISKmlXCg== + +"@nomicfoundation/slang-win32-x64-msvc@0.17.0": + version "0.17.0" + resolved "https://registry.yarnpkg.com/@nomicfoundation/slang-win32-x64-msvc/-/slang-win32-x64-msvc-0.17.0.tgz#f6a5e3250fa07cbda49151edeb80f09090e5b71a" + integrity sha512-zPGsAeiTfqfPNYHD8BfrahQmYzA78ZraoHKTGraq/1xwJwzBK4bu/NtvVA4pJjBV+B4L6DCxVhSbpn40q26JQA== + +"@nomicfoundation/slang@^0.17.0": + version "0.17.0" + resolved "https://registry.yarnpkg.com/@nomicfoundation/slang/-/slang-0.17.0.tgz#d9c25cd711ebf3490c9d0c99e9b4ca2481341a6b" + integrity sha512-1GlkGRcGpVnjFw9Z1vvDKOKo2mzparFt7qrl2pDxWp+jrVtlvej98yCMX52pVyrYE7ZeOSZFnx/DtsSgoukStQ== + dependencies: + "@nomicfoundation/slang-darwin-arm64" "0.17.0" + "@nomicfoundation/slang-darwin-x64" "0.17.0" + "@nomicfoundation/slang-linux-arm64-gnu" "0.17.0" + "@nomicfoundation/slang-linux-arm64-musl" "0.17.0" + "@nomicfoundation/slang-linux-x64-gnu" "0.17.0" + "@nomicfoundation/slang-linux-x64-musl" "0.17.0" + "@nomicfoundation/slang-win32-arm64-msvc" "0.17.0" + "@nomicfoundation/slang-win32-ia32-msvc" "0.17.0" + "@nomicfoundation/slang-win32-x64-msvc" "0.17.0" + +"@nomicfoundation/solidity-analyzer-darwin-arm64@0.1.2": + version "0.1.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-darwin-arm64/-/solidity-analyzer-darwin-arm64-0.1.2.tgz#3a9c3b20d51360b20affb8f753e756d553d49557" + integrity sha512-JaqcWPDZENCvm++lFFGjrDd8mxtf+CtLd2MiXvMNTBD33dContTZ9TWETwNFwg7JTJT5Q9HEecH7FA+HTSsIUw== -"@nomicfoundation/solidity-analyzer-linux-arm64-musl@0.1.1": - version "0.1.1" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-arm64-musl/-/solidity-analyzer-linux-arm64-musl-0.1.1.tgz#c9e06b5d513dd3ab02a7ac069c160051675889a4" - integrity sha512-WJ3CE5Oek25OGE3WwzK7oaopY8xMw9Lhb0mlYuJl/maZVo+WtP36XoQTb7bW/i8aAdHW5Z+BqrHMux23pvxG3w== +"@nomicfoundation/solidity-analyzer-darwin-x64@0.1.2": + version "0.1.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-darwin-x64/-/solidity-analyzer-darwin-x64-0.1.2.tgz#74dcfabeb4ca373d95bd0d13692f44fcef133c28" + integrity sha512-fZNmVztrSXC03e9RONBT+CiksSeYcxI1wlzqyr0L7hsQlK1fzV+f04g2JtQ1c/Fe74ZwdV6aQBdd6Uwl1052sw== -"@nomicfoundation/solidity-analyzer-linux-x64-gnu@0.1.1": - version "0.1.1" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-x64-gnu/-/solidity-analyzer-linux-x64-gnu-0.1.1.tgz#8d328d16839e52571f72f2998c81e46bf320f893" - integrity sha512-5WN7leSr5fkUBBjE4f3wKENUy9HQStu7HmWqbtknfXkkil+eNWiBV275IOlpXku7v3uLsXTOKpnnGHJYI2qsdA== +"@nomicfoundation/solidity-analyzer-linux-arm64-gnu@0.1.2": + version "0.1.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-arm64-gnu/-/solidity-analyzer-linux-arm64-gnu-0.1.2.tgz#4af5849a89e5a8f511acc04f28eb5d4460ba2b6a" + integrity sha512-3d54oc+9ZVBuB6nbp8wHylk4xh0N0Gc+bk+/uJae+rUgbOBwQSfuGIbAZt1wBXs5REkSmynEGcqx6DutoK0tPA== -"@nomicfoundation/solidity-analyzer-linux-x64-musl@0.1.1": - version "0.1.1" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-x64-musl/-/solidity-analyzer-linux-x64-musl-0.1.1.tgz#9b49d0634b5976bb5ed1604a1e1b736f390959bb" - integrity sha512-KdYMkJOq0SYPQMmErv/63CwGwMm5XHenEna9X9aB8mQmhDBrYrlAOSsIPgFCUSL0hjxE3xHP65/EPXR/InD2+w== +"@nomicfoundation/solidity-analyzer-linux-arm64-musl@0.1.2": + version "0.1.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-arm64-musl/-/solidity-analyzer-linux-arm64-musl-0.1.2.tgz#54036808a9a327b2ff84446c130a6687ee702a8e" + integrity sha512-iDJfR2qf55vgsg7BtJa7iPiFAsYf2d0Tv/0B+vhtnI16+wfQeTbP7teookbGvAo0eJo7aLLm0xfS/GTkvHIucA== -"@nomicfoundation/solidity-analyzer-win32-arm64-msvc@0.1.1": - version "0.1.1" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-win32-arm64-msvc/-/solidity-analyzer-win32-arm64-msvc-0.1.1.tgz#e2867af7264ebbcc3131ef837878955dd6a3676f" - integrity sha512-VFZASBfl4qiBYwW5xeY20exWhmv6ww9sWu/krWSesv3q5hA0o1JuzmPHR4LPN6SUZj5vcqci0O6JOL8BPw+APg== +"@nomicfoundation/solidity-analyzer-linux-x64-gnu@0.1.2": + version "0.1.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-x64-gnu/-/solidity-analyzer-linux-x64-gnu-0.1.2.tgz#466cda0d6e43691986c944b909fc6dbb8cfc594e" + integrity sha512-9dlHMAt5/2cpWyuJ9fQNOUXFB/vgSFORg1jpjX1Mh9hJ/MfZXlDdHQ+DpFCs32Zk5pxRBb07yGvSHk9/fezL+g== -"@nomicfoundation/solidity-analyzer-win32-ia32-msvc@0.1.1": - version "0.1.1" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-win32-ia32-msvc/-/solidity-analyzer-win32-ia32-msvc-0.1.1.tgz#0685f78608dd516c8cdfb4896ed451317e559585" - integrity sha512-JnFkYuyCSA70j6Si6cS1A9Gh1aHTEb8kOTBApp/c7NRTFGNMH8eaInKlyuuiIbvYFhlXW4LicqyYuWNNq9hkpQ== +"@nomicfoundation/solidity-analyzer-linux-x64-musl@0.1.2": + version "0.1.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-x64-musl/-/solidity-analyzer-linux-x64-musl-0.1.2.tgz#2b35826987a6e94444140ac92310baa088ee7f94" + integrity sha512-GzzVeeJob3lfrSlDKQw2bRJ8rBf6mEYaWY+gW0JnTDHINA0s2gPR4km5RLIj1xeZZOYz4zRw+AEeYgLRqB2NXg== -"@nomicfoundation/solidity-analyzer-win32-x64-msvc@0.1.1": - version "0.1.1" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-win32-x64-msvc/-/solidity-analyzer-win32-x64-msvc-0.1.1.tgz#c9a44f7108646f083b82e851486e0f6aeb785836" - integrity sha512-HrVJr6+WjIXGnw3Q9u6KQcbZCtk0caVWhCdFADySvRyUxJ8PnzlaP+MhwNE8oyT8OZ6ejHBRrrgjSqDCFXGirw== +"@nomicfoundation/solidity-analyzer-win32-x64-msvc@0.1.2": + version "0.1.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-win32-x64-msvc/-/solidity-analyzer-win32-x64-msvc-0.1.2.tgz#e6363d13b8709ca66f330562337dbc01ce8bbbd9" + integrity sha512-Fdjli4DCcFHb4Zgsz0uEJXZ2K7VEO+w5KVv7HmT7WO10iODdU9csC2az4jrhEsRtiR9Gfd74FlG0NYlw1BMdyA== -"@nomicfoundation/solidity-analyzer@^0.1.0": - version "0.1.1" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer/-/solidity-analyzer-0.1.1.tgz#f5f4d36d3f66752f59a57e7208cd856f3ddf6f2d" - integrity sha512-1LMtXj1puAxyFusBgUIy5pZk3073cNXYnXUpuNKFghHbIit/xZgbk0AokpUADbNm3gyD6bFWl3LRFh3dhVdREg== +"@nomicfoundation/solidity-analyzer@^0.1.0", "@nomicfoundation/solidity-analyzer@^0.1.1": + version "0.1.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer/-/solidity-analyzer-0.1.2.tgz#8bcea7d300157bf3a770a851d9f5c5e2db34ac55" + integrity sha512-q4n32/FNKIhQ3zQGGw5CvPF6GTvDCpYwIf7bEY/dZTZbgfDsHyjJwURxUJf3VQuuJj+fDIFl4+KkBVbw4Ef6jA== optionalDependencies: - "@nomicfoundation/solidity-analyzer-darwin-arm64" "0.1.1" - "@nomicfoundation/solidity-analyzer-darwin-x64" "0.1.1" - "@nomicfoundation/solidity-analyzer-freebsd-x64" "0.1.1" - "@nomicfoundation/solidity-analyzer-linux-arm64-gnu" "0.1.1" - "@nomicfoundation/solidity-analyzer-linux-arm64-musl" "0.1.1" - "@nomicfoundation/solidity-analyzer-linux-x64-gnu" "0.1.1" - "@nomicfoundation/solidity-analyzer-linux-x64-musl" "0.1.1" - "@nomicfoundation/solidity-analyzer-win32-arm64-msvc" "0.1.1" - "@nomicfoundation/solidity-analyzer-win32-ia32-msvc" "0.1.1" - "@nomicfoundation/solidity-analyzer-win32-x64-msvc" "0.1.1" + "@nomicfoundation/solidity-analyzer-darwin-arm64" "0.1.2" + "@nomicfoundation/solidity-analyzer-darwin-x64" "0.1.2" + "@nomicfoundation/solidity-analyzer-linux-arm64-gnu" "0.1.2" + "@nomicfoundation/solidity-analyzer-linux-arm64-musl" "0.1.2" + "@nomicfoundation/solidity-analyzer-linux-x64-gnu" "0.1.2" + "@nomicfoundation/solidity-analyzer-linux-x64-musl" "0.1.2" + "@nomicfoundation/solidity-analyzer-win32-x64-msvc" "0.1.2" "@npmcli/arborist@^6.5.0": - version "6.5.0" - resolved "https://registry.yarnpkg.com/@npmcli/arborist/-/arborist-6.5.0.tgz#ee24ecc56e4c387d78c3bce66918b386df6bd560" - integrity sha512-Ir14P+DyH4COJ9fVbmxVy+9GmyU3e/DnlBtijVN7B3Ri53Y9QmAqi1S9IifG0PTGsfa2U4zhAF8e6I/0VXfWjg== + version "6.5.1" + resolved "https://registry.yarnpkg.com/@npmcli/arborist/-/arborist-6.5.1.tgz#b378a2e162e9b868d06f8f2c7e87e828de7e63ba" + integrity sha512-cdV8pGurLK0CifZRilMJbm2CZ3H4Snk8PAqOngj5qmgFLjEllMLvScSZ3XKfd+CK8fo/hrPHO9zazy9OYdvmUg== dependencies: "@isaacs/string-locale-compare" "^1.1.0" "@npmcli/fs" "^3.1.0" @@ -976,7 +965,7 @@ "@npmcli/name-from-folder" "^2.0.0" "@npmcli/node-gyp" "^3.0.0" "@npmcli/package-json" "^4.0.0" - "@npmcli/query" "^3.0.0" + "@npmcli/query" "^3.1.0" "@npmcli/run-script" "^6.0.0" bin-links "^4.0.1" cacache "^17.0.4" @@ -1003,12 +992,12 @@ walk-up-path "^3.0.1" "@npmcli/config@^6.4.0": - version "6.4.0" - resolved "https://registry.yarnpkg.com/@npmcli/config/-/config-6.4.0.tgz#3b1ddfa0c452fd09beac2cf05ca49b76c7a36bc8" - integrity sha512-/fQjIbuNVIT/PbXvw178Tm97bxV0E0nVUFKHivMKtSI2pcs8xKdaWkHJxf9dTI0G/y5hp/KuCvgcUu5HwAtI1w== + version "6.4.1" + resolved "https://registry.yarnpkg.com/@npmcli/config/-/config-6.4.1.tgz#006409c739635db008e78bf58c92421cc147911d" + integrity sha512-uSz+elSGzjCMANWa5IlbGczLYPkNI/LeR+cHrgaTqTrTSh9RHhOFA4daD2eRUz6lMtOW+Fnsb+qv7V2Zz8ML0g== dependencies: "@npmcli/map-workspaces" "^3.0.2" - ci-info "^3.8.0" + ci-info "^4.0.0" ini "^4.1.0" nopt "^7.0.0" proc-log "^3.0.0" @@ -1017,9 +1006,9 @@ walk-up-path "^3.0.1" "@npmcli/disparity-colors@^3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@npmcli/disparity-colors/-/disparity-colors-3.0.0.tgz#60ea8c6eb5ba9de2d1950e15b06205b2c3ab7833" - integrity sha512-5R/z157/f20Fi0Ou4ZttL51V0xz0EdPEOauFtPCEYOLInDBRCj1/TxOJ5aGTrtShxEshN2d+hXb9ZKSi5RLBcg== + version "3.0.1" + resolved "https://registry.yarnpkg.com/@npmcli/disparity-colors/-/disparity-colors-3.0.1.tgz#042d5ef548200c81e3ee3a84c994744573fe79fd" + integrity sha512-cOypTz/9IAhaPgOktbDNPeccTU88y8I1ZURbPeC0ooziK1h6dRJs2iGz1eKP1muaeVbow8GqQ0DaxLG8Bpmblw== dependencies: ansi-styles "^4.3.0" @@ -1032,9 +1021,9 @@ semver "^7.3.5" "@npmcli/fs@^3.1.0": - version "3.1.0" - resolved "https://registry.yarnpkg.com/@npmcli/fs/-/fs-3.1.0.tgz#233d43a25a91d68c3a863ba0da6a3f00924a173e" - integrity sha512-7kZUAaLscfgbwBQRbvdMYaZOWyMEcPTH/tJjnyAWJ/dvvs9Ef+CERx/qJb9GExJpl1qipaDGn7KqHnFGGixd0w== + version "3.1.1" + resolved "https://registry.yarnpkg.com/@npmcli/fs/-/fs-3.1.1.tgz#59cdaa5adca95d135fc00f2bb53f5771575ce726" + integrity sha512-q9CRWjpHCMIh5sVyefoD1cA7PkvILqCZsnSOEUUivORLjxCO/Irmue2DprETiNgEqktDBZaM1Bi+jrarx1XdCg== dependencies: semver "^7.3.5" @@ -1053,17 +1042,17 @@ which "^3.0.0" "@npmcli/installed-package-contents@^2.0.1", "@npmcli/installed-package-contents@^2.0.2": - version "2.0.2" - resolved "https://registry.yarnpkg.com/@npmcli/installed-package-contents/-/installed-package-contents-2.0.2.tgz#bfd817eccd9e8df200919e73f57f9e3d9e4f9e33" - integrity sha512-xACzLPhnfD51GKvTOOuNX2/V4G4mz9/1I2MfDoye9kBM3RYe5g2YbscsaGoTlaWqkxeiapBWyseULVKpSVHtKQ== + version "2.1.0" + resolved "https://registry.yarnpkg.com/@npmcli/installed-package-contents/-/installed-package-contents-2.1.0.tgz#63048e5f6e40947a3a88dcbcb4fd9b76fdd37c17" + integrity sha512-c8UuGLeZpm69BryRykLuKRyKFZYJsZSCT4aVY5ds4omyZqJ172ApzgfKJ5eV/r3HgLdUYgFVe54KSFVjKoe27w== dependencies: npm-bundled "^3.0.0" npm-normalize-package-bin "^3.0.0" "@npmcli/map-workspaces@^3.0.2", "@npmcli/map-workspaces@^3.0.4": - version "3.0.4" - resolved "https://registry.yarnpkg.com/@npmcli/map-workspaces/-/map-workspaces-3.0.4.tgz#15ad7d854292e484f7ba04bc30187a8320dba799" - integrity sha512-Z0TbvXkRbacjFFLpVpV0e2mheCh+WzQpcqL+4xp49uNJOxOnIAPZyXtUxZ5Qn3QBTGKA11Exjd9a5411rBrhDg== + version "3.0.6" + resolved "https://registry.yarnpkg.com/@npmcli/map-workspaces/-/map-workspaces-3.0.6.tgz#27dc06c20c35ef01e45a08909cab9cb3da08cea6" + integrity sha512-tkYs0OYnzQm6iIRdfy+LcLBjcKuQCeE5YLb8KnrIlutJfheNaPvPpgoFEyEFgbjzl5PLZ3IA/BWAwRU0eHuQDA== dependencies: "@npmcli/name-from-folder" "^2.0.0" glob "^10.2.2" @@ -1118,10 +1107,10 @@ dependencies: which "^3.0.0" -"@npmcli/query@^3.0.0": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@npmcli/query/-/query-3.0.1.tgz#77d63ceb7d27ed748da3cc8b50d45fc341448ed6" - integrity sha512-0jE8iHBogf/+bFDj+ju6/UMLbJ39c8h6nSe6qile+dB7PJ0iV3gNqcb2vtt6WWCBrxv9uAjzUT/8vroluulidA== +"@npmcli/query@^3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@npmcli/query/-/query-3.1.0.tgz#bc202c59e122a06cf8acab91c795edda2cdad42c" + integrity sha512-C/iR0tk7KSKGldibYIB9x8GtO/0Bd0I2mhOaDb8ucQL/bQVTmGoeREaFj64Z5+iCBRf3dQfed0CjJL7I8iTkiQ== dependencies: postcss-selector-parser "^6.0.10" @@ -1142,46 +1131,51 @@ integrity sha512-tY/msAuJo6ARbK6SPIxZrPBms3xPbfwBrulZe0Wtr/DIY9lje2HeV1uoebShn6mx7SjCHif6EjMvoREj+gZ+SA== "@octokit/core@^5.0.0": - version "5.0.2" - resolved "https://registry.yarnpkg.com/@octokit/core/-/core-5.0.2.tgz#ae7c5d61fdd98ba348a27c3cc510879a130b1234" - integrity sha512-cZUy1gUvd4vttMic7C0lwPed8IYXWYp8kHIMatyhY8t8n3Cpw2ILczkV5pGMPqef7v0bLo0pOHrEHarsau2Ydg== + version "5.2.0" + resolved "https://registry.yarnpkg.com/@octokit/core/-/core-5.2.0.tgz#ddbeaefc6b44a39834e1bb2e58a49a117672a7ea" + integrity sha512-1LFfa/qnMQvEOAdzlQymH0ulepxbxnCYAKJZfMci/5XJyIHWgEYnDmgnKakbTh7CH2tFQ5O60oYDvns4i9RAIg== dependencies: "@octokit/auth-token" "^4.0.0" - "@octokit/graphql" "^7.0.0" - "@octokit/request" "^8.0.2" - "@octokit/request-error" "^5.0.0" - "@octokit/types" "^12.0.0" + "@octokit/graphql" "^7.1.0" + "@octokit/request" "^8.3.1" + "@octokit/request-error" "^5.1.0" + "@octokit/types" "^13.0.0" before-after-hook "^2.2.0" universal-user-agent "^6.0.0" -"@octokit/endpoint@^9.0.0": - version "9.0.4" - resolved "https://registry.yarnpkg.com/@octokit/endpoint/-/endpoint-9.0.4.tgz#8afda5ad1ffc3073d08f2b450964c610b821d1ea" - integrity sha512-DWPLtr1Kz3tv8L0UvXTDP1fNwM0S+z6EJpRcvH66orY6Eld4XBMCSYsaWp4xIm61jTWxK68BrR7ibO+vSDnZqw== +"@octokit/endpoint@^9.0.1": + version "9.0.5" + resolved "https://registry.yarnpkg.com/@octokit/endpoint/-/endpoint-9.0.5.tgz#e6c0ee684e307614c02fc6ac12274c50da465c44" + integrity sha512-ekqR4/+PCLkEBF6qgj8WqJfvDq65RH85OAgrtnVp1mSxaXF03u2xW/hUdweGS5654IlC0wkNYC18Z50tSYTAFw== dependencies: - "@octokit/types" "^12.0.0" + "@octokit/types" "^13.1.0" universal-user-agent "^6.0.0" -"@octokit/graphql@^7.0.0": - version "7.0.2" - resolved "https://registry.yarnpkg.com/@octokit/graphql/-/graphql-7.0.2.tgz#3df14b9968192f9060d94ed9e3aa9780a76e7f99" - integrity sha512-OJ2iGMtj5Tg3s6RaXH22cJcxXRi7Y3EBqbHTBRq+PQAqfaS8f/236fUrWhfSn8P4jovyzqucxme7/vWSSZBX2Q== +"@octokit/graphql@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@octokit/graphql/-/graphql-7.1.0.tgz#9bc1c5de92f026648131f04101cab949eeffe4e0" + integrity sha512-r+oZUH7aMFui1ypZnAvZmn0KSqAUgE1/tUXIWaqUCa1758ts/Jio84GZuzsvUkme98kv0WFY8//n0J1Z+vsIsQ== dependencies: - "@octokit/request" "^8.0.1" - "@octokit/types" "^12.0.0" + "@octokit/request" "^8.3.0" + "@octokit/types" "^13.0.0" universal-user-agent "^6.0.0" -"@octokit/openapi-types@^19.1.0": - version "19.1.0" - resolved "https://registry.yarnpkg.com/@octokit/openapi-types/-/openapi-types-19.1.0.tgz#75ec7e64743870fc73e1ab4bc6ec252ecdd624dc" - integrity sha512-6G+ywGClliGQwRsjvqVYpklIfa7oRPA0vyhPQG/1Feh+B+wU0vGH1JiJ5T25d3g1JZYBHzR2qefLi9x8Gt+cpw== +"@octokit/openapi-types@^20.0.0": + version "20.0.0" + resolved "https://registry.yarnpkg.com/@octokit/openapi-types/-/openapi-types-20.0.0.tgz#9ec2daa0090eeb865ee147636e0c00f73790c6e5" + integrity sha512-EtqRBEjp1dL/15V7WiX5LJMIxxkdiGJnabzYx5Apx4FkQIFgAfKumXeYAqqJCj1s+BMX4cPFIFC4OLCR6stlnA== + +"@octokit/openapi-types@^22.2.0": + version "22.2.0" + resolved "https://registry.yarnpkg.com/@octokit/openapi-types/-/openapi-types-22.2.0.tgz#75aa7dcd440821d99def6a60b5f014207ae4968e" + integrity sha512-QBhVjcUa9W7Wwhm6DBFu6ZZ+1/t/oYxqc2tp81Pi41YNuJinbFRx8B133qVOrAaBbF7D/m0Et6f9/pZt9Rc+tg== "@octokit/plugin-paginate-rest@^9.0.0": - version "9.1.5" - resolved "https://registry.yarnpkg.com/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-9.1.5.tgz#1705bcef4dcde1f4015ee58a63dc61b68648f480" - integrity sha512-WKTQXxK+bu49qzwv4qKbMMRXej1DU2gq017euWyKVudA6MldaSSQuxtz+vGbhxV4CjxpUxjZu6rM2wfc1FiWVg== + version "9.2.1" + resolved "https://registry.yarnpkg.com/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-9.2.1.tgz#2e2a2f0f52c9a4b1da1a3aa17dabe3c459b9e401" + integrity sha512-wfGhE/TAkXZRLjksFXuDZdmGnJQHvtU/joFQdweXUgzo1XwvBCD4o4+75NtFfjfLK5IwLf9vHTfSiU3sLRYpRw== dependencies: - "@octokit/types" "^12.4.0" + "@octokit/types" "^12.6.0" "@octokit/plugin-retry@^6.0.0": version "6.0.1" @@ -1193,38 +1187,45 @@ bottleneck "^2.15.3" "@octokit/plugin-throttling@^8.0.0": - version "8.1.3" - resolved "https://registry.yarnpkg.com/@octokit/plugin-throttling/-/plugin-throttling-8.1.3.tgz#7fb0e001c0cb9383c6be07740b8ec326ed990f6b" - integrity sha512-pfyqaqpc0EXh5Cn4HX9lWYsZ4gGbjnSmUILeu4u2gnuM50K/wIk9s1Pxt3lVeVwekmITgN/nJdoh43Ka+vye8A== + version "8.2.0" + resolved "https://registry.yarnpkg.com/@octokit/plugin-throttling/-/plugin-throttling-8.2.0.tgz#9ec3ea2e37b92fac63f06911d0c8141b46dc4941" + integrity sha512-nOpWtLayKFpgqmgD0y3GqXafMFuKcA4tRPZIfu7BArd2lEZeb1988nhWhwx4aZWmjDmUfdgVf7W+Tt4AmvRmMQ== dependencies: "@octokit/types" "^12.2.0" bottleneck "^2.15.3" -"@octokit/request-error@^5.0.0": - version "5.0.1" - resolved "https://registry.yarnpkg.com/@octokit/request-error/-/request-error-5.0.1.tgz#277e3ce3b540b41525e07ba24c5ef5e868a72db9" - integrity sha512-X7pnyTMV7MgtGmiXBwmO6M5kIPrntOXdyKZLigNfQWSEQzVxR4a4vo49vJjTWX70mPndj8KhfT4Dx+2Ng3vnBQ== +"@octokit/request-error@^5.0.0", "@octokit/request-error@^5.1.0": + version "5.1.0" + resolved "https://registry.yarnpkg.com/@octokit/request-error/-/request-error-5.1.0.tgz#ee4138538d08c81a60be3f320cd71063064a3b30" + integrity sha512-GETXfE05J0+7H2STzekpKObFe765O5dlAKUTLNGeH+x47z7JjXHfsHKo5z21D/o/IOZTUEI6nyWyR+bZVP/n5Q== dependencies: - "@octokit/types" "^12.0.0" + "@octokit/types" "^13.1.0" deprecation "^2.0.0" once "^1.4.0" -"@octokit/request@^8.0.1", "@octokit/request@^8.0.2": - version "8.1.6" - resolved "https://registry.yarnpkg.com/@octokit/request/-/request-8.1.6.tgz#a76a859c30421737a3918b40973c2ff369009571" - integrity sha512-YhPaGml3ncZC1NfXpP3WZ7iliL1ap6tLkAp6MvbK2fTTPytzVUyUesBBogcdMm86uRYO5rHaM1xIWxigWZ17MQ== +"@octokit/request@^8.3.0", "@octokit/request@^8.3.1": + version "8.4.0" + resolved "https://registry.yarnpkg.com/@octokit/request/-/request-8.4.0.tgz#7f4b7b1daa3d1f48c0977ad8fffa2c18adef8974" + integrity sha512-9Bb014e+m2TgBeEJGEbdplMVWwPmL1FPtggHQRkV+WVsMggPtEkLKPlcVYm/o8xKLkpJ7B+6N8WfQMtDLX2Dpw== dependencies: - "@octokit/endpoint" "^9.0.0" - "@octokit/request-error" "^5.0.0" - "@octokit/types" "^12.0.0" + "@octokit/endpoint" "^9.0.1" + "@octokit/request-error" "^5.1.0" + "@octokit/types" "^13.1.0" universal-user-agent "^6.0.0" -"@octokit/types@^12.0.0", "@octokit/types@^12.2.0", "@octokit/types@^12.4.0": - version "12.4.0" - resolved "https://registry.yarnpkg.com/@octokit/types/-/types-12.4.0.tgz#8f97b601e91ce6b9776ed8152217e77a71be7aac" - integrity sha512-FLWs/AvZllw/AGVs+nJ+ELCDZZJk+kY0zMen118xhL2zD0s1etIUHm1odgjP7epxYU1ln7SZxEUWYop5bhsdgQ== +"@octokit/types@^12.0.0", "@octokit/types@^12.2.0", "@octokit/types@^12.6.0": + version "12.6.0" + resolved "https://registry.yarnpkg.com/@octokit/types/-/types-12.6.0.tgz#8100fb9eeedfe083aae66473bd97b15b62aedcb2" + integrity sha512-1rhSOfRa6H9w4YwK0yrf5faDaDTb+yLyBUKOCV4xtCDB5VmIPqd/v9yr9o6SAzOAlRxMiRiCic6JVM1/kunVkw== + dependencies: + "@octokit/openapi-types" "^20.0.0" + +"@octokit/types@^13.0.0", "@octokit/types@^13.1.0": + version "13.5.0" + resolved "https://registry.yarnpkg.com/@octokit/types/-/types-13.5.0.tgz#4796e56b7b267ebc7c921dcec262b3d5bfb18883" + integrity sha512-HdqWTf5Z3qwDVlzCrP8UJquMwunpDiMPt5er+QjGzL4hqr/vBVY/MauQgS1xWxCDT1oMx1EULyqxncdCY/NVSQ== dependencies: - "@octokit/openapi-types" "^19.1.0" + "@octokit/openapi-types" "^22.2.0" "@openzeppelin/contracts-400@npm:@openzeppelin/contracts@4.0.0": version "4.0.0" @@ -1241,180 +1242,178 @@ resolved "https://registry.yarnpkg.com/@openzeppelin/contracts-upgradeable/-/contracts-upgradeable-4.9.3.tgz#ff17a80fb945f5102571f8efecb5ce5915cc4811" integrity sha512-jjaHAVRMrE4UuZNfDwjlLGDxTHWIOwTJS2ldnc278a0gevfXfPr8hxKEVBGFBE96kl2G3VHDZhUimw/+G3TG2A== +"@openzeppelin/contracts-upgradeable@^5.0.2": + version "5.0.2" + resolved "https://registry.yarnpkg.com/@openzeppelin/contracts-upgradeable/-/contracts-upgradeable-5.0.2.tgz#3e5321a2ecdd0b206064356798c21225b6ec7105" + integrity sha512-0MmkHSHiW2NRFiT9/r5Lu4eJq5UJ4/tzlOgYXNAIj/ONkQTVnz22pLxDvp4C4uZ9he7ZFvGn3Driptn1/iU7tQ== + "@openzeppelin/contracts@4.9.3": version "4.9.3" resolved "https://registry.yarnpkg.com/@openzeppelin/contracts/-/contracts-4.9.3.tgz#00d7a8cf35a475b160b3f0293a6403c511099364" integrity sha512-He3LieZ1pP2TNt5JbkPA4PNT9WC3gOTOlDcFGJW4Le4QKqwmiNJCRt44APfxMxvq7OugU/cqYuPcSBzOw38DAg== -"@openzeppelin/defender-admin-client@^1.52.0": - version "1.54.1" - resolved "https://registry.yarnpkg.com/@openzeppelin/defender-admin-client/-/defender-admin-client-1.54.1.tgz#b877972992b95a0dc3787f2ade2f044586621357" - integrity sha512-kRpSUdTsnSqntp4FOXIm95t+6VKHc8CUY2Si71VDuxs0q7HSPZkdpRPSntcolwEzWy9L4a8NS/QMwDF5NJ4X1g== - dependencies: - "@openzeppelin/defender-base-client" "1.54.1" - axios "^1.4.0" - ethers "^5.7.2" - lodash "^4.17.19" - node-fetch "^2.6.0" - -"@openzeppelin/defender-base-client@1.54.1", "@openzeppelin/defender-base-client@^1.52.0": - version "1.54.1" - resolved "https://registry.yarnpkg.com/@openzeppelin/defender-base-client/-/defender-base-client-1.54.1.tgz#ed777ae56908d5a920e1f72ac735c63694e65b30" - integrity sha512-DRGz/7KN3ZQwu28YWMOaojrC7jjPkz/uCwkC8/C8B11qwZhA5qIVvyhYHhhFOCl0J84+E3TNdvkPD2q3p2WaJw== - dependencies: - amazon-cognito-identity-js "^6.0.1" - async-retry "^1.3.3" - axios "^1.4.0" - lodash "^4.17.19" - node-fetch "^2.6.0" +"@openzeppelin/contracts@^5.0.2": + version "5.0.2" + resolved "https://registry.yarnpkg.com/@openzeppelin/contracts/-/contracts-5.0.2.tgz#b1d03075e49290d06570b2fd42154d76c2a5d210" + integrity sha512-ytPc6eLGcHHnapAZ9S+5qsdomhjo6QBHTDRRBFfTxXIpsicMhVPouPgmUPebZZZGX7vt9USA+Z+0M0dSVtSUEA== -"@openzeppelin/defender-sdk-account-client@^1.8.0": - version "1.8.0" - resolved "https://registry.yarnpkg.com/@openzeppelin/defender-sdk-account-client/-/defender-sdk-account-client-1.8.0.tgz#ebefcc7f893dac1bae653efcc75b4f48abb46b1a" - integrity sha512-S/G+Cmemi3D0dBlAfQBL4/ZAVt+LtivIg+oWKGaUr3wG2usx12CURMaTTb087FlQabdpxEqiExb5xTCSeKBZ9g== +"@openzeppelin/defender-sdk-account-client@^1.14.4": + version "1.14.4" + resolved "https://registry.yarnpkg.com/@openzeppelin/defender-sdk-account-client/-/defender-sdk-account-client-1.14.4.tgz#06f822cb57910fbfe15826397ede14785285626f" + integrity sha512-SxV4oTofO/xf1IcNJ5Dcc6XdXrxmu2jNPIeOx6GhdwVmO2LDVgi/9pAwXNlW1ihZ4wkJf/BSz3JsRJCgrwkadQ== dependencies: - "@openzeppelin/defender-sdk-base-client" "^1.8.0" - axios "^1.4.0" + "@openzeppelin/defender-sdk-base-client" "^1.14.4" + axios "^1.7.2" lodash "^4.17.21" -"@openzeppelin/defender-sdk-action-client@^1.8.0": - version "1.8.0" - resolved "https://registry.yarnpkg.com/@openzeppelin/defender-sdk-action-client/-/defender-sdk-action-client-1.8.0.tgz#971562101aedd2f35dd3ec500aacf987b7708fc3" - integrity sha512-+hngMvj/5YMAJ7lDKNWOJRPO4bG3KOZhgzzJpGIFOJo4vk3qRY/ogb30uDl1+aSXGCLTrtlTlwcRCM2rLyhZBQ== +"@openzeppelin/defender-sdk-action-client@^1.14.4": + version "1.14.4" + resolved "https://registry.yarnpkg.com/@openzeppelin/defender-sdk-action-client/-/defender-sdk-action-client-1.14.4.tgz#c2c6dd17f7c13e1bf7863730ac4d06a78d272689" + integrity sha512-YoRW3ZST1YCGkBIPtzJNPR0ajK9H0cxhT+evbRX9hgiUNJTgTDJeKGX+qOKOMjKOPXikiYUc2TpmKwP1I2tP5A== dependencies: - "@openzeppelin/defender-sdk-base-client" "^1.8.0" - axios "^1.4.0" - glob "^7.1.6" + "@openzeppelin/defender-sdk-base-client" "^1.14.4" + axios "^1.7.2" + dotenv "^16.3.1" + glob "^11.0.0" jszip "^3.10.1" lodash "^4.17.21" -"@openzeppelin/defender-sdk-base-client@^1.5.0", "@openzeppelin/defender-sdk-base-client@^1.8.0": - version "1.8.0" - resolved "https://registry.yarnpkg.com/@openzeppelin/defender-sdk-base-client/-/defender-sdk-base-client-1.8.0.tgz#2209a060ce61b4dfc44c7ac0c2b1d86e18b69f7d" - integrity sha512-XIJat6BW2CTM74AwG5IL0Q/aE6RXj8x7smnVKmBql4wMvmirVW+njfwzZCLhUTiBXg9AlHxIInEF14SabfIisg== +"@openzeppelin/defender-sdk-base-client@^1.10.0", "@openzeppelin/defender-sdk-base-client@^1.14.4": + version "1.14.4" + resolved "https://registry.yarnpkg.com/@openzeppelin/defender-sdk-base-client/-/defender-sdk-base-client-1.14.4.tgz#3ccd3beb94cba61883f769afe7e6fdbdc5daa12d" + integrity sha512-tOePVQLKpqfGQ1GMzHvSBNd2psPYd86LDNpvdl5gjD0Y2kW/zNh5qBXy29RraGtk/qc8zs9hzS5pAOh0vhGkGQ== dependencies: amazon-cognito-identity-js "^6.3.6" async-retry "^1.3.3" -"@openzeppelin/defender-sdk-deploy-client@^1.5.0", "@openzeppelin/defender-sdk-deploy-client@^1.8.0": - version "1.8.0" - resolved "https://registry.yarnpkg.com/@openzeppelin/defender-sdk-deploy-client/-/defender-sdk-deploy-client-1.8.0.tgz#1e186d2b3ff176c6a4c03e8207bad8022528975f" - integrity sha512-/tNS2EnHuA5l095wzMbIkGMDNHZLcZQ2eLUP8z+AeKaAUeR2z4qzZ1ul21kR3EJURAyoy8aULFZanLggoBWHrA== +"@openzeppelin/defender-sdk-deploy-client@^1.10.0", "@openzeppelin/defender-sdk-deploy-client@^1.14.4": + version "1.14.4" + resolved "https://registry.yarnpkg.com/@openzeppelin/defender-sdk-deploy-client/-/defender-sdk-deploy-client-1.14.4.tgz#1feb94575a32ed4ddee81d03cdb060064936a528" + integrity sha512-+diSoz1zid37LMsY2RDxI+uAsYx9Eryg8Vz+yfvuyd56fXrzjQEln7BBtYQw+2zp9yvyAByOL5XSQdrQga9OBQ== dependencies: - "@ethersproject/abi" "^5.7.0" - "@openzeppelin/defender-sdk-base-client" "^1.8.0" - axios "^1.4.0" + "@openzeppelin/defender-sdk-base-client" "^1.14.4" + axios "^1.7.2" lodash "^4.17.21" -"@openzeppelin/defender-sdk-monitor-client@^1.8.0": - version "1.8.0" - resolved "https://registry.yarnpkg.com/@openzeppelin/defender-sdk-monitor-client/-/defender-sdk-monitor-client-1.8.0.tgz#55f1e91a06f739c8311ed1456c5c4abd76c32cdf" - integrity sha512-eZDWs01c7+8V/d6ct6RvNKYnuTzueYxwkuoZhG9BUoT5ALmtPQJlRZrjguuBzI7+zYwCS57y4ymro7453hOKeA== +"@openzeppelin/defender-sdk-key-value-store-client@^1.14.4": + version "1.14.4" + resolved "https://registry.yarnpkg.com/@openzeppelin/defender-sdk-key-value-store-client/-/defender-sdk-key-value-store-client-1.14.4.tgz#2e9e93e41f41fcaef4f05fbe50af61e1227dc79f" + integrity sha512-8InEiGeUpahKuWTgFWUyS5DS9HkXeHWMW+yxolGwxCy+OIGEPfxg/oMBXC2UzGn3BfIvWic/CLspFzuWIlarEQ== dependencies: - "@ethersproject/abi" "^5.7.0" - "@openzeppelin/defender-sdk-base-client" "^1.8.0" - axios "^1.4.0" + "@openzeppelin/defender-sdk-base-client" "^1.14.4" + axios "^1.7.2" + fs-extra "^11.2.0" lodash "^4.17.21" -"@openzeppelin/defender-sdk-network-client@^1.8.0": - version "1.8.0" - resolved "https://registry.yarnpkg.com/@openzeppelin/defender-sdk-network-client/-/defender-sdk-network-client-1.8.0.tgz#84ab6c28ba8162f146304363546682f24c409154" - integrity sha512-Fuefe+cSlyG8qvPlgbVCtbYlsh0WgbbgAcalNbLq1esW6XHAMzYT2AoHISY2BVADtm7rpyb5fgT6lI3PWIoIcQ== +"@openzeppelin/defender-sdk-monitor-client@^1.14.4": + version "1.14.4" + resolved "https://registry.yarnpkg.com/@openzeppelin/defender-sdk-monitor-client/-/defender-sdk-monitor-client-1.14.4.tgz#092e6cb3d18f4872b6fe81b6a1c769c7a08095a1" + integrity sha512-PSesKNicY37LiHD2EVsyZXQrHRZsPYaVhUuMdqfNoJZexPZfnhv7c2A481tt+hTwAccJguQF69NLqylpdgtpFQ== dependencies: - "@ethersproject/abi" "^5.7.0" - "@openzeppelin/defender-sdk-base-client" "^1.8.0" - axios "^1.4.0" + "@openzeppelin/defender-sdk-base-client" "^1.14.4" + axios "^1.7.2" + ethers "^6.9.0" lodash "^4.17.21" -"@openzeppelin/defender-sdk-notification-channel-client@^1.8.0": - version "1.8.0" - resolved "https://registry.yarnpkg.com/@openzeppelin/defender-sdk-notification-channel-client/-/defender-sdk-notification-channel-client-1.8.0.tgz#b9dcd6fee39eefc2090e5ba3a86d9c7b62b47512" - integrity sha512-V7YJkEdxDDg3L9tcRS/K0FciYdwNhDNCwU5zCPAYHwHii0PDhz6XjB2g/zWLxhZMzOtY246swrnXiOYfvjwirA== +"@openzeppelin/defender-sdk-network-client@^1.10.0", "@openzeppelin/defender-sdk-network-client@^1.14.4": + version "1.14.4" + resolved "https://registry.yarnpkg.com/@openzeppelin/defender-sdk-network-client/-/defender-sdk-network-client-1.14.4.tgz#0f89c45f601e28c2f87c487b62b48d9cd4b5b956" + integrity sha512-OS0H5b0vgYacJcwkvUFJUaRuyUaXhIRl916W5xLvGia5H6i/qn3dP8MZ7oLcPwKc8jB+ucRytO4H/AHsea0aVA== dependencies: - "@ethersproject/abi" "^5.7.0" - "@openzeppelin/defender-sdk-base-client" "^1.8.0" - axios "^1.4.0" + "@openzeppelin/defender-sdk-base-client" "^1.14.4" + axios "^1.7.2" + lodash "^4.17.21" + +"@openzeppelin/defender-sdk-notification-channel-client@^1.14.4": + version "1.14.4" + resolved "https://registry.yarnpkg.com/@openzeppelin/defender-sdk-notification-channel-client/-/defender-sdk-notification-channel-client-1.14.4.tgz#5387d0f14f344a1c0dfb9aedf75f64ab22c3ded1" + integrity sha512-xCMUe4pseRA+tQMrd6PDoZ4aToDi0LPrVAlBXFDFxCZ6/TzcsVA/PgfM4Hy6R+9vF+S5gMFGuJkCpDtlcYfo5A== + dependencies: + "@openzeppelin/defender-sdk-base-client" "^1.14.4" + axios "^1.7.2" lodash "^4.17.21" -"@openzeppelin/defender-sdk-proposal-client@^1.8.0": - version "1.8.0" - resolved "https://registry.yarnpkg.com/@openzeppelin/defender-sdk-proposal-client/-/defender-sdk-proposal-client-1.8.0.tgz#1273b4ac8966fcf024ae03bb96aa2c5ba4137356" - integrity sha512-EIPE3yDK0cbnHpt5ptR20yzW/ao2Qzv5v17Hwu83VG95L5csIMmy7ndjmAie15gaB9Xkw1MKdpHmHhzmohESPg== +"@openzeppelin/defender-sdk-proposal-client@^1.14.4": + version "1.14.4" + resolved "https://registry.yarnpkg.com/@openzeppelin/defender-sdk-proposal-client/-/defender-sdk-proposal-client-1.14.4.tgz#fec7080fc7712e8c7daef923883ddbbdc20e76ee" + integrity sha512-xVI5A6wJb/XfqVAEkSsINrgGkNznw0eZL7CnzX1OUnZ4irrlaD4HpG/CkFgVWLx8tRIMFlUtb3as3KMc/sO8eg== dependencies: - "@openzeppelin/defender-sdk-base-client" "^1.8.0" - axios "^1.4.0" + "@openzeppelin/defender-sdk-base-client" "^1.14.4" + axios "^1.7.2" ethers "^6.9.0" lodash "^4.17.21" -"@openzeppelin/defender-sdk-relay-client@^1.8.0": - version "1.8.0" - resolved "https://registry.yarnpkg.com/@openzeppelin/defender-sdk-relay-client/-/defender-sdk-relay-client-1.8.0.tgz#fafcc4687cabe44bf61c5613da22bcf20d0c8c0e" - integrity sha512-l50OmHl51Hnf5RMZHCVI1PBqb9Af5/DZJKefKqEMA2QpOwnY9gopeFcOsyPWS+d1EDHTUDrKpsFzpCifWWyxeA== +"@openzeppelin/defender-sdk-relay-client@^1.14.4": + version "1.14.4" + resolved "https://registry.yarnpkg.com/@openzeppelin/defender-sdk-relay-client/-/defender-sdk-relay-client-1.14.4.tgz#2649c5e7b237626df50943aef6001fb0ec18f08d" + integrity sha512-L+vPUeeg36muOy1Oh8wqNEJ8qXXQrFytYZerPS9N/Vf7TQBZoKUkuVq69dw7+XYq/ouqbppvAvUtV9SnyDkYpQ== dependencies: - "@openzeppelin/defender-sdk-base-client" "^1.8.0" - axios "^1.4.0" + "@openzeppelin/defender-sdk-base-client" "^1.14.4" + axios "^1.7.2" lodash "^4.17.21" -"@openzeppelin/defender-sdk-relay-signer-client@^1.8.0": - version "1.8.0" - resolved "https://registry.yarnpkg.com/@openzeppelin/defender-sdk-relay-signer-client/-/defender-sdk-relay-signer-client-1.8.0.tgz#c7825428c44e0b2c3912dc5817e3c65081de09f6" - integrity sha512-nZyIKk7dQHWVbtSEsr7zQWVaiX3Ftn/D9ucOCr0+tuWDM70UXrZ8uvLX3MfRPKpc8GAkZjBbUPMLcppLu3g8VQ== +"@openzeppelin/defender-sdk-relay-signer-client@^1.14.4": + version "1.14.4" + resolved "https://registry.yarnpkg.com/@openzeppelin/defender-sdk-relay-signer-client/-/defender-sdk-relay-signer-client-1.14.4.tgz#583b7a202ac5f619b5c4f954c42c2a85c0f39a32" + integrity sha512-zjVhor/LEHYG6Gf+GEFTrwsuGZjVbzqTqQew4X622FY38P13PpcEIdXDgbokqdlX8zpECcggD2kmTTDgVWRqjA== dependencies: "@ethersproject/bignumber" "^5.7.0" "@ethersproject/bytes" "^5.7.0" - "@ethersproject/contracts" "^5.7.0" "@ethersproject/logger" "^5.7.0" "@ethersproject/networks" "^5.7.1" "@ethersproject/properties" "^5.7.0" - "@ethersproject/random" "^5.7.0" + "@ethersproject/providers" "^5.7.2" "@ethersproject/strings" "^5.7.0" - "@openzeppelin/defender-sdk-base-client" "^1.8.0" + "@openzeppelin/defender-sdk-base-client" "^1.14.4" amazon-cognito-identity-js "^6.3.6" - axios "^1.4.0" + axios "^1.7.2" + ethers "^6.9.0" lodash "^4.17.21" "@openzeppelin/defender-sdk@^1.7.0": - version "1.8.0" - resolved "https://registry.yarnpkg.com/@openzeppelin/defender-sdk/-/defender-sdk-1.8.0.tgz#e5455d9eb29a2eb29089742e1f27cd2afa406ff0" - integrity sha512-aFlOLKqJgRcXa5u3uzAhz53BHAUP6S2kyWu4q5M7/9FsyXP6norqe8p6eH67aLuuAZzPzYN+t5M2ebarSW4fag== - dependencies: - "@openzeppelin/defender-sdk-account-client" "^1.8.0" - "@openzeppelin/defender-sdk-action-client" "^1.8.0" - "@openzeppelin/defender-sdk-base-client" "^1.8.0" - "@openzeppelin/defender-sdk-deploy-client" "^1.8.0" - "@openzeppelin/defender-sdk-monitor-client" "^1.8.0" - "@openzeppelin/defender-sdk-network-client" "^1.8.0" - "@openzeppelin/defender-sdk-notification-channel-client" "^1.8.0" - "@openzeppelin/defender-sdk-proposal-client" "^1.8.0" - "@openzeppelin/defender-sdk-relay-client" "^1.8.0" - "@openzeppelin/defender-sdk-relay-signer-client" "^1.8.0" - -"@openzeppelin/hardhat-upgrades@2.5.0": - version "2.5.0" - resolved "https://registry.yarnpkg.com/@openzeppelin/hardhat-upgrades/-/hardhat-upgrades-2.5.0.tgz#29b6bdc1a998bdc1672028586510e144ec25ae7e" - integrity sha512-pRsqyRbp8LX9sTSMbL7jx4NjqjN/4PlKngmuAyRQIheYTGbRIs3FW3WyLuiCjkDlTETfmOsmzrnZxJmxDmxZIA== - dependencies: - "@openzeppelin/defender-admin-client" "^1.52.0" - "@openzeppelin/defender-base-client" "^1.52.0" - "@openzeppelin/defender-sdk-base-client" "^1.5.0" - "@openzeppelin/defender-sdk-deploy-client" "^1.5.0" - "@openzeppelin/upgrades-core" "^1.31.2" + version "1.14.4" + resolved "https://registry.yarnpkg.com/@openzeppelin/defender-sdk/-/defender-sdk-1.14.4.tgz#e7953976fef682d28e3885a905bb70397f028bb0" + integrity sha512-QFXvqeLzfFxyRq5bw+7h2pq65pztNKBUy0vtizdSeQMA6MZ5wqDyTu/8bziYdQH+BmKzMqYBgErJAmic2XCzZQ== + dependencies: + "@openzeppelin/defender-sdk-account-client" "^1.14.4" + "@openzeppelin/defender-sdk-action-client" "^1.14.4" + "@openzeppelin/defender-sdk-base-client" "^1.14.4" + "@openzeppelin/defender-sdk-deploy-client" "^1.14.4" + "@openzeppelin/defender-sdk-key-value-store-client" "^1.14.4" + "@openzeppelin/defender-sdk-monitor-client" "^1.14.4" + "@openzeppelin/defender-sdk-network-client" "^1.14.4" + "@openzeppelin/defender-sdk-notification-channel-client" "^1.14.4" + "@openzeppelin/defender-sdk-proposal-client" "^1.14.4" + "@openzeppelin/defender-sdk-relay-client" "^1.14.4" + "@openzeppelin/defender-sdk-relay-signer-client" "^1.14.4" + +"@openzeppelin/hardhat-upgrades@^3.0.1", "@openzeppelin/hardhat-upgrades@^3.2.1": + version "3.2.1" + resolved "https://registry.yarnpkg.com/@openzeppelin/hardhat-upgrades/-/hardhat-upgrades-3.2.1.tgz#f531784810050b1b3d7a227d6812a0d31ed0cf65" + integrity sha512-Zy5M3QhkzwGdpzQmk+xbWdYOGJWjoTvwbBKYLhctu9B91DoprlhDRaZUwCtunwTdynkTDGdVfGr0kIkvycyKjw== + dependencies: + "@openzeppelin/defender-sdk-base-client" "^1.10.0" + "@openzeppelin/defender-sdk-deploy-client" "^1.10.0" + "@openzeppelin/defender-sdk-network-client" "^1.10.0" + "@openzeppelin/upgrades-core" "^1.35.0" chalk "^4.1.0" debug "^4.1.1" ethereumjs-util "^7.1.5" proper-lockfile "^4.1.1" - undici "^5.14.0" + undici "^6.11.1" -"@openzeppelin/upgrades-core@^1.31.2": - version "1.32.2" - resolved "https://registry.yarnpkg.com/@openzeppelin/upgrades-core/-/upgrades-core-1.32.2.tgz#4313bd0a547090a350817cf798af60e0eb0728e8" - integrity sha512-EkXriOHZfn6u00Tbq0zUuhHDeTQB9WyAZKZo3UeYdqULb7E3vqxZgxgXmWJwEzAb6E77DvprzQ4gwCAjMV/S4Q== +"@openzeppelin/upgrades-core@^1.32.2", "@openzeppelin/upgrades-core@^1.35.0": + version "1.37.1" + resolved "https://registry.yarnpkg.com/@openzeppelin/upgrades-core/-/upgrades-core-1.37.1.tgz#b1879270a83e57639227770b5462b707ad6ab5b0" + integrity sha512-dMQPDoMn1OUZXsCHT1thnAmkZ14v0FNlst5Ej8MIfujOv0k74kUok5XeuNF42fYewnNUYMkkz3PhXU1OIwSeyg== dependencies: + "@nomicfoundation/slang" "^0.17.0" cbor "^9.0.0" chalk "^4.1.0" compare-versions "^6.0.0" debug "^4.1.1" ethereumjs-util "^7.0.3" + minimatch "^9.0.5" minimist "^1.2.7" proper-lockfile "^4.1.1" solidity-ast "^0.4.51" @@ -1424,6 +1423,11 @@ resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== +"@pkgr/core@^0.1.0": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@pkgr/core/-/core-0.1.1.tgz#1ec17e2edbec25c8306d424ecfbf13c7de1aaa31" + integrity sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA== + "@pnpm/config.env-replace@^1.1.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@pnpm/config.env-replace/-/config.env-replace-1.1.0.tgz#ab29da53df41e8948a00f2433f085f54de8b3a4c" @@ -1437,18 +1441,23 @@ graceful-fs "4.2.10" "@pnpm/npm-conf@^2.1.0": - version "2.2.2" - resolved "https://registry.yarnpkg.com/@pnpm/npm-conf/-/npm-conf-2.2.2.tgz#0058baf1c26cbb63a828f0193795401684ac86f0" - integrity sha512-UA91GwWPhFExt3IizW6bOeY/pQ0BkuNwKjk9iQW9KqxluGCrg4VenZ0/L+2Y0+ZOtme72EVvg6v0zo3AMQRCeA== + version "2.3.1" + resolved "https://registry.yarnpkg.com/@pnpm/npm-conf/-/npm-conf-2.3.1.tgz#bb375a571a0bd63ab0a23bece33033c683e9b6b0" + integrity sha512-c83qWb22rNRuB0UaVCI0uRPNRr8Z0FWnEIvT47jiHAmOIUHbBOg5XvV7pM5x+rKn9HRpjxquDbXYSXr3fAKFcw== dependencies: "@pnpm/config.env-replace" "^1.1.0" "@pnpm/network.ca-file" "^1.0.1" config-chain "^1.1.11" -"@scure/base@~1.1.0": - version "1.1.5" - resolved "https://registry.yarnpkg.com/@scure/base/-/base-1.1.5.tgz#1d85d17269fe97694b9c592552dd9e5e33552157" - integrity sha512-Brj9FiG2W1MRQSTB212YVPRrcbjkv48FoZi/u4l/zds/ieRrqsh7aUf6CLwkAq61oKXr/ZlTzlY66gLIj3TFTQ== +"@rtsao/scc@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@rtsao/scc/-/scc-1.1.0.tgz#927dd2fae9bc3361403ac2c7a00c32ddce9ad7e8" + integrity sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g== + +"@scure/base@~1.1.0", "@scure/base@~1.1.6": + version "1.1.8" + resolved "https://registry.yarnpkg.com/@scure/base/-/base-1.1.8.tgz#8f23646c352f020c83bca750a82789e246d42b50" + integrity sha512-6CyAclxj3Nb0XT7GHK6K4zK6k2xJm6E4Ft0Ohjt4WgegiFUHEtFb2CGzmPmGBwoIhrLsqNLYfLr04Y1GePrzZg== "@scure/bip32@1.1.5": version "1.1.5" @@ -1459,14 +1468,14 @@ "@noble/secp256k1" "~1.7.0" "@scure/base" "~1.1.0" -"@scure/bip32@1.3.1": - version "1.3.1" - resolved "https://registry.yarnpkg.com/@scure/bip32/-/bip32-1.3.1.tgz#7248aea723667f98160f593d621c47e208ccbb10" - integrity sha512-osvveYtyzdEVbt3OfwwXFr4P2iVBL5u1Q3q4ONBfDY/UpOuXmOlbgwc1xECEboY8wIays8Yt6onaWMUdUbfl0A== +"@scure/bip32@1.4.0": + version "1.4.0" + resolved "https://registry.yarnpkg.com/@scure/bip32/-/bip32-1.4.0.tgz#4e1f1e196abedcef395b33b9674a042524e20d67" + integrity sha512-sVUpc0Vq3tXCkDGYVWGIZTRfnvu8LoTDaev7vbwh0omSvVORONr960MQWdKqJDCReIEmTj3PAr73O3aoxz7OPg== dependencies: - "@noble/curves" "~1.1.0" - "@noble/hashes" "~1.3.1" - "@scure/base" "~1.1.0" + "@noble/curves" "~1.4.0" + "@noble/hashes" "~1.4.0" + "@scure/base" "~1.1.6" "@scure/bip39@1.1.1": version "1.1.1" @@ -1476,13 +1485,13 @@ "@noble/hashes" "~1.2.0" "@scure/base" "~1.1.0" -"@scure/bip39@1.2.1": - version "1.2.1" - resolved "https://registry.yarnpkg.com/@scure/bip39/-/bip39-1.2.1.tgz#5cee8978656b272a917b7871c981e0541ad6ac2a" - integrity sha512-Z3/Fsz1yr904dduJD0NpiyRHhRYHdcnyh73FZWiV+/qhWi83wNJ3NWolYqCEN+ZWsUz2TWwajJggcRE9r1zUYg== +"@scure/bip39@1.3.0": + version "1.3.0" + resolved "https://registry.yarnpkg.com/@scure/bip39/-/bip39-1.3.0.tgz#0f258c16823ddd00739461ac31398b4e7d6a18c3" + integrity sha512-disdg7gHuTDZtY+ZdkmLpPCk7fxZSu3gBiEGuoC1XYxv9cGx3Z6cpTggCgW6odSOOIXCiDjuGejW+aJKCY/pIQ== dependencies: - "@noble/hashes" "~1.3.0" - "@scure/base" "~1.1.0" + "@noble/hashes" "~1.4.0" + "@scure/base" "~1.1.6" "@semantic-release/commit-analyzer@^10.0.0": version "10.0.4" @@ -1522,9 +1531,9 @@ p-reduce "^2.0.0" "@semantic-release/github@^9.0.0": - version "9.2.5" - resolved "https://registry.yarnpkg.com/@semantic-release/github/-/github-9.2.5.tgz#69fd50759a2bb80dc1c38fded7f79e524a32c546" - integrity sha512-XWumFEOHiWllekymZjeVgkQCJ4YnD8020ZspAHYIIBNX8O4d/1ldeU5iNXu6NGkKlOCokyXh13KwVP0UEMm5kw== + version "9.2.6" + resolved "https://registry.yarnpkg.com/@semantic-release/github/-/github-9.2.6.tgz#0b0b00ab3ab0486cd3aecb4ae2f9f9cf2edd8eae" + integrity sha512-shi+Lrf6exeNZF+sBhK+P011LSbhmIAoUEgEY6SsxF8irJ+J2stwI5jkyDQ+4gzYyDImzV6LCKdYB9FXnQRWKA== dependencies: "@octokit/core" "^5.0.0" "@octokit/plugin-paginate-rest" "^9.0.0" @@ -1540,7 +1549,7 @@ issue-parser "^6.0.0" lodash-es "^4.17.21" mime "^4.0.0" - p-filter "^3.0.0" + p-filter "^4.0.0" url-join "^5.0.0" "@semantic-release/npm@^10.0.2": @@ -1680,17 +1689,17 @@ resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-5.6.0.tgz#41dd6093d34652cddb5d5bdeee04eafc33826668" integrity sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g== -"@sindresorhus/merge-streams@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@sindresorhus/merge-streams/-/merge-streams-1.0.0.tgz#9cd84cc15bc865a5ca35fcaae198eb899f7b5c90" - integrity sha512-rUV5WyJrJLoloD4NDN1V1+LDMDWOa4OTsT4yYJwQNpTU6FWxkxHpL7eu4w+DmiH8x/EAM1otkPE1+LaspIbplw== +"@sindresorhus/merge-streams@^2.1.0": + version "2.3.0" + resolved "https://registry.yarnpkg.com/@sindresorhus/merge-streams/-/merge-streams-2.3.0.tgz#719df7fb41766bc143369eaa0dd56d8dc87c9958" + integrity sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg== -"@smithy/types@^2.7.0": - version "2.7.0" - resolved "https://registry.yarnpkg.com/@smithy/types/-/types-2.7.0.tgz#6ed9ba5bff7c4d28c980cff967e6d8456840a4f3" - integrity sha512-1OIFyhK+vOkMbu4aN2HZz/MomREkrAC/HqY5mlJMUJfGrPRwijJDTeiN8Rnj9zUaB8ogXAfIOtZrrgqZ4w7Wnw== +"@smithy/types@^3.4.0": + version "3.4.0" + resolved "https://registry.yarnpkg.com/@smithy/types/-/types-3.4.0.tgz#08b7b3d6af30c66fd0682c73c206a5baf8b40a63" + integrity sha512-0shOWSg/pnFXPcsSU8ZbaJ4JBHZJPPzLCJxafJvbMVFo9l1w81CqpgUqjlKGNHVrVB7fhIs+WS82JDTyzaLyLA== dependencies: - tslib "^2.5.0" + tslib "^2.6.2" "@solidity-parser/parser@^0.14.0": version "0.14.5" @@ -1699,12 +1708,10 @@ dependencies: antlr4ts "^0.5.0-alpha.4" -"@solidity-parser/parser@^0.16.0": - version "0.16.2" - resolved "https://registry.yarnpkg.com/@solidity-parser/parser/-/parser-0.16.2.tgz#42cb1e3d88b3e8029b0c9befff00b634cd92d2fa" - integrity sha512-PI9NfoA3P8XK2VBkK5oIfRgKDsicwDZfkVq9ZTBCQYGOP1N2owgY2dyLGyU5/J/hQs8KRk55kdmvTLjy3Mu3vg== - dependencies: - antlr4ts "^0.5.0-alpha.4" +"@solidity-parser/parser@^0.18.0": + version "0.18.0" + resolved "https://registry.yarnpkg.com/@solidity-parser/parser/-/parser-0.18.0.tgz#8e77a02a09ecce957255a2f48c9a7178ec191908" + integrity sha512-yfORGUIPgLck41qyN7nbwJRAx17/jAIXCTanHOJZhB6PJ1iAk/84b/xlsVKFSyNyLXIj0dhppoE0+CRws7wlzA== "@szmarczak/http-timer@^5.0.1": version "5.0.1" @@ -1714,20 +1721,23 @@ defer-to-connect "^2.0.1" "@tenderly/hardhat-tenderly@^2.0.1": - version "2.1.0" - resolved "https://registry.yarnpkg.com/@tenderly/hardhat-tenderly/-/hardhat-tenderly-2.1.0.tgz#20036426da8f11a5d8860703ef64cdb9086cc98d" - integrity sha512-wy6WnvrT4fxqTsln5DH3MgT+lvUV7AyqHVtSyGJgQh6NX0Q59ZXKoqedB8Hi3IkYMOhbjbPFlR0Z/zr8sYGEzQ== + version "2.3.0" + resolved "https://registry.yarnpkg.com/@tenderly/hardhat-tenderly/-/hardhat-tenderly-2.3.0.tgz#4ac6a7849d4a45b33b6d62d4896bdbb44c70305d" + integrity sha512-Q21HeQofncnrH33Ys4Xd2HRgxl+4E/HgUqUIu6l734Cpw07KMwlsTicEML0nlVPgLDmtNrJv4cnFn4SypwioaA== dependencies: "@ethersproject/bignumber" "^5.7.0" - "@nomicfoundation/hardhat-ethers" "^3.0.4" - axios "^0.27.2" + "@nomicfoundation/hardhat-ignition" "^0.15.5" + "@nomicfoundation/hardhat-verify" "^2.0.8" + "@openzeppelin/hardhat-upgrades" "^3.0.1" + "@openzeppelin/upgrades-core" "^1.32.2" + axios "^1.6.7" ethers "^6.8.1" fs-extra "^10.1.0" hardhat-deploy "^0.11.43" - tenderly "^0.8.0" + tenderly "^0.9.1" ts-node "^10.9.1" tslog "^4.3.1" - typescript "^5.2.2" + typescript "^5.5.4" "@tootallnate/once@2": version "2.0.0" @@ -1735,9 +1745,9 @@ integrity sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A== "@tsconfig/node10@^1.0.7": - version "1.0.9" - resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.9.tgz#df4907fc07a886922637b15e02d4cebc4c0021b2" - integrity sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA== + version "1.0.11" + resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.11.tgz#6ee46400685f130e278128c7b38b7e031ff5b2f2" + integrity sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw== "@tsconfig/node12@^1.0.7": version "1.0.11" @@ -1804,9 +1814,9 @@ "@types/chai" "*" "@types/chai@*", "@types/chai@^4.3.11": - version "4.3.11" - resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.3.11.tgz#e95050bf79a932cb7305dd130254ccdf9bde671c" - integrity sha512-qQR1dr2rGIHYlJulmr8Ioq3De0Le9E4MJ5AiaeAETJJpndT1uUNHsGFK3L/UIu+rbkQSdj8J/w2bCsBZc/Y5fQ== + version "4.3.19" + resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.3.19.tgz#14519f437361d41e84102ed3fbc922ddace3e228" + integrity sha512-2hHHvQBVE2FiSK4eN0Br6snX9MtolHaTo/batnLjlGRhoQzlCL61iVpxoqO7SfFyOw+P/pwv+0zNHzKoGWz9Cw== "@types/concat-stream@^1.6.0": version "1.6.1" @@ -1866,11 +1876,11 @@ integrity sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw== "@types/node@*": - version "20.10.5" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.10.5.tgz#47ad460b514096b7ed63a1dae26fad0914ed3ab2" - integrity sha512-nNPsNE65wjMxEKI93yOP+NPGGBJz/PoN3kZsVLee0XMiJolxSekEVD8wRwBUBqkwc7UWop0edW50yrCQW4CyRw== + version "22.5.4" + resolved "https://registry.yarnpkg.com/@types/node/-/node-22.5.4.tgz#83f7d1f65bc2ed223bdbf57c7884f1d5a4fa84e8" + integrity sha512-FDuKUJQm/ju9fT/SeX/6+gBzoPzlVCzfzmGkwKvRHQVxi4BntVbyIwf6a4Xn62mrvndLiml6z/UBXIdEVjQLXg== dependencies: - undici-types "~5.26.4" + undici-types "~6.19.2" "@types/node@18.15.13": version "18.15.13" @@ -1883,9 +1893,9 @@ integrity sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw== "@types/node@^18.15.11": - version "18.19.3" - resolved "https://registry.yarnpkg.com/@types/node/-/node-18.19.3.tgz#e4723c4cb385641d61b983f6fe0b716abd5f8fc0" - integrity sha512-k5fggr14DwAytoA/t8rPrIz++lXK7/DqckthCmoZOKNsEbJkId4Z//BqgApXBUGrGddrigYa1oqheo/7YmW4rg== + version "18.19.50" + resolved "https://registry.yarnpkg.com/@types/node/-/node-18.19.50.tgz#8652b34ee7c0e7e2004b3f08192281808d41bf5a" + integrity sha512-xonK+NRrMBRtkL1hVCc3G+uXtjh1Al4opBLjqVmipe5ZAaBYWW6cNAiBVZ1BvmkBhep698rP3UM3aRAdSALuhg== dependencies: undici-types "~5.26.4" @@ -1912,17 +1922,9 @@ integrity sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA== "@types/qs@^6.2.31", "@types/qs@^6.9.7": - version "6.9.11" - resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.11.tgz#208d8a30bc507bd82e03ada29e4732ea46a6bbda" - integrity sha512-oGk0gmhnEJK4Yyk+oI7EfXsLayXatCWPHary1MtcmbAifkobT9cM9yutG/hZKIseOU0MqbIwQ/u2nn/Gb+ltuQ== - -"@types/readable-stream@^2.3.13": - version "2.3.15" - resolved "https://registry.yarnpkg.com/@types/readable-stream/-/readable-stream-2.3.15.tgz#3d79c9ceb1b6a57d5f6e6976f489b9b5384321ae" - integrity sha512-oM5JSKQCcICF1wvGgmecmHldZ48OZamtMxcGGVICOJA8o8cahXC1zEVAif8iwoc5j8etxFaRFnf095+CDsuoFQ== - dependencies: - "@types/node" "*" - safe-buffer "~5.1.1" + version "6.9.15" + resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.15.tgz#adde8a060ec9c305a82de1babc1056e73bd64dce" + integrity sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg== "@types/secp256k1@^4.0.1": version "4.0.6" @@ -1932,9 +1934,9 @@ "@types/node" "*" "@types/semver@^7.3.12": - version "7.5.6" - resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.6.tgz#c65b2bfce1bec346582c07724e3f8c1017a20339" - integrity sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A== + version "7.5.8" + resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.8.tgz#8268a8c57a3e4abd25c165ecd36237db7948a55e" + integrity sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ== "@types/triple-beam@^1.3.2": version "1.3.5" @@ -1947,9 +1949,9 @@ integrity sha512-CiJJvcRtIgzadHCYXw7dqEnMNRjhGZlYK05Mj9OyktqV8uVT8fD2BFOB7S1uwBE3Kj2Z+4UyPmFw/Ixgw/LAlA== "@types/whatwg-url@^11.0.2": - version "11.0.3" - resolved "https://registry.yarnpkg.com/@types/whatwg-url/-/whatwg-url-11.0.3.tgz#9f584c9a9421f0971029ee504dd62a831cb8f3aa" - integrity sha512-z1ELvMijRL1QmU7QuzDkeYXSF2+dXI0ITKoQsIoVKcNBOiK5RMmWy+pYYxJTHFt8vkpZe7UsvRErQwcxZkjoUw== + version "11.0.5" + resolved "https://registry.yarnpkg.com/@types/whatwg-url/-/whatwg-url-11.0.5.tgz#aaa2546e60f0c99209ca13360c32c78caf2c409f" + integrity sha512-coYR071JRaHa+xoEvvYqvnIHaVqaYrLPbsufM9BF63HkwI5Lgmy2QR8Q5K/lYDYo5AK82wOvSOS0UsLTpTG7uQ== dependencies: "@types/webidl-conversions" "*" @@ -2042,10 +2044,10 @@ resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406" integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== -"@zero-tech/eslint-config-cpt@0.2.7": - version "0.2.7" - resolved "https://registry.yarnpkg.com/@zero-tech/eslint-config-cpt/-/eslint-config-cpt-0.2.7.tgz#ec1d94848737863a8c9b9e226fd586b7f8a97346" - integrity sha512-reFmMkcPBjkQgq2hD5FDWfuGIl4dWvKoIdigq3zS375QNLAqQwuY2EPK2RRLQw7Qcw8nTvPFfv4Gwu2fm8yVfQ== +"@zero-tech/eslint-config-cpt@0.2.8": + version "0.2.8" + resolved "https://registry.yarnpkg.com/@zero-tech/eslint-config-cpt/-/eslint-config-cpt-0.2.8.tgz#f4b69187e65f61d519c77755f5ae0963efeb5c9d" + integrity sha512-i5v/tl6Nv23gM8HGXJiiYh5NaL1guARDtka2cx7T6K7g41zd9NZPynHQeGHHtv3zvcFG/hP5J8uS7O3k4DpplA== dependencies: "@typescript-eslint/eslint-plugin" "^5.57.1" "@typescript-eslint/parser" "^5.57.1" @@ -2053,14 +2055,25 @@ eslint-config-airbnb "^19.0.4" eslint-config-airbnb-base "^15.0.0" eslint-plugin-import "^2.27.5" - eslint-plugin-jsdoc "^40.1.1" + eslint-plugin-jsdoc "^50.3.0" eslint-plugin-prefer-arrow "^1.2.3" typescript "^5.0.2" -"@zero-tech/ztoken@2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@zero-tech/ztoken/-/ztoken-2.0.0.tgz#42e2c2aa28ffbc64ce4340cf0464bcc22a155be5" - integrity sha512-t6eLaK3KFsMUZ8cD1OqAiLQgvfYvXSIsgvEwt6FPedT5h64s/5XbVc1MWW22DZ98HqmgcWyEUs3g1MBAG1orCQ== +"@zero-tech/zdc@../zDC/zero-tech-zdc-0.1.7.tgz": + version "0.1.7" + resolved "../zDC/zero-tech-zdc-0.1.7.tgz#fb9a7609eccb9a96f2901e4ab61a424949a93d37" + dependencies: + axios "^1.6.5" + mongodb "^6.3.0" + winston "^3.11.0" + +"@zero-tech/ztoken@2.1.0": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@zero-tech/ztoken/-/ztoken-2.1.0.tgz#71f50b532c258588ade488644fd75d1b8028a256" + integrity sha512-5S392GkiE+mH+ZNWs1XKL/ia4YiQ9tf+i8p1qeoHBFqatwB1wP3XTl+GkosqSxaJPnw/nNq7bn2W+XBnGATxJg== + dependencies: + "@openzeppelin/contracts" "4.9.3" + "@openzeppelin/contracts-upgradeable" "4.9.3" JSONStream@^1.3.5: version "1.3.5" @@ -2085,45 +2098,22 @@ abbrev@^2.0.0: resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-2.0.0.tgz#cf59829b8b4f03f89dda2771cb7f3653828c89bf" integrity sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ== -abort-controller@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392" - integrity sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg== - dependencies: - event-target-shim "^5.0.0" - -abstract-level@^1.0.0, abstract-level@^1.0.2, abstract-level@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/abstract-level/-/abstract-level-1.0.3.tgz#78a67d3d84da55ee15201486ab44c09560070741" - integrity sha512-t6jv+xHy+VYwc4xqZMn2Pa9DjcdzvzZmQGRjTFc8spIbRGHgBrEKbPq+rYXc7CCo0lxgYvSgKVg9qZAhpVQSjA== - dependencies: - buffer "^6.0.3" - catering "^2.1.0" - is-buffer "^2.0.5" - level-supports "^4.0.0" - level-transcoder "^1.0.1" - module-error "^1.0.1" - queue-microtask "^1.2.3" - acorn-jsx@^5.3.2: version "5.3.2" resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== acorn-walk@^8.1.1: - version "8.3.1" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.1.tgz#2f10f5b69329d90ae18c58bf1fa8fccd8b959a43" - integrity sha512-TgUZgYvqZprrl7YldZNoa9OciCAyZR+Ejm9eXzKCmjsF5IKp/wgQ7Z/ZpjpGTIUPwrHQIcYeI8qDh4PsEwxMbw== - -acorn@^8.4.1, acorn@^8.9.0: - version "8.11.2" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.2.tgz#ca0d78b51895be5390a5903c5b3bdcdaf78ae40b" - integrity sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w== + version "8.3.4" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.4.tgz#794dd169c3977edf4ba4ea47583587c5866236b7" + integrity sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g== + dependencies: + acorn "^8.11.0" -address@^1.0.1: - version "1.2.2" - resolved "https://registry.yarnpkg.com/address/-/address-1.2.2.tgz#2b5248dac5485a6390532c6a517fda2e3faac89e" - integrity sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA== +acorn@^8.11.0, acorn@^8.12.0, acorn@^8.4.1, acorn@^8.9.0: + version "8.12.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.12.1.tgz#71616bdccbe25e27a54439e0046e89ca76df2248" + integrity sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg== adm-zip@^0.4.16: version "0.4.16" @@ -2148,9 +2138,9 @@ agent-base@6, agent-base@^6.0.2: debug "4" agent-base@^7.0.2, agent-base@^7.1.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-7.1.0.tgz#536802b76bc0b34aa50195eb2442276d613e3434" - integrity sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg== + version "7.1.1" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-7.1.1.tgz#bdbded7dfb096b751a2a087eeeb9664725b2e317" + integrity sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA== dependencies: debug "^4.3.4" @@ -2169,14 +2159,6 @@ aggregate-error@^3.0.0: clean-stack "^2.0.0" indent-string "^4.0.0" -aggregate-error@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-4.0.1.tgz#25091fe1573b9e0be892aeda15c7c66a545f758e" - integrity sha512-0poP0T7el6Vq3rstR8Mn4V/IQrpBLO6POkUSrN7RhyY+GF/InCFShQzsQ39T25gkHhLgSLByyAz+Kjb+c2L98w== - dependencies: - clean-stack "^4.0.0" - indent-string "^5.0.0" - aggregate-error@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-5.0.0.tgz#ffe15045d7521c51c9d618e3d7f37c13f29b3fd3" @@ -2196,19 +2178,19 @@ ajv@^6.12.4, ajv@^6.12.6: uri-js "^4.2.2" ajv@^8.0.1: - version "8.12.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.12.0.tgz#d1a0527323e22f53562c567c00991577dfbe19d1" - integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== + version "8.17.1" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.17.1.tgz#37d9a5c776af6bc92d7f4f9510eba4c0a60d11a6" + integrity sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g== dependencies: - fast-deep-equal "^3.1.1" + fast-deep-equal "^3.1.3" + fast-uri "^3.0.1" json-schema-traverse "^1.0.0" require-from-string "^2.0.2" - uri-js "^4.2.2" -amazon-cognito-identity-js@^6.0.1, amazon-cognito-identity-js@^6.3.6: - version "6.3.7" - resolved "https://registry.yarnpkg.com/amazon-cognito-identity-js/-/amazon-cognito-identity-js-6.3.7.tgz#65c3d7ee4e0c0a1ffea01927248989c5bd1d1868" - integrity sha512-tSjnM7KyAeOZ7UMah+oOZ6cW4Gf64FFcc7BE2l7MTcp7ekAPrXaCbpcW2xEpH1EiDS4cPcAouHzmCuc2tr72vQ== +amazon-cognito-identity-js@^6.3.6: + version "6.3.12" + resolved "https://registry.yarnpkg.com/amazon-cognito-identity-js/-/amazon-cognito-identity-js-6.3.12.tgz#af73df033094ad4c679c19cf6122b90058021619" + integrity sha512-s7NKDZgx336cp+oDeUtB2ZzT8jWJp/v2LWuYl+LQtMEODe22RF1IJ4nRiDATp+rp1pTffCZcm44Quw4jx2bqNg== dependencies: "@aws-crypto/sha256-js" "1.2.2" buffer "4.9.2" @@ -2221,12 +2203,14 @@ amdefine@>=0.0.4: resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" integrity sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg== -ansi-colors@4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" - integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== +ansi-align@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-3.0.1.tgz#0cdf12e111ace773a86e9a1fad1225c43cb19a59" + integrity sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w== + dependencies: + string-width "^4.1.0" -ansi-colors@^4.1.1: +ansi-colors@^4.1.1, ansi-colors@^4.1.3: version "4.1.3" resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.3.tgz#37611340eb2243e70cc604cad35d63270d48781b" integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== @@ -2239,11 +2223,9 @@ ansi-escapes@^4.3.0: type-fest "^0.21.3" ansi-escapes@^6.2.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-6.2.0.tgz#8a13ce75286f417f1963487d86ba9f90dccf9947" - integrity sha512-kzRaCqXnpzWs+3z5ABPQiVke+iq0KXkHo8xiWV4RPTi5Yli0l97BEQuhXV1s7+aSU/fu1kUuxgS4MsQ0fRuygw== - dependencies: - type-fest "^3.0.0" + version "6.2.1" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-6.2.1.tgz#76c54ce9b081dad39acec4b5d53377913825fb0f" + integrity sha512-4nJ3yixlEthEJ9Rk4vPcdBRkZvQZlYyu8j4/Mqz5sgIkddmEnH2Yj2ZrnP9S3tQOvSNRUIgVNF/1yPpRAGNRig== ansi-regex@^2.0.0: version "2.1.1" @@ -2261,9 +2243,9 @@ ansi-regex@^5.0.1: integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== ansi-regex@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a" - integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== + version "6.1.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.1.0.tgz#95ec409c69619d6cb1b8b34f14b660ef28ebd654" + integrity sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA== ansi-styles@^3.2.1: version "3.2.1" @@ -2289,10 +2271,10 @@ ansicolors@~0.3.2: resolved "https://registry.yarnpkg.com/ansicolors/-/ansicolors-0.3.2.tgz#665597de86a9ffe3aa9bfbe6cae5c6ea426b4979" integrity sha512-QXu7BPrP29VllRxH8GwB7x5iX5qWKAAMLqKQGWTeLWVlNHNOpVMJ91dsxQAIWXpjuW5wqvxu3Jd/nRjrJ+0pqg== -antlr4@^4.11.0: - version "4.13.1" - resolved "https://registry.yarnpkg.com/antlr4/-/antlr4-4.13.1.tgz#1e0a1830a08faeb86217cb2e6c34716004e4253d" - integrity sha512-kiXTspaRYvnIArgE97z5YVVf/cDVQABr3abFRR6mE7yesLMkgu4ujuyV/sgxafQ8wgve0DJQUJ38Z8tkgA2izA== +antlr4@^4.13.1-patch-1: + version "4.13.2" + resolved "https://registry.yarnpkg.com/antlr4/-/antlr4-4.13.2.tgz#0d084ad0e32620482a9c3a0e2470c02e72e4006d" + integrity sha512-QiVbZhyy4xAZ17UPEuG3YTOt8ZaoeOR1CvEAqrEsDBsOqINslaB147i9xqljZqoyf5S+EUlGStaj+t22LT9MOg== antlr4ts@^0.5.0-alpha.4: version "0.5.0-alpha.4" @@ -2317,6 +2299,11 @@ archy@~1.0.0: resolved "https://registry.yarnpkg.com/archy/-/archy-1.0.0.tgz#f9c8c13757cc1dd7bc379ac77b2c62a5c2868c40" integrity sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw== +are-docs-informative@^0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/are-docs-informative/-/are-docs-informative-0.0.2.tgz#387f0e93f5d45280373d387a59d34c96db321963" + integrity sha512-ixiS0nLNNG5jNQzgZJNoUpBKdo9yTYZMGJ+QgT2jmjR7G7+QHRCc4v6LQ3NgE7EBJq+o0ams3waJwkrlBom8Ig== + are-we-there-yet@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz#679df222b278c64f2cdba1175cdc00b0d96164bd" @@ -2326,12 +2313,9 @@ are-we-there-yet@^3.0.0: readable-stream "^3.6.0" are-we-there-yet@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-4.0.1.tgz#05a6fc0e5f70771b673e82b0f915616e0ace8fd3" - integrity sha512-2zuA+jpOYBRgoBCfa+fB87Rk0oGJjDX6pxGzqH6f33NzUhG25Xur6R0u0Z9VVAq8Z5JvQpQI6j6rtonuivC8QA== - dependencies: - delegates "^1.0.0" - readable-stream "^4.1.0" + version "4.0.2" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-4.0.2.tgz#aed25dd0eae514660d49ac2b2366b175c614785a" + integrity sha512-ncSWAawFhKMJDTdoAeOV+jyW1VCMj5QIAwULIBV0SSR7B/RLPPEQiknKcg/RIIZlUQrxELpsxMiTUoAQ4sIUyg== arg@^4.1.0: version "4.1.3" @@ -2365,28 +2349,29 @@ array-back@^4.0.1, array-back@^4.0.2: resolved "https://registry.yarnpkg.com/array-back/-/array-back-4.0.2.tgz#8004e999a6274586beeb27342168652fdb89fa1e" integrity sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg== -array-buffer-byte-length@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz#fabe8bc193fea865f317fe7807085ee0dee5aead" - integrity sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A== +array-buffer-byte-length@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz#1e5583ec16763540a27ae52eed99ff899223568f" + integrity sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg== dependencies: - call-bind "^1.0.2" - is-array-buffer "^3.0.1" + call-bind "^1.0.5" + is-array-buffer "^3.0.4" array-ify@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/array-ify/-/array-ify-1.0.0.tgz#9e528762b4a9066ad163a6962a364418e9626ece" integrity sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng== -array-includes@^3.1.7: - version "3.1.7" - resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.7.tgz#8cd2e01b26f7a3086cbc87271593fe921c62abda" - integrity sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ== +array-includes@^3.1.8: + version "3.1.8" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.8.tgz#5e370cbe172fdd5dd6530c1d4aadda25281ba97d" + integrity sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ== dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - get-intrinsic "^1.2.1" + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-object-atoms "^1.0.0" + get-intrinsic "^1.2.4" is-string "^1.0.7" array-union@^2.1.0: @@ -2399,27 +2384,17 @@ array-uniq@1.0.3: resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" integrity sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q== -array.prototype.findlast@^1.2.2: - version "1.2.3" - resolved "https://registry.yarnpkg.com/array.prototype.findlast/-/array.prototype.findlast-1.2.3.tgz#4e4b375de5adf4897fed155e2d2771564865cc3b" - integrity sha512-kcBubumjciBg4JKp5KTKtI7ec7tRefPk88yjkWJwaVKYd9QfTaxcsOxoMNKd7iBr447zCfDV0z1kOF47umv42g== - dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - es-shim-unscopables "^1.0.0" - get-intrinsic "^1.2.1" - -array.prototype.findlastindex@^1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.3.tgz#b37598438f97b579166940814e2c0493a4f50207" - integrity sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA== +array.prototype.findlastindex@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz#8c35a755c72908719453f87145ca011e39334d0d" + integrity sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ== dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - es-shim-unscopables "^1.0.0" - get-intrinsic "^1.2.1" + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + es-shim-unscopables "^1.0.2" array.prototype.flat@^1.3.2: version "1.3.2" @@ -2441,17 +2416,18 @@ array.prototype.flatmap@^1.3.2: es-abstract "^1.22.1" es-shim-unscopables "^1.0.0" -arraybuffer.prototype.slice@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz#98bd561953e3e74bb34938e77647179dfe6e9f12" - integrity sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw== +arraybuffer.prototype.slice@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz#097972f4255e41bc3425e37dc3f6421cf9aefde6" + integrity sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A== dependencies: - array-buffer-byte-length "^1.0.0" - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - get-intrinsic "^1.2.1" - is-array-buffer "^3.0.2" + array-buffer-byte-length "^1.0.1" + call-bind "^1.0.5" + define-properties "^1.2.1" + es-abstract "^1.22.3" + es-errors "^1.2.1" + get-intrinsic "^1.2.3" + is-array-buffer "^3.0.4" is-shared-array-buffer "^1.0.2" arrify@^1.0.1: @@ -2492,9 +2468,9 @@ async@1.x: integrity sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w== async@^3.2.3: - version "3.2.5" - resolved "https://registry.yarnpkg.com/async/-/async-3.2.5.tgz#ebd52a8fdaf7a2289a24df399f8d8485c8a46b66" - integrity sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg== + version "3.2.6" + resolved "https://registry.yarnpkg.com/async/-/async-3.2.6.tgz#1b0728e14929d51b85b449b7f06e27c1145e38ce" + integrity sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA== asynckit@^0.4.0: version "0.4.0" @@ -2506,10 +2482,12 @@ at-least-node@^1.0.0: resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== -available-typed-arrays@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" - integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== +available-typed-arrays@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz#a5cc375d6a03c2efc87a553f3e0b1522def14846" + integrity sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ== + dependencies: + possible-typed-array-names "^1.0.0" axios@^0.21.1: version "0.21.4" @@ -2526,12 +2504,12 @@ axios@^0.27.2: follow-redirects "^1.14.9" form-data "^4.0.0" -axios@^1.4.0, axios@^1.5.1: - version "1.6.2" - resolved "https://registry.yarnpkg.com/axios/-/axios-1.6.2.tgz#de67d42c755b571d3e698df1b6504cde9b0ee9f2" - integrity sha512-7i24Ri4pmDRfJTR7LDBhsOTtcm+9kjX5WiY1X3wIisx6G9So3pfMkEiU7emUBe46oceVImccTEM3k6C5dbVW8A== +axios@^1.4.0, axios@^1.5.1, axios@^1.6.5, axios@^1.6.7, axios@^1.7.2: + version "1.7.7" + resolved "https://registry.yarnpkg.com/axios/-/axios-1.7.7.tgz#2f554296f9892a72ac8d8e4c5b79c14a91d0a47f" + integrity sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q== dependencies: - follow-redirects "^1.15.0" + follow-redirects "^1.15.6" form-data "^4.0.0" proxy-from-env "^1.1.0" @@ -2541,9 +2519,9 @@ balanced-match@^1.0.0: integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== base-x@^3.0.2, base-x@^3.0.8: - version "3.0.9" - resolved "https://registry.yarnpkg.com/base-x/-/base-x-3.0.9.tgz#6349aaabb58526332de9f60995e548a53fe21320" - integrity sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ== + version "3.0.10" + resolved "https://registry.yarnpkg.com/base-x/-/base-x-3.0.10.tgz#62de58653f8762b5d6f8d9fe30fa75f7b2585a75" + integrity sha512-7d0s06rR9rYaIWHkpfLIFICM/tkSVdoPC9qYAQRpxn9DdKNWNsKC0uk++akckyLq16Tx2WIinnZ6WRriAt6njQ== dependencies: safe-buffer "^5.0.1" @@ -2567,15 +2545,10 @@ big-integer@1.6.36: resolved "https://registry.yarnpkg.com/big-integer/-/big-integer-1.6.36.tgz#78631076265d4ae3555c04f85e7d9d2f3a071a36" integrity sha512-t70bfa7HYEA1D9idDbmuv7YbsbVkQ+Hp+8KFSul4aE5e/i1bjCNIRYJZlA8Q8p0r9T8cF/RVvwUgRA//FydEyg== -bigint-crypto-utils@^3.0.23: - version "3.3.0" - resolved "https://registry.yarnpkg.com/bigint-crypto-utils/-/bigint-crypto-utils-3.3.0.tgz#72ad00ae91062cf07f2b1def9594006c279c1d77" - integrity sha512-jOTSb+drvEDxEq6OuUybOAv/xxoh3cuYRUIPyu8sSHQNKM303UQ2R1DAo45o1AkcIXw6fzbaFI1+xGGdaXs2lg== - bin-links@^4.0.1: - version "4.0.3" - resolved "https://registry.yarnpkg.com/bin-links/-/bin-links-4.0.3.tgz#9e4a3c5900830aee3d7f52178b65e01dcdde64a5" - integrity sha512-obsRaULtJurnfox/MDwgq6Yo9kzbv1CPTk/1/s7Z/61Lezc8IKkFCOXNeVLXz0456WRzBQmSsDWlai2tIhBsfA== + version "4.0.4" + resolved "https://registry.yarnpkg.com/bin-links/-/bin-links-4.0.4.tgz#c3565832b8e287c85f109a02a17027d152a58a63" + integrity sha512-cMtq4W5ZsEwcutJrVId+a/tjt8GSbS+h0oNkdl6+6rBuEv8Ot33Bevj5KPm40t309zuhVic8NjpuL42QCiJWWA== dependencies: cmd-shim "^6.0.0" npm-normalize-package-bin "^3.0.0" @@ -2583,9 +2556,9 @@ bin-links@^4.0.1: write-file-atomic "^5.0.0" binary-extensions@^2.0.0, binary-extensions@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" - integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== + version "2.3.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522" + integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== blakejs@^1.1.0: version "1.2.1" @@ -2617,6 +2590,20 @@ bottleneck@^2.15.3: resolved "https://registry.yarnpkg.com/bottleneck/-/bottleneck-2.19.5.tgz#5df0b90f59fd47656ebe63c78a98419205cadd91" integrity sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw== +boxen@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/boxen/-/boxen-5.1.2.tgz#788cb686fc83c1f486dfa8a40c68fc2b831d2b50" + integrity sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ== + dependencies: + ansi-align "^3.0.0" + camelcase "^6.2.0" + chalk "^4.1.0" + cli-boxes "^2.2.1" + string-width "^4.2.2" + type-fest "^0.20.2" + widest-line "^3.1.0" + wrap-ansi "^7.0.0" + brace-expansion@^1.1.7: version "1.1.11" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" @@ -2632,29 +2619,19 @@ brace-expansion@^2.0.1: dependencies: balanced-match "^1.0.0" -braces@^3.0.2, braces@~3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" - integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== +braces@^3.0.3, braces@~3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" + integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== dependencies: - fill-range "^7.0.1" + fill-range "^7.1.1" brorand@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" integrity sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w== -browser-level@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/browser-level/-/browser-level-1.0.1.tgz#36e8c3183d0fe1c405239792faaab5f315871011" - integrity sha512-XECYKJ+Dbzw0lbydyQuJzwNXtOpbMSq737qxJN11sIRTErOMShvDpbzTlgju7orJKvx4epULolZAuJGLzCmWRQ== - dependencies: - abstract-level "^1.0.2" - catering "^2.1.1" - module-error "^1.0.2" - run-parallel-limit "^1.1.0" - -browser-stdout@1.3.1: +browser-stdout@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== @@ -2687,10 +2664,10 @@ bs58check@^2.1.2: create-hash "^1.1.0" safe-buffer "^5.1.2" -bson@^6.2.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/bson/-/bson-6.2.0.tgz#4b6acafc266ba18eeee111373c2699304a9ba0a3" - integrity sha512-ID1cI+7bazPDyL9wYy9GaQ8gEEohWvcUl/Yf0dIdutJxnmInEEyCsb4awy/OiBfall7zBA179Pahi3vCdFze3Q== +bson@^6.7.0: + version "6.8.0" + resolved "https://registry.yarnpkg.com/bson/-/bson-6.8.0.tgz#5063c41ba2437c2b8ff851b50d9e36cb7aaa7525" + integrity sha512-iOJg8pr7wq2tg/zSlCCHMi3hMm5JTOxLTagf3zxhcenHsFp+c6uOs6K7W5UE7A4QIJGtqh/ZovFNMP4mOPJynQ== buffer-from@^1.0.0: version "1.1.2" @@ -2711,7 +2688,7 @@ buffer@4.9.2: ieee754 "^1.1.4" isarray "^1.0.0" -buffer@6.0.3, buffer@^6.0.3: +buffer@6.0.3: version "6.0.3" resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== @@ -2727,13 +2704,6 @@ buffer@^5.5.0, buffer@^5.6.0: base64-js "^1.3.1" ieee754 "^1.1.13" -builtins@^5.0.0: - version "5.0.1" - resolved "https://registry.yarnpkg.com/builtins/-/builtins-5.0.1.tgz#87f6db9ab0458be728564fa81d876d8d74552fa9" - integrity sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ== - dependencies: - semver "^7.0.0" - bytes@3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" @@ -2763,7 +2733,7 @@ cacache@^16.1.0: tar "^6.1.11" unique-filename "^2.0.0" -cacache@^17.0.0, cacache@^17.0.4, cacache@^17.1.3: +cacache@^17.0.0, cacache@^17.0.4, cacache@^17.1.4: version "17.1.4" resolved "https://registry.yarnpkg.com/cacache/-/cacache-17.1.4.tgz#b3ff381580b47e85c6e64f801101508e26604b35" integrity sha512-/aJwG2l3ZMJ1xNAnqbMpA40of9dj/pIH3QfiuQSqjfPJF747VR0J/bHn+/KdNnHKc6XQcWt/AfRSBft82W1d2A== @@ -2799,14 +2769,16 @@ cacheable-request@^10.2.8: normalize-url "^8.0.0" responselike "^3.0.0" -call-bind@^1.0.0, call-bind@^1.0.2, call-bind@^1.0.4, call-bind@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.5.tgz#6fa2b7845ce0ea49bf4d8b9ef64727a2c2e2e513" - integrity sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ== +call-bind@^1.0.2, call-bind@^1.0.5, call-bind@^1.0.6, call-bind@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.7.tgz#06016599c40c56498c18769d2730be242b6fa3b9" + integrity sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w== dependencies: + es-define-property "^1.0.0" + es-errors "^1.3.0" function-bind "^1.1.2" - get-intrinsic "^1.2.1" - set-function-length "^1.1.1" + get-intrinsic "^1.2.4" + set-function-length "^1.2.1" callsites@^3.0.0: version "3.1.0" @@ -2832,7 +2804,7 @@ camelcase@^5.3.1: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== -camelcase@^6.0.0: +camelcase@^6.0.0, camelcase@^6.2.0: version "6.3.0" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== @@ -2845,21 +2817,11 @@ cardinal@^2.1.1: ansicolors "~0.3.2" redeyed "~2.1.0" -case@^1.6.3: - version "1.6.3" - resolved "https://registry.yarnpkg.com/case/-/case-1.6.3.tgz#0a4386e3e9825351ca2e6216c60467ff5f1ea1c9" - integrity sha512-mzDSXIPaFwVDvZAHqZ9VlbyF4yyXRuX6IvB06WvPYkqJVO24kX1PPhv9bfpKNFZyxYFmmgo03HUiD8iklmJYRQ== - caseless@^0.12.0, caseless@~0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" integrity sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw== -catering@^2.1.0, catering@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/catering/-/catering-2.1.1.tgz#66acba06ed5ee28d5286133982a927de9a04b510" - integrity sha512-K7Qy8O9p76sL3/3m7/zLKbRkyOlSZAgzEaLhyj2mXS8PsCud2Eo4hAb8aLtZqHh0QGqLcb9dlJSu6lHRVENm1w== - cbor@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/cbor/-/cbor-8.1.0.tgz#cfc56437e770b73417a2ecbfc9caf6b771af60d5" @@ -2868,23 +2830,23 @@ cbor@^8.1.0: nofilter "^3.1.0" cbor@^9.0.0: - version "9.0.1" - resolved "https://registry.yarnpkg.com/cbor/-/cbor-9.0.1.tgz#b16e393d4948d44758cd54ac6151379d443b37ae" - integrity sha512-/TQOWyamDxvVIv+DY9cOLNuABkoyz8K/F3QE56539pGVYohx0+MEA1f4lChFTX79dBTBS7R1PF6ovH7G+VtBfQ== + version "9.0.2" + resolved "https://registry.yarnpkg.com/cbor/-/cbor-9.0.2.tgz#536b4f2d544411e70ec2b19a2453f10f83cd9fdb" + integrity sha512-JPypkxsB10s9QOWwa6zwPzqE1Md3vqpPc+cai4sAecuCsRyAtAl/pMyhPlMbT/xtPnm2dznJZYRLui57qiRhaQ== dependencies: nofilter "^3.1.0" chai-as-promised@^7.1.1: - version "7.1.1" - resolved "https://registry.yarnpkg.com/chai-as-promised/-/chai-as-promised-7.1.1.tgz#08645d825deb8696ee61725dbf590c012eb00ca0" - integrity sha512-azL6xMoi+uxu6z4rhWQ1jbdUhOMhis2PvscD/xjLqNMkv3BPPp2JyyuTHOrf9BOosGpNQ11v6BKv/g57RXbiaA== + version "7.1.2" + resolved "https://registry.yarnpkg.com/chai-as-promised/-/chai-as-promised-7.1.2.tgz#70cd73b74afd519754161386421fb71832c6d041" + integrity sha512-aBDHZxRzYnUYuIAIPBH2s511DjlKPzXNlXSGFC8CwmroWQLfrW0LtE1nK3MAwwNhJPa9raEjNCmRoFpG0Hurdw== dependencies: check-error "^1.0.2" chai@^4.3.10: - version "4.3.10" - resolved "https://registry.yarnpkg.com/chai/-/chai-4.3.10.tgz#d784cec635e3b7e2ffb66446a63b4e33bd390384" - integrity sha512-0UXG04VuVbruMUYbJ6JctvH0YnC/4q3/AkT18q4NaITo91CUm0liMS9VqzT9vZhVQ/1eqPanMWjBM+Juhfb/9g== + version "4.5.0" + resolved "https://registry.yarnpkg.com/chai/-/chai-4.5.0.tgz#707e49923afdd9b13a8b0b47d33d732d13812fd8" + integrity sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw== dependencies: assertion-error "^1.1.0" check-error "^1.0.3" @@ -2892,7 +2854,7 @@ chai@^4.3.10: get-func-name "^2.0.2" loupe "^2.3.6" pathval "^1.1.1" - type-detect "^4.0.8" + type-detect "^4.1.0" chalk@^2.3.2, chalk@^2.4.2: version "2.4.2" @@ -2928,10 +2890,10 @@ 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: - version "3.5.3" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" - integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== +chokidar@^3.4.0, chokidar@^3.5.2, chokidar@^3.5.3: + version "3.6.0" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" + integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== dependencies: anymatch "~3.1.2" braces "~3.0.2" @@ -2953,10 +2915,10 @@ ci-info@^2.0.0: resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== -ci-info@^3.6.1, ci-info@^3.7.1, ci-info@^3.8.0: - version "3.9.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.9.0.tgz#4279a62028a7b1f262f3473fc9605f5e218c59b4" - integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== +ci-info@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-4.0.0.tgz#65466f8b280fc019b9f50a5388115d17a63a44f2" + integrity sha512-TdHqgGf9odd8SXNuxtUBVx8Nv+qZOejE6qyqiy5NtbYYQOeFa6zmHkxlPzmaLxWWHsU6nJmB7AETdVPi+2NBUg== cidr-regex@^3.1.1: version "3.1.1" @@ -2989,29 +2951,11 @@ class-is@^1.1.0: resolved "https://registry.yarnpkg.com/class-is/-/class-is-1.1.0.tgz#9d3c0fba0440d211d843cec3dedfa48055005825" integrity sha512-rhjH9AG1fvabIDoGRVH587413LPjTZgmDF9fOFCbFJQV4yuocX1mHxxvXI4g3cGwbVY9wAYIoKlg1N79frJKQw== -classic-level@^1.2.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/classic-level/-/classic-level-1.3.0.tgz#5e36680e01dc6b271775c093f2150844c5edd5c8" - integrity sha512-iwFAJQYtqRTRM0F6L8h4JCt00ZSGdOyqh7yVrhhjrOpFhmBjNlRUey64MCiyo6UmQHMJ+No3c81nujPv+n9yrg== - dependencies: - abstract-level "^1.0.2" - catering "^2.1.0" - module-error "^1.0.1" - napi-macros "^2.2.2" - node-gyp-build "^4.3.0" - clean-stack@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== -clean-stack@^4.0.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-4.2.0.tgz#c464e4cde4ac789f4e0735c5d75beb49d7b30b31" - integrity sha512-LYv6XPxoyODi36Dp976riBtSY27VmFo+MKqEU9QCCWyTrdEPDog+RWA7xQWHi6Vbp61j5c4cdzzX1NidnwtUWg== - dependencies: - escape-string-regexp "5.0.0" - clean-stack@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-5.2.0.tgz#c7a0c91939c7caace30a3bf254e8a8ac276d1189" @@ -3019,6 +2963,11 @@ clean-stack@^5.2.0: dependencies: escape-string-regexp "5.0.0" +cli-boxes@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-2.2.1.tgz#ddd5035d25094fce220e9cab40a45840a440318f" + integrity sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw== + cli-columns@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/cli-columns/-/cli-columns-4.0.0.tgz#9fe4d65975238d55218c41bd2ed296a7fa555646" @@ -3038,9 +2987,9 @@ cli-table3@^0.5.0: colors "^1.1.2" 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== + version "0.6.5" + resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.6.5.tgz#013b91351762739c16a9567c21a04632e449bf2f" + integrity sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ== dependencies: string-width "^4.2.0" optionalDependencies: @@ -3079,9 +3028,9 @@ clone@^1.0.2: integrity sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg== cmd-shim@^6.0.0: - version "6.0.2" - resolved "https://registry.yarnpkg.com/cmd-shim/-/cmd-shim-6.0.2.tgz#435fd9e5c95340e61715e19f90209ed6fcd9e0a4" - integrity sha512-+FFYbB0YLaAkhkcrjkyNLYDiOsFSfRjwjY19LXk/psmMx1z00xlCv7hhQoTGXXIKi+YXHL/iiFo8NqMVQX9nOw== + version "6.0.3" + resolved "https://registry.yarnpkg.com/cmd-shim/-/cmd-shim-6.0.3.tgz#c491e9656594ba17ac83c4bd931590a9d6e26033" + integrity sha512-FMabTRlc5t5zjdenF6mS0MBeFZm0XqHqeOkcskKFb/LYCcRQ5fVgLOHVc4Lq9CqABd9zhjwPjMBCJvMCziSVtA== code-point-at@^1.0.0: version "1.1.0" @@ -3186,25 +3135,25 @@ command-line-usage@^6.1.0: table-layout "^1.0.2" typical "^5.2.0" -commander@3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/commander/-/commander-3.0.2.tgz#6837c3fb677ad9933d1cfba42dd14d5117d6b39e" - integrity sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow== - commander@^10.0.0: version "10.0.1" resolved "https://registry.yarnpkg.com/commander/-/commander-10.0.1.tgz#881ee46b4f77d1c1dccc5823433aa39b022cbe06" integrity sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug== +commander@^8.1.0: + version "8.3.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-8.3.0.tgz#4837ea1b2da67b9c616a67afbb0fafee567bca66" + integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== + 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" - integrity sha512-B52sN2VNghyq5ofvUsqZjmk6YkihBX5vMSChmSK9v4ShjKf3Vk5Xcmgpw4o+iIgtrnM/u5FiMpz9VKb8lpBveA== +comment-parser@1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/comment-parser/-/comment-parser-1.4.1.tgz#bdafead37961ac079be11eb7ec65c4d021eaf9cc" + integrity sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg== common-ancestor-path@^1.0.1: version "1.0.1" @@ -3220,9 +3169,9 @@ compare-func@^2.0.0: dot-prop "^5.1.0" compare-versions@^6.0.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/compare-versions/-/compare-versions-6.1.0.tgz#3f2131e3ae93577df111dba133e6db876ffe127a" - integrity sha512-LNZQXhqUvqUTotpZ00qLSaify3b4VFD588aRr8MKFw4CMUr98ytzCW5wDH5qx/DEY5kCDXcbcRuCqL0szEf2tg== + version "6.1.1" + resolved "https://registry.yarnpkg.com/compare-versions/-/compare-versions-6.1.1.tgz#7af3cc1099ba37d244b3145a9af5201b629148a9" + integrity sha512-4hm4VPpIecmlg59CHXnRDnqGplJFrbLG4aFEl5vl6cK1u76ws3LLvX7ikFnTDl5vo39sjWD6AaDPYodJp/NNHg== concat-map@0.0.1: version "0.0.1" @@ -3329,11 +3278,6 @@ cosmiconfig@^8.0.0: parse-json "^5.2.0" path-type "^4.0.0" -crc-32@^1.2.0: - version "1.2.2" - resolved "https://registry.yarnpkg.com/crc-32/-/crc-32-1.2.2.tgz#3cad35a934b8bf71f25ca524b6da51fb7eace2ff" - integrity sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ== - create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" @@ -3401,6 +3345,33 @@ cssesc@^3.0.0: resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== +data-view-buffer@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/data-view-buffer/-/data-view-buffer-1.0.1.tgz#8ea6326efec17a2e42620696e671d7d5a8bc66b2" + integrity sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA== + dependencies: + call-bind "^1.0.6" + es-errors "^1.3.0" + is-data-view "^1.0.1" + +data-view-byte-length@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz#90721ca95ff280677eb793749fce1011347669e2" + integrity sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ== + dependencies: + call-bind "^1.0.7" + es-errors "^1.3.0" + is-data-view "^1.0.1" + +data-view-byte-offset@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz#5e0bbfb4828ed2d1b9b400cd8a7d119bca0ff18a" + integrity sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA== + dependencies: + call-bind "^1.0.6" + es-errors "^1.3.0" + is-data-view "^1.0.1" + dateformat@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-3.0.3.tgz#a6e37499a4d9a9cf85ef5872044d62901c9889ae" @@ -3411,12 +3382,12 @@ 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@4, debug@4.3.4, debug@^4.0.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4: - version "4.3.4" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" - integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== +debug@4, debug@^4.0.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4, debug@^4.3.5, debug@^4.3.6: + version "4.3.7" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.7.tgz#87945b4151a011d76d95a198d7111c865c360a52" + integrity sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ== dependencies: - ms "2.1.2" + ms "^2.1.3" debug@^3.2.7: version "3.2.7" @@ -3451,9 +3422,9 @@ decompress-response@^6.0.0: mimic-response "^3.1.0" deep-eql@^4.0.1, deep-eql@^4.1.3: - version "4.1.3" - resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-4.1.3.tgz#7c7775513092f7df98d8df9996dd085eb668cc6d" - integrity sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw== + version "4.1.4" + resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-4.1.4.tgz#d0d3912865911bb8fac5afb4e3acfa6a28dc72b7" + integrity sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg== dependencies: type-detect "^4.0.0" @@ -3479,21 +3450,21 @@ defer-to-connect@^2.0.1: resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-2.0.1.tgz#8016bdb4143e4632b77a3449c6236277de520587" integrity sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg== -define-data-property@^1.0.1, define-data-property@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.1.tgz#c35f7cd0ab09883480d12ac5cb213715587800b3" - integrity sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ== +define-data-property@^1.0.1, define-data-property@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" + integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== dependencies: - get-intrinsic "^1.2.1" + es-define-property "^1.0.0" + es-errors "^1.3.0" gopd "^1.0.1" - has-property-descriptors "^1.0.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.3, define-properties@^1.2.0, define-properties@^1.2.1: +define-properties@^1.2.0, define-properties@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== @@ -3522,28 +3493,15 @@ deprecation@^2.0.0: resolved "https://registry.yarnpkg.com/deprecation/-/deprecation-2.3.1.tgz#6368cbdb40abf3373b525ac87e4a260c3a700919" integrity sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ== -detect-port@^1.3.0: - version "1.5.1" - resolved "https://registry.yarnpkg.com/detect-port/-/detect-port-1.5.1.tgz#451ca9b6eaf20451acb0799b8ab40dff7718727b" - integrity sha512-aBzdj76lueB6uUst5iAs7+0H/oOjqI5D16XUWxlWMIMROhcM0rfsNVk93zTngq1dDNpoXRr++Sus7ETAExppAQ== - dependencies: - address "^1.0.1" - debug "4" - -diff@5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/diff/-/diff-5.0.0.tgz#7ed6ad76d859d030787ec35855f5b1daf31d852b" - integrity sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w== - diff@^4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== -diff@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/diff/-/diff-5.1.0.tgz#bc52d298c5ea8df9194800224445ed43ffc87e40" - integrity sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw== +diff@^5.1.0, diff@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-5.2.0.tgz#26ded047cd1179b78b9537d5ef725503ce1ae531" + integrity sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A== difflib@^0.2.4: version "0.2.4" @@ -3585,6 +3543,11 @@ dotenv@16.0.3: resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.0.3.tgz#115aec42bac5053db3c456db30cc243a5a836a07" integrity sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ== +dotenv@^16.3.1: + version "16.4.5" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.4.5.tgz#cdd3b3b604cb327e286b4762e13502f717cb099f" + integrity sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg== + duplexer2@~0.1.0: version "0.1.4" resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.1.4.tgz#8b12dab878c0d69e3e7891051662a32fc6bddcc1" @@ -3597,7 +3560,7 @@ eastasianwidth@^0.2.0: resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== -elliptic@6.5.4, elliptic@^6.5.2, elliptic@^6.5.4: +elliptic@6.5.4: version "6.5.4" resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== @@ -3610,6 +3573,19 @@ elliptic@6.5.4, elliptic@^6.5.2, elliptic@^6.5.4: minimalistic-assert "^1.0.1" minimalistic-crypto-utils "^1.0.1" +elliptic@^6.5.2, elliptic@^6.5.4: + version "6.5.7" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.7.tgz#8ec4da2cb2939926a1b9a73619d768207e647c8b" + integrity sha512-ESVCtTwiA+XhY3wyh24QqRGBoP3rEdDUl3EDUUo9tft074fi19IrdpH7hLCMMP3CIj7jb3W96rn8lt/BqIlt5Q== + dependencies: + bn.js "^4.11.9" + brorand "^1.1.0" + hash.js "^1.0.0" + hmac-drbg "^1.0.1" + inherits "^2.0.4" + minimalistic-assert "^1.0.1" + minimalistic-crypto-utils "^1.0.1" + emoji-regex@^8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" @@ -3670,61 +3646,92 @@ error-ex@^1.2.0, error-ex@^1.3.1, error-ex@^1.3.2: dependencies: is-arrayish "^0.2.1" -es-abstract@^1.22.1: - version "1.22.3" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.22.3.tgz#48e79f5573198de6dee3589195727f4f74bc4f32" - integrity sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA== - dependencies: - array-buffer-byte-length "^1.0.0" - arraybuffer.prototype.slice "^1.0.2" - available-typed-arrays "^1.0.5" - call-bind "^1.0.5" - es-set-tostringtag "^2.0.1" +es-abstract@^1.22.1, es-abstract@^1.22.3, es-abstract@^1.23.0, es-abstract@^1.23.2: + version "1.23.3" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.23.3.tgz#8f0c5a35cd215312573c5a27c87dfd6c881a0aa0" + integrity sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A== + dependencies: + array-buffer-byte-length "^1.0.1" + arraybuffer.prototype.slice "^1.0.3" + available-typed-arrays "^1.0.7" + call-bind "^1.0.7" + data-view-buffer "^1.0.1" + data-view-byte-length "^1.0.1" + data-view-byte-offset "^1.0.0" + es-define-property "^1.0.0" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + es-set-tostringtag "^2.0.3" es-to-primitive "^1.2.1" function.prototype.name "^1.1.6" - get-intrinsic "^1.2.2" - get-symbol-description "^1.0.0" + get-intrinsic "^1.2.4" + get-symbol-description "^1.0.2" globalthis "^1.0.3" gopd "^1.0.1" - has-property-descriptors "^1.0.0" - has-proto "^1.0.1" + has-property-descriptors "^1.0.2" + has-proto "^1.0.3" has-symbols "^1.0.3" - hasown "^2.0.0" - internal-slot "^1.0.5" - is-array-buffer "^3.0.2" + hasown "^2.0.2" + internal-slot "^1.0.7" + is-array-buffer "^3.0.4" is-callable "^1.2.7" - is-negative-zero "^2.0.2" + is-data-view "^1.0.1" + is-negative-zero "^2.0.3" is-regex "^1.1.4" - is-shared-array-buffer "^1.0.2" + is-shared-array-buffer "^1.0.3" is-string "^1.0.7" - is-typed-array "^1.1.12" + is-typed-array "^1.1.13" is-weakref "^1.0.2" object-inspect "^1.13.1" object-keys "^1.1.1" - object.assign "^4.1.4" - regexp.prototype.flags "^1.5.1" - safe-array-concat "^1.0.1" - safe-regex-test "^1.0.0" - string.prototype.trim "^1.2.8" - string.prototype.trimend "^1.0.7" - string.prototype.trimstart "^1.0.7" - typed-array-buffer "^1.0.0" - typed-array-byte-length "^1.0.0" - typed-array-byte-offset "^1.0.0" - typed-array-length "^1.0.4" + object.assign "^4.1.5" + regexp.prototype.flags "^1.5.2" + safe-array-concat "^1.1.2" + safe-regex-test "^1.0.3" + string.prototype.trim "^1.2.9" + string.prototype.trimend "^1.0.8" + string.prototype.trimstart "^1.0.8" + typed-array-buffer "^1.0.2" + typed-array-byte-length "^1.0.1" + typed-array-byte-offset "^1.0.2" + typed-array-length "^1.0.6" unbox-primitive "^1.0.2" - which-typed-array "^1.1.13" + which-typed-array "^1.1.15" -es-set-tostringtag@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.2.tgz#11f7cc9f63376930a5f20be4915834f4bc74f9c9" - integrity sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q== +es-define-property@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.0.tgz#c7faefbdff8b2696cf5f46921edfb77cc4ba3845" + integrity sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ== dependencies: - get-intrinsic "^1.2.2" - has-tostringtag "^1.0.0" - hasown "^2.0.0" + get-intrinsic "^1.2.4" + +es-errors@^1.2.1, es-errors@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" + integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== + +es-module-lexer@^1.5.3: + version "1.5.4" + resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.5.4.tgz#a8efec3a3da991e60efa6b633a7cad6ab8d26b78" + integrity sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw== + +es-object-atoms@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.0.0.tgz#ddb55cd47ac2e240701260bc2a8e31ecb643d941" + integrity sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw== + dependencies: + es-errors "^1.3.0" + +es-set-tostringtag@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz#8bb60f0a440c2e4281962428438d58545af39777" + integrity sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ== + dependencies: + get-intrinsic "^1.2.4" + has-tostringtag "^1.0.2" + hasown "^2.0.1" -es-shim-unscopables@^1.0.0: +es-shim-unscopables@^1.0.0, es-shim-unscopables@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz#1f6942e71ecc7835ed1c8a83006d8771a63a3763" integrity sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw== @@ -3741,14 +3748,9 @@ es-to-primitive@^1.2.1: is-symbol "^1.0.2" escalade@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" - integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== - -escape-string-regexp@4.0.0, escape-string-regexp@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" - integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + version "3.2.0" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5" + integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== escape-string-regexp@5.0.0, escape-string-regexp@^5.0.0: version "5.0.0" @@ -3760,6 +3762,11 @@ escape-string-regexp@^1.0.5: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== +escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + escodegen@1.8.x: version "1.8.1" resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.8.1.tgz#5a5b53af4693110bebb0867aa3430dd3b70a1018" @@ -3800,48 +3807,53 @@ eslint-import-resolver-node@^0.3.9: is-core-module "^2.13.0" resolve "^1.22.4" -eslint-module-utils@^2.8.0: - version "2.8.0" - resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz#e439fee65fc33f6bba630ff621efc38ec0375c49" - integrity sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw== +eslint-module-utils@^2.9.0: + version "2.11.0" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.11.0.tgz#b99b211ca4318243f09661fae088f373ad5243c4" + integrity sha512-gbBE5Hitek/oG6MUVj6sFuzEjA/ClzNflVrLovHi/JgLdC7fiN5gLAY1WIPW1a0V5I999MnsrvVrCOGmmVqDBQ== dependencies: debug "^3.2.7" eslint-plugin-import@^2.27.5: - version "2.29.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz#d45b37b5ef5901d639c15270d74d46d161150643" - integrity sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw== + version "2.30.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.30.0.tgz#21ceea0fc462657195989dd780e50c92fe95f449" + integrity sha512-/mHNE9jINJfiD2EKkg1BKyPyUk4zdnT54YgbOgfjSakWT5oyX/qQLVNTkehyfpcMxZXMy1zyonZ2v7hZTX43Yw== dependencies: - array-includes "^3.1.7" - array.prototype.findlastindex "^1.2.3" + "@rtsao/scc" "^1.1.0" + array-includes "^3.1.8" + array.prototype.findlastindex "^1.2.5" array.prototype.flat "^1.3.2" array.prototype.flatmap "^1.3.2" debug "^3.2.7" doctrine "^2.1.0" eslint-import-resolver-node "^0.3.9" - eslint-module-utils "^2.8.0" - hasown "^2.0.0" - is-core-module "^2.13.1" + eslint-module-utils "^2.9.0" + hasown "^2.0.2" + is-core-module "^2.15.1" is-glob "^4.0.3" minimatch "^3.1.2" - object.fromentries "^2.0.7" - object.groupby "^1.0.1" - object.values "^1.1.7" + object.fromentries "^2.0.8" + object.groupby "^1.0.3" + object.values "^1.2.0" semver "^6.3.1" tsconfig-paths "^3.15.0" -eslint-plugin-jsdoc@^40.1.1: - version "40.3.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-40.3.0.tgz#75a91ab71c41bb797db05a32d9528ce3ab613e90" - integrity sha512-EhCqpzRkxoT2DUB4AnrU0ggBYvTh3bWrLZzQTupq6vSVE6XzNwJVKsOHa41GCoevnsWMBNmoDVjXWGqckjuG1g== +eslint-plugin-jsdoc@^50.3.0: + version "50.3.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-50.3.0.tgz#2a4d1ac7f45b2b62de42389ba8006fd00b7f08dd" + integrity sha512-P7qDB/RckdKETpBM4CtjHRQ5qXByPmFhRi86sN3E+J+tySchq+RSOGGhI2hDIefmmKFuTi/1ACjqsnDJDDDfzg== dependencies: - "@es-joy/jsdoccomment" "~0.37.0" - comment-parser "1.3.1" - debug "^4.3.4" + "@es-joy/jsdoccomment" "~0.48.0" + are-docs-informative "^0.0.2" + comment-parser "1.4.1" + debug "^4.3.6" escape-string-regexp "^4.0.0" - esquery "^1.5.0" - semver "^7.3.8" - spdx-expression-parse "^3.0.1" + espree "^10.1.0" + esquery "^1.6.0" + parse-imports "^2.1.1" + semver "^7.6.3" + spdx-expression-parse "^4.0.0" + synckit "^0.9.1" eslint-plugin-prefer-arrow@^1.2.3: version "1.2.3" @@ -3869,16 +3881,21 @@ eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4 resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== -eslint@^8.37.0: - version "8.56.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.56.0.tgz#4957ce8da409dc0809f99ab07a1b94832ab74b15" - integrity sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ== +eslint-visitor-keys@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-4.0.0.tgz#e3adc021aa038a2a8e0b2f8b0ce8f66b9483b1fb" + integrity sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw== + +eslint@^8.37.0, eslint@^8.56.0: + version "8.57.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.57.0.tgz#c786a6fd0e0b68941aaf624596fb987089195668" + integrity sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ== dependencies: "@eslint-community/eslint-utils" "^4.2.0" "@eslint-community/regexpp" "^4.6.1" "@eslint/eslintrc" "^2.1.4" - "@eslint/js" "8.56.0" - "@humanwhocodes/config-array" "^0.11.13" + "@eslint/js" "8.57.0" + "@humanwhocodes/config-array" "^0.11.14" "@humanwhocodes/module-importer" "^1.0.1" "@nodelib/fs.walk" "^1.2.8" "@ungap/structured-clone" "^1.2.0" @@ -3913,6 +3930,15 @@ eslint@^8.37.0: strip-ansi "^6.0.1" text-table "^0.2.0" +espree@^10.1.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/espree/-/espree-10.1.0.tgz#8788dae611574c0f070691f522e4116c5a11fc56" + integrity sha512-M1M6CpiE6ffoigIOWYO9UDP8TMUw9kqb21tf+08IgDYjCsOvCuDt4jQcZmoYxx+w7zlKw9/N0KXfto+I8/FrXA== + dependencies: + acorn "^8.12.0" + acorn-jsx "^5.3.2" + eslint-visitor-keys "^4.0.0" + espree@^9.6.0, espree@^9.6.1: version "9.6.1" resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f" @@ -3932,10 +3958,10 @@ esprima@^4.0.0, esprima@~4.0.0: resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== -esquery@^1.4.2, esquery@^1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.5.0.tgz#6ce17738de8577694edd7361c57182ac8cb0db0b" - integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== +esquery@^1.4.2, esquery@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.6.0.tgz#91419234f804d852a82dceec3e16cdc22cf9dae7" + integrity sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg== dependencies: estraverse "^5.1.0" @@ -3994,11 +4020,11 @@ eth-gas-reporter@^0.2.25: sync-request "^6.0.0" ethereum-bloom-filters@^1.0.6: - version "1.0.10" - resolved "https://registry.yarnpkg.com/ethereum-bloom-filters/-/ethereum-bloom-filters-1.0.10.tgz#3ca07f4aed698e75bd134584850260246a5fed8a" - integrity sha512-rxJ5OFN3RwjQxDcFP2Z5+Q9ho4eIdEmSc2ht0fCu8Se9nbXjZ7/031uXoUYJ87KHCOdVeiUuwSnoS7hmYAGVHA== + version "1.2.0" + resolved "https://registry.yarnpkg.com/ethereum-bloom-filters/-/ethereum-bloom-filters-1.2.0.tgz#8294f074c1a6cbd32c39d2cc77ce86ff14797dab" + integrity sha512-28hyiE7HVsWubqhpVLVmZXFd4ITeHi+BUu05o9isf0GUpMtzBUi+8/gFrGaGYzvGAJQmJ3JKj77Mk9G98T84rA== dependencies: - js-sha3 "^0.8.0" + "@noble/hashes" "^1.4.0" ethereum-cryptography@0.1.3, ethereum-cryptography@^0.1.3: version "0.1.3" @@ -4032,14 +4058,14 @@ ethereum-cryptography@^1.0.3: "@scure/bip39" "1.1.1" ethereum-cryptography@^2.0.0, ethereum-cryptography@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-2.1.2.tgz#18fa7108622e56481157a5cb7c01c0c6a672eb67" - integrity sha512-Z5Ba0T0ImZ8fqXrJbpHcbpAvIswRte2wGNR/KePnu8GbbvgJ47lMxT/ZZPG6i9Jaht4azPDop4HaM00J0J59ug== + version "2.2.1" + resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-2.2.1.tgz#58f2810f8e020aecb97de8c8c76147600b0b8ccf" + integrity sha512-r/W8lkHSiTLxUxW8Rf3u4HGB0xQweG2RyETjywylKZSzLWoWAijRz8WCuOtJ6wah+avllXBqZuk29HCCvhEIRg== dependencies: - "@noble/curves" "1.1.0" - "@noble/hashes" "1.3.1" - "@scure/bip32" "1.3.1" - "@scure/bip39" "1.2.1" + "@noble/curves" "1.4.2" + "@noble/hashes" "1.4.0" + "@scure/bip32" "1.4.0" + "@scure/bip39" "1.3.0" ethereumjs-abi@^0.6.8: version "0.6.8" @@ -4073,7 +4099,7 @@ ethereumjs-util@^7.0.3, ethereumjs-util@^7.1.4, ethereumjs-util@^7.1.5: ethereum-cryptography "^0.1.3" rlp "^2.2.4" -ethers@^5.0.13, ethers@^5.7.0, ethers@^5.7.1, ethers@^5.7.2: +ethers@^5.0.13, ethers@^5.7.0, ethers@^5.7.2: version "5.7.2" resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.7.2.tgz#3a7deeabbb8c030d4126b24f84e525466145872e" integrity sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg== @@ -4109,18 +4135,18 @@ ethers@^5.0.13, ethers@^5.7.0, ethers@^5.7.1, ethers@^5.7.2: "@ethersproject/web" "5.7.1" "@ethersproject/wordlists" "5.7.0" -ethers@^6.8.1, ethers@^6.9.0: - version "6.9.1" - resolved "https://registry.yarnpkg.com/ethers/-/ethers-6.9.1.tgz#4d50c77b46b6661e00f5cc6292e6bcd933fe4cba" - integrity sha512-kuV8fGd4/8Gj7wkurbsuUsm1DCG6N5gKGYdw3fnWG/7QGknhy1xtHD7kbkCWQAcbAYmzLCLqCPedS3FYncFkKQ== +ethers@^6.13.2, ethers@^6.7.0, ethers@^6.8.1, ethers@^6.9.0: + version "6.13.2" + resolved "https://registry.yarnpkg.com/ethers/-/ethers-6.13.2.tgz#4b67d4b49e69b59893931a032560999e5e4419fe" + integrity sha512-9VkriTTed+/27BGuY1s0hf441kqwHJ1wtN2edksEtiRvXx+soxRX3iSXTfFqq2+YwrOqbDoTHjIhQnjJRlzKmg== dependencies: - "@adraffy/ens-normalize" "1.10.0" + "@adraffy/ens-normalize" "1.10.1" "@noble/curves" "1.2.0" "@noble/hashes" "1.3.2" "@types/node" "18.15.13" aes-js "4.0.0-beta.5" tslib "2.4.0" - ws "8.5.0" + ws "8.17.1" ethjs-unit@0.1.6: version "0.1.6" @@ -4138,16 +4164,6 @@ ethjs-util@0.1.6, ethjs-util@^0.1.6: is-hex-prefixed "1.0.0" strip-hex-prefix "1.0.0" -event-target-shim@^5.0.0: - version "5.0.1" - resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789" - integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== - -events@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" - integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== - evp_bytestokey@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" @@ -4242,15 +4258,20 @@ fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6: resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== +fast-uri@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/fast-uri/-/fast-uri-3.0.1.tgz#cddd2eecfc83a71c1be2cc2ef2061331be8a7134" + integrity sha512-MWipKbbYiYI0UC7cl8m/i/IWTqfC8YXsqjzybjddLsFjStroQzsHXkc73JutMvBiXmOvapk+axIl79ig5t55Bw== + fastest-levenshtein@^1.0.16: version "1.0.16" resolved "https://registry.yarnpkg.com/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz#210e61b6ff181de91ea9b3d1b84fdedd47e034e5" integrity sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg== fastq@^1.6.0: - version "1.16.0" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.16.0.tgz#83b9a9375692db77a822df081edb6a9cf6839320" - integrity sha512-ifCoaXsDrsdkWTtiNJX5uzHDsrck5TzfKKDcuFFTIrrc/BS076qgEIfoIy1VeZqViznfKiysPYTh/QeHtnIsYA== + version "1.17.1" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.17.1.tgz#2a523f07a4e7b1e81a42b91b8bf2254107753b47" + integrity sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w== dependencies: reusify "^1.0.4" @@ -4281,10 +4302,10 @@ file-entry-cache@^6.0.1: dependencies: flat-cache "^3.0.4" -fill-range@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" - integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== +fill-range@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" + integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== dependencies: to-regex-range "^5.0.1" @@ -4295,14 +4316,6 @@ find-replace@^3.0.0: dependencies: array-back "^3.0.1" -find-up@5.0.0, find-up@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" - integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== - dependencies: - locate-path "^6.0.0" - path-exists "^4.0.0" - find-up@^1.0.0: version "1.1.2" resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" @@ -4326,6 +4339,14 @@ find-up@^4.1.0: locate-path "^5.0.0" path-exists "^4.0.0" +find-up@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + find-up@^6.3.0: version "6.3.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-6.3.0.tgz#2abab3d3280b2dc7ac10199ef324c4e002c8c790" @@ -4356,9 +4377,9 @@ flat@^5.0.2: integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== flatted@^3.2.9: - version "3.2.9" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.9.tgz#7eb4c67ca1ba34232ca9d2d93e9886e611ad7daf" - integrity sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ== + version "3.3.1" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.1.tgz#21db470729a6734d4997002f439cb308987f567a" + integrity sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw== fmix@^0.1.0: version "0.1.0" @@ -4372,10 +4393,10 @@ fn.name@1.x.x: resolved "https://registry.yarnpkg.com/fn.name/-/fn.name-1.1.0.tgz#26cad8017967aea8731bc42961d04a3d5988accc" integrity sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw== -follow-redirects@^1.12.1, follow-redirects@^1.14.0, follow-redirects@^1.14.9, 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== +follow-redirects@^1.12.1, follow-redirects@^1.14.0, follow-redirects@^1.14.9, follow-redirects@^1.15.6: + version "1.15.9" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.9.tgz#a604fa10e443bf98ca94228d9eebcc2e8a2c8ee1" + integrity sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ== for-each@^0.3.3: version "0.3.3" @@ -4385,9 +4406,9 @@ for-each@^0.3.3: is-callable "^1.1.3" foreground-child@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.1.1.tgz#1d173e776d75d2772fed08efe4a0de1ea1b12d0d" - integrity sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg== + version "3.3.0" + resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.3.0.tgz#0ac8644c06e431439f8561db8ecf29a7b5519c77" + integrity sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg== dependencies: cross-spawn "^7.0.0" signal-exit "^4.0.1" @@ -4453,7 +4474,7 @@ fs-extra@^10.0.0, fs-extra@^10.1.0: jsonfile "^6.0.1" universalify "^2.0.0" -fs-extra@^11.0.0: +fs-extra@^11.0.0, fs-extra@^11.2.0: version "11.2.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.2.0.tgz#e70e17dfad64232287d01929399e0ea7c86b0e5b" integrity sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw== @@ -4497,7 +4518,7 @@ fs-minipass@^2.0.0, fs-minipass@^2.1.0: dependencies: minipass "^3.0.0" -fs-minipass@^3.0.0, fs-minipass@^3.0.2: +fs-minipass@^3.0.0, fs-minipass@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-3.0.3.tgz#79a85981c4dc120065e96f62086bf6f9dc26cc54" integrity sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw== @@ -4534,11 +4555,6 @@ function.prototype.name@^1.1.6: es-abstract "^1.22.1" functions-have-names "^1.2.3" -functional-red-black-tree@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" - integrity sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g== - functions-have-names@^1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" @@ -4559,9 +4575,9 @@ gauge@^4.0.3: wide-align "^1.1.5" gauge@^5.0.0: - version "5.0.1" - resolved "https://registry.yarnpkg.com/gauge/-/gauge-5.0.1.tgz#1efc801b8ff076b86ef3e9a7a280a975df572112" - integrity sha512-CmykPMJGuNan/3S4kZOpvvPYSNqSHANiWnh9XcMU2pSjtBfF0XzZ2p1bFAxTbnFxyBuPxQYHhzwaoOmUdqzvxQ== + version "5.0.2" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-5.0.2.tgz#7ab44c11181da9766333f10db8cd1e4b17fd6c46" + integrity sha512-pMaFftXPtiGIHCJHdcUUx9Rby/rFT/Kkt3fIIGCs+9PMDIljSyRiqraTlxNtBReJRDfUefpa263RQ3vnp5G/LQ== dependencies: aproba "^1.0.3 || ^2.0.0" color-support "^1.1.3" @@ -4587,11 +4603,12 @@ get-func-name@^2.0.1, get-func-name@^2.0.2: resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.2.tgz#0d7cf20cd13fda808669ffa88f4ffc7a3943fc41" integrity sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ== -get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.0, get-intrinsic@^1.2.1, get-intrinsic@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.2.tgz#281b7622971123e1ef4b3c90fd7539306da93f3b" - integrity sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA== +get-intrinsic@^1.1.3, get-intrinsic@^1.2.1, get-intrinsic@^1.2.3, get-intrinsic@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd" + integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ== dependencies: + es-errors "^1.3.0" function-bind "^1.1.2" has-proto "^1.0.1" has-symbols "^1.0.3" @@ -4617,13 +4634,14 @@ get-stream@^8.0.1: resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-8.0.1.tgz#def9dfd71742cd7754a7761ed43749a27d02eca2" integrity sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA== -get-symbol-description@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" - integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== +get-symbol-description@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.2.tgz#533744d5aa20aca4e079c8e5daf7fd44202821f5" + integrity sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg== dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.1.1" + call-bind "^1.0.5" + es-errors "^1.3.0" + get-intrinsic "^1.2.4" ghost-testrpc@^0.0.2: version "0.0.2" @@ -4634,16 +4652,16 @@ ghost-testrpc@^0.0.2: node-emoji "^1.10.0" git-log-parser@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/git-log-parser/-/git-log-parser-1.2.0.tgz#2e6a4c1b13fc00028207ba795a7ac31667b9fd4a" - integrity sha512-rnCVNfkTL8tdNryFuaY0fYiBWEBcgF748O6ZI61rslBvr2o7U65c2/6npCRqH40vuAhtgtDiqLTJjBVdrejCzA== + version "1.2.1" + resolved "https://registry.yarnpkg.com/git-log-parser/-/git-log-parser-1.2.1.tgz#44355787b37af7560dcc4ddc01cb53b5d139cc28" + integrity sha512-PI+sPDvHXNPl5WNOErAK05s3j0lgwUzMN6o8cyQrDaKfT3qd7TmNJKeXX+SknI5I0QhG5fVPAEwSY4tRGDtYoQ== dependencies: argv-formatter "~1.0.0" spawn-error-forwarder "~1.0.0" split2 "~1.0.0" stream-combiner2 "~1.1.1" through2 "~2.0.0" - traverse "~0.6.6" + traverse "0.6.8" glob-parent@^5.1.2, glob-parent@~5.1.2: version "5.1.2" @@ -4683,16 +4701,29 @@ glob@7.2.0: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^10.2.2, glob@^10.2.7: - version "10.3.10" - resolved "https://registry.yarnpkg.com/glob/-/glob-10.3.10.tgz#0351ebb809fd187fe421ab96af83d3a70715df4b" - integrity sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g== +glob@^10.2.2, glob@^10.3.10: + version "10.4.5" + resolved "https://registry.yarnpkg.com/glob/-/glob-10.4.5.tgz#f4d9f0b90ffdbab09c9d77f5f29b4262517b0956" + integrity sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg== dependencies: foreground-child "^3.1.0" - jackspeak "^2.3.5" - minimatch "^9.0.1" - minipass "^5.0.0 || ^6.0.2 || ^7.0.0" - path-scurry "^1.10.1" + jackspeak "^3.1.2" + minimatch "^9.0.4" + minipass "^7.1.2" + package-json-from-dist "^1.0.0" + path-scurry "^1.11.1" + +glob@^11.0.0: + version "11.0.0" + resolved "https://registry.yarnpkg.com/glob/-/glob-11.0.0.tgz#6031df0d7b65eaa1ccb9b29b5ced16cea658e77e" + integrity sha512-9UiX/Bl6J2yaBbxKoEBRm4Cipxgok8kQYcOPEhScPwebu2I0HoQOuYdIO6S3hLuWoZgpDpwQZMzTFxgpkyT76g== + dependencies: + foreground-child "^3.1.0" + jackspeak "^4.0.1" + minimatch "^10.0.0" + minipass "^7.1.2" + package-json-from-dist "^1.0.0" + path-scurry "^2.0.0" glob@^5.0.15: version "5.0.15" @@ -4705,7 +4736,7 @@ glob@^5.0.15: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^7.0.0, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: +glob@^7.0.0, glob@^7.1.3, glob@^7.1.4: version "7.2.3" resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== @@ -4717,7 +4748,7 @@ glob@^7.0.0, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^8.0.1, glob@^8.0.3: +glob@^8.0.1, glob@^8.0.3, glob@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/glob/-/glob-8.1.0.tgz#d388f656593ef708ee3e34640fdfb99a9fd1c33e" integrity sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ== @@ -4752,11 +4783,12 @@ globals@^13.19.0: type-fest "^0.20.2" globalthis@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.3.tgz#5852882a52b80dc301b0660273e1ed082f0b6ccf" - integrity sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA== + version "1.0.4" + resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.4.tgz#7430ed3a975d97bfb59bcce41f5cabbafa651236" + integrity sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ== dependencies: - define-properties "^1.1.3" + define-properties "^1.2.1" + gopd "^1.0.1" globby@^10.0.1: version "10.0.2" @@ -4785,11 +4817,11 @@ globby@^11.1.0: slash "^3.0.0" globby@^14.0.0: - version "14.0.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-14.0.0.tgz#ea9c062a3614e33f516804e778590fcf055256b9" - integrity sha512-/1WM/LNHRAOH9lZta77uGbq0dAEQM+XjNesWwhlERDVenqothRbnzTrL3/LrIoEPPjeUHC3vrS6TwoyxeHs7MQ== + version "14.0.2" + resolved "https://registry.yarnpkg.com/globby/-/globby-14.0.2.tgz#06554a54ccfe9264e5a9ff8eded46aa1e306482f" + integrity sha512-s3Fq41ZVh7vbbe2PN3nrW7yC7U7MFVc5c98/iTl9c2GawNMKx/J648KQRW6WKkuU8GIbbh2IXfIRQjOZnXcTnw== dependencies: - "@sindresorhus/merge-streams" "^1.0.0" + "@sindresorhus/merge-streams" "^2.1.0" fast-glob "^3.3.2" ignore "^5.2.4" path-type "^5.0.0" @@ -4883,31 +4915,25 @@ hardhat-deploy@^0.11.43: 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" - integrity sha512-INN26G3EW43adGKBNzYWOlI3+rlLnasXTwW79YNnUhXPDa+yHESgt639dJEs37gCjhkbNKcRRJnomXEuMFBXJg== + version "1.0.10" + resolved "https://registry.yarnpkg.com/hardhat-gas-reporter/-/hardhat-gas-reporter-1.0.10.tgz#ebe5bda5334b5def312747580cd923c2b09aef1b" + integrity sha512-02N4+So/fZrzJ88ci54GqwVA3Zrf0C9duuTyGt0CFRIh/CdNwbnTgkXkRfojOMLBQ+6t+lBIkgbsOtqMvNwikA== dependencies: array-uniq "1.0.3" eth-gas-reporter "^0.2.25" sha1 "^1.1.1" -hardhat@^2.19.1: - version "2.19.3" - resolved "https://registry.yarnpkg.com/hardhat/-/hardhat-2.19.3.tgz#fe3b28b889e34a074ea5b740c227e3c8d4ce56e8" - integrity sha512-zUvfILiu1O7W1a+t5E1nCJ6z1danRLNizQkSEQCCgDYcRx13AGXtH1MVZajKmdLmXIjKAPReTp/8JQQ4ZHaX3g== +hardhat@^2.22.10: + version "2.22.10" + resolved "https://registry.yarnpkg.com/hardhat/-/hardhat-2.22.10.tgz#826ab56e47af98406e6dd105ba6d2dbb148013d9" + integrity sha512-JRUDdiystjniAvBGFmJRsiIZSOP2/6s++8xRDe3TzLeQXlWWHsXBrd9wd3JWFyKXvgMqMeLL5Sz/oNxXKYw9vg== dependencies: "@ethersproject/abi" "^5.1.2" "@metamask/eth-sig-util" "^4.0.0" - "@nomicfoundation/ethereumjs-block" "5.0.2" - "@nomicfoundation/ethereumjs-blockchain" "7.0.2" - "@nomicfoundation/ethereumjs-common" "4.0.2" - "@nomicfoundation/ethereumjs-evm" "2.0.2" - "@nomicfoundation/ethereumjs-rlp" "5.0.2" - "@nomicfoundation/ethereumjs-statemanager" "2.0.2" - "@nomicfoundation/ethereumjs-trie" "6.0.2" - "@nomicfoundation/ethereumjs-tx" "5.0.2" - "@nomicfoundation/ethereumjs-util" "9.0.2" - "@nomicfoundation/ethereumjs-vm" "7.0.2" + "@nomicfoundation/edr" "^0.5.2" + "@nomicfoundation/ethereumjs-common" "4.0.4" + "@nomicfoundation/ethereumjs-tx" "5.0.4" + "@nomicfoundation/ethereumjs-util" "9.0.4" "@nomicfoundation/solidity-analyzer" "^0.1.0" "@sentry/node" "^5.18.1" "@types/bn.js" "^5.1.0" @@ -4915,6 +4941,7 @@ hardhat@^2.19.1: adm-zip "^0.4.16" aggregate-error "^3.0.0" ansi-escapes "^4.3.0" + boxen "^5.1.2" chalk "^2.4.2" chokidar "^3.4.0" ci-info "^2.0.0" @@ -4937,7 +4964,7 @@ hardhat@^2.19.1: raw-body "^2.4.1" resolve "1.17.0" semver "^6.3.0" - solc "0.7.3" + solc "0.8.26" source-map-support "^0.5.13" stacktrace-parser "^0.1.10" tsort "0.0.1" @@ -4965,29 +4992,29 @@ has-flag@^4.0.0: resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== -has-property-descriptors@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz#52ba30b6c5ec87fd89fa574bc1c39125c6f65340" - integrity sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg== +has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854" + integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== dependencies: - get-intrinsic "^1.2.2" + es-define-property "^1.0.0" -has-proto@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.1.tgz#1885c1305538958aff469fef37937c22795408e0" - integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg== +has-proto@^1.0.1, has-proto@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.3.tgz#b31ddfe9b0e6e9914536a6ab286426d0214f77fd" + integrity sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q== has-symbols@^1.0.2, has-symbols@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== -has-tostringtag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" - integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== +has-tostringtag@^1.0.0, has-tostringtag@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc" + integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== dependencies: - has-symbols "^1.0.2" + has-symbols "^1.0.3" has-unicode@^2.0.1: version "2.0.1" @@ -5011,14 +5038,14 @@ hash.js@1.1.7, hash.js@^1.0.0, hash.js@^1.0.3, hash.js@^1.1.7: inherits "^2.0.3" minimalistic-assert "^1.0.1" -hasown@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.0.tgz#f4c513d454a57b7c7e1650778de226b11700546c" - integrity sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA== +hasown@^2.0.0, hasown@^2.0.1, hasown@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" + integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== dependencies: function-bind "^1.1.2" -he@1.2.0: +he@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== @@ -5062,9 +5089,9 @@ hosted-git-info@^6.0.0, hosted-git-info@^6.1.1: lru-cache "^7.5.1" hosted-git-info@^7.0.0: - version "7.0.1" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-7.0.1.tgz#9985fcb2700467fecf7f33a4d4874e30680b5322" - integrity sha512-+K84LB1DYwMHoHSgaOY/Jfhw3ucPmSET5v98Ke/HdNSw4a0UktWzyW1mjhjpuxxTqOOsfWT/7iVshHmVZ4IpOA== + version "7.0.2" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-7.0.2.tgz#9b751acac097757667f30114607ef7b661ff4f17" + integrity sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w== dependencies: lru-cache "^10.0.1" @@ -5104,9 +5131,9 @@ http-proxy-agent@^5.0.0: debug "4" http-proxy-agent@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-7.0.0.tgz#e9096c5afd071a3fce56e6252bb321583c124673" - integrity sha512-+ZT+iBxVUQ1asugqnD6oWoRiS25AkjNfG085dKJGtGxkdwLQrMKU5wJr2bOOFAXzKcTuqq+7fZlTMgG3SRfIYQ== + version "7.0.2" + resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz#9a8b1f246866c028509486585f62b8f2c18c270e" + integrity sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig== dependencies: agent-base "^7.1.0" debug "^4.3.4" @@ -5135,9 +5162,9 @@ https-proxy-agent@^5.0.0: debug "4" https-proxy-agent@^7.0.0: - version "7.0.2" - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-7.0.2.tgz#e2645b846b90e96c6e6f347fb5b2e41f1590b09b" - integrity sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA== + version "7.0.5" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz#9e8b5013873299e11fab6fd548405da2d6c602b2" + integrity sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw== dependencies: agent-base "^7.0.2" debug "4" @@ -5191,26 +5218,31 @@ ieee754@^1.1.13, ieee754@^1.1.4, ieee754@^1.2.1: integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== ignore-walk@^6.0.0: - version "6.0.4" - resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-6.0.4.tgz#89950be94b4f522225eb63a13c56badb639190e9" - integrity sha512-t7sv42WkwFkyKbivUCglsQW5YWMskWtbEf4MNKX5u/CCWHKSPzN4FtBQGsQZgCLbxOzpVlcbWVK5KB3auIOjSw== + version "6.0.5" + resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-6.0.5.tgz#ef8d61eab7da169078723d1f82833b36e200b0dd" + integrity sha512-VuuG0wCnjhnylG1ABXT3dAuIpTNDs/G8jlpmwXY03fXoXy/8ZK8/T+hMzt8L4WnrLCJgdybqgPagnF/f97cg3A== dependencies: minimatch "^9.0.0" ignore@^5.1.1, ignore@^5.2.0, ignore@^5.2.4: - version "5.3.0" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.0.tgz#67418ae40d34d6999c95ff56016759c718c82f78" - integrity sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg== + version "5.3.2" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5" + integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== immediate@~3.0.5: version "3.0.6" resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.0.6.tgz#9db1dbd0faf8de6fbe0f5dd5e56bb606280de69b" integrity sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ== +immer@10.0.2: + version "10.0.2" + resolved "https://registry.yarnpkg.com/immer/-/immer-10.0.2.tgz#11636c5b77acf529e059582d76faf338beb56141" + integrity sha512-Rx3CqeqQ19sxUtYV9CU911Vhy8/721wRFnJv3REVGWUmoAcIwzifTsdmJte/MV+0/XpM35LZdQMBGkRIoLPwQA== + immutable@^4.0.0-rc.12: - version "4.3.4" - resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.3.4.tgz#2e07b33837b4bb7662f288c244d1ced1ef65a78f" - integrity sha512-fsXeu4J4i6WNWSikpI88v/PcVflZz+6kMhUfIwc5SY+poQRPnaf5V7qds6SUyUN3cVxEzuCab7QIoLOQ+DQ1wA== + version "4.3.7" + resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.3.7.tgz#c70145fc90d89fb02021e65c84eb0226e4e5a381" + integrity sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw== import-fresh@^3.2.1, import-fresh@^3.3.0: version "3.3.0" @@ -5269,9 +5301,9 @@ ini@^1.3.4, ini@^1.3.5, ini@~1.3.0: integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== ini@^4.1.0, ini@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/ini/-/ini-4.1.1.tgz#d95b3d843b1e906e56d6747d5447904ff50ce7a1" - integrity sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g== + version "4.1.3" + resolved "https://registry.yarnpkg.com/ini/-/ini-4.1.3.tgz#4c359675a6071a46985eb39b14e4a2c0ec98a795" + integrity sha512-X7rqawQBvfdjS10YU1y1YVreA3SsLrW9dX2CewP2EbBJM4ypVNLDkO5y04gejPwKIY9lR+7r9gn3rFPt/kmWFg== init-package-json@^5.0.0: version "5.0.0" @@ -5286,12 +5318,12 @@ init-package-json@^5.0.0: validate-npm-package-license "^3.0.4" validate-npm-package-name "^5.0.0" -internal-slot@^1.0.5: - version "1.0.6" - resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.6.tgz#37e756098c4911c5e912b8edbf71ed3aa116f930" - integrity sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg== +internal-slot@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.7.tgz#c06dcca3ed874249881007b0a5523b172a190802" + integrity sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g== dependencies: - get-intrinsic "^1.2.2" + es-errors "^1.3.0" hasown "^2.0.0" side-channel "^1.0.4" @@ -5320,24 +5352,26 @@ io-ts@1.10.4: dependencies: fp-ts "^1.0.0" +ip-address@^9.0.5: + version "9.0.5" + resolved "https://registry.yarnpkg.com/ip-address/-/ip-address-9.0.5.tgz#117a960819b08780c3bd1f14ef3c1cc1d3f3ea5a" + integrity sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g== + dependencies: + jsbn "1.1.0" + sprintf-js "^1.1.3" + ip-regex@^4.1.0: version "4.3.0" resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-4.3.0.tgz#687275ab0f57fa76978ff8f4dddc8a23d5990db5" integrity sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q== -ip@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ip/-/ip-2.0.0.tgz#4cf4ab182fee2314c75ede1276f8c80b479936da" - integrity sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ== - -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" - integrity sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w== +is-array-buffer@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.4.tgz#7a1f92b3d61edd2bc65d24f130530ea93d7fae98" + integrity sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw== dependencies: call-bind "^1.0.2" - get-intrinsic "^1.2.0" - is-typed-array "^1.1.10" + get-intrinsic "^1.2.1" is-arrayish@^0.2.1: version "0.2.1" @@ -5371,11 +5405,6 @@ is-boolean-object@^1.1.0: call-bind "^1.0.2" has-tostringtag "^1.0.0" -is-buffer@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191" - integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== - is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: version "1.2.7" resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" @@ -5388,12 +5417,19 @@ is-cidr@^4.0.2: dependencies: cidr-regex "^3.1.1" -is-core-module@^2.13.0, is-core-module@^2.13.1, is-core-module@^2.5.0, is-core-module@^2.8.1: - version "2.13.1" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.1.tgz#ad0d7532c6fea9da1ebdc82742d74525c6273384" - integrity sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw== +is-core-module@^2.13.0, is-core-module@^2.15.1, is-core-module@^2.5.0, is-core-module@^2.8.1: + version "2.15.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.15.1.tgz#a7363a25bee942fefab0de13bf6aa372c82dcc37" + integrity sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ== dependencies: - hasown "^2.0.0" + hasown "^2.0.2" + +is-data-view@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-data-view/-/is-data-view-1.0.1.tgz#4b4d3a511b70f3dc26d42c03ca9ca515d847759f" + integrity sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w== + dependencies: + is-typed-array "^1.1.13" is-date-object@^1.0.1: version "1.0.5" @@ -5446,10 +5482,10 @@ is-lambda@^1.0.1: resolved "https://registry.yarnpkg.com/is-lambda/-/is-lambda-1.0.1.tgz#3d9877899e6a53efc0160504cde15f82e6f061d5" integrity sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ== -is-negative-zero@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" - integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== +is-negative-zero@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.3.tgz#ced903a027aca6381b777a5743069d7376a49747" + integrity sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw== is-number-object@^1.0.4: version "1.0.7" @@ -5491,12 +5527,12 @@ is-regex@^1.1.4: call-bind "^1.0.2" has-tostringtag "^1.0.0" -is-shared-array-buffer@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz#8f259c573b60b6a32d4058a1a07430c0a7344c79" - integrity sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA== +is-shared-array-buffer@^1.0.2, is-shared-array-buffer@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz#1237f1cba059cdb62431d378dcc37d9680181688" + integrity sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg== dependencies: - call-bind "^1.0.2" + call-bind "^1.0.7" is-stream@^2.0.0: version "2.0.1" @@ -5529,12 +5565,12 @@ is-text-path@^2.0.0: dependencies: text-extensions "^2.0.0" -is-typed-array@^1.1.10, is-typed-array@^1.1.12, is-typed-array@^1.1.9: - version "1.1.12" - resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.12.tgz#d0bab5686ef4a76f7a73097b95470ab199c57d4a" - integrity sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg== +is-typed-array@^1.1.13: + version "1.1.13" + resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.13.tgz#d6c5ca56df62334959322d7d7dd1cca50debe229" + integrity sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw== dependencies: - which-typed-array "^1.1.11" + which-typed-array "^1.1.14" is-unicode-supported@^0.1.0: version "0.1.0" @@ -5599,10 +5635,19 @@ issue-parser@^6.0.0: lodash.isstring "^4.0.1" lodash.uniqby "^4.7.0" -jackspeak@^2.3.5: - version "2.3.6" - resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-2.3.6.tgz#647ecc472238aee4b06ac0e461acc21a8c505ca8" - integrity sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ== +jackspeak@^3.1.2: + version "3.4.3" + resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-3.4.3.tgz#8833a9d89ab4acde6188942bd1c53b6390ed5a8a" + integrity sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw== + dependencies: + "@isaacs/cliui" "^8.0.2" + optionalDependencies: + "@pkgjs/parseargs" "^0.11.0" + +jackspeak@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-4.0.1.tgz#9fca4ce961af6083e259c376e9e3541431f5287b" + integrity sha512-cub8rahkh0Q/bw1+GxP7aeSe29hHHn2V4m29nnDlvCdlgU+3UGxkZp7Z53jLUdpX3jdTO0nJZUDl3xvbWc2Xog== dependencies: "@isaacs/cliui" "^8.0.2" optionalDependencies: @@ -5618,11 +5663,6 @@ js-cookie@^2.2.1: resolved "https://registry.yarnpkg.com/js-cookie/-/js-cookie-2.2.1.tgz#69e106dc5d5806894562902aa5baec3744e9b2b8" integrity sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ== -js-sdsl@^4.1.4: - version "4.4.2" - resolved "https://registry.yarnpkg.com/js-sdsl/-/js-sdsl-4.4.2.tgz#2e3c031b1f47d3aca8b775532e3ebb0818e7f847" - integrity sha512-dwXFwByc/ajSV6m5bcKAPwe4yDDF6D614pxmIi5odytzxRlwqF6nwoiCek80Ixc7Cvma5awClxrzFtxCQvcM8w== - js-sha3@0.8.0, js-sha3@^0.8.0: version "0.8.0" resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.8.0.tgz#b9b7a5da73afad7dedd0f8c463954cbde6818840" @@ -5646,17 +5686,22 @@ js-yaml@3.x: argparse "^1.0.7" esprima "^4.0.0" -js-yaml@4.1.0, js-yaml@^4.1.0: +js-yaml@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== dependencies: argparse "^2.0.1" -jsdoc-type-pratt-parser@~4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-4.0.0.tgz#136f0571a99c184d84ec84662c45c29ceff71114" - integrity sha512-YtOli5Cmzy3q4dP26GraSOeAhqecewG04hoO8DY56CH4KJ9Fvv5qKWUCCo3HZob7esJQHCv6/+bnTy72xZZaVQ== +jsbn@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-1.1.0.tgz#b01307cb29b618a1ed26ec79e911f803c4da0040" + integrity sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A== + +jsdoc-type-pratt-parser@~4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-4.1.0.tgz#ff6b4a3f339c34a6c188cbf50a16087858d22113" + integrity sha512-Hicd6JK5Njt2QB6XYFS7ok9e37O8AYk3jTcppG4YVQnYjOemymvTcmc7OWsmq/Qqj5TdRFO5/x/tIPmBeRtGHg== json-buffer@3.0.1: version "3.0.1" @@ -5673,10 +5718,10 @@ json-parse-even-better-errors@^2.3.0: resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== -json-parse-even-better-errors@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.1.tgz#02bb29fb5da90b5444581749c22cedd3597c6cb0" - integrity sha512-aatBvbL26wVUCLmbWdCpeu9iF5wOyWpagiKkInA+kfws3sWdBrTnsvN2CKcyCYyUrc7rebNBlK6+kteg7ksecg== +json-parse-even-better-errors@^3.0.0, json-parse-even-better-errors@^3.0.1: + version "3.0.2" + resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.2.tgz#b43d35e89c0f3be6b5fbbe9dc6c82467b30c28da" + integrity sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ== json-schema-traverse@^0.4.1: version "0.4.1" @@ -5815,27 +5860,6 @@ lcid@^1.0.0: dependencies: invert-kv "^1.0.0" -level-supports@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/level-supports/-/level-supports-4.0.1.tgz#431546f9d81f10ff0fea0e74533a0e875c08c66a" - integrity sha512-PbXpve8rKeNcZ9C1mUicC9auIYFyGpkV9/i6g76tLgANwWhtG2v7I4xNBUlkn3lE2/dZF3Pi0ygYGtLc4RXXdA== - -level-transcoder@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/level-transcoder/-/level-transcoder-1.0.1.tgz#f8cef5990c4f1283d4c86d949e73631b0bc8ba9c" - integrity sha512-t7bFwFtsQeD8cl8NIoQ2iwxA0CL/9IFw7/9gAjOonH0PWTTiRfY7Hq+Ejbsxh86tXobDQ6IOiddjNYIfOBs06w== - dependencies: - buffer "^6.0.3" - module-error "^1.0.1" - -level@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/level/-/level-8.0.0.tgz#41b4c515dabe28212a3e881b61c161ffead14394" - integrity sha512-ypf0jjAk2BWI33yzEaaotpq7fkOPALKAgDBxggO6Q9HGX2MRXn0wbP1Jn/tJv1gtL867+YOjOB49WaUF3UoJNQ== - dependencies: - browser-level "^1.0.1" - classic-level "^1.2.0" - levn@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" @@ -5853,17 +5877,17 @@ levn@~0.3.0: type-check "~0.3.2" libnpmaccess@^7.0.2: - version "7.0.2" - resolved "https://registry.yarnpkg.com/libnpmaccess/-/libnpmaccess-7.0.2.tgz#7f056c8c933dd9c8ba771fa6493556b53c5aac52" - integrity sha512-vHBVMw1JFMTgEk15zRsJuSAg7QtGGHpUSEfnbcRL1/gTBag9iEfJbyjpDmdJmwMhvpoLoNBtdAUCdGnaP32hhw== + version "7.0.3" + resolved "https://registry.yarnpkg.com/libnpmaccess/-/libnpmaccess-7.0.3.tgz#9878b75c5cf36ddfff167dd47c1a6cf1fa21193c" + integrity sha512-It+fk/NRdRfv5giLhaVeyebGi/0S2LDSAwuZ0AGQ4x//PtCVb2Hj29wgSHe+XEL+RUkvLBkxbRV+DqLtOzuVTQ== dependencies: npm-package-arg "^10.1.0" npm-registry-fetch "^14.0.3" libnpmdiff@^5.0.20: - version "5.0.20" - resolved "https://registry.yarnpkg.com/libnpmdiff/-/libnpmdiff-5.0.20.tgz#fc1d310521ce9765f7bf7693ba6affa02a11bcc1" - integrity sha512-oG+qEc0qzg++1YqLwguQvXAyG8BrKq+23RHr4sCa5XZnf1U+hcKUp8itgaBY9sGRYyGXtsRgXWWFHBmqXIctDA== + version "5.0.21" + resolved "https://registry.yarnpkg.com/libnpmdiff/-/libnpmdiff-5.0.21.tgz#9d3036595a4cf393e1de07df98a40607a054d333" + integrity sha512-Zx+o/qnGoX46osnInyQQ5KI8jn2wIqXXiu4TJzE8GFd+o6kbyblJf+ihG81M1+yHK3AzkD1m4KK3+UTPXh/hBw== dependencies: "@npmcli/arborist" "^6.5.0" "@npmcli/disparity-colors" "^3.0.0" @@ -5876,13 +5900,13 @@ libnpmdiff@^5.0.20: tar "^6.1.13" libnpmexec@^6.0.4: - version "6.0.4" - resolved "https://registry.yarnpkg.com/libnpmexec/-/libnpmexec-6.0.4.tgz#205c7b77be5776576367c39f8d349e388025d77e" - integrity sha512-dhFp5yA9M2g8oLg/Ys9not+pNzW8B20pcz455TGqyU5VesXnEPQwK5EPVY8W24JJn7M0jMJ6/GxosywMPOTebA== + version "6.0.5" + resolved "https://registry.yarnpkg.com/libnpmexec/-/libnpmexec-6.0.5.tgz#36eb7e5a94a653478c8dd66b4a967cadf3f2540d" + integrity sha512-yN/7uJ3iYCPaKagHfrqXuCFLKn2ddcnYpEyC/tVhisHULC95uCy8AhUdNkThRXzhFqqptejO25ZfoWOGrdqnxA== dependencies: "@npmcli/arborist" "^6.5.0" "@npmcli/run-script" "^6.0.0" - ci-info "^3.7.1" + ci-info "^4.0.0" npm-package-arg "^10.1.0" npmlog "^7.0.1" pacote "^15.0.8" @@ -5893,32 +5917,32 @@ libnpmexec@^6.0.4: walk-up-path "^3.0.1" libnpmfund@^4.2.1: - version "4.2.1" - resolved "https://registry.yarnpkg.com/libnpmfund/-/libnpmfund-4.2.1.tgz#f52bed09060e003c001cdaae8904ee97a3d6d5c6" - integrity sha512-2fbmQMk3wPMdPx1gbYLNbzghj48XAsfytKrmy+A0eFXwDxCwL0BLdgXoeLQCZPpLUMSPPXdKyL6Wm4erWezhnA== + version "4.2.2" + resolved "https://registry.yarnpkg.com/libnpmfund/-/libnpmfund-4.2.2.tgz#4e50507212e64fcb6a396e4c02369f6c0fc40369" + integrity sha512-qnkP09tpryxD/iPYasHM7+yG4ZVe0e91sBVI/R8HJ1+ajeR9poWDckwiN2LEWGvtV/T/dqB++6A1NLrA5NPryw== dependencies: "@npmcli/arborist" "^6.5.0" libnpmhook@^9.0.3: - version "9.0.3" - resolved "https://registry.yarnpkg.com/libnpmhook/-/libnpmhook-9.0.3.tgz#5dbd6a146feb7e11993d36a26f750ae2347bb1d9" - integrity sha512-wMZe58sI7KLhg0+nUWZW5KdMfjNNcOIIbkoP19BDHYoUF9El7eeUWkGNxUGzpHkPKiGoQ1z/v6CYin4deebeuw== + version "9.0.4" + resolved "https://registry.yarnpkg.com/libnpmhook/-/libnpmhook-9.0.4.tgz#43d893e19944a2e729b2b165a74f84a69443880d" + integrity sha512-bYD8nJiPnqeMtSsRc5bztqSh6/v16M0jQjLeO959HJqf9ZRWKRpVnFx971Rz5zbPGOB2BrQa6iopsh5vons5ww== dependencies: aproba "^2.0.0" npm-registry-fetch "^14.0.3" libnpmorg@^5.0.4: - version "5.0.4" - resolved "https://registry.yarnpkg.com/libnpmorg/-/libnpmorg-5.0.4.tgz#94eec2b84fbef736457eb27894c972ae6f5cac82" - integrity sha512-YqYXLMAN0Y1eJH4w3hUFN9648xfSdvJANMsdeZTOWJOW4Pqp8qapJFzQdqCfUkg+tEuQmnaFQQKXvkMZC51+Mw== + version "5.0.5" + resolved "https://registry.yarnpkg.com/libnpmorg/-/libnpmorg-5.0.5.tgz#baaba5c77bdfa6808975be9134a330f84b3fa4d4" + integrity sha512-0EbtEIFthVlmaj0hhC3LlEEXUZU3vKfJwfWL//iAqKjHreMhCD3cgdkld+UeWYDgsZzwzvXmopoY0l38I0yx9Q== dependencies: aproba "^2.0.0" npm-registry-fetch "^14.0.3" libnpmpack@^5.0.20: - version "5.0.20" - resolved "https://registry.yarnpkg.com/libnpmpack/-/libnpmpack-5.0.20.tgz#982e656e87bdfb69b458260d20c6ab243c661e5d" - integrity sha512-lPQXok0sU0V7hjb8oMD6HjYTR296aZvCJQZ1PGC7PeuKkBGuNeqSKVE2I9bwI80E4bFa9gfQ1I+rGfkNRjn6tQ== + version "5.0.21" + resolved "https://registry.yarnpkg.com/libnpmpack/-/libnpmpack-5.0.21.tgz#bcc608279840448fa8c28d8df0f326694d0b6061" + integrity sha512-mQd3pPx7Xf6i2A6QnYcCmgq34BmfVG3HJvpl422B5dLKfi9acITqcJiJ2K7adhxPKZMF5VbP2+j391cs5w+xww== dependencies: "@npmcli/arborist" "^6.5.0" "@npmcli/run-script" "^6.0.0" @@ -5926,11 +5950,11 @@ libnpmpack@^5.0.20: pacote "^15.0.8" libnpmpublish@^7.5.1: - version "7.5.1" - resolved "https://registry.yarnpkg.com/libnpmpublish/-/libnpmpublish-7.5.1.tgz#80f0b5d30210156af7a1b98b1a7bff06bd868684" - integrity sha512-z/7HYMtuRrNgcftrI9ILXezZWHYHG0RaIZFfUvcLktE75vrScE3zOO+qvAbvQodQi4YvYoOGF1ySQ8tdbDCYQQ== + version "7.5.2" + resolved "https://registry.yarnpkg.com/libnpmpublish/-/libnpmpublish-7.5.2.tgz#1b2780a4a56429d6dea332174286179b8d6f930c" + integrity sha512-azAxjEjAgBkbPHUGsGdMbTScyiLcTKdEnNYwGS+9yt+fUsNyiYn8hNH3+HeWKaXzFjvxi50MrHw1yp1gg5pumQ== dependencies: - ci-info "^3.6.1" + ci-info "^4.0.0" normalize-package-data "^5.0.0" npm-package-arg "^10.1.0" npm-registry-fetch "^14.0.3" @@ -5940,24 +5964,24 @@ libnpmpublish@^7.5.1: ssri "^10.0.1" libnpmsearch@^6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/libnpmsearch/-/libnpmsearch-6.0.2.tgz#b6a531a312855dd3bf84dd273b1033dd09b4cbec" - integrity sha512-p+5BF19AvnVg8mcIQhy6yWhI6jHQRVMYaIaKeITEfYAffWsqbottA/WZdMtHL76hViC6SFM1WdclM1w5eAIa1g== + version "6.0.3" + resolved "https://registry.yarnpkg.com/libnpmsearch/-/libnpmsearch-6.0.3.tgz#f6001910b4a68341c2aa3f6f9505e665ed98759e" + integrity sha512-4FLTFsygxRKd+PL32WJlFN1g6gkfx3d90PjgSgd6kl9nJ55sZQAqNyi1M7QROKB4kN8JCNCphK8fQYDMg5bCcg== dependencies: npm-registry-fetch "^14.0.3" libnpmteam@^5.0.3: - version "5.0.3" - resolved "https://registry.yarnpkg.com/libnpmteam/-/libnpmteam-5.0.3.tgz#196657e9d87c0cc914c44fee588ad2b838074a3c" - integrity sha512-7XOGhi45s+ml6TyrhJUTyrErcoDMKGKfEtiTEco4ofU7BGGAUOalVztKMVLLJgJOOXdIAIlzCHqkTXEuSiyCiA== + version "5.0.4" + resolved "https://registry.yarnpkg.com/libnpmteam/-/libnpmteam-5.0.4.tgz#255ac22d94e4b9e911456bf97c1dc1013df03659" + integrity sha512-yN2zxNb8Urvvo7fTWRcP3E/KPtpZJXFweDWcl+H/s3zopGDI9ahpidddGVG98JhnPl3vjqtZvFGU3/sqVTfuIw== dependencies: aproba "^2.0.0" npm-registry-fetch "^14.0.3" libnpmversion@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/libnpmversion/-/libnpmversion-4.0.2.tgz#cad9cd1b287fcf9576a64edfe71491b49a65d06f" - integrity sha512-n1X70mFHv8Piy4yos+MFWUARSkTbyV5cdsHScaIkuwYvRAF/s2VtYScDzWB4Oe8uNEuGNdjiRR1E/Dh1tMvv6g== + version "4.0.3" + resolved "https://registry.yarnpkg.com/libnpmversion/-/libnpmversion-4.0.3.tgz#f4d85d3eb6bdbf7de8d9317abda92528e84b1a53" + integrity sha512-eD1O5zr0ko5pjOdz+2NyTEzP0kzKG8VIVyU+hIsz61cRmTrTxFRJhVBNOI1Q/inifkcM/UTl8EMfa0vX48zfoQ== dependencies: "@npmcli/git" "^4.0.1" "@npmcli/run-script" "^6.0.0" @@ -6097,12 +6121,12 @@ lodash.uniqby@^4.7.0: resolved "https://registry.yarnpkg.com/lodash.uniqby/-/lodash.uniqby-4.7.0.tgz#d99c07a669e9e6d24e1362dfe266c67616af1302" integrity sha512-e/zcLx6CSbmaEgFHCA7BnoQKyCtKMxnuWrJygbwPs/AIn+IMKl66L8/s+wBUn5LRw2pZx3bUHibiV1b6aTWIww== -lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.21, lodash@^4.17.4: +lodash@4.17.21, lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.21, lodash@^4.17.4: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== -log-symbols@4.1.0: +log-symbols@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== @@ -6110,10 +6134,10 @@ log-symbols@4.1.0: chalk "^4.1.0" is-unicode-supported "^0.1.0" -logform@^2.3.2, logform@^2.4.0: - version "2.6.0" - resolved "https://registry.yarnpkg.com/logform/-/logform-2.6.0.tgz#8c82a983f05d6eaeb2d75e3decae7a768b2bf9b5" - integrity sha512-1ulHeNPp6k/LD8H91o7VYFBng5i1BDE7HoKxVbZiGFidS1Rj65qcywLxX+pVfAPoQJEjRdvKcusKwOupHCVOVQ== +logform@^2.6.0, logform@^2.6.1: + version "2.6.1" + resolved "https://registry.yarnpkg.com/logform/-/logform-2.6.1.tgz#71403a7d8cae04b2b734147963236205db9b3df0" + integrity sha512-CdaO738xRapbKIMVn2m4F6KTj4j7ooJ8POVnebSgKo3KBz5axNXRAL7ZdRjIV6NOr2Uf4vjtRkxrFETOioCqSA== dependencies: "@colors/colors" "1.6.0" "@types/triple-beam" "^1.3.2" @@ -6134,17 +6158,15 @@ lowercase-keys@^3.0.0: resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-3.0.0.tgz#c5e7d442e37ead247ae9db117a9d0a467c89d4f2" integrity sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ== -lru-cache@^10.0.1, "lru-cache@^9.1.1 || ^10.0.0": - version "10.1.0" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.1.0.tgz#2098d41c2dc56500e6c88584aa656c84de7d0484" - integrity sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag== +lru-cache@^10.0.1, lru-cache@^10.2.0: + version "10.4.3" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.4.3.tgz#410fc8a17b70e598013df257c2446b7f3383f119" + integrity sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ== -lru-cache@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" - integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== - dependencies: - yallist "^3.0.2" +lru-cache@^11.0.0: + version "11.0.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-11.0.1.tgz#3a732fbfedb82c5ba7bca6564ad3f42afcb6e147" + integrity sha512-CgeuL5uom6j/ZVrg7G/+1IXqRY8JXX4Hghfy5YE0EhoYQWvndP1kufu58cmZLNIDKnRhZrXfdS9urVWx98AipQ== lru-cache@^6.0.0: version "6.0.0" @@ -6248,11 +6270,6 @@ match-all@^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" - integrity sha512-iJIUcQWA88IJB/5L15GnJVnSQJmf/YaxxV6zRavv83HILHaJQb6y0iFyDMdDO0gN8X37tdxmAOrH/P8B6RB8sQ== - md5.js@^1.3.4: version "1.3.5" resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" @@ -6262,15 +6279,6 @@ md5.js@^1.3.4: inherits "^2.0.1" safe-buffer "^5.1.2" -memory-level@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/memory-level/-/memory-level-1.0.0.tgz#7323c3fd368f9af2f71c3cd76ba403a17ac41692" - integrity sha512-UXzwewuWeHBz5krr7EvehKcmLFNoXxGcvuYhC41tRnkrTbJohtS7kVn9akmgirtRygg+f7Yjsfi8Uu5SGSQ4Og== - dependencies: - abstract-level "^1.0.0" - functional-red-black-tree "^1.0.1" - module-error "^1.0.1" - memory-pager@^1.0.2: version "1.5.0" resolved "https://registry.yarnpkg.com/memory-pager/-/memory-pager-1.5.0.tgz#d8751655d22d384682741c972f2c3d6dfa3e66b5" @@ -6319,11 +6327,11 @@ micro-ftch@^0.3.1: integrity sha512-/0LLxhzP0tfiR5hcQebtudP56gUurs2CLkGarnCiB/OqEyUFQ6U3paQi/tgLv0hBJYt2rnr9MNpxz4fiiugstg== 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" - integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== + version "4.0.8" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202" + integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== dependencies: - braces "^3.0.2" + braces "^3.0.3" picomatch "^2.3.1" mime-db@1.52.0: @@ -6339,9 +6347,9 @@ mime-types@^2.1.12: mime-db "1.52.0" mime@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/mime/-/mime-4.0.1.tgz#ad7563d1bfe30253ad97dedfae2b1009d01b9470" - integrity sha512-5lZ5tyrIfliMXzFtkYyekWbtRXObT9OWa8IwQ5uxTBDHucNNwniRqo0yInflj+iYi5CBa6qxadGzGarDfuEOxA== + version "4.0.4" + resolved "https://registry.yarnpkg.com/mime/-/mime-4.0.4.tgz#9f851b0fc3c289d063b20a7a8055b3014b25664b" + integrity sha512-v8yqInVjhXyqP6+Kw4fV3ZzeMRqEW6FotRsKXjRS5VMTNIuXsdRoAvklpoRgSqXm6o9VNH4/C0mgedko9DdLsQ== mimic-fn@^2.1.0: version "2.1.0" @@ -6385,24 +6393,24 @@ minimalistic-crypto-utils@^1.0.1: dependencies: brace-expansion "^1.1.7" -minimatch@5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.0.1.tgz#fb9022f7528125187c92bd9e9b6366be1cf3415b" - integrity sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g== +minimatch@^10.0.0: + version "10.0.1" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-10.0.1.tgz#ce0521856b453c86e25f2c4c0d03e6ff7ddc440b" + integrity sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ== dependencies: brace-expansion "^2.0.1" -minimatch@^5.0.1: +minimatch@^5.0.1, minimatch@^5.1.6: version "5.1.6" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96" integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== dependencies: brace-expansion "^2.0.1" -minimatch@^9.0.0, minimatch@^9.0.1, minimatch@^9.0.3: - version "9.0.3" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.3.tgz#a6e00c3de44c3a542bfaae70abfc22420a6da825" - integrity sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg== +minimatch@^9.0.0, minimatch@^9.0.3, minimatch@^9.0.4, minimatch@^9.0.5: + version "9.0.5" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.5.tgz#d74f9dd6b57d83d8e98cfb82133b03978bc929e5" + integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== dependencies: brace-expansion "^2.0.1" @@ -6439,9 +6447,9 @@ minipass-fetch@^2.0.3: encoding "^0.1.13" minipass-fetch@^3.0.0: - version "3.0.4" - resolved "https://registry.yarnpkg.com/minipass-fetch/-/minipass-fetch-3.0.4.tgz#4d4d9b9f34053af6c6e597a64be8e66e42bf45b7" - integrity sha512-jHAqnA728uUpIaFm7NWsCnqKT6UqZz7GcI/bDpPATuwYyKwJwW0remxSCxUlKiEty+eopHGa3oc8WxgQ1FFJqg== + version "3.0.5" + resolved "https://registry.yarnpkg.com/minipass-fetch/-/minipass-fetch-3.0.5.tgz#f0f97e40580affc4a35cc4a1349f05ae36cb1e4c" + integrity sha512-2N8elDQAtSnFV0Dk7gt15KHsS0Fyz6CbYZ360h0WTYV1Ty46li3rAXVOQj1THMNLdmrD9Vt5pBPtWtVkpwGBqg== dependencies: minipass "^7.0.3" minipass-sized "^1.0.3" @@ -6457,9 +6465,9 @@ minipass-flush@^1.0.5: minipass "^3.0.0" minipass-json-stream@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/minipass-json-stream/-/minipass-json-stream-1.0.1.tgz#7edbb92588fbfc2ff1db2fc10397acb7b6b44aa7" - integrity sha512-ODqY18UZt/I8k+b7rl2AENgbWE8IDYam+undIJONvigAz8KR5GWblsFTEfQs0WODsjbSXWlm+JHEv8Gr6Tfdbg== + version "1.0.2" + resolved "https://registry.yarnpkg.com/minipass-json-stream/-/minipass-json-stream-1.0.2.tgz#5121616c77a11c406c3ffa77509e0b77bb267ec3" + integrity sha512-myxeeTm57lYs8pH2nxPzmEEg8DGIgW+9mv6D4JZD2pa81I/OBjeU7PtICXV6c9eRGTA5JMDsuIPUZRCyBMYNhg== dependencies: jsonparse "^1.3.1" minipass "^3.0.0" @@ -6490,10 +6498,10 @@ minipass@^5.0.0: resolved "https://registry.yarnpkg.com/minipass/-/minipass-5.0.0.tgz#3e9788ffb90b694a5d0ec94479a45b5d8738133d" integrity sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ== -"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.0.3: - version "7.0.4" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.0.4.tgz#dbce03740f50a4786ba994c1fb908844d27b038c" - integrity sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ== +"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.0.3, minipass@^7.0.4, minipass@^7.1.2: + version "7.1.2" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.2.tgz#93a9626ce5e5e66bd4db86849e7515e92340a707" + integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw== minizlib@^2.1.1, minizlib@^2.1.2: version "2.1.2" @@ -6522,66 +6530,55 @@ mnemonist@^0.38.0: dependencies: obliterator "^2.0.0" -mocha@10.2.0, mocha@^10.0.0, mocha@^10.2.0: - version "10.2.0" - resolved "https://registry.yarnpkg.com/mocha/-/mocha-10.2.0.tgz#1fd4a7c32ba5ac372e03a17eef435bd00e5c68b8" - integrity sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg== - dependencies: - ansi-colors "4.1.1" - browser-stdout "1.3.1" - chokidar "3.5.3" - debug "4.3.4" - diff "5.0.0" - escape-string-regexp "4.0.0" - find-up "5.0.0" - glob "7.2.0" - he "1.2.0" - js-yaml "4.1.0" - log-symbols "4.1.0" - minimatch "5.0.1" - ms "2.1.3" - nanoid "3.3.3" - serialize-javascript "6.0.0" - strip-json-comments "3.1.1" - supports-color "8.1.1" - workerpool "6.2.1" - yargs "16.2.0" - yargs-parser "20.2.4" - yargs-unparser "2.0.0" +mocha@^10.0.0, mocha@^10.2.0: + version "10.7.3" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-10.7.3.tgz#ae32003cabbd52b59aece17846056a68eb4b0752" + integrity sha512-uQWxAu44wwiACGqjbPYmjo7Lg8sFrS3dQe7PP2FQI+woptP4vZXSMcfMyFL/e1yFEeEpV4RtyTpZROOKmxis+A== + dependencies: + ansi-colors "^4.1.3" + browser-stdout "^1.3.1" + chokidar "^3.5.3" + debug "^4.3.5" + diff "^5.2.0" + escape-string-regexp "^4.0.0" + find-up "^5.0.0" + glob "^8.1.0" + he "^1.2.0" + js-yaml "^4.1.0" + log-symbols "^4.1.0" + minimatch "^5.1.6" + ms "^2.1.3" + serialize-javascript "^6.0.2" + strip-json-comments "^3.1.1" + supports-color "^8.1.1" + workerpool "^6.5.1" + yargs "^16.2.0" + yargs-parser "^20.2.9" + yargs-unparser "^2.0.0" modify-values@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/modify-values/-/modify-values-1.0.1.tgz#b3939fa605546474e3e3e3c63d64bd43b4ee6022" integrity sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw== -module-error@^1.0.1, module-error@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/module-error/-/module-error-1.0.2.tgz#8d1a48897ca883f47a45816d4fb3e3c6ba404d86" - integrity sha512-0yuvsqSCv8LbaOKhnsQ/T5JhyFlCYLPXK3U2sgV10zoKQwzs/MyfuQUOZQ1V/6OCOJsK/TRgNVrPuPDqtdMFtA== - mongodb-connection-string-url@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/mongodb-connection-string-url/-/mongodb-connection-string-url-3.0.0.tgz#b4f87f92fd8593f3b9365f592515a06d304a1e9c" - integrity sha512-t1Vf+m1I5hC2M5RJx/7AtxgABy1cZmIPQRMXw+gEIPn/cZNF3Oiy+l0UIypUwVB5trcWHq3crg2g3uAR9aAwsQ== + version "3.0.1" + resolved "https://registry.yarnpkg.com/mongodb-connection-string-url/-/mongodb-connection-string-url-3.0.1.tgz#c13e6ac284ae401752ebafdb8cd7f16c6723b141" + integrity sha512-XqMGwRX0Lgn05TDB4PyG2h2kKO/FfWJyCzYQbIhXUxz7ETt0I/FqHjUeqj37irJ+Dl1ZtU82uYyj14u2XsZKfg== dependencies: "@types/whatwg-url" "^11.0.2" whatwg-url "^13.0.0" -mongodb@^6.1.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/mongodb/-/mongodb-6.3.0.tgz#ec9993b19f7ed2ea715b903fcac6171c9d1d38ca" - integrity sha512-tt0KuGjGtLUhLoU263+xvQmPHEGTw5LbcNC73EoFRYgSHwZt5tsoJC110hDyO1kjQzpgNrpdcSza9PknWN4LrA== +mongodb@^6.1.0, mongodb@^6.3.0: + version "6.9.0" + resolved "https://registry.yarnpkg.com/mongodb/-/mongodb-6.9.0.tgz#743ebfff6b3c14b04ac6e00a55e30d4127d3016d" + integrity sha512-UMopBVx1LmEUbW/QE0Hw18u583PEDVQmUmVzzBRH0o/xtE9DBRA5ZYLOjpLIa03i8FXjzvQECJcqoMvCXftTUA== dependencies: - "@mongodb-js/saslprep" "^1.1.0" - bson "^6.2.0" + "@mongodb-js/saslprep" "^1.1.5" + bson "^6.7.0" mongodb-connection-string-url "^3.0.0" -ms@2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - -ms@2.1.3, ms@^2.0.0, ms@^2.1.1, ms@^2.1.2: +ms@^2.0.0, ms@^2.1.1, ms@^2.1.2, ms@^2.1.3: version "2.1.3" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== @@ -6635,7 +6632,7 @@ murmur-128@^0.2.1: fmix "^0.1.0" imul "^1.0.0" -mute-stream@~1.0.0: +mute-stream@^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" integrity sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA== @@ -6645,16 +6642,6 @@ nano-base32@^1.0.1: resolved "https://registry.yarnpkg.com/nano-base32/-/nano-base32-1.0.1.tgz#ba548c879efcfb90da1c4d9e097db4a46c9255ef" integrity sha512-sxEtoTqAPdjWVGv71Q17koMFGsOMSiHsIFEvzOM7cNp8BXB4AnEwmDabm5dorusJf/v1z7QxaZYxUorU9RKaAw== -nanoid@3.3.3: - version "3.3.3" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.3.tgz#fd8e8b7aa761fe807dba2d1b98fb7241bb724a25" - integrity sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w== - -napi-macros@^2.2.2: - version "2.2.2" - resolved "https://registry.yarnpkg.com/napi-macros/-/napi-macros-2.2.2.tgz#817fef20c3e0e40a963fbf7b37d1600bd0201044" - integrity sha512-hmEVtAGYzVQpCKdbQea4skABsdXW4RUh5t5mJ2zzqowJS2OyXZTU1KhDVFhx+NlWZ4ap9mqR9TcDO3LTTttd+g== - natural-compare-lite@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz#17b09581988979fddafe0201e931ba933c96cbb4" @@ -6665,6 +6652,17 @@ natural-compare@^1.4.0: resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== +ndjson@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ndjson/-/ndjson-2.0.0.tgz#320ac86f6fe53f5681897349b86ac6f43bfa3a19" + integrity sha512-nGl7LRGrzugTtaFcJMhLbpzJM6XdivmbkdlaGcrk/LXg2KL/YBC6z1g70xh0/al+oFuVFP8N8kiWRucmeEH/qQ== + dependencies: + json-stringify-safe "^5.0.1" + minimist "^1.2.5" + readable-stream "^3.6.0" + split2 "^3.0.0" + through2 "^4.0.0" + negotiator@^0.6.3: version "0.6.3" resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" @@ -6692,19 +6690,19 @@ node-emoji@^1.10.0, node-emoji@^1.11.0: dependencies: lodash "^4.17.21" -node-fetch@^2.6.0, node-fetch@^2.6.1: +node-fetch@^2.6.1: version "2.7.0" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== dependencies: whatwg-url "^5.0.0" -node-gyp-build@^4.2.0, node-gyp-build@^4.3.0: - version "4.7.1" - resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.7.1.tgz#cd7d2eb48e594874053150a9418ac85af83ca8f7" - integrity sha512-wTSrZ+8lsRRa3I3H8Xr65dLWSgCvY2l4AOnaeKdPA9TB/WYMPaTcrzf3rXvFoVvjKNVnu0CcWSx54qq9GKRUYg== +node-gyp-build@^4.2.0: + version "4.8.2" + resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.8.2.tgz#4f802b71c1ab2ca16af830e6c1ea7dd1ad9496fa" + integrity sha512-IRUxE4BVsHWXkV/SFOut4qTlagw2aM8T5/vnTsmrHJvVoKueJHRc/JaFND7QDDc61kLYUJ6qlZM3sqTSyx2dTw== -node-gyp@^9.0.0, node-gyp@^9.4.0: +node-gyp@^9.0.0, node-gyp@^9.4.1: version "9.4.1" resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-9.4.1.tgz#8a1023e0d6766ecb52764cc3a734b36ff275e185" integrity sha512-OQkWKbjQKbGkMf/xqI1jjy3oCTgMKJac58G2+bjZb3fza6gW2YrCSdMQYaoTb70crvE//Gngr4f0AgVHmqHvBQ== @@ -6741,9 +6739,9 @@ nopt@^6.0.0: abbrev "^1.0.0" nopt@^7.0.0, nopt@^7.2.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-7.2.0.tgz#067378c68116f602f552876194fd11f1292503d7" - integrity sha512-CVDtwCdhYIvnAzFoJ6NJ6dX3oga9/HyciQDnG1vQDjSLMeKLJ4A93ZqYKDrgYSr1FBY5/hMYC+2VCi24pgpkGA== + version "7.2.1" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-7.2.1.tgz#1cac0eab9b8e97c9093338446eddd40b2c8ca1e7" + integrity sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w== dependencies: abbrev "^2.0.0" @@ -6778,12 +6776,11 @@ normalize-package-data@^5.0.0: validate-npm-package-license "^3.0.4" normalize-package-data@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-6.0.0.tgz#68a96b3c11edd462af7189c837b6b1064a484196" - integrity sha512-UL7ELRVxYBHBgYEtZCXjxuD5vPxnmvMGq0jp/dGPKKrN7tfsBh2IY7TlJ15WWwdjRWD3RJbnsygUurTK3xkPkg== + version "6.0.2" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-6.0.2.tgz#a7bc22167fe24025412bcff0a9651eb768b03506" + integrity sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g== dependencies: hosted-git-info "^7.0.0" - is-core-module "^2.8.1" semver "^7.3.5" validate-npm-package-license "^3.0.4" @@ -6793,9 +6790,9 @@ normalize-path@^3.0.0, normalize-path@~3.0.0: integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== normalize-url@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-8.0.0.tgz#593dbd284f743e8dcf6a5ddf8fadff149c82701a" - integrity sha512-uVFpKhj5MheNBJRTiMZ9pE/7hD1QTeEvugSJW/OmLzAp78PB5O6adfMNTvmfKhXBkvCzC+rqifWcVYpGFwTjnw== + version "8.0.1" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-8.0.1.tgz#9b7d96af9836577c58f5883e939365fa15623a4a" + integrity sha512-IO9QvjUMWxPQQhs60oOu10CRkWCiZzSUkzbXGGV9pviYl1fXYcvkzQ5jV9z8Y6un8ARoVRl4EtC6v6jNqbaJ/w== npm-audit-report@^5.0.0: version "5.0.0" @@ -6803,13 +6800,13 @@ npm-audit-report@^5.0.0: integrity sha512-EkXrzat7zERmUhHaoren1YhTxFwsOu5jypE84k6632SXTHcQE1z8V51GC6GVZt8LxkC+tbBcKMUBZAgk8SUSbw== npm-bundled@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-3.0.0.tgz#7e8e2f8bb26b794265028491be60321a25a39db7" - integrity sha512-Vq0eyEQy+elFpzsKjMss9kxqb9tG3YHg4dsyWuUENuzvSUWe1TCnW/vV9FkhvBk/brEDoDiVd+M1Btosa6ImdQ== + version "3.0.1" + resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-3.0.1.tgz#cca73e15560237696254b10170d8f86dad62da25" + integrity sha512-+AvaheE/ww1JEwRHOrn4WHNzOxGtVp+adrg2AeZS/7KuxGUYFuBta98wYpfHBbJp6Tg6j1NKSEVHNcfZzJHQwQ== dependencies: npm-normalize-package-bin "^3.0.0" -npm-install-checks@^6.0.0, npm-install-checks@^6.2.0: +npm-install-checks@^6.0.0, npm-install-checks@^6.2.0, npm-install-checks@^6.3.0: version "6.3.0" resolved "https://registry.yarnpkg.com/npm-install-checks/-/npm-install-checks-6.3.0.tgz#046552d8920e801fa9f919cad569545d60e826fe" integrity sha512-W29RiK/xtpCGqn6f3ixfRYGk+zRyr+Ew9F2E20BfXxT5/euLdA/Nm7fO7OeTGuAmTs30cpgInyJ0cYe708YTZw== @@ -6877,21 +6874,21 @@ npm-run-path@^4.0.1: path-key "^3.0.0" npm-run-path@^5.1.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-5.2.0.tgz#224cdd22c755560253dd71b83a1ef2f758b2e955" - integrity sha512-W4/tgAXFqFA0iL7fk0+uQ3g7wkL8xJmx3XdK0VGb4cHW//eZTtKGvFBBoRKVTpY7n6ze4NL9ly7rgXcHufqXKg== + version "5.3.0" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-5.3.0.tgz#e23353d0ebb9317f174e93417e4a4d82d0249e9f" + integrity sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ== dependencies: path-key "^4.0.0" npm-user-validate@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/npm-user-validate/-/npm-user-validate-2.0.0.tgz#7b69bbbff6f7992a1d9a8968d52fd6b6db5431b6" - integrity sha512-sSWeqAYJ2dUPStJB+AEj0DyLRltr/f6YNcvCA7phkB8/RMLMnVsQ41GMwHo/ERZLYNDsyB2wPm7pZo1mqPOl7Q== + version "2.0.1" + resolved "https://registry.yarnpkg.com/npm-user-validate/-/npm-user-validate-2.0.1.tgz#097afbf0a2351e2a8f478f1ba07960b368f2a25c" + integrity sha512-d17PKaF2h8LSGFl5j4b1gHOJt1fgH7YUcCm1kNSJvaLWWKXlBsuUvx0bBEkr0qhsVA9XP5LtRZ83hdlhm2QkgA== npm@^9.5.0: - version "9.9.2" - resolved "https://registry.yarnpkg.com/npm/-/npm-9.9.2.tgz#28133f81643bce36c1c8bcb57b51e1ee53583df7" - integrity sha512-D3tV+W0PzJOlwo8YmO6fNzaB1CrMVYd1V+2TURF6lbCbmZKqMsYgeQfPVvqiM3zbNSJPhFEnmlEXIogH2Vq7PQ== + version "9.9.3" + resolved "https://registry.yarnpkg.com/npm/-/npm-9.9.3.tgz#18272a7b966721417691fec0ca18f7fbe4a9794e" + integrity sha512-Z1l+rcQ5kYb17F3hHtO601arEpvdRYnCLtg8xo3AGtyj3IthwaraEOexI9903uANkifFbqHC8hT53KIrozWg8A== dependencies: "@isaacs/string-locale-compare" "^1.1.0" "@npmcli/arborist" "^6.5.0" @@ -6903,21 +6900,21 @@ npm@^9.5.0: "@npmcli/run-script" "^6.0.2" abbrev "^2.0.0" archy "~1.0.0" - cacache "^17.1.3" + cacache "^17.1.4" chalk "^5.3.0" - ci-info "^3.8.0" + ci-info "^4.0.0" cli-columns "^4.0.0" cli-table3 "^0.6.3" columnify "^1.6.0" fastest-levenshtein "^1.0.16" - fs-minipass "^3.0.2" - glob "^10.2.7" + fs-minipass "^3.0.3" + glob "^10.3.10" graceful-fs "^4.2.11" hosted-git-info "^6.1.1" ini "^4.1.1" init-package-json "^5.0.0" is-cidr "^4.0.2" - json-parse-even-better-errors "^3.0.0" + json-parse-even-better-errors "^3.0.1" libnpmaccess "^7.0.2" libnpmdiff "^5.0.20" libnpmexec "^6.0.4" @@ -6931,14 +6928,14 @@ npm@^9.5.0: libnpmversion "^4.0.2" make-fetch-happen "^11.1.1" minimatch "^9.0.3" - minipass "^5.0.0" + minipass "^7.0.4" minipass-pipeline "^1.2.4" ms "^2.1.2" - node-gyp "^9.4.0" + node-gyp "^9.4.1" nopt "^7.2.0" normalize-package-data "^5.0.0" npm-audit-report "^5.0.0" - npm-install-checks "^6.2.0" + npm-install-checks "^6.3.0" npm-package-arg "^10.1.0" npm-pick-manifest "^8.0.2" npm-profile "^7.0.1" @@ -6951,12 +6948,12 @@ npm@^9.5.0: proc-log "^3.0.0" qrcode-terminal "^0.12.0" read "^2.1.0" - semver "^7.5.4" + semver "^7.6.0" sigstore "^1.9.0" spdx-expression-parse "^3.0.1" - ssri "^10.0.4" + ssri "^10.0.5" supports-color "^9.4.0" - tar "^6.1.15" + tar "^6.2.0" text-table "~0.2.0" tiny-relative-date "^1.3.0" treeverse "^3.0.0" @@ -7002,17 +6999,17 @@ object-assign@^4.1.0: resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== -object-inspect@^1.13.1, object-inspect@^1.9.0: - version "1.13.1" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.1.tgz#b96c6109324ccfef6b12216a956ca4dc2ff94bc2" - integrity sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ== +object-inspect@^1.13.1: + version "1.13.2" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.2.tgz#dea0088467fb991e67af4058147a24824a3043ff" + integrity sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g== object-keys@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== -object.assign@^4.1.2, object.assign@^4.1.4: +object.assign@^4.1.2, object.assign@^4.1.5: version "4.1.5" resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.5.tgz#3a833f9ab7fdb80fc9e8d2300c803d216d8fdbb0" integrity sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ== @@ -7023,41 +7020,41 @@ object.assign@^4.1.2, object.assign@^4.1.4: object-keys "^1.1.1" object.entries@^1.1.5: - version "1.1.7" - resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.7.tgz#2b47760e2a2e3a752f39dd874655c61a7f03c131" - integrity sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA== + version "1.1.8" + resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.8.tgz#bffe6f282e01f4d17807204a24f8edd823599c41" + integrity sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ== dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" + call-bind "^1.0.7" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" -object.fromentries@^2.0.7: - version "2.0.7" - resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.7.tgz#71e95f441e9a0ea6baf682ecaaf37fa2a8d7e616" - integrity sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA== +object.fromentries@^2.0.8: + version "2.0.8" + resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.8.tgz#f7195d8a9b97bd95cbc1999ea939ecd1a2b00c65" + integrity sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ== dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-object-atoms "^1.0.0" -object.groupby@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/object.groupby/-/object.groupby-1.0.1.tgz#d41d9f3c8d6c778d9cbac86b4ee9f5af103152ee" - integrity sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ== +object.groupby@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/object.groupby/-/object.groupby-1.0.3.tgz#9b125c36238129f6f7b61954a1e7176148d5002e" + integrity sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ== dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - get-intrinsic "^1.2.1" + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" -object.values@^1.1.7: - version "1.1.7" - resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.7.tgz#617ed13272e7e1071b43973aa1655d9291b8442a" - integrity sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng== +object.values@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.2.0.tgz#65405a9d92cee68ac2d303002e0b8470a4d9ab1b" + integrity sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ== dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" + call-bind "^1.0.7" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" obliterator@^2.0.0: version "2.0.4" @@ -7114,16 +7111,16 @@ optionator@^0.8.1: word-wrap "~1.2.3" optionator@^0.9.3: - version "0.9.3" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.3.tgz#007397d44ed1872fdc6ed31360190f81814e2c64" - integrity sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg== + version "0.9.4" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.4.tgz#7ea1c1a5d91d764fb282139c88fe11e182a3a734" + integrity sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g== dependencies: - "@aashutoshrathi/word-wrap" "^1.2.3" deep-is "^0.1.3" fast-levenshtein "^2.0.6" levn "^0.4.1" prelude-ls "^1.2.1" type-check "^0.4.0" + word-wrap "^1.2.5" ordinal@^1.0.3: version "1.0.3" @@ -7152,12 +7149,12 @@ p-each-series@^3.0.0: resolved "https://registry.yarnpkg.com/p-each-series/-/p-each-series-3.0.0.tgz#d1aed5e96ef29864c897367a7d2a628fdc960806" integrity sha512-lastgtAdoH9YaLyDa5i5z64q+kzOcQHsQ5SsZJD3q0VEyI8mq872S3geuNbRUQLVAE9siMfgKrpj7MloKFHruw== -p-filter@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/p-filter/-/p-filter-3.0.0.tgz#ce50e03b24b23930e11679ab8694bd09a2d7ed35" - integrity sha512-QtoWLjXAW++uTX67HZQz1dbTpqBfiidsB6VtQUC9iR85S120+s0T5sO6s+B5MLzFcZkrEd/DGMmCjR+f2Qpxwg== +p-filter@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/p-filter/-/p-filter-4.1.0.tgz#fe0aa794e2dfad8ecf595a39a245484fcd09c6e4" + integrity sha512-37/tPdZ3oJwHaS3gNJdenCDB3Tz26i9sjhnguBtvN0vYlRIiDNnvTWkuh+0hETV9rLPdJ3rlL3yVOYPIAnM8rw== dependencies: - p-map "^5.1.0" + p-map "^7.0.1" p-is-promise@^3.0.0: version "3.0.0" @@ -7227,12 +7224,10 @@ p-map@^4.0.0: dependencies: aggregate-error "^3.0.0" -p-map@^5.1.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/p-map/-/p-map-5.5.0.tgz#054ca8ca778dfa4cf3f8db6638ccb5b937266715" - integrity sha512-VFqfGDHlx87K66yZrNdI4YGtD70IRyd+zSvgks6mzHPRNkoKy+9EKP4SFC77/vTTQYmRmti7dvqC+m5jBrBAcg== - dependencies: - aggregate-error "^4.0.0" +p-map@^7.0.1: + version "7.0.2" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-7.0.2.tgz#7c5119fada4755660f70199a66aa3fe2f85a1fe8" + integrity sha512-z4cYYMMdKHzw4O5UkWJImbZynVIo0lSGTXc7bzB1e/rrDqkgGUNysK/o4bTr+0+xKvvLoTyGqYC4Fgljy9qe1Q== p-reduce@^2.0.0: version "2.1.0" @@ -7254,6 +7249,11 @@ p-try@^2.0.0: resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== +package-json-from-dist@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz#e501cd3094b278495eb4258d4c9f6d5ac3019f00" + integrity sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw== + package-json@^8.1.0: version "8.1.1" resolved "https://registry.yarnpkg.com/package-json/-/package-json-8.1.1.tgz#3e9948e43df40d1e8e78a85485f1070bf8f03dc8" @@ -7314,6 +7314,14 @@ parse-conflict-json@^3.0.0, parse-conflict-json@^3.0.1: just-diff "^6.0.0" just-diff-apply "^5.2.0" +parse-imports@^2.1.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/parse-imports/-/parse-imports-2.2.1.tgz#0a6e8b5316beb5c9905f50eb2bbb8c64a4805642" + integrity sha512-OL/zLggRp8mFhKL0rNORUTR4yBYujK/uU+xZL+/0Rgm2QE4nLO9v8PzEweSJEbMGKmDRjJE4R3IMJlL2di4JeQ== + dependencies: + es-module-lexer "^1.5.3" + slashes "^3.0.12" + parse-json@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" @@ -7392,14 +7400,22 @@ path-parse@^1.0.6, path-parse@^1.0.7: resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== -path-scurry@^1.10.1: - version "1.10.1" - resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.10.1.tgz#9ba6bf5aa8500fe9fd67df4f0d9483b2b0bfc698" - integrity sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ== +path-scurry@^1.11.1: + version "1.11.1" + resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.11.1.tgz#7960a668888594a0720b12a911d1a742ab9f11d2" + integrity sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA== dependencies: - lru-cache "^9.1.1 || ^10.0.0" + lru-cache "^10.2.0" minipass "^5.0.0 || ^6.0.2 || ^7.0.0" +path-scurry@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-2.0.0.tgz#9f052289f23ad8bf9397a2a0425e7b8615c58580" + integrity sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg== + dependencies: + lru-cache "^11.0.0" + minipass "^7.1.2" + path-type@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" @@ -7435,6 +7451,11 @@ pbkdf2@^3.0.17: safe-buffer "^5.0.1" sha.js "^2.4.8" +picocolors@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.0.tgz#5358b76a78cde483ba5cef6a9dc9671440b27d59" + integrity sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw== + picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" @@ -7480,10 +7501,15 @@ pluralize@^8.0.0: resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-8.0.0.tgz#1a6fa16a38d12a1901e0320fa017051c539ce3b1" integrity sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA== +possible-typed-array-names@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz#89bb63c6fada2c3e90adc4a647beeeb39cc7bf8f" + integrity sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q== + postcss-selector-parser@^6.0.10: - version "6.0.13" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz#d05d8d76b1e8e173257ef9d60b706a8e5e99bf1b" - integrity sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ== + version "6.1.2" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz#27ecb41fb0e3b6ba7a1ec84fff347f734c7929de" + integrity sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg== dependencies: cssesc "^3.0.0" util-deprecate "^1.0.2" @@ -7513,11 +7539,6 @@ process-nextick-args@~2.0.0: resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== -process@^0.11.10: - version "0.11.10" - resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" - integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A== - promise-all-reject-late@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/promise-all-reject-late/-/promise-all-reject-late-1.0.1.tgz#f8ebf13483e5ca91ad809ccc2fcf25f26f8643c2" @@ -7557,11 +7578,11 @@ prompts@^2.4.2: sisteransi "^1.0.5" promzard@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/promzard/-/promzard-1.0.0.tgz#3246f8e6c9895a77c0549cefb65828ac0f6c006b" - integrity sha512-KQVDEubSUHGSt5xLakaToDFrSoZhStB8dXLzk2xvwR67gJktrHFvpR63oZgHyK19WKbHFLXJqCPXdVR3aBP8Ig== + version "1.0.2" + resolved "https://registry.yarnpkg.com/promzard/-/promzard-1.0.2.tgz#2226e7c6508b1da3471008ae17066a7c3251e660" + integrity sha512-2FPputGL+mP3jJ3UZg/Dl9YOkovB7DX0oOr+ck5QbZ5MtORtds8k/BZdn+02peDLI8/YWbmzx34k5fA+fHvCVQ== dependencies: - read "^2.0.0" + read "^3.0.1" proper-lockfile@^4.1.1: version "4.1.2" @@ -7598,13 +7619,13 @@ qrcode-terminal@^0.12.0: integrity sha512-EXtzRZmC+YGmGlDFbXKxQiMZNwCLEO6BANKXG4iCtSIM0yqc/pappSx3RIKr4r0uh5JsBckOXeKrB3Iz7mdQpQ== qs@^6.4.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== + version "6.13.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.13.0.tgz#6ca3bd58439f7e245655798997787b0d88a51906" + integrity sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg== dependencies: - side-channel "^1.0.4" + side-channel "^1.0.6" -queue-microtask@^1.2.2, queue-microtask@^1.2.3: +queue-microtask@^1.2.2: version "1.2.3" resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== @@ -7731,6 +7752,22 @@ read@^2.0.0, read@^2.1.0: dependencies: mute-stream "~1.0.0" +read@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/read/-/read-3.0.1.tgz#926808f0f7c83fa95f1ef33c0e2c09dbb28fd192" + integrity sha512-SLBrDU/Srs/9EoWhU5GdbAoxG1GzpQHo/6qiGItaoLJ1thmYpcNIM1qISEUvyHBzfGlWIyd6p2DNi1oV1VmAuw== + dependencies: + mute-stream "^1.0.0" + +readable-stream@3, readable-stream@^3.0.0, readable-stream@^3.4.0, readable-stream@^3.6.0, readable-stream@^3.6.2: + version "3.6.2" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" + integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + readable-stream@^2.0.0, readable-stream@^2.0.2, readable-stream@^2.2.2, readable-stream@~2.3.6: version "2.3.8" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" @@ -7744,26 +7781,6 @@ readable-stream@^2.0.0, readable-stream@^2.0.2, readable-stream@^2.2.2, readable string_decoder "~1.1.1" util-deprecate "~1.0.1" -readable-stream@^3.4.0, readable-stream@^3.6.0: - version "3.6.2" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" - integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== - dependencies: - inherits "^2.0.3" - string_decoder "^1.1.1" - util-deprecate "^1.0.1" - -readable-stream@^4.1.0: - version "4.5.1" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-4.5.1.tgz#3f2e4e66eab45606ac8f31597b9edb80c13b12ab" - integrity sha512-uQjbf34vmf/asGnOHQEw07Q4llgMACQZTWWa4MmICS0IKJoHbLwKCy71H3eR99Dw5iYejc6W+pqZZEeqRtUFAw== - dependencies: - abort-controller "^3.0.0" - buffer "^6.0.3" - events "^3.3.0" - process "^0.11.10" - string_decoder "^1.3.0" - readdirp@~3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" @@ -7810,14 +7827,15 @@ regenerator-runtime@^0.14.0: resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f" integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw== -regexp.prototype.flags@^1.5.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz#90ce989138db209f81492edd734183ce99f9677e" - integrity sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg== +regexp.prototype.flags@^1.5.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz#138f644a3350f981a858c44f6bb1a61ff59be334" + integrity sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw== dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - set-function-name "^2.0.0" + call-bind "^1.0.6" + define-properties "^1.2.1" + es-errors "^1.3.0" + set-function-name "^2.0.1" registry-auth-token@^5.0.0, registry-auth-token@^5.0.1: version "5.0.2" @@ -7857,7 +7875,7 @@ require-from-string@^1.1.0: resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-1.2.1.tgz#529c9ccef27380adfec9a2f965b649bbee636418" integrity sha512-H7AkJWMobeskkttHyhTVtS0fxpFLjxhbfMa6Bk3wimP7sdPRGL3EyCg3sAQenFfAe+xQ+oAc85Nmtvq0ROM83Q== -require-from-string@^2.0.0, require-from-string@^2.0.2: +require-from-string@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== @@ -7964,13 +7982,6 @@ rlp@^2.2.3, rlp@^2.2.4: dependencies: bn.js "^5.2.0" -run-parallel-limit@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/run-parallel-limit/-/run-parallel-limit-1.1.0.tgz#be80e936f5768623a38a963262d6bef8ff11e7ba" - integrity sha512-jJA7irRNM91jaKc3Hcl1npHsFLOXOoTkPCUL1JEa1R82O2miplXXRaGdjW/KM/98YQWDhJLiSs793CnXfblJUw== - dependencies: - queue-microtask "^1.2.2" - run-parallel@^1.1.9: version "1.2.0" resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" @@ -7978,18 +7989,13 @@ run-parallel@^1.1.9: dependencies: queue-microtask "^1.2.2" -rustbn.js@~0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/rustbn.js/-/rustbn.js-0.2.0.tgz#8082cb886e707155fd1cb6f23bd591ab8d55d0ca" - integrity sha512-4VlvkRUuCJvr2J6Y0ImW7NvTCriMi7ErOAqWk1y69vAdoNIzCF3yPmgeNzx+RQTLEDFq5sHfscn1MwHxP9hNfA== - -safe-array-concat@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.0.1.tgz#91686a63ce3adbea14d61b14c99572a8ff84754c" - integrity sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q== +safe-array-concat@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.1.2.tgz#81d77ee0c4e8b863635227c721278dd524c20edb" + integrity sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q== dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.2.1" + call-bind "^1.0.7" + get-intrinsic "^1.2.4" has-symbols "^1.0.3" isarray "^2.0.5" @@ -8003,19 +8009,19 @@ safe-buffer@~5.1.0, safe-buffer@~5.1.1: resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== -safe-regex-test@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.0.tgz#793b874d524eb3640d1873aad03596db2d4f2295" - integrity sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA== +safe-regex-test@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.3.tgz#a5b4c0f06e0ab50ea2c395c14d8371232924c377" + integrity sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw== dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.1.3" + call-bind "^1.0.6" + es-errors "^1.3.0" is-regex "^1.1.4" safe-stable-stringify@^2.3.1: - version "2.4.3" - resolved "https://registry.yarnpkg.com/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz#138c84b6f6edb3db5f8ef3ef7115b8f55ccbf886" - integrity sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g== + version "2.5.0" + resolved "https://registry.yarnpkg.com/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz#4ca2f8e385f2831c432a719b108a3bf7af42a1dd" + integrity sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA== "safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0": version "2.1.2" @@ -8112,17 +8118,15 @@ semver@^6.3.0, semver@^6.3.1: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== -semver@^7.0.0, semver@^7.1.1, semver@^7.1.2, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5, semver@^7.3.7, semver@^7.3.8, semver@^7.5.2, semver@^7.5.3, semver@^7.5.4: - version "7.5.4" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" - integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== - dependencies: - lru-cache "^6.0.0" +semver@^7.0.0, semver@^7.1.1, semver@^7.1.2, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5, semver@^7.3.7, semver@^7.5.2, semver@^7.5.3, semver@^7.6.0, semver@^7.6.3: + version "7.6.3" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" + integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== -serialize-javascript@6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz#efae5d88f45d7924141da8b5c3a7a7e663fefeb8" - integrity sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag== +serialize-javascript@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.2.tgz#defa1e055c83bf6d59ea805d8da862254eb6a6c2" + integrity sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g== dependencies: randombytes "^2.1.0" @@ -8131,24 +8135,27 @@ set-blocking@^2.0.0: resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== -set-function-length@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.1.1.tgz#4bc39fafb0307224a33e106a7d35ca1218d659ed" - integrity sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ== +set-function-length@^1.2.1: + version "1.2.2" + resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" + integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== dependencies: - define-data-property "^1.1.1" - get-intrinsic "^1.2.1" + define-data-property "^1.1.4" + es-errors "^1.3.0" + function-bind "^1.1.2" + get-intrinsic "^1.2.4" gopd "^1.0.1" - has-property-descriptors "^1.0.0" + has-property-descriptors "^1.0.2" -set-function-name@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.1.tgz#12ce38b7954310b9f61faa12701620a0c882793a" - integrity sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA== +set-function-name@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.2.tgz#16a705c5a0dc2f5e638ca96d8a8cd4e1c2b90985" + integrity sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ== dependencies: - define-data-property "^1.0.1" + define-data-property "^1.1.4" + es-errors "^1.3.0" functions-have-names "^1.2.3" - has-property-descriptors "^1.0.0" + has-property-descriptors "^1.0.2" setimmediate@^1.0.5: version "1.0.5" @@ -8204,14 +8211,15 @@ shelljs@^0.8.3: interpret "^1.0.0" rechoir "^0.6.2" -side-channel@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" - integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== +side-channel@^1.0.4, side-channel@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.6.tgz#abd25fb7cd24baf45466406b1096b7831c9215f2" + integrity sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA== dependencies: - call-bind "^1.0.0" - get-intrinsic "^1.0.2" - object-inspect "^1.9.0" + call-bind "^1.0.7" + es-errors "^1.3.0" + get-intrinsic "^1.2.4" + object-inspect "^1.13.1" signal-exit@^3.0.2, signal-exit@^3.0.3, signal-exit@^3.0.7: version "3.0.7" @@ -8265,6 +8273,11 @@ slash@^5.1.0: resolved "https://registry.yarnpkg.com/slash/-/slash-5.1.0.tgz#be3adddcdf09ac38eebe8dcdc7b1a57a75b095ce" integrity sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg== +slashes@^3.0.12: + version "3.0.12" + resolved "https://registry.yarnpkg.com/slashes/-/slashes-3.0.12.tgz#3d664c877ad542dc1509eaf2c50f38d483a6435a" + integrity sha512-Q9VME8WyGkc7pJf6QEkj3wE+2CnvZMI+XJhwdTPR8Z/kWQRXi7boAWLDibRPyHRTUTPx5FaU7MsyrjI3yLB4HA== + slice-ansi@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" @@ -8289,25 +8302,23 @@ socks-proxy-agent@^7.0.0: socks "^2.6.2" socks@^2.6.2: - version "2.7.1" - resolved "https://registry.yarnpkg.com/socks/-/socks-2.7.1.tgz#d8e651247178fde79c0663043e07240196857d55" - integrity sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ== + version "2.8.3" + resolved "https://registry.yarnpkg.com/socks/-/socks-2.8.3.tgz#1ebd0f09c52ba95a09750afe3f3f9f724a800cb5" + integrity sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw== dependencies: - ip "^2.0.0" + ip-address "^9.0.5" smart-buffer "^4.2.0" -solc@0.7.3: - version "0.7.3" - resolved "https://registry.yarnpkg.com/solc/-/solc-0.7.3.tgz#04646961bd867a744f63d2b4e3c0701ffdc7d78a" - integrity sha512-GAsWNAjGzIDg7VxzP6mPjdurby3IkGCjQcM8GFYZT6RyaoUZKmMU6Y7YwG+tFGhv7dwZ8rmR4iwFDrrD99JwqA== +solc@0.8.26: + version "0.8.26" + resolved "https://registry.yarnpkg.com/solc/-/solc-0.8.26.tgz#afc78078953f6ab3e727c338a2fefcd80dd5b01a" + integrity sha512-yiPQNVf5rBFHwN6SIf3TUUvVAFKcQqmSUFeq+fb6pNRCo0ZCgpYOZDi3BVoezCPIAcKrVYd/qXlBLUP9wVrZ9g== dependencies: command-exists "^1.2.8" - commander "3.0.2" + commander "^8.1.0" follow-redirects "^1.12.1" - fs-extra "^0.30.0" js-sha3 "0.8.0" memorystream "^0.3.1" - require-from-string "^2.0.0" semver "^5.5.0" tmp "0.0.33" @@ -8322,14 +8333,14 @@ solc@^0.4.20: semver "^5.3.0" yargs "^4.7.1" -solhint@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/solhint/-/solhint-4.0.0.tgz#fbd27ec9c8348b4fea90b5b469a5c95d625d2e59" - integrity sha512-bFViMcFvhqVd/HK3Roo7xZXX5nbujS7Bxeg5vnZc9QvH0yCWCrQ38Yrn1pbAY9tlKROc6wFr+rK1mxYgYrjZgA== +solhint@^5.0.1: + version "5.0.3" + resolved "https://registry.yarnpkg.com/solhint/-/solhint-5.0.3.tgz#b57f6d2534fe09a60f9db1b92e834363edd1cbde" + integrity sha512-OLCH6qm/mZTCpplTXzXTJGId1zrtNuDYP5c2e6snIv/hdRVxPfBBz/bAlL91bY/Accavkayp2Zp2BaDSrLVXTQ== dependencies: - "@solidity-parser/parser" "^0.16.0" + "@solidity-parser/parser" "^0.18.0" ajv "^6.12.6" - antlr4 "^4.11.0" + antlr4 "^4.13.1-patch-1" ast-parents "^0.0.1" chalk "^4.1.2" commander "^10.0.0" @@ -8349,30 +8360,27 @@ solhint@^4.0.0: prettier "^2.8.3" solidity-ast@^0.4.38, solidity-ast@^0.4.51: - version "0.4.55" - resolved "https://registry.yarnpkg.com/solidity-ast/-/solidity-ast-0.4.55.tgz#00b685e6eefb2e8dfb67df1fe0afbe3b3bfb4b28" - integrity sha512-qeEU/r/K+V5lrAw8iswf2/yfWAnSGs3WKPHI+zAFKFjX0dIBVXEU/swQ8eJQYHf6PJWUZFO2uWV4V1wEOkeQbA== - dependencies: - array.prototype.findlast "^1.2.2" + version "0.4.59" + resolved "https://registry.yarnpkg.com/solidity-ast/-/solidity-ast-0.4.59.tgz#290a2815aef70a61092591ab3e991da080ae5931" + integrity sha512-I+CX0wrYUN9jDfYtcgWSe+OAowaXy8/1YQy7NS4ni5IBDmIYBq7ZzaP/7QqouLjzZapmQtvGLqCaYgoUWqBo5g== -solidity-coverage@^0.8.5: - version "0.8.5" - resolved "https://registry.yarnpkg.com/solidity-coverage/-/solidity-coverage-0.8.5.tgz#64071c3a0c06a0cecf9a7776c35f49edc961e875" - integrity sha512-6C6N6OV2O8FQA0FWA95FdzVH+L16HU94iFgg5wAFZ29UpLFkgNI/DRR2HotG1bC0F4gAc/OMs2BJI44Q/DYlKQ== +solidity-coverage@^0.8.12: + version "0.8.13" + resolved "https://registry.yarnpkg.com/solidity-coverage/-/solidity-coverage-0.8.13.tgz#8eeada2e82ae19d25568368aa782a2baad0e0ce7" + integrity sha512-RiBoI+kF94V3Rv0+iwOj3HQVSqNzA9qm/qDP1ZDXK5IX0Cvho1qiz8hAXTsAo6KOIUeP73jfscq0KlLqVxzGWA== dependencies: "@ethersproject/abi" "^5.0.9" - "@solidity-parser/parser" "^0.16.0" + "@solidity-parser/parser" "^0.18.0" chalk "^2.4.2" death "^1.1.0" - detect-port "^1.3.0" difflib "^0.2.4" fs-extra "^8.1.0" ghost-testrpc "^0.0.2" global-modules "^2.0.0" globby "^10.0.1" jsonschema "^1.2.4" - lodash "^4.17.15" - mocha "10.2.0" + lodash "^4.17.21" + mocha "^10.2.0" node-emoji "^1.10.0" pify "^4.0.1" recursive-readdir "^2.2.2" @@ -8430,9 +8438,9 @@ spdx-correct@^3.0.0: spdx-license-ids "^3.0.0" spdx-exceptions@^2.1.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d" - integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== + version "2.5.0" + resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz#5d607d27fc806f66d7b64a766650fa890f04ed66" + integrity sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w== spdx-expression-parse@^3.0.0, spdx-expression-parse@^3.0.1: version "3.0.1" @@ -8442,10 +8450,25 @@ spdx-expression-parse@^3.0.0, spdx-expression-parse@^3.0.1: spdx-exceptions "^2.1.0" spdx-license-ids "^3.0.0" +spdx-expression-parse@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-4.0.0.tgz#a23af9f3132115465dac215c099303e4ceac5794" + integrity sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ== + dependencies: + spdx-exceptions "^2.1.0" + spdx-license-ids "^3.0.0" + spdx-license-ids@^3.0.0: - version "3.0.16" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.16.tgz#a14f64e0954f6e25cc6587bd4f392522db0d998f" - integrity sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw== + version "3.0.20" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.20.tgz#e44ed19ed318dd1e5888f93325cee800f0f51b89" + integrity sha512-jg25NiDV/1fLtSgEgyvVyDunvaNHbuwF9lfNV17gSmPFAlYzdfNBlLtLzXTevwkPj7DhGbmN9VnmJIgLnhvaBw== + +split2@^3.0.0: + version "3.2.2" + resolved "https://registry.yarnpkg.com/split2/-/split2-3.2.2.tgz#bf2cf2a37d838312c249c89206fd7a17dd12365f" + integrity sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg== + dependencies: + readable-stream "^3.0.0" split2@^4.0.0: version "4.2.0" @@ -8466,15 +8489,20 @@ split@^1.0.1: dependencies: through "2" +sprintf-js@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.3.tgz#4914b903a2f8b685d17fdf78a70e917e872e444a" + integrity sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA== + sprintf-js@~1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== -ssri@^10.0.0, ssri@^10.0.1, ssri@^10.0.4: - version "10.0.5" - resolved "https://registry.yarnpkg.com/ssri/-/ssri-10.0.5.tgz#e49efcd6e36385196cb515d3a2ad6c3f0265ef8c" - integrity sha512-bSf16tAFkGeRlUNDjXu8FzaMQt6g2HZJrun7mtMbIPOddxt3GLMSz5VWUWcqTJUPfLEaDIepGxv+bYQW49596A== +ssri@^10.0.0, ssri@^10.0.1, ssri@^10.0.5: + version "10.0.6" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-10.0.6.tgz#a8aade2de60ba2bce8688e3fa349bad05c7dc1e5" + integrity sha512-MGrFH9Z4NP9Iyhqn16sDtBpRRNJ0Y2hNa6D65h736fVSaPCHr4DM4sWUNvVaSuC+0OBGhwsrydQwmgfg5LncqQ== dependencies: minipass "^7.0.3" @@ -8515,7 +8543,7 @@ string-format@^2.0.0: resolved "https://registry.yarnpkg.com/string-format/-/string-format-2.0.0.tgz#f2df2e7097440d3b65de31b6d40d54c96eaffb9b" integrity sha512-bbEs3scLeYNXLecRRuk6uJxdXUSj6le/8rNPHChIJTn2V79aXVTR1EH2OH5zLKKoz0V02fOUKZZcw01pLUShZA== -"string-width-cjs@npm:string-width@^4.2.0", "string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: +"string-width-cjs@npm:string-width@^4.2.0": version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -8533,6 +8561,15 @@ string-width@^1.0.1: is-fullwidth-code-point "^1.0.0" strip-ansi "^3.0.0" +"string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.2, string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + string-width@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" @@ -8550,34 +8587,35 @@ string-width@^5.0.1, string-width@^5.1.2: emoji-regex "^9.2.2" strip-ansi "^7.0.1" -string.prototype.trim@^1.2.8: - version "1.2.8" - resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz#f9ac6f8af4bd55ddfa8895e6aea92a96395393bd" - integrity sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ== +string.prototype.trim@^1.2.9: + version "1.2.9" + resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz#b6fa326d72d2c78b6df02f7759c73f8f6274faa4" + integrity sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw== dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.0" + es-object-atoms "^1.0.0" -string.prototype.trimend@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz#1bb3afc5008661d73e2dc015cd4853732d6c471e" - integrity sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA== +string.prototype.trimend@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz#3651b8513719e8a9f48de7f2f77640b26652b229" + integrity sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ== dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" + call-bind "^1.0.7" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" -string.prototype.trimstart@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz#d4cdb44b83a4737ffbac2d406e405d43d0184298" - integrity sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg== +string.prototype.trimstart@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz#7ee834dda8c7c17eff3118472bb35bfedaa34dde" + integrity sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg== dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" + call-bind "^1.0.7" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" -string_decoder@^1.1.1, string_decoder@^1.3.0: +string_decoder@^1.1.1: version "1.3.0" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== @@ -8591,7 +8629,7 @@ string_decoder@~1.1.1: dependencies: safe-buffer "~5.1.0" -"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: +"strip-ansi-cjs@npm:strip-ansi@^6.0.1": version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== @@ -8612,6 +8650,13 @@ strip-ansi@^4.0.0: dependencies: ansi-regex "^3.0.0" +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + strip-ansi@^7.0.1: version "7.1.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" @@ -8655,7 +8700,7 @@ strip-indent@^3.0.0: dependencies: min-indent "^1.0.0" -strip-json-comments@3.1.1, strip-json-comments@^3.1.1: +strip-json-comments@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== @@ -8665,13 +8710,6 @@ strip-json-comments@~2.0.1: resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== -supports-color@8.1.1: - version "8.1.1" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" - integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== - dependencies: - has-flag "^4.0.0" - supports-color@^3.1.0: version "3.2.3" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6" @@ -8693,6 +8731,13 @@ supports-color@^7.0.0, supports-color@^7.1.0: dependencies: has-flag "^4.0.0" +supports-color@^8.1.1: + version "8.1.1" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + supports-color@^9.4.0: version "9.4.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-9.4.0.tgz#17bfcf686288f531db3dea3215510621ccb55954" @@ -8727,6 +8772,14 @@ sync-rpc@^1.2.1: dependencies: get-port "^3.1.0" +synckit@^0.9.1: + version "0.9.1" + resolved "https://registry.yarnpkg.com/synckit/-/synckit-0.9.1.tgz#febbfbb6649979450131f64735aa3f6c14575c88" + integrity sha512-7gr8p9TQP6RAHusBOSLs46F4564ZrjV8xFmw5zCmgmhGUcw2hxsShhJ6CEiHQMgPDwAQ1fWHPM0ypc4RMAig4A== + dependencies: + "@pkgr/core" "^0.1.0" + tslib "^2.6.2" + table-layout@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/table-layout/-/table-layout-1.0.2.tgz#c4038a1853b0136d63365a734b6931cf4fad4a04" @@ -8738,9 +8791,9 @@ table-layout@^1.0.2: wordwrapjs "^4.0.0" table@^6.8.0, table@^6.8.1: - version "6.8.1" - resolved "https://registry.yarnpkg.com/table/-/table-6.8.1.tgz#ea2b71359fe03b017a5fbc296204471158080bdf" - integrity sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA== + version "6.8.2" + resolved "https://registry.yarnpkg.com/table/-/table-6.8.2.tgz#c5504ccf201213fa227248bdc8c5569716ac6c58" + integrity sha512-w2sfv80nrAh2VCbqR5AK27wswXhqcck2AhfnNW76beQXskGZ1V12GwS//yYVa3d3fcvAip2OUnbDAjW2k3v9fA== dependencies: ajv "^8.0.1" lodash.truncate "^4.4.2" @@ -8748,10 +8801,10 @@ table@^6.8.0, table@^6.8.1: string-width "^4.2.3" strip-ansi "^6.0.1" -tar@^6.1.11, tar@^6.1.13, tar@^6.1.15, tar@^6.1.2: - version "6.2.0" - resolved "https://registry.yarnpkg.com/tar/-/tar-6.2.0.tgz#b14ce49a79cb1cd23bc9b016302dea5474493f73" - integrity sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ== +tar@^6.1.11, tar@^6.1.13, tar@^6.1.2, tar@^6.2.0: + version "6.2.1" + resolved "https://registry.yarnpkg.com/tar/-/tar-6.2.1.tgz#717549c541bc3c2af15751bea94b1dd068d4b03a" + integrity sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A== dependencies: chownr "^2.0.0" fs-minipass "^2.0.0" @@ -8775,10 +8828,10 @@ tempy@^3.0.0: type-fest "^2.12.2" unique-string "^3.0.0" -tenderly@^0.8.0: - version "0.8.0" - resolved "https://registry.yarnpkg.com/tenderly/-/tenderly-0.8.0.tgz#ffda1f40597b91470e728900e3bdfe6a4f152ec5" - integrity sha512-4Faw9jkwMuBOva82lAtvhTa9isc503GkWwVWSsR8ONm+i3SeFatv7hNyYPZIifQBeuU9GOVNkWHCAXon6NE/aw== +tenderly@^0.9.1: + version "0.9.1" + resolved "https://registry.yarnpkg.com/tenderly/-/tenderly-0.9.1.tgz#de988bc5b65a106c2e1f84faf17863ba9bb81173" + integrity sha512-EGhYYbOgIC0EUebrMIwCRIL9NrGrC8q3gTY/3JNSqvQrNX4RLUgMHungTG4bkgGAwJoehC57vsAeKqR1PVIyjw== dependencies: axios "^0.27.2" cli-table3 "^0.6.2" @@ -8825,6 +8878,13 @@ then-request@^6.0.0: promise "^8.0.0" qs "^6.4.0" +through2@^4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/through2/-/through2-4.0.2.tgz#a7ce3ac2a7a8b0b966c80e7c49f0484c3b239764" + integrity sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw== + dependencies: + readable-stream "3" + through2@~2.0.0: version "2.0.5" resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" @@ -8874,7 +8934,7 @@ tr46@~0.0.3: resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== -traverse@~0.6.6: +traverse@0.6.8: version "0.6.8" resolved "https://registry.yarnpkg.com/traverse/-/traverse-0.6.8.tgz#5e5e0c41878b57e4b73ad2f3d1e36a715ea4ab15" integrity sha512-aXJDbk6SnumuaZSANd21XAo15ucCDE38H4fkqiGsc3MhCK+wOlZvLP9cB/TvpHT0mOyWgC4Z8EwRlzqYSUzdsA== @@ -8967,15 +9027,15 @@ tslib@^1.11.1, tslib@^1.8.1, tslib@^1.9.3: resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== -tslib@^2.3.1, tslib@^2.5.0: - version "2.6.2" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" - integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== +tslib@^2.3.1, tslib@^2.6.2: + version "2.7.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.7.0.tgz#d9b40c5c40ab59e8738f297df3087bf1a2690c01" + integrity sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA== tslog@^4.3.1, tslog@^4.4.0: - version "4.9.2" - resolved "https://registry.yarnpkg.com/tslog/-/tslog-4.9.2.tgz#35de3a073784dfe3849caeaa028010c7a62b7f4a" - integrity sha512-wBM+LRJoNl34Bdu8mYEFxpvmOUedpNUwMNQB/NcuPIZKwdDde6xLHUev3bBjXQU7gdurX++X/YE7gLH8eXYsiQ== + version "4.9.3" + resolved "https://registry.yarnpkg.com/tslog/-/tslog-4.9.3.tgz#d4167d5f51748bdeab593945bc2d8f9827ea0dba" + integrity sha512-oDWuGVONxhVEBtschLf2cs/Jy8i7h1T+CpdkTNWQgdAF7DhRo2G8vMCgILKe7ojdEkLhICWgI1LYSSKaJsRgcw== tsort@0.0.1: version "0.0.1" @@ -9022,10 +9082,10 @@ type-check@~0.3.2: dependencies: prelude-ls "~1.1.2" -type-detect@^4.0.0, type-detect@^4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" - integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== +type-detect@^4.0.0, type-detect@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.1.0.tgz#deb2453e8f08dcae7ae98c626b13dddb0155906c" + integrity sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw== type-fest@^0.18.0: version "0.18.1" @@ -9067,15 +9127,15 @@ type-fest@^2.12.2: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-2.19.0.tgz#88068015bb33036a598b952e55e9311a60fd3a9b" integrity sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA== -type-fest@^3.0.0, type-fest@^3.8.0: +type-fest@^3.8.0: version "3.13.1" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-3.13.1.tgz#bb744c1f0678bea7543a2d1ec24e83e68e8c8706" integrity sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g== type-fest@^4.2.0: - version "4.8.3" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-4.8.3.tgz#6db08d9f44d596cd953f83020c7c56310c368d1c" - integrity sha512-//BaTm14Q/gHBn09xlnKNqfI8t6bmdzx2DXYfPBNofN0WUybCEUDcbCWcTa0oF09lzLjZgPphXAsvRiMK0V6Bw== + version "4.26.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-4.26.1.tgz#a4a17fa314f976dd3e6d6675ef6c775c16d7955e" + integrity sha512-yOGpmOAL7CkKe/91I5O3gPICmJNLJ1G4zFYVAsRHg7M64biSnPtRj0WNQt++bRkjYOqjWXrhnUw1utzmVErAdg== typechain@^8.3.2: version "8.3.2" @@ -9093,54 +9153,59 @@ typechain@^8.3.2: ts-command-line-args "^2.2.0" ts-essentials "^7.0.1" -typed-array-buffer@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz#18de3e7ed7974b0a729d3feecb94338d1472cd60" - integrity sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw== +typed-array-buffer@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz#1867c5d83b20fcb5ccf32649e5e2fc7424474ff3" + integrity sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ== dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.2.1" - is-typed-array "^1.1.10" + call-bind "^1.0.7" + es-errors "^1.3.0" + is-typed-array "^1.1.13" -typed-array-byte-length@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz#d787a24a995711611fb2b87a4052799517b230d0" - integrity sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA== +typed-array-byte-length@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz#d92972d3cff99a3fa2e765a28fcdc0f1d89dec67" + integrity sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw== dependencies: - call-bind "^1.0.2" + call-bind "^1.0.7" for-each "^0.3.3" - has-proto "^1.0.1" - is-typed-array "^1.1.10" + gopd "^1.0.1" + has-proto "^1.0.3" + is-typed-array "^1.1.13" -typed-array-byte-offset@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz#cbbe89b51fdef9cd6aaf07ad4707340abbc4ea0b" - integrity sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg== +typed-array-byte-offset@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz#f9ec1acb9259f395093e4567eb3c28a580d02063" + integrity sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA== dependencies: - available-typed-arrays "^1.0.5" - call-bind "^1.0.2" + available-typed-arrays "^1.0.7" + call-bind "^1.0.7" for-each "^0.3.3" - has-proto "^1.0.1" - is-typed-array "^1.1.10" + gopd "^1.0.1" + has-proto "^1.0.3" + is-typed-array "^1.1.13" -typed-array-length@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.4.tgz#89d83785e5c4098bec72e08b319651f0eac9c1bb" - integrity sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng== +typed-array-length@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.6.tgz#57155207c76e64a3457482dfdc1c9d1d3c4c73a3" + integrity sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g== dependencies: - call-bind "^1.0.2" + call-bind "^1.0.7" for-each "^0.3.3" - is-typed-array "^1.1.9" + gopd "^1.0.1" + has-proto "^1.0.3" + is-typed-array "^1.1.13" + possible-typed-array-names "^1.0.0" typedarray@^0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA== -typescript@^5.0.2, typescript@^5.2.2: - version "5.3.3" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.3.3.tgz#b3ce6ba258e72e6305ba66f5c9b452aaee3ffe37" - integrity sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw== +typescript@^5.0.2, typescript@^5.5.4: + version "5.6.2" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.6.2.tgz#d1de67b6bef77c41823f822df8f0b3bcff60a5a0" + integrity sha512-NW8ByodCSNCwZeghjN3o+JX5OFH0Ojg6sadjEKY4huZ52TqbJTJnDo5+Tw98lSy63NZvi4n+ez5m2u5d4PkZyw== typical@^4.0.0: version "4.0.0" @@ -9153,9 +9218,9 @@ typical@^5.2.0: integrity sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg== uglify-js@^3.1.4: - version "3.17.4" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.17.4.tgz#61678cf5fa3f5b7eb789bb345df29afb8257c22c" - integrity sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g== + version "3.19.3" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.19.3.tgz#82315e9bbc6f2b25888858acd1fff8441035b77f" + integrity sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ== unbox-primitive@^1.0.2: version "1.0.2" @@ -9172,13 +9237,23 @@ undici-types@~5.26.4: resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== +undici-types@~6.19.2: + version "6.19.8" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.19.8.tgz#35111c9d1437ab83a7cdc0abae2f26d88eda0a02" + integrity sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw== + undici@^5.14.0: - version "5.28.2" - resolved "https://registry.yarnpkg.com/undici/-/undici-5.28.2.tgz#fea200eac65fc7ecaff80a023d1a0543423b4c91" - integrity sha512-wh1pHJHnUeQV5Xa8/kyQhO7WFa8M34l026L5P/+2TYiakvGy5Rdc8jWZVyG7ieht/0WgJLEd3kcU5gKx+6GC8w== + version "5.28.4" + resolved "https://registry.yarnpkg.com/undici/-/undici-5.28.4.tgz#6b280408edb6a1a604a9b20340f45b422e373068" + integrity sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g== dependencies: "@fastify/busboy" "^2.0.0" +undici@^6.11.1: + version "6.19.8" + resolved "https://registry.yarnpkg.com/undici/-/undici-6.19.8.tgz#002d7c8a28f8cc3a44ff33c3d4be4d85e15d40e1" + integrity sha512-U8uCCl2x9TK3WANvmBavymRzxbfFYG+tAu+fgx3zxQy3qdagQqBLwJVrdyO1TBfUXvfKveMKJZhpvUYoOjM+4g== + unfetch@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/unfetch/-/unfetch-4.2.0.tgz#7e21b0ef7d363d8d9af0fb929a5555f6ef97a3be" @@ -9285,11 +9360,9 @@ validate-npm-package-license@^3.0.1, validate-npm-package-license@^3.0.4: spdx-expression-parse "^3.0.0" validate-npm-package-name@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/validate-npm-package-name/-/validate-npm-package-name-5.0.0.tgz#f16afd48318e6f90a1ec101377fa0384cfc8c713" - integrity sha512-YuKoXDAhBYxY7SfOKxHBDoSyENFeW5VvIIQp2TGQuit8gpK6MnWaQelBKxso72DoxTZfZdcP3W90LqpSkgPzLQ== - dependencies: - builtins "^5.0.0" + version "5.0.1" + resolved "https://registry.yarnpkg.com/validate-npm-package-name/-/validate-npm-package-name-5.0.1.tgz#a316573e9b49f3ccd90dbb6eb52b3f06c6d604e8" + integrity sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ== varint@^5.0.0: version "5.0.2" @@ -9309,9 +9382,9 @@ wcwidth@^1.0.0: defaults "^1.0.3" web3-utils@^1.0.0-beta.31, web3-utils@^1.3.6: - version "1.10.3" - resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.10.3.tgz#f1db99c82549c7d9f8348f04ffe4e0188b449714" - integrity sha512-OqcUrEE16fDBbGoQtZXWdavsPzbGIDc5v3VrRTZ0XrIpefC/viZ1ZU9bGEemazyS0catk/3rkOOxpzTfY+XsyQ== + version "1.10.4" + resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.10.4.tgz#0daee7d6841641655d8b3726baf33b08eda1cbec" + integrity sha512-tsu8FiKJLk2PzhDl9fXbGUWTkkVXYhtTA+SmEFkKft+9BgwLxfCRpU96sWv7ICC8zixBNd3JURVoiR3dUXgP8A== dependencies: "@ethereumjs/util" "^8.1.0" bn.js "^5.2.1" @@ -9364,16 +9437,16 @@ which-module@^1.0.0: resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f" integrity sha512-F6+WgncZi/mJDrammbTuHe1q0R5hOXv/mBaiNA2TCNT/LTHusX0V+CJnj9XT8ki5ln2UZyyddDgHfCzyrOH7MQ== -which-typed-array@^1.1.11, which-typed-array@^1.1.13: - version "1.1.13" - resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.13.tgz#870cd5be06ddb616f504e7b039c4c24898184d36" - integrity sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow== +which-typed-array@^1.1.14, which-typed-array@^1.1.15: + version "1.1.15" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.15.tgz#264859e9b11a649b388bfaaf4f767df1f779b38d" + integrity sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA== dependencies: - available-typed-arrays "^1.0.5" - call-bind "^1.0.4" + available-typed-arrays "^1.0.7" + call-bind "^1.0.7" for-each "^0.3.3" gopd "^1.0.1" - has-tostringtag "^1.0.0" + has-tostringtag "^1.0.2" which@^1.1.1, which@^1.3.1: version "1.3.1" @@ -9403,38 +9476,45 @@ wide-align@^1.1.5: dependencies: string-width "^1.0.2 || 2 || 3 || 4" +widest-line@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-3.1.0.tgz#8292333bbf66cb45ff0de1603b136b7ae1496eca" + integrity sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg== + dependencies: + string-width "^4.0.0" + window-size@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.2.0.tgz#b4315bb4214a3d7058ebeee892e13fa24d98b075" integrity sha512-UD7d8HFA2+PZsbKyaOCEy8gMh1oDtHgJh1LfgjQ4zVXmYjAT/kvz3PueITKuqDiIXQe7yzpPnxX3lNc+AhQMyw== -winston-transport@^4.5.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/winston-transport/-/winston-transport-4.6.0.tgz#f1c1a665ad1b366df72199e27892721832a19e1b" - integrity sha512-wbBA9PbPAHxKiygo7ub7BYRiKxms0tpfU2ljtWzb3SjRjv5yl6Ozuy/TkXf00HTAt+Uylo3gSkNwzc4ME0wiIg== +winston-transport@^4.7.0: + version "4.7.1" + resolved "https://registry.yarnpkg.com/winston-transport/-/winston-transport-4.7.1.tgz#52ff1bcfe452ad89991a0aaff9c3b18e7f392569" + integrity sha512-wQCXXVgfv/wUPOfb2x0ruxzwkcZfxcktz6JIMUaPLmcNhO4bZTwA/WtDWK74xV3F2dKu8YadrFv0qhwYjVEwhA== dependencies: - logform "^2.3.2" - readable-stream "^3.6.0" + logform "^2.6.1" + readable-stream "^3.6.2" triple-beam "^1.3.0" winston@^3.11.0: - version "3.11.0" - resolved "https://registry.yarnpkg.com/winston/-/winston-3.11.0.tgz#2d50b0a695a2758bb1c95279f0a88e858163ed91" - integrity sha512-L3yR6/MzZAOl0DsysUXHVjOwv8mKZ71TrA/41EIduGpOOV5LQVodqN+QdQ6BS6PJ/RdIshZhq84P/fStEZkk7g== + version "3.14.2" + resolved "https://registry.yarnpkg.com/winston/-/winston-3.14.2.tgz#94ce5fd26d374f563c969d12f0cd9c641065adab" + integrity sha512-CO8cdpBB2yqzEf8v895L+GNKYJiEq8eKlHU38af3snQBQ+sdAIUepjMSguOIJC7ICbzm0ZI+Af2If4vIJrtmOg== dependencies: "@colors/colors" "^1.6.0" "@dabh/diagnostics" "^2.0.2" async "^3.2.3" is-stream "^2.0.0" - logform "^2.4.0" + logform "^2.6.0" one-time "^1.0.0" readable-stream "^3.4.0" safe-stable-stringify "^2.3.1" stack-trace "0.0.x" triple-beam "^1.3.0" - winston-transport "^4.5.0" + winston-transport "^4.7.0" -word-wrap@~1.2.3: +word-wrap@^1.2.5, word-wrap@~1.2.3: version "1.2.5" resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== @@ -9452,12 +9532,12 @@ wordwrapjs@^4.0.0: reduce-flatten "^2.0.0" typical "^5.2.0" -workerpool@6.2.1: - version "6.2.1" - resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.2.1.tgz#46fc150c17d826b86a008e5a4508656777e9c343" - integrity sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw== +workerpool@^6.5.1: + version "6.5.1" + resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.5.1.tgz#060f73b39d0caf97c6db64da004cd01b4c099544" + integrity sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA== -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== @@ -9474,6 +9554,15 @@ wrap-ansi@^2.0.0: string-width "^1.0.1" strip-ansi "^3.0.1" +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + wrap-ansi@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" @@ -9501,15 +9590,15 @@ ws@7.4.6: resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.6.tgz#5654ca8ecdeee47c33a9a4bf6d28e2be2980377c" integrity sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A== -ws@8.5.0: - version "8.5.0" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.5.0.tgz#bfb4be96600757fe5382de12c670dab984a1ed4f" - integrity sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg== +ws@8.17.1: + version "8.17.1" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.17.1.tgz#9293da530bb548febc95371d90f9c878727d919b" + integrity sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ== ws@^7.4.6: - version "7.5.9" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591" - integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== + version "7.5.10" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.10.tgz#58b5c20dc281633f6c19113f39b349bd8bd558d9" + integrity sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ== xtend@~4.0.1: version "4.0.2" @@ -9526,21 +9615,11 @@ y18n@^5.0.5: resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== -yallist@^3.0.2: - version "3.1.1" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" - integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== - yallist@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== -yargs-parser@20.2.4: - version "20.2.4" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54" - integrity sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA== - yargs-parser@^2.4.1: version "2.4.1" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-2.4.1.tgz#85568de3cf150ff49fa51825f03a8c880ddcc5c4" @@ -9549,7 +9628,7 @@ yargs-parser@^2.4.1: camelcase "^3.0.0" lodash.assign "^4.0.6" -yargs-parser@^20.2.2, yargs-parser@^20.2.3: +yargs-parser@^20.2.2, yargs-parser@^20.2.3, yargs-parser@^20.2.9: version "20.2.9" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== @@ -9559,7 +9638,7 @@ yargs-parser@^21.1.1: resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== -yargs-unparser@2.0.0: +yargs-unparser@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-2.0.0.tgz#f131f9226911ae5d9ad38c432fe809366c2325eb" integrity sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA== @@ -9569,7 +9648,7 @@ yargs-unparser@2.0.0: flat "^5.0.2" is-plain-obj "^2.1.0" -yargs@16.2.0: +yargs@^16.2.0: version "16.2.0" resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== @@ -9626,9 +9705,9 @@ yocto-queue@^0.1.0: integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== 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== + version "1.1.1" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-1.1.1.tgz#fef65ce3ac9f8a32ceac5a634f74e17e5b232110" + integrity sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g== zksync-web3@^0.14.3: version "0.14.4"