From 667381b1458629ce47d47a45cdf96f5b969ef688 Mon Sep 17 00:00:00 2001 From: Sebastian Lorenz Date: Fri, 12 May 2023 18:45:26 +0200 Subject: [PATCH] chore: initial foundry deployment/utils/tests MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Sean Casey Co-authored-by: Paweł Kędzia --- .github/workflows/changeset.yaml | 4 +- .github/workflows/ci.yaml | 19 +- .gitignore | 1 + .prettierignore | 3 + .solhint.json | 2 +- Makefile | 135 +- README.md | 64 +- foundry.toml | 6 +- interfaces.txt | 176 ++ lib/forge-std | 2 +- package.json | 5 +- packages/protocol/package.json | 1 + pnpm-lock.yaml | 2481 ++++++++--------- remappings.txt | 4 +- tests/bases/IntegrationTest.sol | 152 + tests/bases/UnitTest.sol | 7 + .../external/IAaveV2LendingPool.sol | 57 + .../external/IChainlinkAggregator.sol | 8 + tests/interfaces/external/IERC20.sol | 7 + tests/interfaces/external/IWETH.sol | 34 + tests/persistent/Dispatcher.t.sol | 208 -- .../AddressListRegistry.t.sol | 529 ++++ tests/tests/core/dispatcher/Dispatcher.t.sol | 115 + .../core/dispatcher/DispatcherOwnership.t.sol | 94 + .../dispatcher/DispatcherVaultCreation.t.sol | 84 + .../dispatcher/DispatcherVaultMigration.t.sol | 624 +++++ .../ExternalPositionFactory.t.sol | 240 ++ .../ExternalPositionProxy.t.sol | 123 + .../core/fund-deployer/FundDeployer.t.sol | 122 + .../FundDeployerMigrationIn.t.sol | 305 ++ .../uint-list-registry/UintListRegistry.t.sol | 496 ++++ .../PerformanceFeeIntegration.t.sol | 83 + .../fees/performance/PerformanceFeeUnit.t.sol | 116 + .../infrastracture/ValueInterpreter.t.sol | 109 + .../CumulativeSlippageTolerancePolicy.t.sol | 438 +++ .../tests/protocols/aave/AaveV2Adapter.t.sol | 89 + .../protocols/kiln/KilnStakingPosition.t.sol | 75 + tests/utils/CommonUtils.sol | 14 + tests/utils/CoreUtils.sol | 18 + tests/utils/common/ErrorUtils.sol | 14 + tests/utils/common/EventUtils.sol | 56 + tests/utils/common/TokenUtils.sol | 45 + tests/utils/core/AdapterUtils.sol | 103 + tests/utils/core/AssetUniverseUtils.sol | 148 + tests/utils/core/DeploymentUtils.sol | 501 ++++ tests/utils/core/ExternalPositionUtils.sol | 77 + tests/utils/core/ListRegistryUtils.sol | 9 + tests/utils/core/PolicyUtils.sol | 14 + tests/utils/core/VaultUtils.sol | 232 ++ tests/utils/fees/FeeUtils.sol | 18 + tests/utils/fees/PerformanceFeeUtils.sol | 13 + ...CumulativeSlippageTolerancePolicyUtils.sol | 47 + tests/utils/protocols/aave/AaveV2Utils.sol | 69 + tests/utils/protocols/kiln/KilnUtils.sol | 89 + 54 files changed, 7001 insertions(+), 1484 deletions(-) create mode 100644 interfaces.txt create mode 100644 tests/bases/IntegrationTest.sol create mode 100644 tests/bases/UnitTest.sol create mode 100644 tests/interfaces/external/IAaveV2LendingPool.sol create mode 100644 tests/interfaces/external/IChainlinkAggregator.sol create mode 100644 tests/interfaces/external/IERC20.sol create mode 100644 tests/interfaces/external/IWETH.sol delete mode 100644 tests/persistent/Dispatcher.t.sol create mode 100644 tests/tests/core/address-list-registry/AddressListRegistry.t.sol create mode 100644 tests/tests/core/dispatcher/Dispatcher.t.sol create mode 100644 tests/tests/core/dispatcher/DispatcherOwnership.t.sol create mode 100644 tests/tests/core/dispatcher/DispatcherVaultCreation.t.sol create mode 100644 tests/tests/core/dispatcher/DispatcherVaultMigration.t.sol create mode 100644 tests/tests/core/external-positions/ExternalPositionFactory.t.sol create mode 100644 tests/tests/core/external-positions/ExternalPositionProxy.t.sol create mode 100644 tests/tests/core/fund-deployer/FundDeployer.t.sol create mode 100644 tests/tests/core/fund-deployer/FundDeployerMigrationIn.t.sol create mode 100644 tests/tests/core/uint-list-registry/UintListRegistry.t.sol create mode 100644 tests/tests/fees/performance/PerformanceFeeIntegration.t.sol create mode 100644 tests/tests/fees/performance/PerformanceFeeUnit.t.sol create mode 100644 tests/tests/infrastracture/ValueInterpreter.t.sol create mode 100644 tests/tests/policies/CumulativeSlippageTolerancePolicy.t.sol create mode 100644 tests/tests/protocols/aave/AaveV2Adapter.t.sol create mode 100644 tests/tests/protocols/kiln/KilnStakingPosition.t.sol create mode 100644 tests/utils/CommonUtils.sol create mode 100644 tests/utils/CoreUtils.sol create mode 100644 tests/utils/common/ErrorUtils.sol create mode 100644 tests/utils/common/EventUtils.sol create mode 100644 tests/utils/common/TokenUtils.sol create mode 100644 tests/utils/core/AdapterUtils.sol create mode 100644 tests/utils/core/AssetUniverseUtils.sol create mode 100644 tests/utils/core/DeploymentUtils.sol create mode 100644 tests/utils/core/ExternalPositionUtils.sol create mode 100644 tests/utils/core/ListRegistryUtils.sol create mode 100644 tests/utils/core/PolicyUtils.sol create mode 100644 tests/utils/core/VaultUtils.sol create mode 100644 tests/utils/fees/FeeUtils.sol create mode 100644 tests/utils/fees/PerformanceFeeUtils.sol create mode 100644 tests/utils/policies/CumulativeSlippageTolerancePolicyUtils.sol create mode 100644 tests/utils/protocols/aave/AaveV2Utils.sol create mode 100644 tests/utils/protocols/kiln/KilnUtils.sol diff --git a/.github/workflows/changeset.yaml b/.github/workflows/changeset.yaml index c5bbd769e..6643edd86 100644 --- a/.github/workflows/changeset.yaml +++ b/.github/workflows/changeset.yaml @@ -21,14 +21,12 @@ jobs: - name: Install pnpm uses: pnpm/action-setup@v2 - with: - version: 7.18.1 - name: Set up node uses: actions/setup-node@v2 with: cache: pnpm - node-version: 16 + node-version: 18 - name: Install dependencies run: pnpm install diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index b0093a335..a7b73dd29 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -14,7 +14,7 @@ concurrency: cancel-in-progress: true env: - CACHE_VERSION: '4' + CACHE_VERSION: '5' NODE_OPTIONS: '--max-old-space-size=4096' jobs: @@ -35,8 +35,6 @@ jobs: - name: Install pnpm uses: pnpm/action-setup@v2 - with: - version: 7.18.1 - name: Set up node uses: actions/setup-node@v2 @@ -47,8 +45,14 @@ jobs: - name: Install dependencies run: pnpm install + - name: Make interfaces + run: make interfaces + - name: Run tests run: forge test + env: + ETHEREUM_NODE_MAINNET: ${{ secrets.ETHEREUM_NODE_MAINNET }} + ETHEREUM_NODE_POLYGON: ${{ secrets.ETHEREUM_NODE_POLYGON }} test: name: Test @@ -65,8 +69,6 @@ jobs: - name: Install pnpm uses: pnpm/action-setup@v2 - with: - version: 7.18.1 - name: Set up node uses: actions/setup-node@v2 @@ -113,10 +115,13 @@ jobs: - name: Check out repository uses: actions/checkout@v3 + - name: Install foundry + uses: foundry-rs/foundry-toolchain@v1 + with: + version: nightly + - name: Install pnpm uses: pnpm/action-setup@v2 - with: - version: 7.18.1 - name: Set up node uses: actions/setup-node@v2 diff --git a/.gitignore b/.gitignore index cf962caea..99d56edf1 100644 --- a/.gitignore +++ b/.gitignore @@ -22,3 +22,4 @@ cache/ artifacts/ deployments/ node_modules/ +tests/interfaces/internal/ diff --git a/.prettierignore b/.prettierignore index b4f92d007..7f45f8703 100644 --- a/.prettierignore +++ b/.prettierignore @@ -13,3 +13,6 @@ deployments/ # Ignore dependencies. lib/ + +# Ignore tests directory (uses `forge fmt`). +tests/ diff --git a/.solhint.json b/.solhint.json index b5324386d..d33aa5a7b 100644 --- a/.solhint.json +++ b/.solhint.json @@ -1,7 +1,7 @@ { "extends": "solhint:recommended", "rules": { - "compiler-version": ["error", "0.6.12 || 0.7.6"], + "compiler-version": ["error", "0.6.12 || 0.7.6 || 0.8.17 || ^0.8.10"], "func-visibility": ["error", { "ignoreConstructors": true }], "no-empty-blocks": "off", "not-rely-on-time": "off", diff --git a/Makefile b/Makefile index a88d596a6..fc59b37f0 100644 --- a/Makefile +++ b/Makefile @@ -1,2 +1,133 @@ -clean: - git clean -dfX --exclude !**/.env* --exclude !**/cache/hardhat-network-fork +# See https://tech.davis-hansson.com/p/make +SHELL := bash +.ONESHELL: +.SHELLFLAGS := -eu -o pipefail -c +.DELETE_ON_ERROR: +.DEFAULT_GOAL := all + +MAKEFLAGS += --warn-undefined-variables +MAKEFLAGS += --no-builtin-rules + +ifndef VERBOSE + MAKEFLAGS += --silent +endif + +ifeq ($(origin .RECIPEPREFIX), undefined) + $(error This Make does not support .RECIPEPREFIX. Please use GNU Make 4.0 or later) +endif +.RECIPEPREFIX = > + +CAST := cast +FORGE := forge + +TESTS_DIR := tests/ +CONTRACTS_DIR := contracts/ +ARTIFACTS_DIR := artifacts/ +INTERFACES_DIR := tests/interfaces/internal/ +INTERFACES_LICENSE_HEADER := // SPDX-License-Identifier: Unlicense + +.PHONY: help +help: ## Describe useful make targets +> grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf "%-30s %s\n", $$1, $$2}' + +.PHONY: all +all: build lint test ## Run build, lint (default) + +.PHONY: build +build: artifacts interfaces ## Build all contract artifacts & interfaces + +.PHONY: artifacts +artifacts: $(ARTIFACTS_DIR) ## Build all contract artifacts + +.PHONY: interfaces +interfaces: $(INTERFACES_DIR) ## ## Generate interfaces for all contracts listed in interfaces.txt + +.PHONY: test +test: ## Run the entire test suite +> $(FORGE) test + +.PHONY: lint +lint: ## Lint all contract source files +# TODO: Switch to `forge fmt` for the contract source files too. +> $(FORGE) fmt --check $(TESTS_DIR) $(INTERFACES_DIR) + +.PHONY: format +format: ## Format all contract source files +# TODO: Switch to `forge fmt` for the contract source files too. +> $(FORGE) fmt $(TESTS_DIR) $(INTERFACES_DIR) + +.PHONY: clean +clean: ## Remove all untracked files and directories +> git clean -dfX --exclude !**/.env* --exclude !**/deployments --exclude !**/cache/hardhat-network-fork + +$(ARTIFACTS_DIR): Makefile $(shell find $(CONTRACTS_DIR) -type f -name "*.sol") +> mkdir -p $(@D) +> # Remove this once the `forge build` command supports a more capable version of the `--skip` option. +> export FOUNDRY_TEST=this-directory-does-not-exist +> $(FORGE) build --extra-output-files abi +> touch $@ + +$(INTERFACES_DIR): Makefile $(ARTIFACTS_DIR) interfaces.txt +> mkdir -p $(@D) +> +> # Remove all existing interfaces and abis. +> find $(INTERFACES_DIR) -type f -name "*.sol" -delete +> find $(INTERFACES_DIR) -type f -name "*.abi.json" -delete +> +> # Read interfaces.txt line by line and use `cast interface` to generate the interfaces. +> while read -r line; do +> # Skip empty lines and lines starting with `#`. +> if [[ -z "$$line" || "$$line" == \#* ]]; then +> continue +> fi +> +> # The line format is `output: input`. +> output="$$(echo $$line | cut -d ':' -f1 | xargs)" +> input="$$(echo $$line | cut -d ':' -f2 | xargs)" +> if [[ -z "$$output" || -z "$$input" ]]; then +> echo "Invalid line format n interfaces.txt ($$line)" +> exit 1; +> fi +> +> # Extract the output name of the interface from the output path. +> name="$$(basename $$output | cut -d '.' -f1)" +> if [[ -z "$$name" ]]; then +> echo "Invalid output $$output in interfaces.txt" +> exit 1 +> fi +> +> # Prepend the interfaces directory to the output path and check the file extension. +> output="$(INTERFACES_DIR)$$output" +> if [[ ! "$$input" == *.abi.json ]]; then +> echo "Invalid extension for interface source $$input" +> exit 1 +> fi +> +> # If the input is a path, use it directly. Otherwise, try to find the file in the artifacts directory. +> if echo "$$input" | grep -q "/"; then +> path="$$input" +> else +> path="$$(find $(ARTIFACTS_DIR) -type f -name $$input | head -n 1)" +> fi +> +> # Check if the source file was found. +> if [[ -z "$$path" || ! -f "$$path" ]]; then +> echo "Failed to locate source file for $$input" +> exit 1 +> fi +> +> dir="$$(dirname $$output)" +> abi="$$dir/$$name.abi.json" +> +> # Create the parent directory and copy the abi file over. +> mkdir -p "$$dir" +> cp "$$path" "$$abi" +> +> # Generate the interface using `cast interface`. +> $(CAST) interface "$$abi" -o "$$output" -n "$$name" +> +> # Add a license header to the generated interface. +> echo -e "$(INTERFACES_LICENSE_HEADER)\n$$(cat $$output)" > $$output +> done < "interfaces.txt" +> +> touch $@ diff --git a/README.md b/README.md index a9924b959..f88d4d5f5 100644 --- a/README.md +++ b/README.md @@ -4,35 +4,81 @@ Enzyme is an Ethereum-based protocol for decentralized on-chain asset management. It is a protocol for people or entities to manage their wealth & the wealth of others within a customizable and safe environment. Enzyme empowers anyone to set up, manage and invest in customized on-chain investment vehicles. -## Install +## Security Issues and Bug Bounty + +If you find a vulnerability that may affect live deployments, you can submit a report via: + +A. Immunefi(https://immunefi.com/bounty/enzymefinance/), or + +B. Direct email to [security@enzyme.finance](mailto:security@enzyme.finance) + +Please **DO NOT** open a public issue. + +## Using this Repo + +### A Tale of Two Frameworks + +:construction: + +This repo is currently in-flux for a gradual move from Hardhat to Foundry, so there are mixed dependencies, deployment mechanisms, helpers, and tests. The following rules should hold: + +- all production contracts live in `contracts/persistent/` and `contracts/release/` (deployed contracts [here](https://docs.enzyme.finance/developers/contracts)) +- the "old" Hardhat-based dependencies / deployment / helpers / tests live in `packages/` +- the "new" Foundry-based dependencies / deployment / helpers / tests live in `tests/` + +Test suites are being gradually migrated from the Hardhat setup to Foundry, so check both for test coverage. ### Prerequisites +1. Make sure to have the following installed: + - [node](https://www.nodejs.org) - [pnpm](https://pnpm.io) +- [foundry](https://github.com/foundry-rs/foundry) +- [make](https://www.gnu.org/software/make/) -```sh +2. Clone this repo: + +``` git clone [GIT_REPOSITORY_URL] -cd protocol +``` + +### Dependencies + +1. Install node packages: + +```sh pnpm install ``` -## Compile contracts +2. Generate internal interfaces for foundry deployment and tests: + +```sh +make build +``` + +### Compile contracts ```sh pnpm compile ``` -## Test +### Run tests -First, create a `.env` file by copying `.env.example`. Input your Ethereum node endpoint info as-needed (generally, only setting `ETHEREUM_NODE_MAINNET` is fine). +1. Create a `.env` file by copying `.env.example`. Input your Ethereum (and/or other networks) node endpoint info as-needed (generally, only setting `ETHEREUM_NODE_MAINNET`, `ETHEREUM_NODE_POLYGON`, etc is fine). -Then, you can run tests. The full test suite can be run with: +2. Run hardhat tests with (defaults to full test suite): ```sh pnpm test ``` +3. Run foundry tests with (defaults to full test suite): + +```sh +forge test +``` + Note that tests might fail on the first runs while building a cache for the fork block, due to timeout. Continue to run tests as-needed, which will build the cache. ## Contribute @@ -40,7 +86,3 @@ Note that tests might fail on the first runs while building a cache for the fork See [our contributing instructions](CONTRIBUTING.md). Please note that all repositories hosted under this organization follow our [Code of Conduct](CODE_OF_CONDUCT.md), make sure to review and follow it. - -### Security Issues - -If you find a vulnerability that may affect live or testnet deployments, please send your report privately to [security@enzyme.finance](mailto:security@enzyme.finance). Please **DO NOT** file a public issue. diff --git a/foundry.toml b/foundry.toml index c511d3655..81f3a0ec7 100644 --- a/foundry.toml +++ b/foundry.toml @@ -7,12 +7,16 @@ cache_path = "cache" bytecode_hash = "none" verbosity = 3 remappings = [ - "@enzyme/=contracts/", "@uniswap/=node_modules/@uniswap/", "@openzeppelin/=node_modules/@openzeppelin/", "@openzeppelin-solc-0.7/=node_modules/@openzeppelin-solc-0.7/", "forge-std/=lib/forge-std/src/" ] +fs_permissions = [{ access = "read", path = "./artifacts"}] [profile.default.optimizer_details] yul = false + +[rpc_endpoints] +mainnet = "${ETHEREUM_NODE_MAINNET}" +polygon = "${ETHEREUM_NODE_POLYGON}" diff --git a/interfaces.txt b/interfaces.txt new file mode 100644 index 000000000..8c3916318 --- /dev/null +++ b/interfaces.txt @@ -0,0 +1,176 @@ +####################################################################################################################### +# PERSISTENT +####################################################################################################################### + +# Dispatcher +IDispatcher.sol: Dispatcher.abi.json +IMigrationHookHandler.sol: IMigrationHookHandler.abi.json + +# Arbitrary value oracle +IArbitraryValueOracle.sol: IArbitraryValueOracle.abi.json +IManualValueOracleFactory.sol: ManualValueOracleFactory.abi.json +IManualValueOracleLib.sol: ManualValueOracleLib.abi.json + +# Off-chain +IFundValueCalculatorRouter.sol: FundValueCalculatorRouter.abi.json +IFundValueCalculatorUsdWrapper.sol: FundValueCalculatorUsdWrapper.abi.json + +# Address list registry +IAddressListRegistry.sol: AddressListRegistry.abi.json +IAaveV2ATokenListOwner.sol: AaveV2ATokenListOwner.abi.json +IAaveV3ATokenListOwner.sol: AaveV3ATokenListOwner.abi.json +ICompoundV3CTokenListOwner.sol: CompoundV3CTokenListOwner.abi.json + +# Uint list registry +IUintListRegistry.sol: UintListRegistry.abi.json + +# Global config +IGlobalConfigLib.sol: GlobalConfigLib.abi.json + +# Shares splitter +ISharesSplitterLib.sol: SharesSplitterLib.abi.json +ISharesSplitterFactory.sol: SharesSplitterFactory.abi.json + +# Protocol fee +IProtocolFeeReserve.sol: ProtocolFeeReserveLib.abi.json + +# Shares wrapper +IGatedRedemptionQueueSharesWrapperLib.sol: GatedRedemptionQueueSharesWrapperLib.abi.json +IGatedRedemptionQueueSharesWrapperFactory.sol: GatedRedemptionQueueSharesWrapperFactory.abi.json + +# External positions +IExternalPosition.sol: IExternalPosition.abi.json +IExternalPositionFactory.sol: ExternalPositionFactory.abi.json +IExternalPositionProxy.sol: ExternalPositionProxy.abi.json +IExternalPositionVault.sol: IExternalPositionVault.abi.json +IMapleV1ToV2PoolMapper.sol: MapleV1ToV2PoolMapper.abi.json + +####################################################################################################################### +# RELEASE +####################################################################################################################### + +# Core +IVault.sol: VaultLib.abi.json +IVaultCore.sol: IVaultCore.abi.json +IComptroller.sol: ComptrollerLib.abi.json +IFundDeployer.sol: FundDeployer.abi.json + +# Policies +IPolicy.sol: IPolicy.abi.json +IPolicyManager.sol: PolicyManager.abi.json +IAllowedExternalPositionTypesPolicy.sol: AllowedExternalPositionTypesPolicy.abi.json +ICumulativeSlippageTolerancePolicy.sol: CumulativeSlippageTolerancePolicy.abi.json +IOnlyUntrackDustOrPricelessAssetsPolicy.sol: OnlyUntrackDustOrPricelessAssetsPolicy.abi.json +IAllowedAdapterIncomingAssetsPolicy.sol: AllowedAdapterIncomingAssetsPolicy.abi.json +IAllowedExternalPositionTypesPerManagerPolicy.sol: AllowedExternalPositionTypesPerManagerPolicy.abi.json +IOnlyRemoveDustExternalPositionPolicy.sol: OnlyRemoveDustExternalPositionPolicy.abi.json +IAllowedAdaptersPerManagerPolicy.sol: AllowedAdaptersPerManagerPolicy.abi.json +IAllowedAdaptersPolicy.sol: AllowedAdaptersPolicy.abi.json +IAllowedDepositRecipientsPolicy.sol: AllowedDepositRecipientsPolicy.abi.json +IAllowedSharesTransferRecipientsPolicy.sol: AllowedSharesTransferRecipientsPolicy.abi.json +IMinMaxInvestmentPolicy.sol: MinMaxInvestmentPolicy.abi.json +IAllowedAssetsForRedemptionPolicy.sol: AllowedAssetsForRedemptionPolicy.abi.json +IMinAssetBalancesPostRedemptionPolicy.sol: MinAssetBalancesPostRedemptionPolicy.abi.json + +# Fees +IFee.sol: IFee.abi.json +IFeeManager.sol: FeeManager.abi.json +IManagementFee.sol: ManagementFee.abi.json +IMinSharesSupplyFee.sol: MinSharesSupplyFee.abi.json +IExitRateDirectFee.sol: ExitRateDirectFee.abi.json +IExitRateBurnFee.sol: ExitRateBurnFee.abi.json +IEntranceRateBurnFee.sol: EntranceRateBurnFee.abi.json +IEntranceRateDirectFee.sol: EntranceRateDirectFee.abi.json +IPerformanceFee.sol: PerformanceFee.abi.json + +# Integrations +IIntegrationAdapter.sol: IIntegrationAdapter.abi.json +IIntegrationManager.sol: IntegrationManager.abi.json +IUniswapV2LiquidityAdapter.sol: UniswapV2LiquidityAdapter.abi.json +IAaveV3Adapter.sol: AaveV3Adapter.abi.json +ISynthetixAdapter.sol: SynthetixAdapter.abi.json +IPoolTogetherV4Adapter.sol: PoolTogetherV4Adapter.abi.json +IConvexCurveLpStakingAdapter.sol: ConvexCurveLpStakingAdapter.abi.json +IUniswapV3Adapter.sol: UniswapV3Adapter.abi.json +IIdleAdapter.sol: IdleAdapter.abi.json +ICurveLiquidityAdapter.sol: CurveLiquidityAdapter.abi.json +IUniswapV2ExchangeAdapter.sol: UniswapV2ExchangeAdapter.abi.json +ICompoundV3Adapter.sol: CompoundV3Adapter.abi.json +IYearnVaultV2Adapter.sol: YearnVaultV2Adapter.abi.json +IParaSwapV5Adapter.sol: ParaSwapV5Adapter.abi.json +IAaveV2Adapter.sol: AaveV2Adapter.abi.json +IAuraBalancerV2LpStakingAdapter.sol: AuraBalancerV2LpStakingAdapter.abi.json +IZeroExV2Adapter.sol: ZeroExV2Adapter.abi.json +IBalancerV2LiquidityAdapter.sol: BalancerV2LiquidityAdapter.abi.json +ICurveExchangeAdapter.sol: CurveExchangeAdapter.abi.json +ICompoundAdapter.sol: CompoundAdapter.abi.json + +# External positions +IExternalPositionManager.sol: ExternalPositionManager.abi.json +IAaveDebtPositionLib.sol: AaveDebtPositionLib.abi.json +IAaveDebtPositionParser.sol: AaveDebtPositionParser.abi.json +IArbitraryLoanPositionLib.sol: ArbitraryLoanPositionLib.abi.json +IArbitraryLoanPositionParser.sol: ArbitraryLoanPositionParser.abi.json +IArbitraryLoanFixedInterestModule.sol: ArbitraryLoanFixedInterestModule.abi.json +IArbitraryLoanTotalNominalDeltaOracleModule.sol: ArbitraryLoanTotalNominalDeltaOracleModule.abi.json +IKilnStakingPositionLib.sol: KilnStakingPositionLib.abi.json +IKilnStakingPositionParser.sol: KilnStakingPositionParser.abi.json +ILiquityDebtPositionLib.sol: LiquityDebtPositionLib.abi.json +ILiquityDebtPositionParser.sol: LiquityDebtPositionParser.abi.json +INotionalV2PositionLib.sol: NotionalV2PositionLib.abi.json +INotionalV2PositionParser.sol: NotionalV2PositionParser.abi.json +ITheGraphDelegationPositionLib.sol: TheGraphDelegationPositionLib.abi.json +ITheGraphDelegationPositionParser.sol: TheGraphDelegationPositionParser.abi.json +IMapleLiquidityPositionLib.sol: MapleLiquidityPositionLib.abi.json +IMapleLiquidityPositionParser.sol: MapleLiquidityPositionParser.abi.json +ISolvV2BondIssuerPositionLib.sol: SolvV2BondIssuerPositionLib.abi.json +ISolvV2BondIssuerPositionParser.sol: SolvV2BondIssuerPositionParser.abi.json +IConvexVotingPositionLib.sol: ConvexVotingPositionLib.abi.json +IConvexVotingPositionParser.sol: ConvexVotingPositionParser.abi.json +IUniswapV3LiquidityPositionLib.sol: UniswapV3LiquidityPositionLib.abi.json +IUniswapV3LiquidityPositionParser.sol: UniswapV3LiquidityPositionParser.abi.json +ISolvV2BondBuyerPositionLib.sol: SolvV2BondBuyerPositionLib.abi.json +ISolvV2BondBuyerPositionParser.sol: SolvV2BondBuyerPositionParser.abi.json +ICompoundDebtPositionLib.sol: CompoundDebtPositionLib.abi.json +ICompoundDebtPositionParser.sol: CompoundDebtPositionParser.abi.json + +# Value interpreter +IValueInterpreter.sol: ValueInterpreter.abi.json + +# Price feeds +IDerivativePriceFeed.sol: IDerivativePriceFeed.abi.json +ICurvePriceFeed.sol: CurvePriceFeed.abi.json +IBalancerV2WeightedPoolPriceFeed.sol: BalancerV2WeightedPoolPriceFeed.abi.json +IFiduPriceFeed.sol: FiduPriceFeed.abi.json +IBalancerV2StablePoolPriceFeed.sol: BalancerV2StablePoolPriceFeed.abi.json +IWstethPriceFeed.sol: WstethPriceFeed.abi.json +ICompoundPriceFeed.sol: CompoundPriceFeed.abi.json +IUniswapV2PoolPriceFeed.sol: UniswapV2PoolPriceFeed.abi.json +IBalancerV2GaugeTokenPriceFeed.sol: BalancerV2GaugeTokenPriceFeed.abi.json +IPoolTogetherV4PriceFeed.sol: PoolTogetherV4PriceFeed.abi.json +IIdlePriceFeed.sol: IdlePriceFeed.abi.json +IRevertingPriceFeed.sol: RevertingPriceFeed.abi.json +IAuraBalancerV2LpStakingWrapperPriceFeed.sol: AuraBalancerV2LpStakingWrapperPriceFeed.abi.json +IConvexCurveLpStakingWrapperPriceFeed.sol: ConvexCurveLpStakingWrapperPriceFeed.abi.json +IYearnVaultV2PriceFeed.sol: YearnVaultV2PriceFeed.abi.json +IChainlinkPriceFeedMixin.sol: ChainlinkPriceFeedMixin.abi.json + +# Protocol fee +IProtocolFeeTracker.sol: ProtocolFeeTracker.abi.json + +# Gas relayer +IGasRelayPaymasterLib.sol: GasRelayPaymasterLib.abi.json +IGasRelayPaymasterFactory.sol: GasRelayPaymasterFactory.abi.json +IConvexCurveLpStakingWrapperFactory.sol: ConvexCurveLpStakingWrapperFactory.abi.json +IConvexCurveLpStakingWrapperLib.sol: ConvexCurveLpStakingWrapperLib.abi.json +IAuraBalancerV2LpStakingWrapperFactory.sol: AuraBalancerV2LpStakingWrapperFactory.abi.json + +# Peripheral +IDepositWrapper.sol: DepositWrapper.abi.json +IUnpermissionedActionsWrapper.sol: UnpermissionedActionsWrapper.abi.json +IArbitraryTokenPhasedSharesWrapperFactory.sol: ArbitraryTokenPhasedSharesWrapperFactory.abi.json +IArbitraryTokenPhasedSharesWrapperProxy.sol: ArbitraryTokenPhasedSharesWrapperProxy.abi.json +IArbitraryTokenPhasedSharesWrapperLib.sol: ArbitraryTokenPhasedSharesWrapperLib.abi.json + +# Off-chain +IFundValueCalculator.sol: FundValueCalculator.abi.json diff --git a/lib/forge-std b/lib/forge-std index 2c7cbfc6f..73d44ec7d 160000 --- a/lib/forge-std +++ b/lib/forge-std @@ -1 +1 @@ -Subproject commit 2c7cbfc6fbede6d7c9e6b17afe997e3fdfe22fef +Subproject commit 73d44ec7d124e3831bc5f832267889ffb6f9bc3f diff --git a/package.json b/package.json index 73b5ca88e..73b48bd5d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,7 @@ { "name": "monorepo", "private": true, + "packageManager": "pnpm@8.3.1", "scripts": { "build": "pnpm run --recursive -- build", "test": "cross-env TS_NODE_TRANSPILE_ONLY=1 pnpm run compile && cross-env TS_NODE_TRANSPILE_ONLY=1 pnpm run --filter @enzymefinance/protocol -- test", @@ -17,8 +18,8 @@ "size-contracts": "hardhat size-contracts", "prettier": "prettier --check --plugin prettier-plugin-solidity \"**/*.{js,ts,json,md,yml,sol}\"", "solhint": "solhint --max-warnings 0 \"**/*.sol\"", - "format": "pnpm prettier --write && pnpm solhint --fix && pnpm run --recursive format", - "lint": "pnpm prettier --cache && pnpm solhint && pnpm run --recursive lint", + "format": "forge fmt tests && pnpm prettier --write && pnpm solhint --fix && pnpm run --recursive format", + "lint": "forge fmt --check tests && pnpm prettier --cache && pnpm solhint && pnpm run --recursive lint", "typecheck": "pnpm run --recursive typecheck", "release": "pnpm build && changeset publish", "changeset:version": "changeset version && pnpm install --lockfile-only", diff --git a/packages/protocol/package.json b/packages/protocol/package.json index ec412c00f..36e8b940f 100644 --- a/packages/protocol/package.json +++ b/packages/protocol/package.json @@ -58,6 +58,7 @@ "@nomiclabs/hardhat-etherscan": "3.1.0", "@openzeppelin-solc-0.7/contracts": "npm:@openzeppelin/contracts@3.4.2-solc-0.7", "@openzeppelin/contracts": "3.4.1", + "@openzeppelin/contractsV4": "npm:@openzeppelin/contracts@4.8.1", "@types/fs-extra": "^9.0.13", "@types/jest": "^28.1.6", "@types/node": "^18.6.4", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index bbfa017c7..07b1ceb8f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,4 +1,4 @@ -lockfileVersion: 5.4 +lockfileVersion: '6.0' overrides: antlr4: 4.9.0 @@ -6,116 +6,163 @@ overrides: importers: .: - specifiers: - '@changesets/cli': ^2.24.1 - '@tsconfig/node16': ^1.0.3 - cross-env: ^7.0.3 - prettier: ^2.7.1 - prettier-plugin-solidity: 1.0.0-dev.23 - solhint: 3.3.7 - typescript: ^4.7.4 devDependencies: - '@changesets/cli': 2.24.1 - '@tsconfig/node16': 1.0.3 - cross-env: 7.0.3 - prettier: 2.7.1 - prettier-plugin-solidity: 1.0.0-dev.23_prettier@2.7.1 - solhint: 3.3.7 - typescript: 4.7.4 + '@changesets/cli': + specifier: ^2.24.1 + version: 2.24.1 + '@tsconfig/node16': + specifier: ^1.0.3 + version: 1.0.3 + cross-env: + specifier: ^7.0.3 + version: 7.0.3 + prettier: + specifier: ^2.7.1 + version: 2.7.1 + prettier-plugin-solidity: + specifier: 1.0.0-dev.23 + version: 1.0.0-dev.23(prettier@2.7.1) + solhint: + specifier: 3.3.7 + version: 3.3.7 + typescript: + specifier: ^4.7.4 + version: 4.7.4 packages/ethers: - specifiers: - '@ethersproject/abi': ^5.7.0 - '@ethersproject/abstract-signer': ^5.7.0 - eslint: ^8.12.0 - ethers: ^5.7.1 - tsup: ^6.2.1 - typescript: ^4.5.5 dependencies: - '@ethersproject/abi': 5.7.0 - '@ethersproject/abstract-signer': 5.7.0 - ethers: 5.7.1 + '@ethersproject/abi': + specifier: ^5.7.0 + version: 5.7.0 + '@ethersproject/abstract-signer': + specifier: ^5.7.0 + version: 5.7.0 + ethers: + specifier: ^5.7.1 + version: 5.7.1 devDependencies: - eslint: 8.21.0 - tsup: 6.2.1_typescript@4.7.4 - typescript: 4.7.4 + eslint: + specifier: ^8.12.0 + version: 8.21.0 + tsup: + specifier: ^6.2.1 + version: 6.2.1(postcss@8.4.14)(ts-node@10.9.1)(typescript@4.7.4) + typescript: + specifier: ^4.5.5 + version: 4.7.4 packages/protocol: - specifiers: - '@enzymefinance/eslint-config': 1.0.26 - '@enzymefinance/ethers': workspace:4.0.10 - '@ethersproject/abi': ^5.7.0 - '@ethersproject/abstract-signer': ^5.7.0 - '@jest/environment': ^28.1.3 - '@nomiclabs/hardhat-ethers': 2.1.1 - '@nomiclabs/hardhat-etherscan': 3.1.0 - '@openzeppelin-solc-0.7/contracts': npm:@openzeppelin/contracts@3.4.2-solc-0.7 - '@openzeppelin/contracts': 3.4.1 - '@types/fs-extra': ^9.0.13 - '@types/jest': ^28.1.6 - '@types/node': ^18.6.4 - '@uniswap/v3-periphery': github:uniswap/v3-periphery#80f26c86c57b8a5e4b913f42844d4c8bd274d058 - decimal.js: ^10.3.1 - deepmerge: ^4.2.2 - dotenv: ^16.0.1 - eslint: ^8.12.0 - ethers: ^5.7.1 - fs-extra: ^10.1.0 - glob: ^8.0.3 - hardhat: 2.11.2 - hardhat-contract-sizer: ^2.5.1 - hardhat-deploy: ^0.11.15 - jest: ^28.1.3 - jest-diff: ^28.1.3 - jest-environment-node: ^28.1.3 - jest-esbuild: ^0.2.9 - jest-matcher-utils: ^28.1.3 - jest-snapshot: ^28.1.3 - merkletreejs: ^0.2.31 - ts-node: ^10.7.0 - tsconfig-paths: ^4.1.0 - tsup: ^6.2.1 - typescript: ^4.5.5 - dependencies: - '@enzymefinance/ethers': link:../ethers - '@ethersproject/abi': 5.7.0 - '@ethersproject/abstract-signer': 5.7.0 - decimal.js: 10.3.1 - ethers: 5.7.1 + dependencies: + '@enzymefinance/ethers': + specifier: workspace:4.0.10 + version: link:../ethers + '@ethersproject/abi': + specifier: ^5.7.0 + version: 5.7.0 + '@ethersproject/abstract-signer': + specifier: ^5.7.0 + version: 5.7.0 + decimal.js: + specifier: ^10.3.1 + version: 10.3.1 + ethers: + specifier: ^5.7.1 + version: 5.7.1 devDependencies: - '@enzymefinance/eslint-config': 1.0.26_wsv5japwtrclzi5ys3gahjagkm - '@jest/environment': 28.1.3 - '@nomiclabs/hardhat-ethers': 2.1.1_liuail6phkx7un26teqxcf6yx4 - '@nomiclabs/hardhat-etherscan': 3.1.0_hardhat@2.11.2 - '@openzeppelin-solc-0.7/contracts': /@openzeppelin/contracts/3.4.2-solc-0.7 - '@openzeppelin/contracts': 3.4.1 - '@types/fs-extra': 9.0.13 - '@types/jest': 28.1.6 - '@types/node': 18.6.4 - '@uniswap/v3-periphery': github.com/uniswap/v3-periphery/80f26c86c57b8a5e4b913f42844d4c8bd274d058_hardhat@2.11.2 - deepmerge: 4.2.2 - dotenv: 16.0.1 - eslint: 8.21.0 - fs-extra: 10.1.0 - glob: 8.0.3 - hardhat: 2.11.2_6oasmw356qmm23djlsjgkwvrtm - hardhat-contract-sizer: 2.6.1_hardhat@2.11.2 - hardhat-deploy: 0.11.15 - jest: 28.1.3_6caleeh6c3yahw3yaj3duy3aa4 - jest-diff: 28.1.3 - jest-environment-node: 28.1.3 - jest-esbuild: 0.2.9_jest@28.1.3 - jest-matcher-utils: 28.1.3 - jest-snapshot: 28.1.3 - merkletreejs: 0.2.32 - ts-node: 10.9.1_hn66opzbaneygq52jmwjxha6su - tsconfig-paths: 4.1.0 - tsup: 6.2.1_ltanrvuoktvcmn7biuqju6k57a - typescript: 4.7.4 + '@enzymefinance/eslint-config': + specifier: 1.0.26 + version: 1.0.26(eslint@8.21.0)(prettier@2.7.1)(ts-node@10.9.1)(typescript@4.7.4) + '@jest/environment': + specifier: ^28.1.3 + version: 28.1.3 + '@nomiclabs/hardhat-ethers': + specifier: 2.1.1 + version: 2.1.1(ethers@5.7.1)(hardhat@2.11.2) + '@nomiclabs/hardhat-etherscan': + specifier: 3.1.0 + version: 3.1.0(hardhat@2.11.2) + '@openzeppelin-solc-0.7/contracts': + specifier: npm:@openzeppelin/contracts@3.4.2-solc-0.7 + version: /@openzeppelin/contracts@3.4.2-solc-0.7 + '@openzeppelin/contracts': + specifier: 3.4.1 + version: 3.4.1 + '@openzeppelin/contractsV4': + specifier: npm:@openzeppelin/contracts@4.8.1 + version: /@openzeppelin/contracts@4.8.1 + '@types/fs-extra': + specifier: ^9.0.13 + version: 9.0.13 + '@types/jest': + specifier: ^28.1.6 + version: 28.1.6 + '@types/node': + specifier: ^18.6.4 + version: 18.6.4 + '@uniswap/v3-periphery': + specifier: github:uniswap/v3-periphery#80f26c86c57b8a5e4b913f42844d4c8bd274d058 + version: github.com/uniswap/v3-periphery/80f26c86c57b8a5e4b913f42844d4c8bd274d058(hardhat@2.11.2) + deepmerge: + specifier: ^4.2.2 + version: 4.2.2 + dotenv: + specifier: ^16.0.1 + version: 16.0.1 + eslint: + specifier: ^8.12.0 + version: 8.21.0 + fs-extra: + specifier: ^10.1.0 + version: 10.1.0 + glob: + specifier: ^8.0.3 + version: 8.0.3 + hardhat: + specifier: 2.11.2 + version: 2.11.2(ts-node@10.9.1)(typescript@4.7.4) + hardhat-contract-sizer: + specifier: ^2.5.1 + version: 2.6.1(hardhat@2.11.2) + hardhat-deploy: + specifier: ^0.11.15 + version: 0.11.15 + jest: + specifier: ^28.1.3 + version: 28.1.3(@types/node@18.6.4)(ts-node@10.9.1) + jest-diff: + specifier: ^28.1.3 + version: 28.1.3 + jest-environment-node: + specifier: ^28.1.3 + version: 28.1.3 + jest-esbuild: + specifier: ^0.2.9 + version: 0.2.9(jest@28.1.3) + jest-matcher-utils: + specifier: ^28.1.3 + version: 28.1.3 + jest-snapshot: + specifier: ^28.1.3 + version: 28.1.3 + merkletreejs: + specifier: ^0.2.31 + version: 0.2.32 + ts-node: + specifier: ^10.7.0 + version: 10.9.1(@types/node@18.6.4)(typescript@4.7.4) + tsconfig-paths: + specifier: ^4.1.0 + version: 4.1.0 + tsup: + specifier: ^6.2.1 + version: 6.2.1(postcss@8.4.14)(ts-node@10.9.1)(typescript@4.7.4) + typescript: + specifier: ^4.5.5 + version: 4.7.4 packages: - /@ampproject/remapping/2.2.0: + /@ampproject/remapping@2.2.0: resolution: {integrity: sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==} engines: {node: '>=6.0.0'} dependencies: @@ -123,26 +170,26 @@ packages: '@jridgewell/trace-mapping': 0.3.14 dev: true - /@babel/code-frame/7.18.6: + /@babel/code-frame@7.18.6: resolution: {integrity: sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==} engines: {node: '>=6.9.0'} dependencies: '@babel/highlight': 7.18.6 dev: true - /@babel/compat-data/7.18.8: + /@babel/compat-data@7.18.8: resolution: {integrity: sha512-HSmX4WZPPK3FUxYp7g2T6EyO8j96HlZJlxmKPSh6KAcqwyDrfx7hKjXpAW/0FhFfTJsR0Yt4lAjLI2coMptIHQ==} engines: {node: '>=6.9.0'} dev: true - /@babel/core/7.18.10: + /@babel/core@7.18.10: resolution: {integrity: sha512-JQM6k6ENcBFKVtWvLavlvi/mPcpYZ3+R+2EySDEMSMbp7Mn4FexlbbJVrx2R7Ijhr01T8gyqrOaABWIOgxeUyw==} engines: {node: '>=6.9.0'} dependencies: '@ampproject/remapping': 2.2.0 '@babel/code-frame': 7.18.6 '@babel/generator': 7.18.10 - '@babel/helper-compilation-targets': 7.18.9_@babel+core@7.18.10 + '@babel/helper-compilation-targets': 7.18.9(@babel/core@7.18.10) '@babel/helper-module-transforms': 7.18.9 '@babel/helpers': 7.18.9 '@babel/parser': 7.18.11 @@ -150,7 +197,7 @@ packages: '@babel/traverse': 7.18.11 '@babel/types': 7.18.10 convert-source-map: 1.8.0 - debug: 4.3.4 + debug: 4.3.4(supports-color@8.1.1) gensync: 1.0.0-beta.2 json5: 2.2.1 semver: 6.3.0 @@ -158,7 +205,7 @@ packages: - supports-color dev: true - /@babel/generator/7.18.10: + /@babel/generator@7.18.10: resolution: {integrity: sha512-0+sW7e3HjQbiHbj1NeU/vN8ornohYlacAfZIaXhdoGweQqgcNy69COVciYYqEXJ/v+9OBA7Frxm4CVAuNqKeNA==} engines: {node: '>=6.9.0'} dependencies: @@ -167,7 +214,7 @@ packages: jsesc: 2.5.2 dev: true - /@babel/helper-compilation-targets/7.18.9_@babel+core@7.18.10: + /@babel/helper-compilation-targets@7.18.9(@babel/core@7.18.10): resolution: {integrity: sha512-tzLCyVmqUiFlcFoAPLA/gL9TeYrF61VLNtb+hvkuVaB5SUjW7jcfrglBIX1vUIoT7CLP3bBlIMeyEsIl2eFQNg==} engines: {node: '>=6.9.0'} peerDependencies: @@ -180,12 +227,12 @@ packages: semver: 6.3.0 dev: true - /@babel/helper-environment-visitor/7.18.9: + /@babel/helper-environment-visitor@7.18.9: resolution: {integrity: sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==} engines: {node: '>=6.9.0'} dev: true - /@babel/helper-function-name/7.18.9: + /@babel/helper-function-name@7.18.9: resolution: {integrity: sha512-fJgWlZt7nxGksJS9a0XdSaI4XvpExnNIgRP+rVefWh5U7BL8pPuir6SJUmFKRfjWQ51OtWSzwOxhaH/EBWWc0A==} engines: {node: '>=6.9.0'} dependencies: @@ -193,21 +240,21 @@ packages: '@babel/types': 7.18.10 dev: true - /@babel/helper-hoist-variables/7.18.6: + /@babel/helper-hoist-variables@7.18.6: resolution: {integrity: sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.18.10 dev: true - /@babel/helper-module-imports/7.18.6: + /@babel/helper-module-imports@7.18.6: resolution: {integrity: sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.18.10 dev: true - /@babel/helper-module-transforms/7.18.9: + /@babel/helper-module-transforms@7.18.9: resolution: {integrity: sha512-KYNqY0ICwfv19b31XzvmI/mfcylOzbLtowkw+mfvGPAQ3kfCnMLYbED3YecL5tPd8nAYFQFAd6JHp2LxZk/J1g==} engines: {node: '>=6.9.0'} dependencies: @@ -223,41 +270,41 @@ packages: - supports-color dev: true - /@babel/helper-plugin-utils/7.18.9: + /@babel/helper-plugin-utils@7.18.9: resolution: {integrity: sha512-aBXPT3bmtLryXaoJLyYPXPlSD4p1ld9aYeR+sJNOZjJJGiOpb+fKfh3NkcCu7J54nUJwCERPBExCCpyCOHnu/w==} engines: {node: '>=6.9.0'} dev: true - /@babel/helper-simple-access/7.18.6: + /@babel/helper-simple-access@7.18.6: resolution: {integrity: sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.18.10 dev: true - /@babel/helper-split-export-declaration/7.18.6: + /@babel/helper-split-export-declaration@7.18.6: resolution: {integrity: sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.18.10 dev: true - /@babel/helper-string-parser/7.18.10: + /@babel/helper-string-parser@7.18.10: resolution: {integrity: sha512-XtIfWmeNY3i4t7t4D2t02q50HvqHybPqW2ki1kosnvWCwuCMeo81Jf0gwr85jy/neUdg5XDdeFE/80DXiO+njw==} engines: {node: '>=6.9.0'} dev: true - /@babel/helper-validator-identifier/7.18.6: + /@babel/helper-validator-identifier@7.18.6: resolution: {integrity: sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==} engines: {node: '>=6.9.0'} dev: true - /@babel/helper-validator-option/7.18.6: + /@babel/helper-validator-option@7.18.6: resolution: {integrity: sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==} engines: {node: '>=6.9.0'} dev: true - /@babel/helpers/7.18.9: + /@babel/helpers@7.18.9: resolution: {integrity: sha512-Jf5a+rbrLoR4eNdUmnFu8cN5eNJT6qdTdOg5IHIzq87WwyRw9PwguLFOWYgktN/60IP4fgDUawJvs7PjQIzELQ==} engines: {node: '>=6.9.0'} dependencies: @@ -268,7 +315,7 @@ packages: - supports-color dev: true - /@babel/highlight/7.18.6: + /@babel/highlight@7.18.6: resolution: {integrity: sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==} engines: {node: '>=6.9.0'} dependencies: @@ -277,7 +324,7 @@ packages: js-tokens: 4.0.0 dev: true - /@babel/parser/7.18.11: + /@babel/parser@7.18.11: resolution: {integrity: sha512-9JKn5vN+hDt0Hdqn1PiJ2guflwP+B6Ga8qbDuoF0PzzVhrzsKIJo8yGqVk6CmMHiMei9w1C1Bp9IMJSIK+HPIQ==} engines: {node: '>=6.0.0'} hasBin: true @@ -285,7 +332,7 @@ packages: '@babel/types': 7.18.10 dev: true - /@babel/plugin-syntax-async-generators/7.8.4_@babel+core@7.18.10: + /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.18.10): resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} peerDependencies: '@babel/core': ^7.0.0-0 @@ -294,7 +341,7 @@ packages: '@babel/helper-plugin-utils': 7.18.9 dev: true - /@babel/plugin-syntax-bigint/7.8.3_@babel+core@7.18.10: + /@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.18.10): resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} peerDependencies: '@babel/core': ^7.0.0-0 @@ -303,7 +350,7 @@ packages: '@babel/helper-plugin-utils': 7.18.9 dev: true - /@babel/plugin-syntax-class-properties/7.12.13_@babel+core@7.18.10: + /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.18.10): resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} peerDependencies: '@babel/core': ^7.0.0-0 @@ -312,7 +359,7 @@ packages: '@babel/helper-plugin-utils': 7.18.9 dev: true - /@babel/plugin-syntax-import-meta/7.10.4_@babel+core@7.18.10: + /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.18.10): resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} peerDependencies: '@babel/core': ^7.0.0-0 @@ -321,7 +368,7 @@ packages: '@babel/helper-plugin-utils': 7.18.9 dev: true - /@babel/plugin-syntax-json-strings/7.8.3_@babel+core@7.18.10: + /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.18.10): resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} peerDependencies: '@babel/core': ^7.0.0-0 @@ -330,7 +377,7 @@ packages: '@babel/helper-plugin-utils': 7.18.9 dev: true - /@babel/plugin-syntax-logical-assignment-operators/7.10.4_@babel+core@7.18.10: + /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.18.10): resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} peerDependencies: '@babel/core': ^7.0.0-0 @@ -339,7 +386,7 @@ packages: '@babel/helper-plugin-utils': 7.18.9 dev: true - /@babel/plugin-syntax-nullish-coalescing-operator/7.8.3_@babel+core@7.18.10: + /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.18.10): resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} peerDependencies: '@babel/core': ^7.0.0-0 @@ -348,7 +395,7 @@ packages: '@babel/helper-plugin-utils': 7.18.9 dev: true - /@babel/plugin-syntax-numeric-separator/7.10.4_@babel+core@7.18.10: + /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.18.10): resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} peerDependencies: '@babel/core': ^7.0.0-0 @@ -357,7 +404,7 @@ packages: '@babel/helper-plugin-utils': 7.18.9 dev: true - /@babel/plugin-syntax-object-rest-spread/7.8.3_@babel+core@7.18.10: + /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.18.10): resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} peerDependencies: '@babel/core': ^7.0.0-0 @@ -366,7 +413,7 @@ packages: '@babel/helper-plugin-utils': 7.18.9 dev: true - /@babel/plugin-syntax-optional-catch-binding/7.8.3_@babel+core@7.18.10: + /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.18.10): resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} peerDependencies: '@babel/core': ^7.0.0-0 @@ -375,7 +422,7 @@ packages: '@babel/helper-plugin-utils': 7.18.9 dev: true - /@babel/plugin-syntax-optional-chaining/7.8.3_@babel+core@7.18.10: + /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.18.10): resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} peerDependencies: '@babel/core': ^7.0.0-0 @@ -384,7 +431,7 @@ packages: '@babel/helper-plugin-utils': 7.18.9 dev: true - /@babel/plugin-syntax-top-level-await/7.14.5_@babel+core@7.18.10: + /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.18.10): resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} engines: {node: '>=6.9.0'} peerDependencies: @@ -394,7 +441,7 @@ packages: '@babel/helper-plugin-utils': 7.18.9 dev: true - /@babel/plugin-syntax-typescript/7.18.6_@babel+core@7.18.10: + /@babel/plugin-syntax-typescript@7.18.6(@babel/core@7.18.10): resolution: {integrity: sha512-mAWAuq4rvOepWCBid55JuRNvpTNf2UGVgoz4JV0fXEKolsVZDzsa4NqCef758WZJj/GDu0gVGItjKFiClTAmZA==} engines: {node: '>=6.9.0'} peerDependencies: @@ -404,7 +451,7 @@ packages: '@babel/helper-plugin-utils': 7.18.9 dev: true - /@babel/runtime-corejs3/7.18.9: + /@babel/runtime-corejs3@7.18.9: resolution: {integrity: sha512-qZEWeccZCrHA2Au4/X05QW5CMdm4VjUDCrGq5gf1ZDcM4hRqreKrtwAn7yci9zfgAS9apvnsFXiGBHBAxZdK9A==} engines: {node: '>=6.9.0'} dependencies: @@ -412,14 +459,14 @@ packages: regenerator-runtime: 0.13.9 dev: true - /@babel/runtime/7.18.9: + /@babel/runtime@7.18.9: resolution: {integrity: sha512-lkqXDcvlFT5rvEjiu6+QYO+1GXrEHRo2LOtS7E4GtX5ESIZOgepqsZBVIj6Pv+a6zqsya9VCgiK1KAK4BvJDAw==} engines: {node: '>=6.9.0'} dependencies: regenerator-runtime: 0.13.9 dev: true - /@babel/template/7.18.10: + /@babel/template@7.18.10: resolution: {integrity: sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==} engines: {node: '>=6.9.0'} dependencies: @@ -428,7 +475,7 @@ packages: '@babel/types': 7.18.10 dev: true - /@babel/traverse/7.18.11: + /@babel/traverse@7.18.11: resolution: {integrity: sha512-TG9PiM2R/cWCAy6BPJKeHzNbu4lPzOSZpeMfeNErskGpTJx6trEvFaVCbDvpcxwy49BKWmEPwiW8mrysNiDvIQ==} engines: {node: '>=6.9.0'} dependencies: @@ -440,13 +487,13 @@ packages: '@babel/helper-split-export-declaration': 7.18.6 '@babel/parser': 7.18.11 '@babel/types': 7.18.10 - debug: 4.3.4 + debug: 4.3.4(supports-color@8.1.1) globals: 11.12.0 transitivePeerDependencies: - supports-color dev: true - /@babel/types/7.18.10: + /@babel/types@7.18.10: resolution: {integrity: sha512-MJvnbEiiNkpjo+LknnmRrqbY1GPUUggjv+wQVjetM/AONoupqRALB7I6jGqNUAZsKcRIEu2J6FRFvsczljjsaQ==} engines: {node: '>=6.9.0'} dependencies: @@ -455,11 +502,11 @@ packages: to-fast-properties: 2.0.0 dev: true - /@bcoe/v8-coverage/0.2.3: + /@bcoe/v8-coverage@0.2.3: resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} dev: true - /@changesets/apply-release-plan/6.0.3: + /@changesets/apply-release-plan@6.0.3: resolution: {integrity: sha512-/3JKqtDefs2YSEQI6JQo43/MKTLfhPdrW/BFmqnRpW8UmPB+YXjjQgfjR/2KOaObLOkoixcL3WCK4wNkn/Krmw==} dependencies: '@babel/runtime': 7.18.9 @@ -477,7 +524,7 @@ packages: semver: 5.7.1 dev: true - /@changesets/assemble-release-plan/5.2.0: + /@changesets/assemble-release-plan@5.2.0: resolution: {integrity: sha512-ewY24PEbSec2eKX0+KM7eyENA2hUUp6s4LF9p/iBxTtc+TX2Xbx5rZnlLKZkc8tpuQ3PZbyjLFXWhd1PP6SjCg==} dependencies: '@babel/runtime': 7.18.9 @@ -488,13 +535,13 @@ packages: semver: 5.7.1 dev: true - /@changesets/changelog-git/0.1.12: + /@changesets/changelog-git@0.1.12: resolution: {integrity: sha512-Xv2CPjTBmwjl8l4ZyQ3xrsXZMq8WafPUpEonDpTmcb24XY8keVzt7ZSCJuDz035EiqrjmDKDhODoQ6XiHudlig==} dependencies: '@changesets/types': 5.1.0 dev: true - /@changesets/cli/2.24.1: + /@changesets/cli@2.24.1: resolution: {integrity: sha512-7Lz1inqGQjBrXgnXlENtzQ7EmO/9c+09d9oi8XoK4ARqlJe8GpafjqKRobcjcA/TTI7Fn2+cke4CrXFZfVF8Rw==} hasBin: true dependencies: @@ -533,7 +580,7 @@ packages: tty-table: 4.1.6 dev: true - /@changesets/config/2.1.0: + /@changesets/config@2.1.0: resolution: {integrity: sha512-43potf+DwYHmH7EY19vxtCq6fqj7UUIrZ4DTwM3pVBqCKxFIytm7GPy7wNAsH06UvMw7NRuOu4QK5HN02GsIrw==} dependencies: '@changesets/errors': 0.1.4 @@ -545,13 +592,13 @@ packages: micromatch: 4.0.5 dev: true - /@changesets/errors/0.1.4: + /@changesets/errors@0.1.4: resolution: {integrity: sha512-HAcqPF7snsUJ/QzkWoKfRfXushHTu+K5KZLJWPb34s4eCZShIf8BFO3fwq6KU8+G7L5KdtN2BzQAXOSXEyiY9Q==} dependencies: extendable-error: 0.1.7 dev: true - /@changesets/get-dependents-graph/1.3.3: + /@changesets/get-dependents-graph@1.3.3: resolution: {integrity: sha512-h4fHEIt6X+zbxdcznt1e8QD7xgsXRAXd2qzLlyxoRDFSa6SxJrDAUyh7ZUNdhjBU4Byvp4+6acVWVgzmTy4UNQ==} dependencies: '@changesets/types': 5.1.0 @@ -561,7 +608,7 @@ packages: semver: 5.7.1 dev: true - /@changesets/get-release-plan/3.0.12: + /@changesets/get-release-plan@3.0.12: resolution: {integrity: sha512-TlpEdpxV5ZQmNeHoD6KNKAc01wjRrcu9/CQqzmO4qAlX7ARA4pIuAxd8QZ1AQXv/l4qhHox7SUYH3VLHfarv5w==} dependencies: '@babel/runtime': 7.18.9 @@ -573,11 +620,11 @@ packages: '@manypkg/get-packages': 1.1.3 dev: true - /@changesets/get-version-range-type/0.3.2: + /@changesets/get-version-range-type@0.3.2: resolution: {integrity: sha512-SVqwYs5pULYjYT4op21F2pVbcrca4qA/bAA3FmFXKMN7Y+HcO8sbZUTx3TAy2VXulP2FACd1aC7f2nTuqSPbqg==} dev: true - /@changesets/git/1.4.1: + /@changesets/git@1.4.1: resolution: {integrity: sha512-GWwRXEqBsQ3nEYcyvY/u2xUK86EKAevSoKV/IhELoZ13caZ1A1TSak/71vyKILtzuLnFPk5mepP5HjBxr7lZ9Q==} dependencies: '@babel/runtime': 7.18.9 @@ -588,20 +635,20 @@ packages: spawndamnit: 2.0.0 dev: true - /@changesets/logger/0.0.5: + /@changesets/logger@0.0.5: resolution: {integrity: sha512-gJyZHomu8nASHpaANzc6bkQMO9gU/ib20lqew1rVx753FOxffnCrJlGIeQVxNWCqM+o6OOleCo/ivL8UAO5iFw==} dependencies: chalk: 2.4.2 dev: true - /@changesets/parse/0.3.14: + /@changesets/parse@0.3.14: resolution: {integrity: sha512-SWnNVyC9vz61ueTbuxvA6b4HXcSx2iaWr2VEa37lPg1Vw+cEyQp7lOB219P7uow1xFfdtIEEsxbzXnqLAAaY8w==} dependencies: '@changesets/types': 5.1.0 js-yaml: 3.14.1 dev: true - /@changesets/pre/1.0.12: + /@changesets/pre@1.0.12: resolution: {integrity: sha512-RFzWYBZx56MtgMesXjxx7ymyI829/rcIw/41hvz3VJPnY8mDscN7RJyYu7Xm7vts2Fcd+SRcO0T/Ws3I1/6J7g==} dependencies: '@babel/runtime': 7.18.9 @@ -611,7 +658,7 @@ packages: fs-extra: 7.0.1 dev: true - /@changesets/read/0.5.7: + /@changesets/read@0.5.7: resolution: {integrity: sha512-Iteg0ccTPpkJ+qFzY97k7qqdVE5Kz30TqPo9GibpBk2g8tcLFUqf+Qd0iXPLcyhUZpPL1U6Hia1gINHNKIKx4g==} dependencies: '@babel/runtime': 7.18.9 @@ -624,15 +671,15 @@ packages: p-filter: 2.1.0 dev: true - /@changesets/types/4.1.0: + /@changesets/types@4.1.0: resolution: {integrity: sha512-LDQvVDv5Kb50ny2s25Fhm3d9QSZimsoUGBsUioj6MC3qbMUCuC8GPIvk/M6IvXx3lYhAs0lwWUQLb+VIEUCECw==} dev: true - /@changesets/types/5.1.0: + /@changesets/types@5.1.0: resolution: {integrity: sha512-uUByGATZCdaPkaO9JkBsgGDjEvHyY2Sb0e/J23+cwxBi5h0fxpLF/HObggO/Fw8T2nxK6zDfJbPsdQt5RwYFJA==} dev: true - /@changesets/write/0.1.9: + /@changesets/write@0.1.9: resolution: {integrity: sha512-E90ZrsrfJVOOQaP3Mm5Xd7uDwBAqq3z5paVEavTHKA8wxi7NAL8CmjgbGxSFuiP7ubnJA2BuHlrdE4z86voGOg==} dependencies: '@babel/runtime': 7.18.9 @@ -642,38 +689,38 @@ packages: prettier: 1.19.1 dev: true - /@colors/colors/1.5.0: + /@colors/colors@1.5.0: resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==} engines: {node: '>=0.1.90'} requiresBuild: true dev: true optional: true - /@cspotcode/source-map-support/0.8.1: + /@cspotcode/source-map-support@0.8.1: resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} engines: {node: '>=12'} dependencies: '@jridgewell/trace-mapping': 0.3.9 dev: true - /@enzymefinance/eslint-config/1.0.26_wsv5japwtrclzi5ys3gahjagkm: + /@enzymefinance/eslint-config@1.0.26(eslint@8.21.0)(prettier@2.7.1)(ts-node@10.9.1)(typescript@4.7.4): resolution: {integrity: sha512-OCkun3+5VtzeWvG7gKGFJo8B0sbVi6oGCIh8bbIVzso9BhWynGrWJLIExRs4b7yB5P529OFbxXtMuihN2MFmag==} peerDependencies: eslint: ^8.9.0 prettier: ^2.5.1 dependencies: '@rushstack/eslint-patch': 1.1.4 - '@typescript-eslint/eslint-plugin': 5.32.0_iosr3hrei2tubxveewluhu5lhy - '@typescript-eslint/parser': 5.32.0_qugx7qdu5zevzvxaiqyxfiwquq + '@typescript-eslint/eslint-plugin': 5.32.0(@typescript-eslint/parser@5.32.0)(eslint@8.21.0)(typescript@4.7.4) + '@typescript-eslint/parser': 5.32.0(eslint@8.21.0)(typescript@4.7.4) eslint: 8.21.0 - eslint-config-prettier: 8.5.0_eslint@8.21.0 - eslint-plugin-jsx-a11y: 6.6.1_eslint@8.21.0 - eslint-plugin-react: 7.30.1_eslint@8.21.0 - eslint-plugin-react-hooks: 4.6.0_eslint@8.21.0 + eslint-config-prettier: 8.5.0(eslint@8.21.0) + eslint-plugin-jsx-a11y: 6.6.1(eslint@8.21.0) + eslint-plugin-react: 7.30.1(eslint@8.21.0) + eslint-plugin-react-hooks: 4.6.0(eslint@8.21.0) eslint-plugin-security: 1.5.0 - eslint-plugin-simple-import-sort: 7.0.0_eslint@8.21.0 - eslint-plugin-tailwindcss: 3.6.0_ts-node@10.9.1 - eslint-plugin-unused-imports: 2.0.0_i7ihj7mda6acsfp32zwgvvndem + eslint-plugin-simple-import-sort: 7.0.0(eslint@8.21.0) + eslint-plugin-tailwindcss: 3.6.0(ts-node@10.9.1) + eslint-plugin-unused-imports: 2.0.0(@typescript-eslint/eslint-plugin@5.32.0)(eslint@8.21.0) prettier: 2.7.1 transitivePeerDependencies: - supports-color @@ -681,7 +728,7 @@ packages: - typescript dev: true - /@esbuild/linux-loong64/0.14.53: + /@esbuild/linux-loong64@0.14.53: resolution: {integrity: sha512-W2dAL6Bnyn4xa/QRSU3ilIK4EzD5wgYXKXJiS1HDF5vU3675qc2bvFyLwbUcdmssDveyndy7FbitrCoiV/eMLg==} engines: {node: '>=12'} cpu: [loong64] @@ -690,12 +737,12 @@ packages: dev: true optional: true - /@eslint/eslintrc/1.3.0: + /@eslint/eslintrc@1.3.0: resolution: {integrity: sha512-UWW0TMTmk2d7hLcWD1/e2g5HDM/HQ3csaLSqXCfqwh4uNDuNqlaKWXmEsL4Cs41Z0KnILNvwbHAah3C2yt06kw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: ajv: 6.12.6 - debug: 4.3.4 + debug: 4.3.4(supports-color@8.1.1) espree: 9.3.3 globals: 13.17.0 ignore: 5.2.0 @@ -707,7 +754,7 @@ packages: - supports-color dev: true - /@ethersproject/abi/5.7.0: + /@ethersproject/abi@5.7.0: resolution: {integrity: sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA==} dependencies: '@ethersproject/address': 5.7.0 @@ -720,7 +767,7 @@ packages: '@ethersproject/properties': 5.7.0 '@ethersproject/strings': 5.7.0 - /@ethersproject/abstract-provider/5.7.0: + /@ethersproject/abstract-provider@5.7.0: resolution: {integrity: sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw==} dependencies: '@ethersproject/bignumber': 5.7.0 @@ -731,7 +778,7 @@ packages: '@ethersproject/transactions': 5.7.0 '@ethersproject/web': 5.7.1 - /@ethersproject/abstract-signer/5.7.0: + /@ethersproject/abstract-signer@5.7.0: resolution: {integrity: sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ==} dependencies: '@ethersproject/abstract-provider': 5.7.0 @@ -740,7 +787,7 @@ packages: '@ethersproject/logger': 5.7.0 '@ethersproject/properties': 5.7.0 - /@ethersproject/address/5.7.0: + /@ethersproject/address@5.7.0: resolution: {integrity: sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==} dependencies: '@ethersproject/bignumber': 5.7.0 @@ -749,35 +796,35 @@ packages: '@ethersproject/logger': 5.7.0 '@ethersproject/rlp': 5.7.0 - /@ethersproject/base64/5.7.0: + /@ethersproject/base64@5.7.0: resolution: {integrity: sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ==} dependencies: '@ethersproject/bytes': 5.7.0 - /@ethersproject/basex/5.7.0: + /@ethersproject/basex@5.7.0: resolution: {integrity: sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw==} dependencies: '@ethersproject/bytes': 5.7.0 '@ethersproject/properties': 5.7.0 - /@ethersproject/bignumber/5.7.0: + /@ethersproject/bignumber@5.7.0: resolution: {integrity: sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw==} dependencies: '@ethersproject/bytes': 5.7.0 '@ethersproject/logger': 5.7.0 bn.js: 5.2.1 - /@ethersproject/bytes/5.7.0: + /@ethersproject/bytes@5.7.0: resolution: {integrity: sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A==} dependencies: '@ethersproject/logger': 5.7.0 - /@ethersproject/constants/5.7.0: + /@ethersproject/constants@5.7.0: resolution: {integrity: sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA==} dependencies: '@ethersproject/bignumber': 5.7.0 - /@ethersproject/contracts/5.7.0: + /@ethersproject/contracts@5.7.0: resolution: {integrity: sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg==} dependencies: '@ethersproject/abi': 5.7.0 @@ -791,7 +838,7 @@ packages: '@ethersproject/properties': 5.7.0 '@ethersproject/transactions': 5.7.0 - /@ethersproject/hash/5.7.0: + /@ethersproject/hash@5.7.0: resolution: {integrity: sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g==} dependencies: '@ethersproject/abstract-signer': 5.7.0 @@ -804,7 +851,7 @@ packages: '@ethersproject/properties': 5.7.0 '@ethersproject/strings': 5.7.0 - /@ethersproject/hdnode/5.7.0: + /@ethersproject/hdnode@5.7.0: resolution: {integrity: sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg==} dependencies: '@ethersproject/abstract-signer': 5.7.0 @@ -820,7 +867,7 @@ packages: '@ethersproject/transactions': 5.7.0 '@ethersproject/wordlists': 5.7.0 - /@ethersproject/json-wallets/5.7.0: + /@ethersproject/json-wallets@5.7.0: resolution: {integrity: sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g==} dependencies: '@ethersproject/abstract-signer': 5.7.0 @@ -837,32 +884,32 @@ packages: aes-js: 3.0.0 scrypt-js: 3.0.1 - /@ethersproject/keccak256/5.7.0: + /@ethersproject/keccak256@5.7.0: resolution: {integrity: sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg==} dependencies: '@ethersproject/bytes': 5.7.0 js-sha3: 0.8.0 - /@ethersproject/logger/5.7.0: + /@ethersproject/logger@5.7.0: resolution: {integrity: sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig==} - /@ethersproject/networks/5.7.1: + /@ethersproject/networks@5.7.1: resolution: {integrity: sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ==} dependencies: '@ethersproject/logger': 5.7.0 - /@ethersproject/pbkdf2/5.7.0: + /@ethersproject/pbkdf2@5.7.0: resolution: {integrity: sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw==} dependencies: '@ethersproject/bytes': 5.7.0 '@ethersproject/sha2': 5.7.0 - /@ethersproject/properties/5.7.0: + /@ethersproject/properties@5.7.0: resolution: {integrity: sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw==} dependencies: '@ethersproject/logger': 5.7.0 - /@ethersproject/providers/5.7.1: + /@ethersproject/providers@5.7.1: resolution: {integrity: sha512-vZveG/DLyo+wk4Ga1yx6jSEHrLPgmTt+dFv0dv8URpVCRf0jVhalps1jq/emN/oXnMRsC7cQgAF32DcXLL7BPQ==} dependencies: '@ethersproject/abstract-provider': 5.7.0 @@ -889,26 +936,26 @@ packages: - bufferutil - utf-8-validate - /@ethersproject/random/5.7.0: + /@ethersproject/random@5.7.0: resolution: {integrity: sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ==} dependencies: '@ethersproject/bytes': 5.7.0 '@ethersproject/logger': 5.7.0 - /@ethersproject/rlp/5.7.0: + /@ethersproject/rlp@5.7.0: resolution: {integrity: sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w==} dependencies: '@ethersproject/bytes': 5.7.0 '@ethersproject/logger': 5.7.0 - /@ethersproject/sha2/5.7.0: + /@ethersproject/sha2@5.7.0: resolution: {integrity: sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw==} dependencies: '@ethersproject/bytes': 5.7.0 '@ethersproject/logger': 5.7.0 hash.js: 1.1.7 - /@ethersproject/signing-key/5.7.0: + /@ethersproject/signing-key@5.7.0: resolution: {integrity: sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q==} dependencies: '@ethersproject/bytes': 5.7.0 @@ -918,7 +965,7 @@ packages: elliptic: 6.5.4 hash.js: 1.1.7 - /@ethersproject/solidity/5.7.0: + /@ethersproject/solidity@5.7.0: resolution: {integrity: sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA==} dependencies: '@ethersproject/bignumber': 5.7.0 @@ -928,14 +975,14 @@ packages: '@ethersproject/sha2': 5.7.0 '@ethersproject/strings': 5.7.0 - /@ethersproject/strings/5.7.0: + /@ethersproject/strings@5.7.0: resolution: {integrity: sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg==} dependencies: '@ethersproject/bytes': 5.7.0 '@ethersproject/constants': 5.7.0 '@ethersproject/logger': 5.7.0 - /@ethersproject/transactions/5.7.0: + /@ethersproject/transactions@5.7.0: resolution: {integrity: sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ==} dependencies: '@ethersproject/address': 5.7.0 @@ -948,14 +995,14 @@ packages: '@ethersproject/rlp': 5.7.0 '@ethersproject/signing-key': 5.7.0 - /@ethersproject/units/5.7.0: + /@ethersproject/units@5.7.0: resolution: {integrity: sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg==} dependencies: '@ethersproject/bignumber': 5.7.0 '@ethersproject/constants': 5.7.0 '@ethersproject/logger': 5.7.0 - /@ethersproject/wallet/5.7.0: + /@ethersproject/wallet@5.7.0: resolution: {integrity: sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA==} dependencies: '@ethersproject/abstract-provider': 5.7.0 @@ -974,7 +1021,7 @@ packages: '@ethersproject/transactions': 5.7.0 '@ethersproject/wordlists': 5.7.0 - /@ethersproject/web/5.7.1: + /@ethersproject/web@5.7.1: resolution: {integrity: sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w==} dependencies: '@ethersproject/base64': 5.7.0 @@ -983,7 +1030,7 @@ packages: '@ethersproject/properties': 5.7.0 '@ethersproject/strings': 5.7.0 - /@ethersproject/wordlists/5.7.0: + /@ethersproject/wordlists@5.7.0: resolution: {integrity: sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA==} dependencies: '@ethersproject/bytes': 5.7.0 @@ -992,26 +1039,26 @@ packages: '@ethersproject/properties': 5.7.0 '@ethersproject/strings': 5.7.0 - /@humanwhocodes/config-array/0.10.4: + /@humanwhocodes/config-array@0.10.4: resolution: {integrity: sha512-mXAIHxZT3Vcpg83opl1wGlVZ9xydbfZO3r5YfRSH6Gpp2J/PfdBP0wbDa2sO6/qRbcalpoevVyW6A/fI6LfeMw==} engines: {node: '>=10.10.0'} dependencies: '@humanwhocodes/object-schema': 1.2.1 - debug: 4.3.4 + debug: 4.3.4(supports-color@8.1.1) minimatch: 3.1.2 transitivePeerDependencies: - supports-color dev: true - /@humanwhocodes/gitignore-to-minimatch/1.0.2: + /@humanwhocodes/gitignore-to-minimatch@1.0.2: resolution: {integrity: sha512-rSqmMJDdLFUsyxR6FMtD00nfQKKLFb1kv+qBbOVKqErvloEIJLo5bDTJTQNTYgeyp78JsA7u/NPi5jT1GR/MuA==} dev: true - /@humanwhocodes/object-schema/1.2.1: + /@humanwhocodes/object-schema@1.2.1: resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} dev: true - /@istanbuljs/load-nyc-config/1.1.0: + /@istanbuljs/load-nyc-config@1.1.0: resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} engines: {node: '>=8'} dependencies: @@ -1022,12 +1069,12 @@ packages: resolve-from: 5.0.0 dev: true - /@istanbuljs/schema/0.1.3: + /@istanbuljs/schema@0.1.3: resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} engines: {node: '>=8'} dev: true - /@jest/console/28.1.3: + /@jest/console@28.1.3: resolution: {integrity: sha512-QPAkP5EwKdK/bxIr6C1I4Vs0rm2nHiANzj/Z5X2JQkrZo6IqvC4ldZ9K95tF0HdidhA8Bo6egxSzUFPYKcEXLw==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} dependencies: @@ -1039,7 +1086,7 @@ packages: slash: 3.0.0 dev: true - /@jest/core/28.1.3_ts-node@10.9.1: + /@jest/core@28.1.3(ts-node@10.9.1): resolution: {integrity: sha512-CIKBrlaKOzA7YG19BEqCw3SLIsEwjZkeJzf5bdooVnW4bH5cktqe3JX+G2YV1aK5vP8N9na1IGWFzYaTp6k6NA==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} peerDependencies: @@ -1060,7 +1107,7 @@ packages: exit: 0.1.2 graceful-fs: 4.2.10 jest-changed-files: 28.1.3 - jest-config: 28.1.3_6caleeh6c3yahw3yaj3duy3aa4 + jest-config: 28.1.3(@types/node@18.6.4)(ts-node@10.9.1) jest-haste-map: 28.1.3 jest-message-util: 28.1.3 jest-regex-util: 28.0.2 @@ -1082,7 +1129,7 @@ packages: - ts-node dev: true - /@jest/environment/28.1.3: + /@jest/environment@28.1.3: resolution: {integrity: sha512-1bf40cMFTEkKyEf585R9Iz1WayDjHoHqvts0XFYEqyKM3cFWDpeMoqKKTAF9LSYQModPUlh8FKptoM2YcMWAXA==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} dependencies: @@ -1092,14 +1139,14 @@ packages: jest-mock: 28.1.3 dev: true - /@jest/expect-utils/28.1.3: + /@jest/expect-utils@28.1.3: resolution: {integrity: sha512-wvbi9LUrHJLn3NlDW6wF2hvIMtd4JUl2QNVrjq+IBSHirgfrR3o9RnVtxzdEGO2n9JyIWwHnLfby5KzqBGg2YA==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} dependencies: jest-get-type: 28.0.2 dev: true - /@jest/expect/28.1.3: + /@jest/expect@28.1.3: resolution: {integrity: sha512-lzc8CpUbSoE4dqT0U+g1qODQjBRHPpCPXissXD4mS9+sWQdmmpeJ9zSH1rS1HEkrsMN0fb7nKrJ9giAR1d3wBw==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} dependencies: @@ -1109,7 +1156,7 @@ packages: - supports-color dev: true - /@jest/fake-timers/28.1.3: + /@jest/fake-timers@28.1.3: resolution: {integrity: sha512-D/wOkL2POHv52h+ok5Oj/1gOG9HSywdoPtFsRCUmlCILXNn5eIWmcnd3DIiWlJnpGvQtmajqBP95Ei0EimxfLw==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} dependencies: @@ -1121,7 +1168,7 @@ packages: jest-util: 28.1.3 dev: true - /@jest/globals/28.1.3: + /@jest/globals@28.1.3: resolution: {integrity: sha512-XFU4P4phyryCXu1pbcqMO0GSQcYe1IsalYCDzRNyhetyeyxMcIxa11qPNDpVNLeretItNqEmYYQn1UYz/5x1NA==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} dependencies: @@ -1132,7 +1179,7 @@ packages: - supports-color dev: true - /@jest/reporters/28.1.3: + /@jest/reporters@28.1.3: resolution: {integrity: sha512-JuAy7wkxQZVNU/V6g9xKzCGC5LVXx9FDcABKsSXp5MiKPEE2144a/vXTEDoyzjUpZKfVwp08Wqg5A4WfTMAzjg==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} peerDependencies: @@ -1170,14 +1217,14 @@ packages: - supports-color dev: true - /@jest/schemas/28.1.3: + /@jest/schemas@28.1.3: resolution: {integrity: sha512-/l/VWsdt/aBXgjshLWOFyFt3IVdYypu5y2Wn2rOO1un6nkqIn8SLXzgIMYXFyYsRWDyF5EthmKJMIdJvk08grg==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} dependencies: '@sinclair/typebox': 0.24.27 dev: true - /@jest/source-map/28.1.2: + /@jest/source-map@28.1.2: resolution: {integrity: sha512-cV8Lx3BeStJb8ipPHnqVw/IM2VCMWO3crWZzYodSIkxXnRcXJipCdx1JCK0K5MsJJouZQTH73mzf4vgxRaH9ww==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} dependencies: @@ -1186,7 +1233,7 @@ packages: graceful-fs: 4.2.10 dev: true - /@jest/test-result/28.1.3: + /@jest/test-result@28.1.3: resolution: {integrity: sha512-kZAkxnSE+FqE8YjW8gNuoVkkC9I7S1qmenl8sGcDOLropASP+BkcGKwhXoyqQuGOGeYY0y/ixjrd/iERpEXHNg==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} dependencies: @@ -1196,7 +1243,7 @@ packages: collect-v8-coverage: 1.0.1 dev: true - /@jest/test-sequencer/28.1.3: + /@jest/test-sequencer@28.1.3: resolution: {integrity: sha512-NIMPEqqa59MWnDi1kvXXpYbqsfQmSJsIbnd85mdVGkiDfQ9WQQTXOLsvISUfonmnBT+w85WEgneCigEEdHDFxw==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} dependencies: @@ -1206,7 +1253,7 @@ packages: slash: 3.0.0 dev: true - /@jest/transform/28.1.3: + /@jest/transform@28.1.3: resolution: {integrity: sha512-u5dT5di+oFI6hfcLOHGTAfmUxFRrjK+vnaP0kkVow9Md/M7V/MxqQMOz/VV25UZO8pzeA9PjfTpOu6BDuwSPQA==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} dependencies: @@ -1229,7 +1276,7 @@ packages: - supports-color dev: true - /@jest/types/28.1.3: + /@jest/types@28.1.3: resolution: {integrity: sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} dependencies: @@ -1241,7 +1288,7 @@ packages: chalk: 4.1.2 dev: true - /@jridgewell/gen-mapping/0.1.1: + /@jridgewell/gen-mapping@0.1.1: resolution: {integrity: sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==} engines: {node: '>=6.0.0'} dependencies: @@ -1249,7 +1296,7 @@ packages: '@jridgewell/sourcemap-codec': 1.4.14 dev: true - /@jridgewell/gen-mapping/0.3.2: + /@jridgewell/gen-mapping@0.3.2: resolution: {integrity: sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==} engines: {node: '>=6.0.0'} dependencies: @@ -1258,35 +1305,35 @@ packages: '@jridgewell/trace-mapping': 0.3.14 dev: true - /@jridgewell/resolve-uri/3.1.0: + /@jridgewell/resolve-uri@3.1.0: resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==} engines: {node: '>=6.0.0'} dev: true - /@jridgewell/set-array/1.1.2: + /@jridgewell/set-array@1.1.2: resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} engines: {node: '>=6.0.0'} dev: true - /@jridgewell/sourcemap-codec/1.4.14: + /@jridgewell/sourcemap-codec@1.4.14: resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==} dev: true - /@jridgewell/trace-mapping/0.3.14: + /@jridgewell/trace-mapping@0.3.14: resolution: {integrity: sha512-bJWEfQ9lPTvm3SneWwRFVLzrh6nhjwqw7TUFFBEMzwvg7t7PCDenf2lDwqo4NQXzdpgBXyFgDWnQA+2vkruksQ==} dependencies: '@jridgewell/resolve-uri': 3.1.0 '@jridgewell/sourcemap-codec': 1.4.14 dev: true - /@jridgewell/trace-mapping/0.3.9: + /@jridgewell/trace-mapping@0.3.9: resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} dependencies: '@jridgewell/resolve-uri': 3.1.0 '@jridgewell/sourcemap-codec': 1.4.14 dev: true - /@manypkg/find-root/1.1.0: + /@manypkg/find-root@1.1.0: resolution: {integrity: sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==} dependencies: '@babel/runtime': 7.18.9 @@ -1295,7 +1342,7 @@ packages: fs-extra: 8.1.0 dev: true - /@manypkg/get-packages/1.1.3: + /@manypkg/get-packages@1.1.3: resolution: {integrity: sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==} dependencies: '@babel/runtime': 7.18.9 @@ -1306,7 +1353,7 @@ packages: read-yaml-file: 1.1.0 dev: true - /@metamask/eth-sig-util/4.0.1: + /@metamask/eth-sig-util@4.0.1: resolution: {integrity: sha512-tghyZKLHZjcdlDqCA3gNZmLeR0XvOE9U1qoQO9ohyAZT6Pya+H9vkBPcsyXytmYLNgVoin7CKCmweo/R43V+tQ==} engines: {node: '>=12.0.0'} dependencies: @@ -1317,15 +1364,15 @@ packages: tweetnacl-util: 0.15.1 dev: true - /@noble/hashes/1.1.2: + /@noble/hashes@1.1.2: resolution: {integrity: sha512-KYRCASVTv6aeUi1tsF8/vpyR7zpfs3FUzy2Jqm+MU+LmUKhQ0y2FpfwqkCcxSg2ua4GALJd8k2R76WxwZGbQpA==} dev: true - /@noble/secp256k1/1.6.3: + /@noble/secp256k1@1.6.3: resolution: {integrity: sha512-T04e4iTurVy7I8Sw4+c5OSN9/RkPlo1uKxAomtxQNLq8j1uPAqnsqG1bqvY3Jv7c13gyr6dui0zmh/I3+f/JaQ==} dev: true - /@nodelib/fs.scandir/2.1.5: + /@nodelib/fs.scandir@2.1.5: resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} dependencies: @@ -1333,12 +1380,12 @@ packages: run-parallel: 1.2.0 dev: true - /@nodelib/fs.stat/2.0.5: + /@nodelib/fs.stat@2.0.5: resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} engines: {node: '>= 8'} dev: true - /@nodelib/fs.walk/1.2.8: + /@nodelib/fs.walk@1.2.8: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} dependencies: @@ -1346,7 +1393,7 @@ packages: fastq: 1.13.0 dev: true - /@nomicfoundation/ethereumjs-block/4.0.0: + /@nomicfoundation/ethereumjs-block@4.0.0: resolution: {integrity: sha512-bk8uP8VuexLgyIZAHExH1QEovqx0Lzhc9Ntm63nCRKLHXIZkobaFaeCVwTESV7YkPKUk7NiK11s8ryed4CS9yA==} engines: {node: '>=14'} dependencies: @@ -1358,7 +1405,7 @@ packages: ethereum-cryptography: 0.1.3 dev: true - /@nomicfoundation/ethereumjs-blockchain/6.0.0: + /@nomicfoundation/ethereumjs-blockchain@6.0.0: resolution: {integrity: sha512-pLFEoea6MWd81QQYSReLlLfH7N9v7lH66JC/NMPN848ySPPQA5renWnE7wPByfQFzNrPBuDDRFFULMDmj1C0xw==} engines: {node: '>=14'} dependencies: @@ -1369,7 +1416,7 @@ packages: '@nomicfoundation/ethereumjs-trie': 5.0.0 '@nomicfoundation/ethereumjs-util': 8.0.0 abstract-level: 1.0.3 - debug: 4.3.4 + debug: 4.3.4(supports-color@8.1.1) ethereum-cryptography: 0.1.3 level: 8.0.0 lru-cache: 5.1.1 @@ -1378,14 +1425,14 @@ packages: - supports-color dev: true - /@nomicfoundation/ethereumjs-common/3.0.0: + /@nomicfoundation/ethereumjs-common@3.0.0: resolution: {integrity: sha512-WS7qSshQfxoZOpHG/XqlHEGRG1zmyjYrvmATvc4c62+gZXgre1ymYP8ZNgx/3FyZY0TWe9OjFlKOfLqmgOeYwA==} dependencies: '@nomicfoundation/ethereumjs-util': 8.0.0 crc-32: 1.2.2 dev: true - /@nomicfoundation/ethereumjs-ethash/2.0.0: + /@nomicfoundation/ethereumjs-ethash@2.0.0: resolution: {integrity: sha512-WpDvnRncfDUuXdsAXlI4lXbqUDOA+adYRQaEezIkxqDkc+LDyYDbd/xairmY98GnQzo1zIqsIL6GB5MoMSJDew==} engines: {node: '>=14'} dependencies: @@ -1397,7 +1444,7 @@ packages: ethereum-cryptography: 0.1.3 dev: true - /@nomicfoundation/ethereumjs-evm/1.0.0: + /@nomicfoundation/ethereumjs-evm@1.0.0: resolution: {integrity: sha512-hVS6qRo3V1PLKCO210UfcEQHvlG7GqR8iFzp0yyjTg2TmJQizcChKgWo8KFsdMw6AyoLgLhHGHw4HdlP8a4i+Q==} engines: {node: '>=14'} dependencies: @@ -1405,7 +1452,7 @@ packages: '@nomicfoundation/ethereumjs-util': 8.0.0 '@types/async-eventemitter': 0.2.1 async-eventemitter: 0.2.4 - debug: 4.3.4 + debug: 4.3.4(supports-color@8.1.1) ethereum-cryptography: 0.1.3 mcl-wasm: 0.7.9 rustbn.js: 0.2.0 @@ -1413,27 +1460,27 @@ packages: - supports-color dev: true - /@nomicfoundation/ethereumjs-rlp/4.0.0: + /@nomicfoundation/ethereumjs-rlp@4.0.0: resolution: {integrity: sha512-GaSOGk5QbUk4eBP5qFbpXoZoZUj/NrW7MRa0tKY4Ew4c2HAS0GXArEMAamtFrkazp0BO4K5p2ZCG3b2FmbShmw==} engines: {node: '>=14'} hasBin: true dev: true - /@nomicfoundation/ethereumjs-statemanager/1.0.0: + /@nomicfoundation/ethereumjs-statemanager@1.0.0: resolution: {integrity: sha512-jCtqFjcd2QejtuAMjQzbil/4NHf5aAWxUc+CvS0JclQpl+7M0bxMofR2AJdtz+P3u0ke2euhYREDiE7iSO31vQ==} dependencies: '@nomicfoundation/ethereumjs-common': 3.0.0 '@nomicfoundation/ethereumjs-rlp': 4.0.0 '@nomicfoundation/ethereumjs-trie': 5.0.0 '@nomicfoundation/ethereumjs-util': 8.0.0 - debug: 4.3.4 + debug: 4.3.4(supports-color@8.1.1) ethereum-cryptography: 0.1.3 functional-red-black-tree: 1.0.1 transitivePeerDependencies: - supports-color dev: true - /@nomicfoundation/ethereumjs-trie/5.0.0: + /@nomicfoundation/ethereumjs-trie@5.0.0: resolution: {integrity: sha512-LIj5XdE+s+t6WSuq/ttegJzZ1vliwg6wlb+Y9f4RlBpuK35B9K02bO7xU+E6Rgg9RGptkWd6TVLdedTI4eNc2A==} engines: {node: '>=14'} dependencies: @@ -1443,7 +1490,7 @@ packages: readable-stream: 3.6.0 dev: true - /@nomicfoundation/ethereumjs-tx/4.0.0: + /@nomicfoundation/ethereumjs-tx@4.0.0: resolution: {integrity: sha512-Gg3Lir2lNUck43Kp/3x6TfBNwcWC9Z1wYue9Nz3v4xjdcv6oDW9QSMJxqsKw9QEGoBBZ+gqwpW7+F05/rs/g1w==} engines: {node: '>=14'} dependencies: @@ -1453,7 +1500,7 @@ packages: ethereum-cryptography: 0.1.3 dev: true - /@nomicfoundation/ethereumjs-util/8.0.0: + /@nomicfoundation/ethereumjs-util@8.0.0: resolution: {integrity: sha512-2emi0NJ/HmTG+CGY58fa+DQuAoroFeSH9gKu9O6JnwTtlzJtgfTixuoOqLEgyyzZVvwfIpRueuePb8TonL1y+A==} engines: {node: '>=14'} dependencies: @@ -1461,7 +1508,7 @@ packages: ethereum-cryptography: 0.1.3 dev: true - /@nomicfoundation/ethereumjs-vm/6.0.0: + /@nomicfoundation/ethereumjs-vm@6.0.0: resolution: {integrity: sha512-JMPxvPQ3fzD063Sg3Tp+UdwUkVxMoo1uML6KSzFhMH3hoQi/LMuXBoEHAoW83/vyNS9BxEe6jm6LmT5xdeEJ6w==} engines: {node: '>=14'} dependencies: @@ -1476,7 +1523,7 @@ packages: '@nomicfoundation/ethereumjs-util': 8.0.0 '@types/async-eventemitter': 0.2.1 async-eventemitter: 0.2.4 - debug: 4.3.4 + debug: 4.3.4(supports-color@8.1.1) ethereum-cryptography: 0.1.3 functional-red-black-tree: 1.0.1 mcl-wasm: 0.7.9 @@ -1485,7 +1532,7 @@ packages: - supports-color dev: true - /@nomicfoundation/solidity-analyzer-darwin-arm64/0.0.3: + /@nomicfoundation/solidity-analyzer-darwin-arm64@0.0.3: resolution: {integrity: sha512-W+bIiNiZmiy+MTYFZn3nwjyPUO6wfWJ0lnXx2zZrM8xExKObMrhCh50yy8pQING24mHfpPFCn89wEB/iG7vZDw==} engines: {node: '>= 10'} cpu: [arm64] @@ -1494,7 +1541,7 @@ packages: dev: true optional: true - /@nomicfoundation/solidity-analyzer-darwin-x64/0.0.3: + /@nomicfoundation/solidity-analyzer-darwin-x64@0.0.3: resolution: {integrity: sha512-HuJd1K+2MgmFIYEpx46uzwEFjvzKAI765mmoMxy4K+Aqq1p+q7hHRlsFU2kx3NB8InwotkkIq3A5FLU1sI1WDw==} engines: {node: '>= 10'} cpu: [x64] @@ -1503,7 +1550,7 @@ packages: dev: true optional: true - /@nomicfoundation/solidity-analyzer-freebsd-x64/0.0.3: + /@nomicfoundation/solidity-analyzer-freebsd-x64@0.0.3: resolution: {integrity: sha512-2cR8JNy23jZaO/vZrsAnWCsO73asU7ylrHIe0fEsXbZYqBP9sMr+/+xP3CELDHJxUbzBY8zqGvQt1ULpyrG+Kw==} engines: {node: '>= 10'} cpu: [x64] @@ -1512,7 +1559,7 @@ packages: dev: true optional: true - /@nomicfoundation/solidity-analyzer-linux-arm64-gnu/0.0.3: + /@nomicfoundation/solidity-analyzer-linux-arm64-gnu@0.0.3: resolution: {integrity: sha512-Eyv50EfYbFthoOb0I1568p+eqHGLwEUhYGOxcRNywtlTE9nj+c+MT1LA53HnxD9GsboH4YtOOmJOulrjG7KtbA==} engines: {node: '>= 10'} cpu: [arm64] @@ -1521,7 +1568,7 @@ packages: dev: true optional: true - /@nomicfoundation/solidity-analyzer-linux-arm64-musl/0.0.3: + /@nomicfoundation/solidity-analyzer-linux-arm64-musl@0.0.3: resolution: {integrity: sha512-V8grDqI+ivNrgwEt2HFdlwqV2/EQbYAdj3hbOvjrA8Qv+nq4h9jhQUxFpegYMDtpU8URJmNNlXgtfucSrAQwtQ==} engines: {node: '>= 10'} cpu: [arm64] @@ -1530,7 +1577,7 @@ packages: dev: true optional: true - /@nomicfoundation/solidity-analyzer-linux-x64-gnu/0.0.3: + /@nomicfoundation/solidity-analyzer-linux-x64-gnu@0.0.3: resolution: {integrity: sha512-uRfVDlxtwT1vIy7MAExWAkRD4r9M79zMG7S09mCrWUn58DbLs7UFl+dZXBX0/8FTGYWHhOT/1Etw1ZpAf5DTrg==} engines: {node: '>= 10'} cpu: [x64] @@ -1539,7 +1586,7 @@ packages: dev: true optional: true - /@nomicfoundation/solidity-analyzer-linux-x64-musl/0.0.3: + /@nomicfoundation/solidity-analyzer-linux-x64-musl@0.0.3: resolution: {integrity: sha512-8HPwYdLbhcPpSwsE0yiU/aZkXV43vlXT2ycH+XlOjWOnLfH8C41z0njK8DHRtEFnp4OVN6E7E5lHBBKDZXCliA==} engines: {node: '>= 10'} cpu: [x64] @@ -1548,7 +1595,7 @@ packages: dev: true optional: true - /@nomicfoundation/solidity-analyzer-win32-arm64-msvc/0.0.3: + /@nomicfoundation/solidity-analyzer-win32-arm64-msvc@0.0.3: resolution: {integrity: sha512-5WWcT6ZNvfCuxjlpZOY7tdvOqT1kIQYlDF9Q42wMpZ5aTm4PvjdCmFDDmmTvyXEBJ4WTVmY5dWNWaxy8h/E28g==} engines: {node: '>= 10'} cpu: [arm64] @@ -1557,7 +1604,7 @@ packages: dev: true optional: true - /@nomicfoundation/solidity-analyzer-win32-ia32-msvc/0.0.3: + /@nomicfoundation/solidity-analyzer-win32-ia32-msvc@0.0.3: resolution: {integrity: sha512-P/LWGZwWkyjSwkzq6skvS2wRc3gabzAbk6Akqs1/Iiuggql2CqdLBkcYWL5Xfv3haynhL+2jlNkak+v2BTZI4A==} engines: {node: '>= 10'} cpu: [ia32] @@ -1566,7 +1613,7 @@ packages: dev: true optional: true - /@nomicfoundation/solidity-analyzer-win32-x64-msvc/0.0.3: + /@nomicfoundation/solidity-analyzer-win32-x64-msvc@0.0.3: resolution: {integrity: sha512-4AcTtLZG1s/S5mYAIr/sdzywdNwJpOcdStGF3QMBzEt+cGn3MchMaS9b1gyhb2KKM2c39SmPF5fUuWq1oBSQZQ==} engines: {node: '>= 10'} cpu: [x64] @@ -1575,7 +1622,7 @@ packages: dev: true optional: true - /@nomicfoundation/solidity-analyzer/0.0.3: + /@nomicfoundation/solidity-analyzer@0.0.3: resolution: {integrity: sha512-VFMiOQvsw7nx5bFmrmVp2Q9rhIjw2AFST4DYvWVVO9PMHPE23BY2+kyfrQ4J3xCMFC8fcBbGLt7l4q7m1SlTqg==} engines: {node: '>= 12'} optionalDependencies: @@ -1591,17 +1638,17 @@ packages: '@nomicfoundation/solidity-analyzer-win32-x64-msvc': 0.0.3 dev: true - /@nomiclabs/hardhat-ethers/2.1.1_liuail6phkx7un26teqxcf6yx4: + /@nomiclabs/hardhat-ethers@2.1.1(ethers@5.7.1)(hardhat@2.11.2): resolution: {integrity: sha512-Gg0IFkT/DW3vOpih4/kMjeZCLYqtfgECLeLXTs7ZDPzcK0cfoc5wKk4nq5n/izCUzdhidO/Utd6ptF9JrWwWVA==} peerDependencies: ethers: ^5.0.0 hardhat: ^2.0.0 dependencies: ethers: 5.7.1 - hardhat: 2.11.2_6oasmw356qmm23djlsjgkwvrtm + hardhat: 2.11.2(ts-node@10.9.1)(typescript@4.7.4) dev: true - /@nomiclabs/hardhat-etherscan/3.1.0_hardhat@2.11.2: + /@nomiclabs/hardhat-etherscan@3.1.0(hardhat@2.11.2): resolution: {integrity: sha512-JroYgfN1AlYFkQTQ3nRwFi4o8NtZF7K/qFR2dxDUgHbCtIagkUseca9L4E/D2ScUm4XT40+8PbCdqZi+XmHyQA==} peerDependencies: hardhat: ^2.0.4 @@ -1610,9 +1657,9 @@ packages: '@ethersproject/address': 5.7.0 cbor: 5.2.0 chalk: 2.4.2 - debug: 4.3.4 + debug: 4.3.4(supports-color@8.1.1) fs-extra: 7.0.1 - hardhat: 2.11.2_6oasmw356qmm23djlsjgkwvrtm + hardhat: 2.11.2(ts-node@10.9.1)(typescript@4.7.4) lodash: 4.17.21 semver: 6.3.0 table: 6.8.0 @@ -1621,27 +1668,31 @@ packages: - supports-color dev: true - /@openzeppelin/contracts/3.4.1: + /@openzeppelin/contracts@3.4.1: resolution: {integrity: sha512-cUriqMauq1ylzP2TxePNdPqkwI7Le3Annh4K9rrpvKfSBB/bdW+Iu1ihBaTIABTAAJ85LmKL5SSPPL9ry8d1gQ==} dev: true - /@openzeppelin/contracts/3.4.1-solc-0.7-2: + /@openzeppelin/contracts@3.4.1-solc-0.7-2: resolution: {integrity: sha512-tAG9LWg8+M2CMu7hIsqHPaTyG4uDzjr6mhvH96LvOpLZZj6tgzTluBt+LsCf1/QaYrlis6pITvpIaIhE+iZB+Q==} dev: true - /@openzeppelin/contracts/3.4.2-solc-0.7: + /@openzeppelin/contracts@3.4.2-solc-0.7: resolution: {integrity: sha512-W6QmqgkADuFcTLzHL8vVoNBtkwjvQRpYIAom7KiUNoLKghyx3FgH0GBjt8NRvigV1ZmMOBllvE1By1C+bi8WpA==} dev: true - /@rushstack/eslint-patch/1.1.4: + /@openzeppelin/contracts@4.8.1: + resolution: {integrity: sha512-xQ6eUZl+RDyb/FiZe1h+U7qr/f4p/SrTSQcTPH2bjur3C5DbuW/zFgCU/b1P/xcIaEqJep+9ju4xDRi3rmChdQ==} + dev: true + + /@rushstack/eslint-patch@1.1.4: resolution: {integrity: sha512-LwzQKA4vzIct1zNZzBmRKI9QuNpLgTQMEjsQLf3BXuGYb3QPTP4Yjf6mkdX+X1mYttZ808QpOwAzZjv28kq7DA==} dev: true - /@scure/base/1.1.1: + /@scure/base@1.1.1: resolution: {integrity: sha512-ZxOhsSyxYwLJj3pLZCefNitxsj093tb2vq90mp2txoYeBqbcjDjqFhyM8eUjq/uFm6zJ+mUuqxlS2FkuSY1MTA==} dev: true - /@scure/bip32/1.1.0: + /@scure/bip32@1.1.0: resolution: {integrity: sha512-ftTW3kKX54YXLCxH6BB7oEEoJfoE2pIgw7MINKAs5PsS6nqKPuKk1haTF/EuHmYqG330t5GSrdmtRuHaY1a62Q==} dependencies: '@noble/hashes': 1.1.2 @@ -1649,14 +1700,14 @@ packages: '@scure/base': 1.1.1 dev: true - /@scure/bip39/1.1.0: + /@scure/bip39@1.1.0: resolution: {integrity: sha512-pwrPOS16VeTKg98dYXQyIjJEcWfz7/1YJIwxUEPFfQPtc86Ym/1sVgQ2RLoD43AazMk2l/unK4ITySSpW2+82w==} dependencies: '@noble/hashes': 1.1.2 '@scure/base': 1.1.1 dev: true - /@sentry/core/5.30.0: + /@sentry/core@5.30.0: resolution: {integrity: sha512-TmfrII8w1PQZSZgPpUESqjB+jC6MvZJZdLtE/0hZ+SrnKhW3x5WlYLvTXZpcWePYBku7rl2wn1RZu6uT0qCTeg==} engines: {node: '>=6'} dependencies: @@ -1667,7 +1718,7 @@ packages: tslib: 1.14.1 dev: true - /@sentry/hub/5.30.0: + /@sentry/hub@5.30.0: resolution: {integrity: sha512-2tYrGnzb1gKz2EkMDQcfLrDTvmGcQPuWxLnJKXJvYTQDGLlEvi2tWz1VIHjunmOvJrB5aIQLhm+dcMRwFZDCqQ==} engines: {node: '>=6'} dependencies: @@ -1676,7 +1727,7 @@ packages: tslib: 1.14.1 dev: true - /@sentry/minimal/5.30.0: + /@sentry/minimal@5.30.0: resolution: {integrity: sha512-BwWb/owZKtkDX+Sc4zCSTNcvZUq7YcH3uAVlmh/gtR9rmUvbzAA3ewLuB3myi4wWRAMEtny6+J/FN/x+2wn9Xw==} engines: {node: '>=6'} dependencies: @@ -1685,7 +1736,7 @@ packages: tslib: 1.14.1 dev: true - /@sentry/node/5.30.0: + /@sentry/node@5.30.0: resolution: {integrity: sha512-Br5oyVBF0fZo6ZS9bxbJZG4ApAjRqAnqFFurMVJJdunNb80brh7a5Qva2kjhm+U6r9NJAB5OmDyPkA1Qnt+QVg==} engines: {node: '>=6'} dependencies: @@ -1702,7 +1753,7 @@ packages: - supports-color dev: true - /@sentry/tracing/5.30.0: + /@sentry/tracing@5.30.0: resolution: {integrity: sha512-dUFowCr0AIMwiLD7Fs314Mdzcug+gBVo/+NCMyDw8tFxJkwWAKl7Qa2OZxLQ0ZHjakcj1hNKfCQJ9rhyfOl4Aw==} engines: {node: '>=6'} dependencies: @@ -1713,12 +1764,12 @@ packages: tslib: 1.14.1 dev: true - /@sentry/types/5.30.0: + /@sentry/types@5.30.0: resolution: {integrity: sha512-R8xOqlSTZ+htqrfteCWU5Nk0CDN5ApUTvrlvBuiH1DyP6czDZ4ktbZB0hAgBlVcK0U+qpD3ag3Tqqpa5Q67rPw==} engines: {node: '>=6'} dev: true - /@sentry/utils/5.30.0: + /@sentry/utils@5.30.0: resolution: {integrity: sha512-zaYmoH0NWWtvnJjC9/CBseXMtKHm/tm40sz3YfJRxeQjyzRqNQPgivpd9R/oDJCYj999mzdW382p/qi2ypjLww==} engines: {node: '>=6'} dependencies: @@ -1726,49 +1777,49 @@ packages: tslib: 1.14.1 dev: true - /@sinclair/typebox/0.24.27: + /@sinclair/typebox@0.24.27: resolution: {integrity: sha512-K7C7IlQ3zLePEZleUN21ceBA2aLcMnLHTLph8QWk1JK37L90obdpY+QGY8bXMKxf1ht1Z0MNewvXxWv0oGDYFg==} dev: true - /@sinonjs/commons/1.8.3: + /@sinonjs/commons@1.8.3: resolution: {integrity: sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==} dependencies: type-detect: 4.0.8 dev: true - /@sinonjs/fake-timers/9.1.2: + /@sinonjs/fake-timers@9.1.2: resolution: {integrity: sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw==} dependencies: '@sinonjs/commons': 1.8.3 dev: true - /@solidity-parser/parser/0.14.3: + /@solidity-parser/parser@0.14.3: resolution: {integrity: sha512-29g2SZ29HtsqA58pLCtopI1P/cPy5/UAzlcAXO6T/CNJimG6yA8kx4NaseMyJULiC+TEs02Y9/yeHzClqoA0hw==} dependencies: antlr4ts: 0.5.0-alpha.4 dev: true - /@tsconfig/node10/1.0.9: + /@tsconfig/node10@1.0.9: resolution: {integrity: sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==} dev: true - /@tsconfig/node12/1.0.11: + /@tsconfig/node12@1.0.11: resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} dev: true - /@tsconfig/node14/1.0.3: + /@tsconfig/node14@1.0.3: resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} dev: true - /@tsconfig/node16/1.0.3: + /@tsconfig/node16@1.0.3: resolution: {integrity: sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==} dev: true - /@types/async-eventemitter/0.2.1: + /@types/async-eventemitter@0.2.1: resolution: {integrity: sha512-M2P4Ng26QbAeITiH7w1d7OxtldgfAe0wobpyJzVK/XOb0cUGKU2R4pfAhqcJBXAe2ife5ZOhSv4wk7p+ffURtg==} dev: true - /@types/babel__core/7.1.19: + /@types/babel__core@7.1.19: resolution: {integrity: sha512-WEOTgRsbYkvA/KCsDwVEGkd7WAr1e3g31VHQ8zy5gul/V1qKullU/BU5I68X5v7V3GnB9eotmom4v5a5gjxorw==} dependencies: '@babel/parser': 7.18.11 @@ -1778,151 +1829,151 @@ packages: '@types/babel__traverse': 7.18.0 dev: true - /@types/babel__generator/7.6.4: + /@types/babel__generator@7.6.4: resolution: {integrity: sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==} dependencies: '@babel/types': 7.18.10 dev: true - /@types/babel__template/7.4.1: + /@types/babel__template@7.4.1: resolution: {integrity: sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==} dependencies: '@babel/parser': 7.18.11 '@babel/types': 7.18.10 dev: true - /@types/babel__traverse/7.18.0: + /@types/babel__traverse@7.18.0: resolution: {integrity: sha512-v4Vwdko+pgymgS+A2UIaJru93zQd85vIGWObM5ekZNdXCKtDYqATlEYnWgfo86Q6I1Lh0oXnksDnMU1cwmlPDw==} dependencies: '@babel/types': 7.18.10 dev: true - /@types/bn.js/4.11.6: + /@types/bn.js@4.11.6: resolution: {integrity: sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==} dependencies: '@types/node': 18.7.18 dev: true - /@types/bn.js/5.1.0: + /@types/bn.js@5.1.0: resolution: {integrity: sha512-QSSVYj7pYFN49kW77o2s9xTCwZ8F2xLbjLLSEVh8D2F4JUhZtPAGOFLTD+ffqksBx/u4cE/KImFjyhqCjn/LIA==} dependencies: '@types/node': 18.6.4 dev: true - /@types/bn.js/5.1.1: + /@types/bn.js@5.1.1: resolution: {integrity: sha512-qNrYbZqMx0uJAfKnKclPh+dTwK33KfLHYqtyODwd5HnXOjnkhc4qgn3BrK6RWyGZm5+sIFE7Q7Vz6QQtJB7w7g==} dependencies: '@types/node': 18.7.18 dev: true - /@types/fs-extra/9.0.13: + /@types/fs-extra@9.0.13: resolution: {integrity: sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==} dependencies: '@types/node': 18.6.4 dev: true - /@types/graceful-fs/4.1.5: + /@types/graceful-fs@4.1.5: resolution: {integrity: sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==} dependencies: '@types/node': 18.6.4 dev: true - /@types/is-ci/3.0.0: + /@types/is-ci@3.0.0: resolution: {integrity: sha512-Q0Op0hdWbYd1iahB+IFNQcWXFq4O0Q5MwQP7uN0souuQ4rPg1vEYcnIOfr1gY+M+6rc8FGoRaBO1mOOvL29sEQ==} dependencies: ci-info: 3.3.2 dev: true - /@types/istanbul-lib-coverage/2.0.4: + /@types/istanbul-lib-coverage@2.0.4: resolution: {integrity: sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==} dev: true - /@types/istanbul-lib-report/3.0.0: + /@types/istanbul-lib-report@3.0.0: resolution: {integrity: sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==} dependencies: '@types/istanbul-lib-coverage': 2.0.4 dev: true - /@types/istanbul-reports/3.0.1: + /@types/istanbul-reports@3.0.1: resolution: {integrity: sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==} dependencies: '@types/istanbul-lib-report': 3.0.0 dev: true - /@types/jest/28.1.6: + /@types/jest@28.1.6: resolution: {integrity: sha512-0RbGAFMfcBJKOmqRazM8L98uokwuwD5F8rHrv/ZMbrZBwVOWZUyPG6VFNscjYr/vjM3Vu4fRrCPbOs42AfemaQ==} dependencies: jest-matcher-utils: 28.1.3 pretty-format: 28.1.3 dev: true - /@types/json-schema/7.0.11: + /@types/json-schema@7.0.11: resolution: {integrity: sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==} dev: true - /@types/lru-cache/5.1.1: + /@types/lru-cache@5.1.1: resolution: {integrity: sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw==} dev: true - /@types/minimist/1.2.2: + /@types/minimist@1.2.2: resolution: {integrity: sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==} dev: true - /@types/node/12.20.55: + /@types/node@12.20.55: resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} dev: true - /@types/node/18.6.4: + /@types/node@18.6.4: resolution: {integrity: sha512-I4BD3L+6AWiUobfxZ49DlU43gtI+FTHSv9pE2Zekg6KjMpre4ByusaljW3vYSLJrvQ1ck1hUaeVu8HVlY3vzHg==} dev: true - /@types/node/18.7.18: + /@types/node@18.7.18: resolution: {integrity: sha512-m+6nTEOadJZuTPkKR/SYK3A2d7FZrgElol9UP1Kae90VVU4a6mxnPuLiIW1m4Cq4gZ/nWb9GrdVXJCoCazDAbg==} dev: true - /@types/normalize-package-data/2.4.1: + /@types/normalize-package-data@2.4.1: resolution: {integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==} dev: true - /@types/pbkdf2/3.1.0: + /@types/pbkdf2@3.1.0: resolution: {integrity: sha512-Cf63Rv7jCQ0LaL8tNXmEyqTHuIJxRdlS5vMh1mj5voN4+QFhVZnlZruezqpWYDiJ8UTzhP0VmeLXCmBk66YrMQ==} dependencies: '@types/node': 18.7.18 dev: true - /@types/prettier/2.7.0: + /@types/prettier@2.7.0: resolution: {integrity: sha512-RI1L7N4JnW5gQw2spvL7Sllfuf1SaHdrZpCHiBlCXjIlufi1SMNnbu2teze3/QE67Fg2tBlH7W+mi4hVNk4p0A==} dev: true - /@types/qs/6.9.7: + /@types/qs@6.9.7: resolution: {integrity: sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==} dev: true - /@types/secp256k1/4.0.3: + /@types/secp256k1@4.0.3: resolution: {integrity: sha512-Da66lEIFeIz9ltsdMZcpQvmrmmoqrfju8pm1BH8WbYjZSwUgCwXLb9C+9XYogwBITnbsSaMdVPb2ekf7TV+03w==} dependencies: '@types/node': 18.7.18 dev: true - /@types/semver/6.2.3: + /@types/semver@6.2.3: resolution: {integrity: sha512-KQf+QAMWKMrtBMsB8/24w53tEsxllMj6TuA80TT/5igJalLI/zm0L3oXRbIAl4Ohfc85gyHX/jhMwsVkmhLU4A==} dev: true - /@types/stack-utils/2.0.1: + /@types/stack-utils@2.0.1: resolution: {integrity: sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==} dev: true - /@types/yargs-parser/21.0.0: + /@types/yargs-parser@21.0.0: resolution: {integrity: sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==} dev: true - /@types/yargs/17.0.11: + /@types/yargs@17.0.11: resolution: {integrity: sha512-aB4y9UDUXTSMxmM4MH+YnuR0g5Cph3FLQBoWoMB21DSvFVAxRVEHEMx3TLh+zUZYMCQtKiqazz0Q4Rre31f/OA==} dependencies: '@types/yargs-parser': 21.0.0 dev: true - /@typescript-eslint/eslint-plugin/5.32.0_iosr3hrei2tubxveewluhu5lhy: + /@typescript-eslint/eslint-plugin@5.32.0(@typescript-eslint/parser@5.32.0)(eslint@8.21.0)(typescript@4.7.4): resolution: {integrity: sha512-CHLuz5Uz7bHP2WgVlvoZGhf0BvFakBJKAD/43Ty0emn4wXWv5k01ND0C0fHcl/Im8Td2y/7h44E9pca9qAu2ew==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -1933,23 +1984,23 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/parser': 5.32.0_qugx7qdu5zevzvxaiqyxfiwquq + '@typescript-eslint/parser': 5.32.0(eslint@8.21.0)(typescript@4.7.4) '@typescript-eslint/scope-manager': 5.32.0 - '@typescript-eslint/type-utils': 5.32.0_qugx7qdu5zevzvxaiqyxfiwquq - '@typescript-eslint/utils': 5.32.0_qugx7qdu5zevzvxaiqyxfiwquq - debug: 4.3.4 + '@typescript-eslint/type-utils': 5.32.0(eslint@8.21.0)(typescript@4.7.4) + '@typescript-eslint/utils': 5.32.0(eslint@8.21.0)(typescript@4.7.4) + debug: 4.3.4(supports-color@8.1.1) eslint: 8.21.0 functional-red-black-tree: 1.0.1 ignore: 5.2.0 regexpp: 3.2.0 semver: 7.3.7 - tsutils: 3.21.0_typescript@4.7.4 + tsutils: 3.21.0(typescript@4.7.4) typescript: 4.7.4 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/parser/5.32.0_qugx7qdu5zevzvxaiqyxfiwquq: + /@typescript-eslint/parser@5.32.0(eslint@8.21.0)(typescript@4.7.4): resolution: {integrity: sha512-IxRtsehdGV9GFQ35IGm5oKKR2OGcazUoiNBxhRV160iF9FoyuXxjY+rIqs1gfnd+4eL98OjeGnMpE7RF/NBb3A==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -1961,15 +2012,15 @@ packages: dependencies: '@typescript-eslint/scope-manager': 5.32.0 '@typescript-eslint/types': 5.32.0 - '@typescript-eslint/typescript-estree': 5.32.0_typescript@4.7.4 - debug: 4.3.4 + '@typescript-eslint/typescript-estree': 5.32.0(typescript@4.7.4) + debug: 4.3.4(supports-color@8.1.1) eslint: 8.21.0 typescript: 4.7.4 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/scope-manager/5.32.0: + /@typescript-eslint/scope-manager@5.32.0: resolution: {integrity: sha512-KyAE+tUON0D7tNz92p1uetRqVJiiAkeluvwvZOqBmW9z2XApmk5WSMV9FrzOroAcVxJZB3GfUwVKr98Dr/OjOg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: @@ -1977,7 +2028,7 @@ packages: '@typescript-eslint/visitor-keys': 5.32.0 dev: true - /@typescript-eslint/type-utils/5.32.0_qugx7qdu5zevzvxaiqyxfiwquq: + /@typescript-eslint/type-utils@5.32.0(eslint@8.21.0)(typescript@4.7.4): resolution: {integrity: sha512-0gSsIhFDduBz3QcHJIp3qRCvVYbqzHg8D6bHFsDMrm0rURYDj+skBK2zmYebdCp+4nrd9VWd13egvhYFJj/wZg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -1987,21 +2038,21 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/utils': 5.32.0_qugx7qdu5zevzvxaiqyxfiwquq - debug: 4.3.4 + '@typescript-eslint/utils': 5.32.0(eslint@8.21.0)(typescript@4.7.4) + debug: 4.3.4(supports-color@8.1.1) eslint: 8.21.0 - tsutils: 3.21.0_typescript@4.7.4 + tsutils: 3.21.0(typescript@4.7.4) typescript: 4.7.4 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/types/5.32.0: + /@typescript-eslint/types@5.32.0: resolution: {integrity: sha512-EBUKs68DOcT/EjGfzywp+f8wG9Zw6gj6BjWu7KV/IYllqKJFPlZlLSYw/PTvVyiRw50t6wVbgv4p9uE2h6sZrQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true - /@typescript-eslint/typescript-estree/5.32.0_typescript@4.7.4: + /@typescript-eslint/typescript-estree@5.32.0(typescript@4.7.4): resolution: {integrity: sha512-ZVAUkvPk3ITGtCLU5J4atCw9RTxK+SRc6hXqLtllC2sGSeMFWN+YwbiJR9CFrSFJ3w4SJfcWtDwNb/DmUIHdhg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -2012,17 +2063,17 @@ packages: dependencies: '@typescript-eslint/types': 5.32.0 '@typescript-eslint/visitor-keys': 5.32.0 - debug: 4.3.4 + debug: 4.3.4(supports-color@8.1.1) globby: 11.1.0 is-glob: 4.0.3 semver: 7.3.7 - tsutils: 3.21.0_typescript@4.7.4 + tsutils: 3.21.0(typescript@4.7.4) typescript: 4.7.4 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/utils/5.32.0_qugx7qdu5zevzvxaiqyxfiwquq: + /@typescript-eslint/utils@5.32.0(eslint@8.21.0)(typescript@4.7.4): resolution: {integrity: sha512-W7lYIAI5Zlc5K082dGR27Fczjb3Q57ECcXefKU/f0ajM5ToM0P+N9NmJWip8GmGu/g6QISNT+K6KYB+iSHjXCQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -2031,16 +2082,16 @@ packages: '@types/json-schema': 7.0.11 '@typescript-eslint/scope-manager': 5.32.0 '@typescript-eslint/types': 5.32.0 - '@typescript-eslint/typescript-estree': 5.32.0_typescript@4.7.4 + '@typescript-eslint/typescript-estree': 5.32.0(typescript@4.7.4) eslint: 8.21.0 eslint-scope: 5.1.1 - eslint-utils: 3.0.0_eslint@8.21.0 + eslint-utils: 3.0.0(eslint@8.21.0) transitivePeerDependencies: - supports-color - typescript dev: true - /@typescript-eslint/visitor-keys/5.32.0: + /@typescript-eslint/visitor-keys@5.32.0: resolution: {integrity: sha512-S54xOHZgfThiZ38/ZGTgB2rqx51CMJ5MCfVT2IplK4Q7hgzGfe0nLzLCcenDnc/cSjP568hdeKfeDcBgqNHD/g==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: @@ -2048,33 +2099,33 @@ packages: eslint-visitor-keys: 3.3.0 dev: true - /@ungap/promise-all-settled/1.1.2: + /@ungap/promise-all-settled@1.1.2: resolution: {integrity: sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==} dev: true - /@uniswap/lib/4.0.1-alpha: + /@uniswap/lib@4.0.1-alpha: resolution: {integrity: sha512-f6UIliwBbRsgVLxIaBANF6w09tYqc6Y/qXdsrbEmXHyFA7ILiKrIwRFXe1yOg8M3cksgVsO9N7yuL2DdCGQKBA==} engines: {node: '>=10'} dev: true - /@uniswap/v2-core/1.0.1: + /@uniswap/v2-core@1.0.1: resolution: {integrity: sha512-MtybtkUPSyysqLY2U210NBDeCHX+ltHt3oADGdjqoThZaFRDKwM6k1Nb3F0A3hk5hwuQvytFWhrWHOEq6nVJ8Q==} engines: {node: '>=10'} dev: true - /@uniswap/v3-core/1.0.0: + /@uniswap/v3-core@1.0.0: resolution: {integrity: sha512-kSC4djMGKMHj7sLMYVnn61k9nu+lHjMIxgg9CDQT+s2QYLoA56GbSK9Oxr+qJXzzygbkrmuY6cwgP6cW2JXPFA==} engines: {node: '>=10'} dev: true - /abort-controller/3.0.0: + /abort-controller@3.0.0: resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} engines: {node: '>=6.5'} dependencies: event-target-shim: 5.0.1 dev: true - /abstract-level/1.0.3: + /abstract-level@1.0.3: resolution: {integrity: sha512-t6jv+xHy+VYwc4xqZMn2Pa9DjcdzvzZmQGRjTFc8spIbRGHgBrEKbPq+rYXc7CCo0lxgYvSgKVg9qZAhpVQSjA==} engines: {node: '>=12'} dependencies: @@ -2087,7 +2138,7 @@ packages: queue-microtask: 1.2.3 dev: true - /acorn-jsx/5.3.2_acorn@6.4.2: + /acorn-jsx@5.3.2(acorn@6.4.2): resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 @@ -2095,7 +2146,7 @@ packages: acorn: 6.4.2 dev: true - /acorn-jsx/5.3.2_acorn@8.8.0: + /acorn-jsx@5.3.2(acorn@8.8.0): resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 @@ -2103,7 +2154,7 @@ packages: acorn: 8.8.0 dev: true - /acorn-node/1.8.2: + /acorn-node@1.8.2: resolution: {integrity: sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==} dependencies: acorn: 7.4.1 @@ -2111,52 +2162,52 @@ packages: xtend: 4.0.2 dev: true - /acorn-walk/7.2.0: + /acorn-walk@7.2.0: resolution: {integrity: sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==} engines: {node: '>=0.4.0'} dev: true - /acorn-walk/8.2.0: + /acorn-walk@8.2.0: resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} engines: {node: '>=0.4.0'} dev: true - /acorn/6.4.2: + /acorn@6.4.2: resolution: {integrity: sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==} engines: {node: '>=0.4.0'} hasBin: true dev: true - /acorn/7.4.1: + /acorn@7.4.1: resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==} engines: {node: '>=0.4.0'} hasBin: true dev: true - /acorn/8.8.0: + /acorn@8.8.0: resolution: {integrity: sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==} engines: {node: '>=0.4.0'} hasBin: true dev: true - /adm-zip/0.4.16: + /adm-zip@0.4.16: resolution: {integrity: sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg==} engines: {node: '>=0.3.0'} dev: true - /aes-js/3.0.0: + /aes-js@3.0.0: resolution: {integrity: sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==} - /agent-base/6.0.2: + /agent-base@6.0.2: resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} engines: {node: '>= 6.0.0'} dependencies: - debug: 4.3.4 + debug: 4.3.4(supports-color@8.1.1) transitivePeerDependencies: - supports-color dev: true - /aggregate-error/3.1.0: + /aggregate-error@3.1.0: resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} engines: {node: '>=8'} dependencies: @@ -2164,7 +2215,7 @@ packages: indent-string: 4.0.0 dev: true - /ajv/6.12.6: + /ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} dependencies: fast-deep-equal: 3.1.3 @@ -2173,7 +2224,7 @@ packages: uri-js: 4.4.1 dev: true - /ajv/8.11.0: + /ajv@8.11.0: resolution: {integrity: sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==} dependencies: fast-deep-equal: 3.1.3 @@ -2182,76 +2233,76 @@ packages: uri-js: 4.4.1 dev: true - /ansi-colors/4.1.1: + /ansi-colors@4.1.1: resolution: {integrity: sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==} engines: {node: '>=6'} dev: true - /ansi-colors/4.1.3: + /ansi-colors@4.1.3: resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} engines: {node: '>=6'} dev: true - /ansi-escapes/3.2.0: + /ansi-escapes@3.2.0: resolution: {integrity: sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==} engines: {node: '>=4'} dev: true - /ansi-escapes/4.3.2: + /ansi-escapes@4.3.2: resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} engines: {node: '>=8'} dependencies: type-fest: 0.21.3 dev: true - /ansi-regex/3.0.1: + /ansi-regex@3.0.1: resolution: {integrity: sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==} engines: {node: '>=4'} dev: true - /ansi-regex/4.1.1: + /ansi-regex@4.1.1: resolution: {integrity: sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==} engines: {node: '>=6'} dev: true - /ansi-regex/5.0.1: + /ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} dev: true - /ansi-styles/3.2.1: + /ansi-styles@3.2.1: resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} engines: {node: '>=4'} dependencies: color-convert: 1.9.3 dev: true - /ansi-styles/4.3.0: + /ansi-styles@4.3.0: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} dependencies: color-convert: 2.0.1 dev: true - /ansi-styles/5.2.0: + /ansi-styles@5.2.0: resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} engines: {node: '>=10'} dev: true - /antlr4/4.9.0: + /antlr4@4.9.0: resolution: {integrity: sha512-TAS2RfNblx/wlfy/h0YNaBSC1sg5rQ4Twm0h/ksCoWRAsLo9Freh367zXtRZdKVYSOLkOJbPDJL6TFclCr0Xvw==} engines: {node: '>=14'} dev: true - /antlr4ts/0.5.0-alpha.4: + /antlr4ts@0.5.0-alpha.4: resolution: {integrity: sha512-WPQDt1B74OfPv/IMS2ekXAKkTZIHl88uMetg6q3OTqgFxZ/dxDXI0EWLyZid/1Pe6hTftyg5N7gel5wNAGxXyQ==} dev: true - /any-promise/1.3.0: + /any-promise@1.3.0: resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} dev: true - /anymatch/3.1.2: + /anymatch@3.1.2: resolution: {integrity: sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==} engines: {node: '>= 8'} dependencies: @@ -2259,25 +2310,25 @@ packages: picomatch: 2.3.1 dev: true - /arg/4.1.3: + /arg@4.1.3: resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} dev: true - /arg/5.0.2: + /arg@5.0.2: resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} dev: true - /argparse/1.0.10: + /argparse@1.0.10: resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} dependencies: sprintf-js: 1.0.3 dev: true - /argparse/2.0.1: + /argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} dev: true - /aria-query/4.2.2: + /aria-query@4.2.2: resolution: {integrity: sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA==} engines: {node: '>=6.0'} dependencies: @@ -2285,7 +2336,7 @@ packages: '@babel/runtime-corejs3': 7.18.9 dev: true - /array-includes/3.1.5: + /array-includes@3.1.5: resolution: {integrity: sha512-iSDYZMMyTPkiFasVqfuAQnWAYcvO/SeBSCGKePoEthjp4LEMTe4uLc7b025o4jAZpHhihh8xPo99TNWUWWkGDQ==} engines: {node: '>= 0.4'} dependencies: @@ -2296,12 +2347,12 @@ packages: is-string: 1.0.7 dev: true - /array-union/2.1.0: + /array-union@2.1.0: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} engines: {node: '>=8'} dev: true - /array.prototype.flat/1.3.0: + /array.prototype.flat@1.3.0: resolution: {integrity: sha512-12IUEkHsAhA4DY5s0FPgNXIdc8VRSqD9Zp78a5au9abH/SOBrsp082JOWFNTjkMozh8mqcdiKuaLGhPeYztxSw==} engines: {node: '>= 0.4'} dependencies: @@ -2311,7 +2362,7 @@ packages: es-shim-unscopables: 1.0.0 dev: true - /array.prototype.flatmap/1.3.0: + /array.prototype.flatmap@1.3.0: resolution: {integrity: sha512-PZC9/8TKAIxcWKdyeb77EzULHPrIX/tIZebLJUQOMR1OwYosT8yggdfWScfTBCDj5utONvOuPQQumYsU2ULbkg==} engines: {node: '>= 0.4'} dependencies: @@ -2321,63 +2372,63 @@ packages: es-shim-unscopables: 1.0.0 dev: true - /arrify/1.0.1: + /arrify@1.0.1: resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} engines: {node: '>=0.10.0'} dev: true - /ast-parents/0.0.1: + /ast-parents@0.0.1: resolution: {integrity: sha512-XHusKxKz3zoYk1ic8Un640joHbFMhbqneyoZfoKnEGtf2ey9Uh/IdpcQplODdO/kENaMIWsD0nJm4+wX3UNLHA==} dev: true - /ast-types-flow/0.0.7: + /ast-types-flow@0.0.7: resolution: {integrity: sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==} dev: true - /astral-regex/1.0.0: + /astral-regex@1.0.0: resolution: {integrity: sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==} engines: {node: '>=4'} dev: true - /astral-regex/2.0.0: + /astral-regex@2.0.0: resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} engines: {node: '>=8'} dev: true - /async-eventemitter/0.2.4: + /async-eventemitter@0.2.4: resolution: {integrity: sha512-pd20BwL7Yt1zwDFy+8MX8F1+WCT8aQeKj0kQnTrH9WaeRETlRamVhD0JtRPmrV4GfOJ2F9CvdQkZeZhnh2TuHw==} dependencies: async: 2.6.4 dev: true - /async/2.6.4: + /async@2.6.4: resolution: {integrity: sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==} dependencies: lodash: 4.17.21 dev: true - /asynckit/0.4.0: + /asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} dev: true - /axe-core/4.4.3: + /axe-core@4.4.3: resolution: {integrity: sha512-32+ub6kkdhhWick/UjvEwRchgoetXqTK14INLqbGm5U2TzBkBNF3nQtLYm8ovxSkQWArjEQvftCKryjZaATu3w==} engines: {node: '>=4'} dev: true - /axios/0.21.4_debug@4.3.4: + /axios@0.21.4(debug@4.3.4): resolution: {integrity: sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==} dependencies: - follow-redirects: 1.15.2_debug@4.3.4 + follow-redirects: 1.15.2(debug@4.3.4) transitivePeerDependencies: - debug dev: true - /axobject-query/2.2.0: + /axobject-query@2.2.0: resolution: {integrity: sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA==} dev: true - /babel-jest/28.1.3_@babel+core@7.18.10: + /babel-jest@28.1.3(@babel/core@7.18.10): resolution: {integrity: sha512-epUaPOEWMk3cWX0M/sPvCHHCe9fMFAa/9hXEgKP8nFfNl/jlGkE9ucq9NqkZGXLDduCJYS0UvSlPUwC0S+rH6Q==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} peerDependencies: @@ -2387,7 +2438,7 @@ packages: '@jest/transform': 28.1.3 '@types/babel__core': 7.1.19 babel-plugin-istanbul: 6.1.1 - babel-preset-jest: 28.1.3_@babel+core@7.18.10 + babel-preset-jest: 28.1.3(@babel/core@7.18.10) chalk: 4.1.2 graceful-fs: 4.2.10 slash: 3.0.0 @@ -2395,7 +2446,7 @@ packages: - supports-color dev: true - /babel-plugin-istanbul/6.1.1: + /babel-plugin-istanbul@6.1.1: resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} engines: {node: '>=8'} dependencies: @@ -2408,7 +2459,7 @@ packages: - supports-color dev: true - /babel-plugin-jest-hoist/28.1.3: + /babel-plugin-jest-hoist@28.1.3: resolution: {integrity: sha512-Ys3tUKAmfnkRUpPdpa98eYrAR0nV+sSFUZZEGuQ2EbFd1y4SOLtD5QDNHAq+bb9a+bbXvYQC4b+ID/THIMcU6Q==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} dependencies: @@ -2418,27 +2469,27 @@ packages: '@types/babel__traverse': 7.18.0 dev: true - /babel-preset-current-node-syntax/1.0.1_@babel+core@7.18.10: + /babel-preset-current-node-syntax@1.0.1(@babel/core@7.18.10): resolution: {integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==} peerDependencies: '@babel/core': ^7.0.0 dependencies: '@babel/core': 7.18.10 - '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.18.10 - '@babel/plugin-syntax-bigint': 7.8.3_@babel+core@7.18.10 - '@babel/plugin-syntax-class-properties': 7.12.13_@babel+core@7.18.10 - '@babel/plugin-syntax-import-meta': 7.10.4_@babel+core@7.18.10 - '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.18.10 - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.18.10 - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.18.10 - '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.18.10 - '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.18.10 - '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.18.10 - '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.18.10 - '@babel/plugin-syntax-top-level-await': 7.14.5_@babel+core@7.18.10 - dev: true - - /babel-preset-jest/28.1.3_@babel+core@7.18.10: + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.18.10) + '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.18.10) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.18.10) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.18.10) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.18.10) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.18.10) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.18.10) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.18.10) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.18.10) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.18.10) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.18.10) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.18.10) + dev: true + + /babel-preset-jest@28.1.3(@babel/core@7.18.10): resolution: {integrity: sha512-L+fupJvlWAHbQfn74coNX3zf60LXMJsezNvvx8eIh7iOR1luJ1poxYgQk1F8PYtNq/6QODDHCqsSnTFSWC491A==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} peerDependencies: @@ -2446,106 +2497,106 @@ packages: dependencies: '@babel/core': 7.18.10 babel-plugin-jest-hoist: 28.1.3 - babel-preset-current-node-syntax: 1.0.1_@babel+core@7.18.10 + babel-preset-current-node-syntax: 1.0.1(@babel/core@7.18.10) dev: true - /balanced-match/1.0.2: + /balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} dev: true - /base-x/3.0.9: + /base-x@3.0.9: resolution: {integrity: sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==} dependencies: safe-buffer: 5.2.1 dev: true - /base64-js/1.5.1: + /base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} dev: true - /base64-sol/1.0.1: + /base64-sol@1.0.1: resolution: {integrity: sha512-ld3cCNMeXt4uJXmLZBHFGMvVpK9KsLVEhPpFRXnvSVAqABKbuNZg/+dsq3NuM+wxFLb/UrVkz7m1ciWmkMfTbg==} dev: true - /bech32/1.1.4: + /bech32@1.1.4: resolution: {integrity: sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==} - /better-path-resolve/1.0.0: + /better-path-resolve@1.0.0: resolution: {integrity: sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==} engines: {node: '>=4'} dependencies: is-windows: 1.0.2 dev: true - /bigint-crypto-utils/3.1.6: + /bigint-crypto-utils@3.1.6: resolution: {integrity: sha512-k5ljSLHx94jQTW3+18KEfxLJR8/XFBHqhfhEGF48qT8p/jL6EdiG7oNOiiIRGMFh2wEP8kaCXZbVd+5dYkngUg==} engines: {node: '>=10.4.0'} dependencies: bigint-mod-arith: 3.1.1 dev: true - /bigint-mod-arith/3.1.1: + /bigint-mod-arith@3.1.1: resolution: {integrity: sha512-SzFqdncZKXq5uh3oLFZXmzaZEMDsA7ml9l53xKaVGO6/+y26xNwAaTQEg2R+D+d07YduLbKi0dni3YPsR51UDQ==} engines: {node: '>=10.4.0'} dev: true - /bignumber.js/9.0.2: + /bignumber.js@9.0.2: resolution: {integrity: sha512-GAcQvbpsM0pUb0zw1EI0KhQEZ+lRwR5fYaAp3vPOYuP7aDvGy6cVN6XHLauvF8SOga2y0dcLcjt3iQDTSEliyw==} dev: true - /bignumber.js/9.1.0: + /bignumber.js@9.1.0: resolution: {integrity: sha512-4LwHK4nfDOraBCtst+wOWIHbu1vhvAPJK8g8nROd4iuc3PSEjWif/qwbkh8jwCJz6yDBvtU4KPynETgrfh7y3A==} dev: true - /binary-extensions/2.2.0: + /binary-extensions@2.2.0: resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} engines: {node: '>=8'} dev: true - /blakejs/1.2.1: + /blakejs@1.2.1: resolution: {integrity: sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ==} dev: true - /bn.js/4.11.6: + /bn.js@4.11.6: resolution: {integrity: sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA==} dev: true - /bn.js/4.12.0: + /bn.js@4.12.0: resolution: {integrity: sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==} - /bn.js/5.2.1: + /bn.js@5.2.1: resolution: {integrity: sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==} - /brace-expansion/1.1.11: + /brace-expansion@1.1.11: resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} dependencies: balanced-match: 1.0.2 concat-map: 0.0.1 dev: true - /brace-expansion/2.0.1: + /brace-expansion@2.0.1: resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} dependencies: balanced-match: 1.0.2 dev: true - /braces/3.0.2: + /braces@3.0.2: resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} engines: {node: '>=8'} dependencies: fill-range: 7.0.1 dev: true - /breakword/1.0.5: + /breakword@1.0.5: resolution: {integrity: sha512-ex5W9DoOQ/LUEU3PMdLs9ua/CYZl1678NUkKOdUSi8Aw5F1idieaiRURCBFJCwVcrD1J8Iy3vfWSloaMwO2qFg==} dependencies: wcwidth: 1.0.1 dev: true - /brorand/1.1.0: + /brorand@1.1.0: resolution: {integrity: sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==} - /browser-level/1.0.1: + /browser-level@1.0.1: resolution: {integrity: sha512-XECYKJ+Dbzw0lbydyQuJzwNXtOpbMSq737qxJN11sIRTErOMShvDpbzTlgju7orJKvx4epULolZAuJGLzCmWRQ==} dependencies: abstract-level: 1.0.3 @@ -2554,11 +2605,11 @@ packages: run-parallel-limit: 1.1.0 dev: true - /browser-stdout/1.3.1: + /browser-stdout@1.3.1: resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==} dev: true - /browserify-aes/1.2.0: + /browserify-aes@1.2.0: resolution: {integrity: sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==} dependencies: buffer-xor: 1.0.3 @@ -2569,7 +2620,7 @@ packages: safe-buffer: 5.2.1 dev: true - /browserslist/4.21.3: + /browserslist@4.21.3: resolution: {integrity: sha512-898rgRXLAyRkM1GryrrBHGkqA5hlpkV5MhtZwg9QXeiyLUYs2k00Un05aX5l2/yJIOObYKOpS2JNo8nJDE7fWQ==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true @@ -2577,16 +2628,16 @@ packages: caniuse-lite: 1.0.30001374 electron-to-chromium: 1.4.211 node-releases: 2.0.6 - update-browserslist-db: 1.0.5_browserslist@4.21.3 + update-browserslist-db: 1.0.5(browserslist@4.21.3) dev: true - /bs58/4.0.1: + /bs58@4.0.1: resolution: {integrity: sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==} dependencies: base-x: 3.0.9 dev: true - /bs58check/2.1.2: + /bs58check@2.1.2: resolution: {integrity: sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==} dependencies: bs58: 4.0.1 @@ -2594,32 +2645,32 @@ packages: safe-buffer: 5.2.1 dev: true - /bser/2.1.1: + /bser@2.1.1: resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} dependencies: node-int64: 0.4.0 dev: true - /buffer-from/1.1.2: + /buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} dev: true - /buffer-reverse/1.0.1: + /buffer-reverse@1.0.1: resolution: {integrity: sha512-M87YIUBsZ6N924W57vDwT/aOu8hw7ZgdByz6ijksLjmHJELBASmYTTlNHRgjE+pTsT9oJXGaDSgqqwfdHotDUg==} dev: true - /buffer-xor/1.0.3: + /buffer-xor@1.0.3: resolution: {integrity: sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==} dev: true - /buffer/6.0.3: + /buffer@6.0.3: resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} dependencies: base64-js: 1.5.1 ieee754: 1.2.1 dev: true - /bundle-require/3.0.4_esbuild@0.14.53: + /bundle-require@3.0.4(esbuild@0.14.53): resolution: {integrity: sha512-VXG6epB1yrLAvWVQpl92qF347/UXmncQj7J3U8kZEbdVZ1ZkQyr4hYeL/9RvcE8vVVdp53dY78Fd/3pqfRqI1A==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} peerDependencies: @@ -2629,53 +2680,53 @@ packages: load-tsconfig: 0.2.3 dev: true - /bytes/3.1.2: + /bytes@3.1.2: resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} engines: {node: '>= 0.8'} dev: true - /cac/6.7.12: + /cac@6.7.12: resolution: {integrity: sha512-rM7E2ygtMkJqD9c7WnFU6fruFcN3xe4FM5yUmgxhZzIKJk4uHl9U/fhwdajGFQbQuv43FAUo1Fe8gX/oIKDeSA==} engines: {node: '>=8'} dev: true - /call-bind/1.0.2: + /call-bind@1.0.2: resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} dependencies: function-bind: 1.1.1 get-intrinsic: 1.1.2 dev: true - /caller-callsite/2.0.0: + /caller-callsite@2.0.0: resolution: {integrity: sha512-JuG3qI4QOftFsZyOn1qq87fq5grLIyk1JYd5lJmdA+fG7aQ9pA/i3JIJGcO3q0MrRcHlOt1U+ZeHW8Dq9axALQ==} engines: {node: '>=4'} dependencies: callsites: 2.0.0 dev: true - /caller-path/2.0.0: + /caller-path@2.0.0: resolution: {integrity: sha512-MCL3sf6nCSXOwCTzvPKhN18TU7AHTvdtam8DAogxcrJ8Rjfbbg7Lgng64H9Iy+vUV6VGFClN/TyxBkAebLRR4A==} engines: {node: '>=4'} dependencies: caller-callsite: 2.0.0 dev: true - /callsites/2.0.0: + /callsites@2.0.0: resolution: {integrity: sha512-ksWePWBloaWPxJYQ8TL0JHvtci6G5QTKwQ95RcWAa/lzoAKuAOflGdAK92hpHXjkwb8zLxoLNUoNYZgVsaJzvQ==} engines: {node: '>=4'} dev: true - /callsites/3.1.0: + /callsites@3.1.0: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} dev: true - /camelcase-css/2.0.1: + /camelcase-css@2.0.1: resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} engines: {node: '>= 6'} dev: true - /camelcase-keys/6.2.2: + /camelcase-keys@6.2.2: resolution: {integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==} engines: {node: '>=8'} dependencies: @@ -2684,26 +2735,26 @@ packages: quick-lru: 4.0.1 dev: true - /camelcase/5.3.1: + /camelcase@5.3.1: resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} engines: {node: '>=6'} dev: true - /camelcase/6.3.0: + /camelcase@6.3.0: resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} engines: {node: '>=10'} dev: true - /caniuse-lite/1.0.30001374: + /caniuse-lite@1.0.30001374: resolution: {integrity: sha512-mWvzatRx3w+j5wx/mpFN5v5twlPrabG8NqX2c6e45LCpymdoGqNvRkRutFUqpRTXKFQFNQJasvK0YT7suW6/Hw==} dev: true - /catering/2.1.1: + /catering@2.1.1: resolution: {integrity: sha512-K7Qy8O9p76sL3/3m7/zLKbRkyOlSZAgzEaLhyj2mXS8PsCud2Eo4hAb8aLtZqHh0QGqLcb9dlJSu6lHRVENm1w==} engines: {node: '>=6'} dev: true - /cbor/5.2.0: + /cbor@5.2.0: resolution: {integrity: sha512-5IMhi9e1QU76ppa5/ajP1BmMWZ2FHkhAhjeVKQ/EFCgYSEaeVaoGtL7cxJskf9oCCk+XjzaIdc3IuU/dbA/o2A==} engines: {node: '>=6.0.0'} dependencies: @@ -2711,7 +2762,7 @@ packages: nofilter: 1.0.4 dev: true - /chalk/2.4.2: + /chalk@2.4.2: resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} engines: {node: '>=4'} dependencies: @@ -2720,7 +2771,7 @@ packages: supports-color: 5.5.0 dev: true - /chalk/4.1.2: + /chalk@4.1.2: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} dependencies: @@ -2728,16 +2779,16 @@ packages: supports-color: 7.2.0 dev: true - /char-regex/1.0.2: + /char-regex@1.0.2: resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} engines: {node: '>=10'} dev: true - /chardet/0.7.0: + /chardet@0.7.0: resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} dev: true - /chokidar/3.5.3: + /chokidar@3.5.3: resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} engines: {node: '>= 8.10.0'} dependencies: @@ -2752,26 +2803,26 @@ packages: fsevents: 2.3.2 dev: true - /ci-info/2.0.0: + /ci-info@2.0.0: resolution: {integrity: sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==} dev: true - /ci-info/3.3.2: + /ci-info@3.3.2: resolution: {integrity: sha512-xmDt/QIAdeZ9+nfdPsaBCpMvHNLFiLdjj59qjqn+6iPe6YmHGQ35sBnQ8uslRBXFmXkiZQOJRjvQeoGppoTjjg==} dev: true - /cipher-base/1.0.4: + /cipher-base@1.0.4: resolution: {integrity: sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==} dependencies: inherits: 2.0.4 safe-buffer: 5.2.1 dev: true - /cjs-module-lexer/1.2.2: + /cjs-module-lexer@1.2.2: resolution: {integrity: sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==} dev: true - /classic-level/1.2.0: + /classic-level@1.2.0: resolution: {integrity: sha512-qw5B31ANxSluWz9xBzklRWTUAJ1SXIdaVKTVS7HcTGKOAmExx65Wo5BUICW+YGORe2FOUaDghoI9ZDxj82QcFg==} engines: {node: '>=12'} requiresBuild: true @@ -2783,19 +2834,19 @@ packages: node-gyp-build: 4.5.0 dev: true - /clean-stack/2.2.0: + /clean-stack@2.2.0: resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} engines: {node: '>=6'} dev: true - /cli-cursor/2.1.0: + /cli-cursor@2.1.0: resolution: {integrity: sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==} engines: {node: '>=4'} dependencies: restore-cursor: 2.0.0 dev: true - /cli-table3/0.6.2: + /cli-table3@0.6.2: resolution: {integrity: sha512-QyavHCaIC80cMivimWu4aWHilIpiDpfm3hGmqAmXVL1UsnbLuBSMd21hTX6VY4ZSDSM73ESLeF8TOYId3rBTbw==} engines: {node: 10.* || >= 12.*} dependencies: @@ -2804,11 +2855,11 @@ packages: '@colors/colors': 1.5.0 dev: true - /cli-width/2.2.1: + /cli-width@2.2.1: resolution: {integrity: sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==} dev: true - /cliui/6.0.0: + /cliui@6.0.0: resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==} dependencies: string-width: 4.2.3 @@ -2816,7 +2867,7 @@ packages: wrap-ansi: 6.2.0 dev: true - /cliui/7.0.4: + /cliui@7.0.4: resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} dependencies: string-width: 4.2.3 @@ -2824,86 +2875,86 @@ packages: wrap-ansi: 7.0.0 dev: true - /clone/1.0.4: + /clone@1.0.4: resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} engines: {node: '>=0.8'} dev: true - /co/4.6.0: + /co@4.6.0: resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} dev: true - /collect-v8-coverage/1.0.1: + /collect-v8-coverage@1.0.1: resolution: {integrity: sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==} dev: true - /color-convert/1.9.3: + /color-convert@1.9.3: resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} dependencies: color-name: 1.1.3 dev: true - /color-convert/2.0.1: + /color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} engines: {node: '>=7.0.0'} dependencies: color-name: 1.1.4 dev: true - /color-name/1.1.3: + /color-name@1.1.3: resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} dev: true - /color-name/1.1.4: + /color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} dev: true - /combined-stream/1.0.8: + /combined-stream@1.0.8: resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} engines: {node: '>= 0.8'} dependencies: delayed-stream: 1.0.0 dev: true - /command-exists/1.2.9: + /command-exists@1.2.9: resolution: {integrity: sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==} dev: true - /commander/2.18.0: + /commander@2.18.0: resolution: {integrity: sha512-6CYPa+JP2ftfRU2qkDK+UTVeQYosOg/2GbcjIcKPHfinyOLPVGXu/ovN86RP49Re5ndJK1N0kuiidFFuepc4ZQ==} dev: true - /commander/3.0.2: + /commander@3.0.2: resolution: {integrity: sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow==} dev: true - /commander/4.1.1: + /commander@4.1.1: resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} engines: {node: '>= 6'} dev: true - /concat-map/0.0.1: + /concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} dev: true - /convert-source-map/1.8.0: + /convert-source-map@1.8.0: resolution: {integrity: sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==} dependencies: safe-buffer: 5.1.2 dev: true - /cookie/0.4.2: + /cookie@0.4.2: resolution: {integrity: sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==} engines: {node: '>= 0.6'} dev: true - /core-js-pure/3.24.1: + /core-js-pure@3.24.1: resolution: {integrity: sha512-r1nJk41QLLPyozHUUPmILCEMtMw24NG4oWK6RbsDdjzQgg9ZvrUsPBj1MnG0wXXp1DCDU6j+wUvEmBSrtRbLXg==} requiresBuild: true dev: true - /cosmiconfig/5.2.1: + /cosmiconfig@5.2.1: resolution: {integrity: sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==} engines: {node: '>=4'} dependencies: @@ -2913,13 +2964,13 @@ packages: parse-json: 4.0.0 dev: true - /crc-32/1.2.2: + /crc-32@1.2.2: resolution: {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==} engines: {node: '>=0.8'} hasBin: true dev: true - /create-hash/1.2.0: + /create-hash@1.2.0: resolution: {integrity: sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==} dependencies: cipher-base: 1.0.4 @@ -2929,7 +2980,7 @@ packages: sha.js: 2.4.11 dev: true - /create-hmac/1.1.7: + /create-hmac@1.1.7: resolution: {integrity: sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==} dependencies: cipher-base: 1.0.4 @@ -2940,11 +2991,11 @@ packages: sha.js: 2.4.11 dev: true - /create-require/1.1.1: + /create-require@1.1.1: resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} dev: true - /cross-env/7.0.3: + /cross-env@7.0.3: resolution: {integrity: sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==} engines: {node: '>=10.14', npm: '>=6', yarn: '>=1'} hasBin: true @@ -2952,7 +3003,7 @@ packages: cross-spawn: 7.0.3 dev: true - /cross-spawn/5.1.0: + /cross-spawn@5.1.0: resolution: {integrity: sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==} dependencies: lru-cache: 4.1.5 @@ -2960,7 +3011,7 @@ packages: which: 1.3.1 dev: true - /cross-spawn/6.0.5: + /cross-spawn@6.0.5: resolution: {integrity: sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==} engines: {node: '>=4.8'} dependencies: @@ -2971,7 +3022,7 @@ packages: which: 1.3.1 dev: true - /cross-spawn/7.0.3: + /cross-spawn@7.0.3: resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} engines: {node: '>= 8'} dependencies: @@ -2980,29 +3031,29 @@ packages: which: 2.0.2 dev: true - /crypto-js/3.3.0: + /crypto-js@3.3.0: resolution: {integrity: sha512-DIT51nX0dCfKltpRiXV+/TVZq+Qq2NgF4644+K7Ttnla7zEzqc+kjJyiB96BHNyUTBxyjzRcZYpUdZa+QAqi6Q==} dev: true - /cssesc/3.0.0: + /cssesc@3.0.0: resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} engines: {node: '>=4'} hasBin: true dev: true - /csv-generate/3.4.3: + /csv-generate@3.4.3: resolution: {integrity: sha512-w/T+rqR0vwvHqWs/1ZyMDWtHHSJaN06klRqJXBEpDJaM/+dZkso0OKh1VcuuYvK3XM53KysVNq8Ko/epCK8wOw==} dev: true - /csv-parse/4.16.3: + /csv-parse@4.16.3: resolution: {integrity: sha512-cO1I/zmz4w2dcKHVvpCr7JVRu8/FymG5OEpmvsZYlccYolPBLoVGKUHgNoc4ZGkFeFlWGEDmMyBM+TTqRdW/wg==} dev: true - /csv-stringify/5.6.5: + /csv-stringify@5.6.5: resolution: {integrity: sha512-PjiQ659aQ+fUTQqSrd1XEDnOr52jh30RBurfzkscaE2tPaFsDH5wOAHJiw8XAHphRknCwMUE9KRayc4K/NbO8A==} dev: true - /csv/5.5.3: + /csv@5.5.3: resolution: {integrity: sha512-QTaY0XjjhTQOdguARF0lGKm5/mEq9PD9/VhZZegHDIBq2tQwgNpHc3dneD4mGo2iJs+fTKv5Bp0fZ+BRuY3Z0g==} engines: {node: '>= 0.1.90'} dependencies: @@ -3012,23 +3063,11 @@ packages: stream-transform: 2.1.3 dev: true - /damerau-levenshtein/1.0.8: + /damerau-levenshtein@1.0.8: resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} dev: true - /debug/4.3.4: - resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - dependencies: - ms: 2.1.2 - dev: true - - /debug/4.3.4_supports-color@8.1.1: + /debug@4.3.4(supports-color@8.1.1): resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} engines: {node: '>=6.0'} peerDependencies: @@ -3041,7 +3080,7 @@ packages: supports-color: 8.1.1 dev: true - /decamelize-keys/1.1.0: + /decamelize-keys@1.1.0: resolution: {integrity: sha512-ocLWuYzRPoS9bfiSdDd3cxvrzovVMZnRDVEzAs+hWIVXGDbHxWMECij2OBuyB/An0FFW/nLuq6Kv1i/YC5Qfzg==} engines: {node: '>=0.10.0'} dependencies: @@ -3049,40 +3088,40 @@ packages: map-obj: 1.0.1 dev: true - /decamelize/1.2.0: + /decamelize@1.2.0: resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} engines: {node: '>=0.10.0'} dev: true - /decamelize/4.0.0: + /decamelize@4.0.0: resolution: {integrity: sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==} engines: {node: '>=10'} dev: true - /decimal.js/10.3.1: + /decimal.js@10.3.1: resolution: {integrity: sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ==} dev: false - /dedent/0.7.0: + /dedent@0.7.0: resolution: {integrity: sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==} dev: true - /deep-is/0.1.4: + /deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} dev: true - /deepmerge/4.2.2: + /deepmerge@4.2.2: resolution: {integrity: sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==} engines: {node: '>=0.10.0'} dev: true - /defaults/1.0.3: + /defaults@1.0.3: resolution: {integrity: sha512-s82itHOnYrN0Ib8r+z7laQz3sdE+4FP3d9Q7VLO7U+KRT+CR0GsWuyHxzdAY82I7cXv0G/twrqomTJLOssO5HA==} dependencies: clone: 1.0.4 dev: true - /define-properties/1.1.4: + /define-properties@1.1.4: resolution: {integrity: sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==} engines: {node: '>= 0.4'} dependencies: @@ -3090,31 +3129,31 @@ packages: object-keys: 1.1.1 dev: true - /defined/1.0.0: + /defined@1.0.0: resolution: {integrity: sha512-Y2caI5+ZwS5c3RiNDJ6u53VhQHv+hHKwhkI1iHvceKUHw9Df6EK2zRLfjejRgMuCuxK7PfSWIMwWecceVvThjQ==} dev: true - /delayed-stream/1.0.0: + /delayed-stream@1.0.0: resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} engines: {node: '>=0.4.0'} dev: true - /depd/2.0.0: + /depd@2.0.0: resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} engines: {node: '>= 0.8'} dev: true - /detect-indent/6.1.0: + /detect-indent@6.1.0: resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} engines: {node: '>=8'} dev: true - /detect-newline/3.1.0: + /detect-newline@3.1.0: resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} engines: {node: '>=8'} dev: true - /detective/5.2.1: + /detective@5.2.1: resolution: {integrity: sha512-v9XE1zRnz1wRtgurGu0Bs8uHKFSTdteYZNbIPFVhUZ39L/S79ppMpdmVOZAnoz1jfEFodc48n6MX483Xo3t1yw==} engines: {node: '>=0.8.0'} hasBin: true @@ -3124,60 +3163,60 @@ packages: minimist: 1.2.6 dev: true - /didyoumean/1.2.2: + /didyoumean@1.2.2: resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} dev: true - /diff-sequences/28.1.1: + /diff-sequences@28.1.1: resolution: {integrity: sha512-FU0iFaH/E23a+a718l8Qa/19bF9p06kgE0KipMOMadwa3SjnaElKzPaUC0vnibs6/B/9ni97s61mcejk8W1fQw==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} dev: true - /diff/4.0.2: + /diff@4.0.2: resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} engines: {node: '>=0.3.1'} dev: true - /diff/5.0.0: + /diff@5.0.0: resolution: {integrity: sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==} engines: {node: '>=0.3.1'} dev: true - /dir-glob/3.0.1: + /dir-glob@3.0.1: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} dependencies: path-type: 4.0.0 dev: true - /dlv/1.1.3: + /dlv@1.1.3: resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} dev: true - /doctrine/2.1.0: + /doctrine@2.1.0: resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} engines: {node: '>=0.10.0'} dependencies: esutils: 2.0.3 dev: true - /doctrine/3.0.0: + /doctrine@3.0.0: resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} engines: {node: '>=6.0.0'} dependencies: esutils: 2.0.3 dev: true - /dotenv/16.0.1: + /dotenv@16.0.1: resolution: {integrity: sha512-1K6hR6wtk2FviQ4kEiSjFiH5rpzEVi8WW0x96aztHVMhEspNpc4DVOUTEHtEva5VThQ8IaBX1Pe4gSzpVVUsKQ==} engines: {node: '>=12'} dev: true - /electron-to-chromium/1.4.211: + /electron-to-chromium@1.4.211: resolution: {integrity: sha512-BZSbMpyFQU0KBJ1JG26XGeFI3i4op+qOYGxftmZXFZoHkhLgsSv4DHDJfl8ogII3hIuzGt51PaZ195OVu0yJ9A==} dev: true - /elliptic/6.5.4: + /elliptic@6.5.4: resolution: {integrity: sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==} dependencies: bn.js: 4.12.0 @@ -3188,50 +3227,50 @@ packages: minimalistic-assert: 1.0.1 minimalistic-crypto-utils: 1.0.1 - /emittery/0.10.2: + /emittery@0.10.2: resolution: {integrity: sha512-aITqOwnLanpHLNXZJENbOgjUBeHocD+xsSJmNrjovKBW5HbSpW3d1pEls7GFQPUWXiwG9+0P4GtHfEqC/4M0Iw==} engines: {node: '>=12'} dev: true - /emoji-regex/10.1.0: + /emoji-regex@10.1.0: resolution: {integrity: sha512-xAEnNCT3w2Tg6MA7ly6QqYJvEoY1tm9iIjJ3yMKK9JPlWuRHAMoe5iETwQnx3M9TVbFMfsrBgWKR+IsmswwNjg==} dev: true - /emoji-regex/7.0.3: + /emoji-regex@7.0.3: resolution: {integrity: sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==} dev: true - /emoji-regex/8.0.0: + /emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} dev: true - /emoji-regex/9.2.2: + /emoji-regex@9.2.2: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} dev: true - /encode-utf8/1.0.3: + /encode-utf8@1.0.3: resolution: {integrity: sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw==} dev: true - /enquirer/2.3.6: + /enquirer@2.3.6: resolution: {integrity: sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==} engines: {node: '>=8.6'} dependencies: ansi-colors: 4.1.3 dev: true - /env-paths/2.2.1: + /env-paths@2.2.1: resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} engines: {node: '>=6'} dev: true - /error-ex/1.3.2: + /error-ex@1.3.2: resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} dependencies: is-arrayish: 0.2.1 dev: true - /es-abstract/1.20.1: + /es-abstract@1.20.1: resolution: {integrity: sha512-WEm2oBhfoI2sImeM4OF2zE2V3BYdSF+KnSi9Sidz51fQHd7+JuF8Xgcj9/0o+OWeIeIS/MiuNnlruQrJf16GQA==} engines: {node: '>= 0.4'} dependencies: @@ -3260,13 +3299,13 @@ packages: unbox-primitive: 1.0.2 dev: true - /es-shim-unscopables/1.0.0: + /es-shim-unscopables@1.0.0: resolution: {integrity: sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==} dependencies: has: 1.0.3 dev: true - /es-to-primitive/1.2.1: + /es-to-primitive@1.2.1: resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} engines: {node: '>= 0.4'} dependencies: @@ -3275,7 +3314,7 @@ packages: is-symbol: 1.0.4 dev: true - /esbuild-android-64/0.14.53: + /esbuild-android-64@0.14.53: resolution: {integrity: sha512-fIL93sOTnEU+NrTAVMIKiAw0YH22HWCAgg4N4Z6zov2t0kY9RAJ50zY9ZMCQ+RT6bnOfDt8gCTnt/RaSNA2yRA==} engines: {node: '>=12'} cpu: [x64] @@ -3284,7 +3323,7 @@ packages: dev: true optional: true - /esbuild-android-arm64/0.14.53: + /esbuild-android-arm64@0.14.53: resolution: {integrity: sha512-PC7KaF1v0h/nWpvlU1UMN7dzB54cBH8qSsm7S9mkwFA1BXpaEOufCg8hdoEI1jep0KeO/rjZVWrsH8+q28T77A==} engines: {node: '>=12'} cpu: [arm64] @@ -3293,7 +3332,7 @@ packages: dev: true optional: true - /esbuild-darwin-64/0.14.53: + /esbuild-darwin-64@0.14.53: resolution: {integrity: sha512-gE7P5wlnkX4d4PKvLBUgmhZXvL7lzGRLri17/+CmmCzfncIgq8lOBvxGMiQ4xazplhxq+72TEohyFMZLFxuWvg==} engines: {node: '>=12'} cpu: [x64] @@ -3302,7 +3341,7 @@ packages: dev: true optional: true - /esbuild-darwin-arm64/0.14.53: + /esbuild-darwin-arm64@0.14.53: resolution: {integrity: sha512-otJwDU3hnI15Q98PX4MJbknSZ/WSR1I45il7gcxcECXzfN4Mrpft5hBDHXNRnCh+5858uPXBXA1Vaz2jVWLaIA==} engines: {node: '>=12'} cpu: [arm64] @@ -3311,7 +3350,7 @@ packages: dev: true optional: true - /esbuild-freebsd-64/0.14.53: + /esbuild-freebsd-64@0.14.53: resolution: {integrity: sha512-WkdJa8iyrGHyKiPF4lk0MiOF87Q2SkE+i+8D4Cazq3/iqmGPJ6u49je300MFi5I2eUsQCkaOWhpCVQMTKGww2w==} engines: {node: '>=12'} cpu: [x64] @@ -3320,7 +3359,7 @@ packages: dev: true optional: true - /esbuild-freebsd-arm64/0.14.53: + /esbuild-freebsd-arm64@0.14.53: resolution: {integrity: sha512-9T7WwCuV30NAx0SyQpw8edbKvbKELnnm1FHg7gbSYaatH+c8WJW10g/OdM7JYnv7qkimw2ZTtSA+NokOLd2ydQ==} engines: {node: '>=12'} cpu: [arm64] @@ -3329,7 +3368,7 @@ packages: dev: true optional: true - /esbuild-linux-32/0.14.53: + /esbuild-linux-32@0.14.53: resolution: {integrity: sha512-VGanLBg5en2LfGDgLEUxQko2lqsOS7MTEWUi8x91YmsHNyzJVT/WApbFFx3MQGhkf+XdimVhpyo5/G0PBY91zg==} engines: {node: '>=12'} cpu: [ia32] @@ -3338,7 +3377,7 @@ packages: dev: true optional: true - /esbuild-linux-64/0.14.53: + /esbuild-linux-64@0.14.53: resolution: {integrity: sha512-pP/FA55j/fzAV7N9DF31meAyjOH6Bjuo3aSKPh26+RW85ZEtbJv9nhoxmGTd9FOqjx59Tc1ZbrJabuiXlMwuZQ==} engines: {node: '>=12'} cpu: [x64] @@ -3347,25 +3386,25 @@ packages: dev: true optional: true - /esbuild-linux-arm/0.14.53: - resolution: {integrity: sha512-/u81NGAVZMopbmzd21Nu/wvnKQK3pT4CrvQ8BTje1STXcQAGnfyKgQlj3m0j2BzYbvQxSy+TMck4TNV2onvoPA==} + /esbuild-linux-arm64@0.14.53: + resolution: {integrity: sha512-GDmWITT+PMsjCA6/lByYk7NyFssW4Q6in32iPkpjZ/ytSyH+xeEx8q7HG3AhWH6heemEYEWpTll/eui3jwlSnw==} engines: {node: '>=12'} - cpu: [arm] + cpu: [arm64] os: [linux] requiresBuild: true dev: true optional: true - /esbuild-linux-arm64/0.14.53: - resolution: {integrity: sha512-GDmWITT+PMsjCA6/lByYk7NyFssW4Q6in32iPkpjZ/ytSyH+xeEx8q7HG3AhWH6heemEYEWpTll/eui3jwlSnw==} + /esbuild-linux-arm@0.14.53: + resolution: {integrity: sha512-/u81NGAVZMopbmzd21Nu/wvnKQK3pT4CrvQ8BTje1STXcQAGnfyKgQlj3m0j2BzYbvQxSy+TMck4TNV2onvoPA==} engines: {node: '>=12'} - cpu: [arm64] + cpu: [arm] os: [linux] requiresBuild: true dev: true optional: true - /esbuild-linux-mips64le/0.14.53: + /esbuild-linux-mips64le@0.14.53: resolution: {integrity: sha512-d6/XHIQW714gSSp6tOOX2UscedVobELvQlPMkInhx1NPz4ThZI9uNLQ4qQJHGBGKGfu+rtJsxM4NVHLhnNRdWQ==} engines: {node: '>=12'} cpu: [mips64el] @@ -3374,7 +3413,7 @@ packages: dev: true optional: true - /esbuild-linux-ppc64le/0.14.53: + /esbuild-linux-ppc64le@0.14.53: resolution: {integrity: sha512-ndnJmniKPCB52m+r6BtHHLAOXw+xBCWIxNnedbIpuREOcbSU/AlyM/2dA3BmUQhsHdb4w3amD5U2s91TJ3MzzA==} engines: {node: '>=12'} cpu: [ppc64] @@ -3383,7 +3422,7 @@ packages: dev: true optional: true - /esbuild-linux-riscv64/0.14.53: + /esbuild-linux-riscv64@0.14.53: resolution: {integrity: sha512-yG2sVH+QSix6ct4lIzJj329iJF3MhloLE6/vKMQAAd26UVPVkhMFqFopY+9kCgYsdeWvXdPgmyOuKa48Y7+/EQ==} engines: {node: '>=12'} cpu: [riscv64] @@ -3392,7 +3431,7 @@ packages: dev: true optional: true - /esbuild-linux-s390x/0.14.53: + /esbuild-linux-s390x@0.14.53: resolution: {integrity: sha512-OCJlgdkB+XPYndHmw6uZT7jcYgzmx9K+28PVdOa/eLjdoYkeAFvH5hTwX4AXGLZLH09tpl4bVsEtvuyUldaNCg==} engines: {node: '>=12'} cpu: [s390x] @@ -3401,7 +3440,7 @@ packages: dev: true optional: true - /esbuild-netbsd-64/0.14.53: + /esbuild-netbsd-64@0.14.53: resolution: {integrity: sha512-gp2SB+Efc7MhMdWV2+pmIs/Ja/Mi5rjw+wlDmmbIn68VGXBleNgiEZG+eV2SRS0kJEUyHNedDtwRIMzaohWedQ==} engines: {node: '>=12'} cpu: [x64] @@ -3410,7 +3449,7 @@ packages: dev: true optional: true - /esbuild-openbsd-64/0.14.53: + /esbuild-openbsd-64@0.14.53: resolution: {integrity: sha512-eKQ30ZWe+WTZmteDYg8S+YjHV5s4iTxeSGhJKJajFfQx9TLZJvsJX0/paqwP51GicOUruFpSUAs2NCc0a4ivQQ==} engines: {node: '>=12'} cpu: [x64] @@ -3419,7 +3458,7 @@ packages: dev: true optional: true - /esbuild-sunos-64/0.14.53: + /esbuild-sunos-64@0.14.53: resolution: {integrity: sha512-OWLpS7a2FrIRukQqcgQqR1XKn0jSJoOdT+RlhAxUoEQM/IpytS3FXzCJM6xjUYtpO5GMY0EdZJp+ur2pYdm39g==} engines: {node: '>=12'} cpu: [x64] @@ -3428,7 +3467,7 @@ packages: dev: true optional: true - /esbuild-windows-32/0.14.53: + /esbuild-windows-32@0.14.53: resolution: {integrity: sha512-m14XyWQP5rwGW0tbEfp95U6A0wY0DYPInWBB7D69FAXUpBpBObRoGTKRv36lf2RWOdE4YO3TNvj37zhXjVL5xg==} engines: {node: '>=12'} cpu: [ia32] @@ -3437,7 +3476,7 @@ packages: dev: true optional: true - /esbuild-windows-64/0.14.53: + /esbuild-windows-64@0.14.53: resolution: {integrity: sha512-s9skQFF0I7zqnQ2K8S1xdLSfZFsPLuOGmSx57h2btSEswv0N0YodYvqLcJMrNMXh6EynOmWD7rz+0rWWbFpIHQ==} engines: {node: '>=12'} cpu: [x64] @@ -3446,7 +3485,7 @@ packages: dev: true optional: true - /esbuild-windows-arm64/0.14.53: + /esbuild-windows-arm64@0.14.53: resolution: {integrity: sha512-E+5Gvb+ZWts+00T9II6wp2L3KG2r3iGxByqd/a1RmLmYWVsSVUjkvIxZuJ3hYTIbhLkH5PRwpldGTKYqVz0nzQ==} engines: {node: '>=12'} cpu: [arm64] @@ -3455,7 +3494,7 @@ packages: dev: true optional: true - /esbuild/0.14.53: + /esbuild@0.14.53: resolution: {integrity: sha512-ohO33pUBQ64q6mmheX1mZ8mIXj8ivQY/L4oVuAshr+aJI+zLl+amrp3EodrUNDNYVrKJXGPfIHFGhO8slGRjuw==} engines: {node: '>=12'} hasBin: true @@ -3484,27 +3523,27 @@ packages: esbuild-windows-arm64: 0.14.53 dev: true - /escalade/3.1.1: + /escalade@3.1.1: resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} engines: {node: '>=6'} dev: true - /escape-string-regexp/1.0.5: + /escape-string-regexp@1.0.5: resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} engines: {node: '>=0.8.0'} dev: true - /escape-string-regexp/2.0.0: + /escape-string-regexp@2.0.0: resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} engines: {node: '>=8'} dev: true - /escape-string-regexp/4.0.0: + /escape-string-regexp@4.0.0: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} dev: true - /eslint-config-prettier/8.5.0_eslint@8.21.0: + /eslint-config-prettier@8.5.0(eslint@8.21.0): resolution: {integrity: sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==} hasBin: true peerDependencies: @@ -3513,7 +3552,7 @@ packages: eslint: 8.21.0 dev: true - /eslint-plugin-jsx-a11y/6.6.1_eslint@8.21.0: + /eslint-plugin-jsx-a11y@6.6.1(eslint@8.21.0): resolution: {integrity: sha512-sXgFVNHiWffBq23uiS/JaP6eVR622DqwB4yTzKvGZGcPq6/yZ3WmOZfuBks/vHWo9GaFOqC2ZK4i6+C35knx7Q==} engines: {node: '>=4.0'} peerDependencies: @@ -3535,7 +3574,7 @@ packages: semver: 6.3.0 dev: true - /eslint-plugin-react-hooks/4.6.0_eslint@8.21.0: + /eslint-plugin-react-hooks@4.6.0(eslint@8.21.0): resolution: {integrity: sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==} engines: {node: '>=10'} peerDependencies: @@ -3544,7 +3583,7 @@ packages: eslint: 8.21.0 dev: true - /eslint-plugin-react/7.30.1_eslint@8.21.0: + /eslint-plugin-react@7.30.1(eslint@8.21.0): resolution: {integrity: sha512-NbEvI9jtqO46yJA3wcRF9Mo0lF9T/jhdHqhCHXiXtD+Zcb98812wvokjWpU7Q4QH5edo6dmqrukxVvWWXHlsUg==} engines: {node: '>=4'} peerDependencies: @@ -3567,13 +3606,13 @@ packages: string.prototype.matchall: 4.0.7 dev: true - /eslint-plugin-security/1.5.0: + /eslint-plugin-security@1.5.0: resolution: {integrity: sha512-hAFVwLZ/UeXrlyVD2TDarv/x00CoFVpaY0IUZhKjPjiFxqkuQVixsK4f2rxngeQOqSxi6OUjzJM/jMwKEVjJ8g==} dependencies: safe-regex: 2.1.1 dev: true - /eslint-plugin-simple-import-sort/7.0.0_eslint@8.21.0: + /eslint-plugin-simple-import-sort@7.0.0(eslint@8.21.0): resolution: {integrity: sha512-U3vEDB5zhYPNfxT5TYR7u01dboFZp+HNpnGhkDB2g/2E4wZ/g1Q9Ton8UwCLfRV9yAKyYqDh62oHOamvkFxsvw==} peerDependencies: eslint: '>=5.0.0' @@ -3581,18 +3620,18 @@ packages: eslint: 8.21.0 dev: true - /eslint-plugin-tailwindcss/3.6.0_ts-node@10.9.1: + /eslint-plugin-tailwindcss@3.6.0(ts-node@10.9.1): resolution: {integrity: sha512-gWLGNWHuhh5ngwkJ2sgSByanpRw2s5GdrM2ff2/w8Ho2mWh2MyGvpnFZpL4b0XT/C0WF9zlq57+vFHJOeFhMkg==} engines: {node: '>=12.13.0'} dependencies: fast-glob: 3.2.11 postcss: 8.4.14 - tailwindcss: 3.1.7_pe6iykxod2v7i2uk6okjazxzki + tailwindcss: 3.1.7(postcss@8.4.14)(ts-node@10.9.1) transitivePeerDependencies: - ts-node dev: true - /eslint-plugin-unused-imports/2.0.0_i7ihj7mda6acsfp32zwgvvndem: + /eslint-plugin-unused-imports@2.0.0(@typescript-eslint/eslint-plugin@5.32.0)(eslint@8.21.0): resolution: {integrity: sha512-3APeS/tQlTrFa167ThtP0Zm0vctjr4M44HMpeg1P4bK6wItarumq0Ma82xorMKdFsWpphQBlRPzw/pxiVELX1A==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -3602,17 +3641,17 @@ packages: '@typescript-eslint/eslint-plugin': optional: true dependencies: - '@typescript-eslint/eslint-plugin': 5.32.0_iosr3hrei2tubxveewluhu5lhy + '@typescript-eslint/eslint-plugin': 5.32.0(@typescript-eslint/parser@5.32.0)(eslint@8.21.0)(typescript@4.7.4) eslint: 8.21.0 eslint-rule-composer: 0.3.0 dev: true - /eslint-rule-composer/0.3.0: + /eslint-rule-composer@0.3.0: resolution: {integrity: sha512-bt+Sh8CtDmn2OajxvNO+BX7Wn4CIWMpTRm3MaiKPCQcnnlm0CS2mhui6QaoeQugs+3Kj2ESKEEGJUdVafwhiCg==} engines: {node: '>=4.0.0'} dev: true - /eslint-scope/4.0.3: + /eslint-scope@4.0.3: resolution: {integrity: sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==} engines: {node: '>=4.0.0'} dependencies: @@ -3620,7 +3659,7 @@ packages: estraverse: 4.3.0 dev: true - /eslint-scope/5.1.1: + /eslint-scope@5.1.1: resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} engines: {node: '>=8.0.0'} dependencies: @@ -3628,7 +3667,7 @@ packages: estraverse: 4.3.0 dev: true - /eslint-scope/7.1.1: + /eslint-scope@7.1.1: resolution: {integrity: sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: @@ -3636,14 +3675,14 @@ packages: estraverse: 5.3.0 dev: true - /eslint-utils/1.4.3: + /eslint-utils@1.4.3: resolution: {integrity: sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==} engines: {node: '>=6'} dependencies: eslint-visitor-keys: 1.3.0 dev: true - /eslint-utils/3.0.0_eslint@8.21.0: + /eslint-utils@3.0.0(eslint@8.21.0): resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==} engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0} peerDependencies: @@ -3653,22 +3692,22 @@ packages: eslint-visitor-keys: 2.1.0 dev: true - /eslint-visitor-keys/1.3.0: + /eslint-visitor-keys@1.3.0: resolution: {integrity: sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==} engines: {node: '>=4'} dev: true - /eslint-visitor-keys/2.1.0: + /eslint-visitor-keys@2.1.0: resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} engines: {node: '>=10'} dev: true - /eslint-visitor-keys/3.3.0: + /eslint-visitor-keys@3.3.0: resolution: {integrity: sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true - /eslint/5.16.0: + /eslint@5.16.0: resolution: {integrity: sha512-S3Rz11i7c8AA5JPv7xAH+dOyq/Cu/VXHiHXBPOU1k/JAM5dXqQPt3qcrhpHSorXmrpu2g0gkIBVXAqCpzfoZIg==} engines: {node: ^6.14.0 || ^8.10.0 || >=9.10.0} hasBin: true @@ -3677,7 +3716,7 @@ packages: ajv: 6.12.6 chalk: 2.4.2 cross-spawn: 6.0.5 - debug: 4.3.4 + debug: 4.3.4(supports-color@8.1.1) doctrine: 3.0.0 eslint-scope: 4.0.3 eslint-utils: 1.4.3 @@ -3713,7 +3752,7 @@ packages: - supports-color dev: true - /eslint/8.21.0: + /eslint@8.21.0: resolution: {integrity: sha512-/XJ1+Qurf1T9G2M5IHrsjp+xrGT73RZf23xA1z5wB1ZzzEAWSZKvRwhWxTFp1rvkvCfwcvAUNAP31bhKTTGfDA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} hasBin: true @@ -3724,11 +3763,11 @@ packages: ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.3 - debug: 4.3.4 + debug: 4.3.4(supports-color@8.1.1) doctrine: 3.0.0 escape-string-regexp: 4.0.0 eslint-scope: 7.1.1 - eslint-utils: 3.0.0_eslint@8.21.0 + eslint-utils: 3.0.0(eslint@8.21.0) eslint-visitor-keys: 3.3.0 espree: 9.3.3 esquery: 1.4.0 @@ -3761,66 +3800,66 @@ packages: - supports-color dev: true - /espree/5.0.1: + /espree@5.0.1: resolution: {integrity: sha512-qWAZcWh4XE/RwzLJejfcofscgMc9CamR6Tn1+XRXNzrvUSSbiAjGOI/fggztjIi7y9VLPqnICMIPiGyr8JaZ0A==} engines: {node: '>=6.0.0'} dependencies: acorn: 6.4.2 - acorn-jsx: 5.3.2_acorn@6.4.2 + acorn-jsx: 5.3.2(acorn@6.4.2) eslint-visitor-keys: 1.3.0 dev: true - /espree/9.3.3: + /espree@9.3.3: resolution: {integrity: sha512-ORs1Rt/uQTqUKjDdGCyrtYxbazf5umATSf/K4qxjmZHORR6HJk+2s/2Pqe+Kk49HHINC/xNIrGfgh8sZcll0ng==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: acorn: 8.8.0 - acorn-jsx: 5.3.2_acorn@8.8.0 + acorn-jsx: 5.3.2(acorn@8.8.0) eslint-visitor-keys: 3.3.0 dev: true - /esprima/4.0.1: + /esprima@4.0.1: resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} engines: {node: '>=4'} hasBin: true dev: true - /esquery/1.4.0: + /esquery@1.4.0: resolution: {integrity: sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==} engines: {node: '>=0.10'} dependencies: estraverse: 5.3.0 dev: true - /esrecurse/4.3.0: + /esrecurse@4.3.0: resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} engines: {node: '>=4.0'} dependencies: estraverse: 5.3.0 dev: true - /estraverse/4.3.0: + /estraverse@4.3.0: resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} engines: {node: '>=4.0'} dev: true - /estraverse/5.3.0: + /estraverse@5.3.0: resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} engines: {node: '>=4.0'} dev: true - /esutils/2.0.3: + /esutils@2.0.3: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} dev: true - /ethereum-bloom-filters/1.0.10: + /ethereum-bloom-filters@1.0.10: resolution: {integrity: sha512-rxJ5OFN3RwjQxDcFP2Z5+Q9ho4eIdEmSc2ht0fCu8Se9nbXjZ7/031uXoUYJ87KHCOdVeiUuwSnoS7hmYAGVHA==} dependencies: js-sha3: 0.8.0 dev: true - /ethereum-cryptography/0.1.3: + /ethereum-cryptography@0.1.3: resolution: {integrity: sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==} dependencies: '@types/pbkdf2': 3.1.0 @@ -3840,7 +3879,7 @@ packages: setimmediate: 1.0.5 dev: true - /ethereum-cryptography/1.1.2: + /ethereum-cryptography@1.1.2: resolution: {integrity: sha512-XDSJlg4BD+hq9N2FjvotwUET9Tfxpxc3kWGE2AqUG5vcbeunnbImVk3cj6e/xT3phdW21mE8R5IugU4fspQDcQ==} dependencies: '@noble/hashes': 1.1.2 @@ -3849,14 +3888,14 @@ packages: '@scure/bip39': 1.1.0 dev: true - /ethereumjs-abi/0.6.8: + /ethereumjs-abi@0.6.8: resolution: {integrity: sha512-Tx0r/iXI6r+lRsdvkFDlut0N08jWMnKRZ6Gkq+Nmw75lZe4e6o3EkSnkaBP5NF6+m5PTGAr9JP43N3LyeoglsA==} dependencies: bn.js: 4.12.0 ethereumjs-util: 6.2.1 dev: true - /ethereumjs-util/6.2.1: + /ethereumjs-util@6.2.1: resolution: {integrity: sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw==} dependencies: '@types/bn.js': 4.11.6 @@ -3868,7 +3907,7 @@ packages: rlp: 2.2.7 dev: true - /ethereumjs-util/7.1.5: + /ethereumjs-util@7.1.5: resolution: {integrity: sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==} engines: {node: '>=10.0.0'} dependencies: @@ -3879,7 +3918,7 @@ packages: rlp: 2.2.7 dev: true - /ethers/5.7.1: + /ethers@5.7.1: resolution: {integrity: sha512-5krze4dRLITX7FpU8J4WscXqADiKmyeNlylmmDLbS95DaZpBhDe2YSwRQwKXWNyXcox7a3gBgm/MkGXV1O1S/Q==} dependencies: '@ethersproject/abi': 5.7.0 @@ -3916,7 +3955,7 @@ packages: - bufferutil - utf-8-validate - /ethjs-unit/0.1.6: + /ethjs-unit@0.1.6: resolution: {integrity: sha512-/Sn9Y0oKl0uqQuvgFk/zQgR7aw1g36qX/jzSQ5lSwlO0GigPymk4eGQfeNTD03w1dPOqfz8V77Cy43jH56pagw==} engines: {node: '>=6.5.0', npm: '>=3'} dependencies: @@ -3924,7 +3963,7 @@ packages: number-to-bn: 1.7.0 dev: true - /ethjs-util/0.1.6: + /ethjs-util@0.1.6: resolution: {integrity: sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w==} engines: {node: '>=6.5.0', npm: '>=3'} dependencies: @@ -3932,19 +3971,19 @@ packages: strip-hex-prefix: 1.0.0 dev: true - /event-target-shim/5.0.1: + /event-target-shim@5.0.1: resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} engines: {node: '>=6'} dev: true - /evp_bytestokey/1.0.3: + /evp_bytestokey@1.0.3: resolution: {integrity: sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==} dependencies: md5.js: 1.3.5 safe-buffer: 5.2.1 dev: true - /execa/5.1.1: + /execa@5.1.1: resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} engines: {node: '>=10'} dependencies: @@ -3959,12 +3998,12 @@ packages: strip-final-newline: 2.0.0 dev: true - /exit/0.1.2: + /exit@0.1.2: resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==} engines: {node: '>= 0.8.0'} dev: true - /expect/28.1.3: + /expect@28.1.3: resolution: {integrity: sha512-eEh0xn8HlsuOBxFgIss+2mX85VAS4Qy3OSkjV7rlBWljtA4oWH37glVGyOZSZvErDT/yBywZdPGwCXuTvSG85g==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} dependencies: @@ -3975,11 +4014,11 @@ packages: jest-util: 28.1.3 dev: true - /extendable-error/0.1.7: + /extendable-error@0.1.7: resolution: {integrity: sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==} dev: true - /external-editor/3.1.0: + /external-editor@3.1.0: resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} engines: {node: '>=4'} dependencies: @@ -3988,15 +4027,15 @@ packages: tmp: 0.0.33 dev: true - /fast-deep-equal/3.1.3: + /fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} dev: true - /fast-diff/1.2.0: + /fast-diff@1.2.0: resolution: {integrity: sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==} dev: true - /fast-glob/3.2.11: + /fast-glob@3.2.11: resolution: {integrity: sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==} engines: {node: '>=8.6.0'} dependencies: @@ -4007,62 +4046,62 @@ packages: micromatch: 4.0.5 dev: true - /fast-json-stable-stringify/2.1.0: + /fast-json-stable-stringify@2.1.0: resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} dev: true - /fast-levenshtein/2.0.6: + /fast-levenshtein@2.0.6: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} dev: true - /fastq/1.13.0: + /fastq@1.13.0: resolution: {integrity: sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==} dependencies: reusify: 1.0.4 dev: true - /fb-watchman/2.0.1: + /fb-watchman@2.0.1: resolution: {integrity: sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==} dependencies: bser: 2.1.1 dev: true - /figures/2.0.0: + /figures@2.0.0: resolution: {integrity: sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA==} engines: {node: '>=4'} dependencies: escape-string-regexp: 1.0.5 dev: true - /file-entry-cache/5.0.1: + /file-entry-cache@5.0.1: resolution: {integrity: sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==} engines: {node: '>=4'} dependencies: flat-cache: 2.0.1 dev: true - /file-entry-cache/6.0.1: + /file-entry-cache@6.0.1: resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} engines: {node: ^10.12.0 || >=12.0.0} dependencies: flat-cache: 3.0.4 dev: true - /fill-range/7.0.1: + /fill-range@7.0.1: resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} engines: {node: '>=8'} dependencies: to-regex-range: 5.0.1 dev: true - /find-up/2.1.0: + /find-up@2.1.0: resolution: {integrity: sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==} engines: {node: '>=4'} dependencies: locate-path: 2.0.0 dev: true - /find-up/4.1.0: + /find-up@4.1.0: resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} engines: {node: '>=8'} dependencies: @@ -4070,7 +4109,7 @@ packages: path-exists: 4.0.0 dev: true - /find-up/5.0.0: + /find-up@5.0.0: resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} engines: {node: '>=10'} dependencies: @@ -4078,14 +4117,14 @@ packages: path-exists: 4.0.0 dev: true - /find-yarn-workspace-root2/1.2.16: + /find-yarn-workspace-root2@1.2.16: resolution: {integrity: sha512-hr6hb1w8ePMpPVUK39S4RlwJzi+xPLuVuG8XlwXU3KD5Yn3qgBWVfy3AzNlDhWvE1EORCE65/Qm26rFQt3VLVA==} dependencies: micromatch: 4.0.5 pkg-dir: 4.2.0 dev: true - /flat-cache/2.0.1: + /flat-cache@2.0.1: resolution: {integrity: sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==} engines: {node: '>=4'} dependencies: @@ -4094,7 +4133,7 @@ packages: write: 1.0.3 dev: true - /flat-cache/3.0.4: + /flat-cache@3.0.4: resolution: {integrity: sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==} engines: {node: ^10.12.0 || >=12.0.0} dependencies: @@ -4102,26 +4141,26 @@ packages: rimraf: 3.0.2 dev: true - /flat/5.0.2: + /flat@5.0.2: resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} hasBin: true dev: true - /flatted/2.0.2: + /flatted@2.0.2: resolution: {integrity: sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==} dev: true - /flatted/3.2.6: + /flatted@3.2.6: resolution: {integrity: sha512-0sQoMh9s0BYsm+12Huy/rkKxVu4R1+r96YX5cG44rHV0pQ6iC3Q+mkoMFaGWObMFYQxCVT+ssG1ksneA2MI9KQ==} dev: true - /fmix/0.1.0: + /fmix@0.1.0: resolution: {integrity: sha512-Y6hyofImk9JdzU8k5INtTXX1cu8LDlePWDFU5sftm9H+zKCr5SGrVjdhkvsim646cw5zD0nADj8oHyXMZmCZ9w==} dependencies: imul: 1.0.1 dev: true - /follow-redirects/1.15.2_debug@4.3.4: + /follow-redirects@1.15.2(debug@4.3.4): resolution: {integrity: sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==} engines: {node: '>=4.0'} peerDependencies: @@ -4130,10 +4169,10 @@ packages: debug: optional: true dependencies: - debug: 4.3.4 + debug: 4.3.4(supports-color@8.1.1) dev: true - /form-data/4.0.0: + /form-data@4.0.0: resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} engines: {node: '>= 6'} dependencies: @@ -4142,11 +4181,11 @@ packages: mime-types: 2.1.35 dev: true - /fp-ts/1.19.3: + /fp-ts@1.19.3: resolution: {integrity: sha512-H5KQDspykdHuztLTg+ajGN0Z2qUjcEf3Ybxc6hLt0k7/zPkn29XnKnxlBPyW2XIddWrGaJBzBl4VLYOtk39yZg==} dev: true - /fs-extra/0.30.0: + /fs-extra@0.30.0: resolution: {integrity: sha512-UvSPKyhMn6LEd/WpUaV9C9t3zATuqoqfWc3QdPhPLb58prN9tqYPlPWi8Krxi44loBoUzlobqZ3+8tGpxxSzwA==} dependencies: graceful-fs: 4.2.10 @@ -4156,7 +4195,7 @@ packages: rimraf: 2.7.1 dev: true - /fs-extra/10.1.0: + /fs-extra@10.1.0: resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} engines: {node: '>=12'} dependencies: @@ -4165,7 +4204,7 @@ packages: universalify: 2.0.0 dev: true - /fs-extra/7.0.1: + /fs-extra@7.0.1: resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} engines: {node: '>=6 <7 || >=8'} dependencies: @@ -4174,7 +4213,7 @@ packages: universalify: 0.1.2 dev: true - /fs-extra/8.1.0: + /fs-extra@8.1.0: resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} engines: {node: '>=6 <7 || >=8'} dependencies: @@ -4183,11 +4222,11 @@ packages: universalify: 0.1.2 dev: true - /fs.realpath/1.0.0: + /fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} dev: true - /fsevents/2.3.2: + /fsevents@2.3.2: resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] @@ -4195,11 +4234,11 @@ packages: dev: true optional: true - /function-bind/1.1.1: + /function-bind@1.1.1: resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} dev: true - /function.prototype.name/1.1.5: + /function.prototype.name@1.1.5: resolution: {integrity: sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==} engines: {node: '>= 0.4'} dependencies: @@ -4209,25 +4248,25 @@ packages: functions-have-names: 1.2.3 dev: true - /functional-red-black-tree/1.0.1: + /functional-red-black-tree@1.0.1: resolution: {integrity: sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==} dev: true - /functions-have-names/1.2.3: + /functions-have-names@1.2.3: resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} dev: true - /gensync/1.0.0-beta.2: + /gensync@1.0.0-beta.2: resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} engines: {node: '>=6.9.0'} dev: true - /get-caller-file/2.0.5: + /get-caller-file@2.0.5: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} dev: true - /get-intrinsic/1.1.2: + /get-intrinsic@1.1.2: resolution: {integrity: sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==} dependencies: function-bind: 1.1.1 @@ -4235,17 +4274,17 @@ packages: has-symbols: 1.0.3 dev: true - /get-package-type/0.1.0: + /get-package-type@0.1.0: resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} engines: {node: '>=8.0.0'} dev: true - /get-stream/6.0.1: + /get-stream@6.0.1: resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} engines: {node: '>=10'} dev: true - /get-symbol-description/1.0.0: + /get-symbol-description@1.0.0: resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==} engines: {node: '>= 0.4'} dependencies: @@ -4253,21 +4292,21 @@ packages: get-intrinsic: 1.1.2 dev: true - /glob-parent/5.1.2: + /glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} dependencies: is-glob: 4.0.3 dev: true - /glob-parent/6.0.2: + /glob-parent@6.0.2: resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} engines: {node: '>=10.13.0'} dependencies: is-glob: 4.0.3 dev: true - /glob/7.1.6: + /glob@7.1.6: resolution: {integrity: sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==} dependencies: fs.realpath: 1.0.0 @@ -4278,7 +4317,7 @@ packages: path-is-absolute: 1.0.1 dev: true - /glob/7.2.0: + /glob@7.2.0: resolution: {integrity: sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==} dependencies: fs.realpath: 1.0.0 @@ -4289,7 +4328,7 @@ packages: path-is-absolute: 1.0.1 dev: true - /glob/7.2.3: + /glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} dependencies: fs.realpath: 1.0.0 @@ -4300,7 +4339,7 @@ packages: path-is-absolute: 1.0.1 dev: true - /glob/8.0.3: + /glob@8.0.3: resolution: {integrity: sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==} engines: {node: '>=12'} dependencies: @@ -4311,19 +4350,19 @@ packages: once: 1.4.0 dev: true - /globals/11.12.0: + /globals@11.12.0: resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} engines: {node: '>=4'} dev: true - /globals/13.17.0: + /globals@13.17.0: resolution: {integrity: sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==} engines: {node: '>=8'} dependencies: type-fest: 0.20.2 dev: true - /globby/11.1.0: + /globby@11.1.0: resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} engines: {node: '>=10'} dependencies: @@ -4335,37 +4374,37 @@ packages: slash: 3.0.0 dev: true - /graceful-fs/4.2.10: + /graceful-fs@4.2.10: resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==} dev: true - /grapheme-splitter/1.0.4: + /grapheme-splitter@1.0.4: resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==} dev: true - /hard-rejection/2.1.0: + /hard-rejection@2.1.0: resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==} engines: {node: '>=6'} dev: true - /hardhat-contract-sizer/2.6.1_hardhat@2.11.2: + /hardhat-contract-sizer@2.6.1(hardhat@2.11.2): resolution: {integrity: sha512-b8wS7DBvyo22kmVwpzstAQTdDCThpl/ySBqZh5ga9Yxjf61/uTL12TEg5nl7lDeWy73ntEUzxMwY6XxbQEc2wA==} peerDependencies: hardhat: ^2.0.0 dependencies: chalk: 4.1.2 cli-table3: 0.6.2 - hardhat: 2.11.2_6oasmw356qmm23djlsjgkwvrtm + hardhat: 2.11.2(ts-node@10.9.1)(typescript@4.7.4) dev: true - /hardhat-deploy/0.11.15: + /hardhat-deploy@0.11.15: resolution: {integrity: sha512-7e/GfVLmSXlcVePVFbC/xZ8mD97ChR6gHeUbejWMvzXpZ6I5bjSPZuaH5AebRRlb/6LjeIrN1+bKnayY0Sw9aA==} dependencies: '@types/qs': 6.9.7 - axios: 0.21.4_debug@4.3.4 + axios: 0.21.4(debug@4.3.4) chalk: 4.1.2 chokidar: 3.5.3 - debug: 4.3.4 + debug: 4.3.4(supports-color@8.1.1) enquirer: 2.3.6 ethers: 5.7.1 form-data: 4.0.0 @@ -4373,23 +4412,23 @@ packages: match-all: 1.2.6 murmur-128: 0.2.1 qs: 6.11.0 - zksync-web3: 0.8.1_ethers@5.7.1 + zksync-web3: 0.8.1(ethers@5.7.1) transitivePeerDependencies: - bufferutil - supports-color - utf-8-validate dev: true - /hardhat-watcher/2.5.0_hardhat@2.11.2: + /hardhat-watcher@2.5.0(hardhat@2.11.2): resolution: {integrity: sha512-Su2qcSMIo2YO2PrmJ0/tdkf+6pSt8zf9+4URR5edMVti6+ShI8T3xhPrwugdyTOFuyj8lKHrcTZNKUFYowYiyA==} peerDependencies: hardhat: ^2.0.0 dependencies: chokidar: 3.5.3 - hardhat: 2.11.2_6oasmw356qmm23djlsjgkwvrtm + hardhat: 2.11.2(ts-node@10.9.1)(typescript@4.7.4) dev: true - /hardhat/2.11.2_6oasmw356qmm23djlsjgkwvrtm: + /hardhat@2.11.2(ts-node@10.9.1)(typescript@4.7.4): resolution: {integrity: sha512-BdsXC1CFJQDJKmAgCwpmGhFuVU6dcqlgMgT0Kg/xmFAFVugkpYu6NRmh4AaJ3Fah0/BR9DOR4XgQGIbg4eon/Q==} engines: {node: ^14.0.0 || ^16.0.0 || ^18.0.0} hasBin: true @@ -4425,7 +4464,7 @@ packages: chalk: 2.4.2 chokidar: 3.5.3 ci-info: 2.0.0 - debug: 4.3.4 + debug: 4.3.4(supports-color@8.1.1) enquirer: 2.3.6 env-paths: 2.2.1 ethereum-cryptography: 1.1.2 @@ -4445,10 +4484,10 @@ packages: raw-body: 2.5.1 resolve: 1.17.0 semver: 6.3.0 - solc: 0.7.3_debug@4.3.4 + solc: 0.7.3(debug@4.3.4) source-map-support: 0.5.21 stacktrace-parser: 0.1.10 - ts-node: 10.9.1_hn66opzbaneygq52jmwjxha6su + ts-node: 10.9.1(@types/node@18.6.4)(typescript@4.7.4) tsort: 0.0.1 typescript: 4.7.4 undici: 5.10.0 @@ -4460,46 +4499,46 @@ packages: - utf-8-validate dev: true - /has-bigints/1.0.2: + /has-bigints@1.0.2: resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} dev: true - /has-flag/3.0.0: + /has-flag@3.0.0: resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} engines: {node: '>=4'} dev: true - /has-flag/4.0.0: + /has-flag@4.0.0: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} dev: true - /has-property-descriptors/1.0.0: + /has-property-descriptors@1.0.0: resolution: {integrity: sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==} dependencies: get-intrinsic: 1.1.2 dev: true - /has-symbols/1.0.3: + /has-symbols@1.0.3: resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} engines: {node: '>= 0.4'} dev: true - /has-tostringtag/1.0.0: + /has-tostringtag@1.0.0: resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==} engines: {node: '>= 0.4'} dependencies: has-symbols: 1.0.3 dev: true - /has/1.0.3: + /has@1.0.3: resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} engines: {node: '>= 0.4.0'} dependencies: function-bind: 1.1.1 dev: true - /hash-base/3.1.0: + /hash-base@3.1.0: resolution: {integrity: sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==} engines: {node: '>=4'} dependencies: @@ -4508,33 +4547,33 @@ packages: safe-buffer: 5.2.1 dev: true - /hash.js/1.1.7: + /hash.js@1.1.7: resolution: {integrity: sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==} dependencies: inherits: 2.0.4 minimalistic-assert: 1.0.1 - /he/1.2.0: + /he@1.2.0: resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} hasBin: true dev: true - /hmac-drbg/1.0.1: + /hmac-drbg@1.0.1: resolution: {integrity: sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==} dependencies: hash.js: 1.1.7 minimalistic-assert: 1.0.1 minimalistic-crypto-utils: 1.0.1 - /hosted-git-info/2.8.9: + /hosted-git-info@2.8.9: resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} dev: true - /html-escaper/2.0.2: + /html-escaper@2.0.2: resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} dev: true - /http-errors/2.0.0: + /http-errors@2.0.0: resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} engines: {node: '>= 0.8'} dependencies: @@ -4545,51 +4584,51 @@ packages: toidentifier: 1.0.1 dev: true - /https-proxy-agent/5.0.1: + /https-proxy-agent@5.0.1: resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} engines: {node: '>= 6'} dependencies: agent-base: 6.0.2 - debug: 4.3.4 + debug: 4.3.4(supports-color@8.1.1) transitivePeerDependencies: - supports-color dev: true - /human-id/1.0.2: + /human-id@1.0.2: resolution: {integrity: sha512-UNopramDEhHJD+VR+ehk8rOslwSfByxPIZyJRfV739NDhN5LF1fa1MqnzKm2lGTQRjNrjK19Q5fhkgIfjlVUKw==} dev: true - /human-signals/2.1.0: + /human-signals@2.1.0: resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} engines: {node: '>=10.17.0'} dev: true - /iconv-lite/0.4.24: + /iconv-lite@0.4.24: resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} engines: {node: '>=0.10.0'} dependencies: safer-buffer: 2.1.2 dev: true - /ieee754/1.2.1: + /ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} dev: true - /ignore/4.0.6: + /ignore@4.0.6: resolution: {integrity: sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==} engines: {node: '>= 4'} dev: true - /ignore/5.2.0: + /ignore@5.2.0: resolution: {integrity: sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==} engines: {node: '>= 4'} dev: true - /immutable/4.1.0: + /immutable@4.1.0: resolution: {integrity: sha512-oNkuqVTA8jqG1Q6c+UglTOD1xhC1BtjKI7XkCXRkZHrN5m18/XsnUp8Q89GkQO/z+0WjonSvl0FLhDYftp46nQ==} dev: true - /import-fresh/2.0.0: + /import-fresh@2.0.0: resolution: {integrity: sha512-eZ5H8rcgYazHbKC3PG4ClHNykCSxtAhxSSEM+2mb+7evD2CKF5V7c0dNum7AdpDh0ZdICwZY9sRSn8f+KH96sg==} engines: {node: '>=4'} dependencies: @@ -4597,7 +4636,7 @@ packages: resolve-from: 3.0.0 dev: true - /import-fresh/3.3.0: + /import-fresh@3.3.0: resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} engines: {node: '>=6'} dependencies: @@ -4605,7 +4644,7 @@ packages: resolve-from: 4.0.0 dev: true - /import-local/3.1.0: + /import-local@3.1.0: resolution: {integrity: sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==} engines: {node: '>=8'} hasBin: true @@ -4614,32 +4653,32 @@ packages: resolve-cwd: 3.0.0 dev: true - /imul/1.0.1: + /imul@1.0.1: resolution: {integrity: sha512-WFAgfwPLAjU66EKt6vRdTlKj4nAgIDQzh29JonLa4Bqtl6D8JrIMvWjCnx7xEjVNmP3U0fM5o8ZObk7d0f62bA==} engines: {node: '>=0.10.0'} dev: true - /imurmurhash/0.1.4: + /imurmurhash@0.1.4: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} engines: {node: '>=0.8.19'} dev: true - /indent-string/4.0.0: + /indent-string@4.0.0: resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} engines: {node: '>=8'} dev: true - /inflight/1.0.6: + /inflight@1.0.6: resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} dependencies: once: 1.4.0 wrappy: 1.0.2 dev: true - /inherits/2.0.4: + /inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - /inquirer/6.5.2: + /inquirer@6.5.2: resolution: {integrity: sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ==} engines: {node: '>=6.0.0'} dependencies: @@ -4658,7 +4697,7 @@ packages: through: 2.3.8 dev: true - /internal-slot/1.0.3: + /internal-slot@1.0.3: resolution: {integrity: sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==} engines: {node: '>= 0.4'} dependencies: @@ -4667,30 +4706,30 @@ packages: side-channel: 1.0.4 dev: true - /io-ts/1.10.4: + /io-ts@1.10.4: resolution: {integrity: sha512-b23PteSnYXSONJ6JQXRAlvJhuw8KOtkqa87W4wDtvMrud/DTJd5X+NpOOI+O/zZwVq6v0VLAaJ+1EDViKEuN9g==} dependencies: fp-ts: 1.19.3 dev: true - /is-arrayish/0.2.1: + /is-arrayish@0.2.1: resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} dev: true - /is-bigint/1.0.4: + /is-bigint@1.0.4: resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} dependencies: has-bigints: 1.0.2 dev: true - /is-binary-path/2.1.0: + /is-binary-path@2.1.0: resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} engines: {node: '>=8'} dependencies: binary-extensions: 2.2.0 dev: true - /is-boolean-object/1.1.2: + /is-boolean-object@1.1.2: resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} engines: {node: '>= 0.4'} dependencies: @@ -4698,101 +4737,101 @@ packages: has-tostringtag: 1.0.0 dev: true - /is-buffer/2.0.5: + /is-buffer@2.0.5: resolution: {integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==} engines: {node: '>=4'} dev: true - /is-callable/1.2.4: + /is-callable@1.2.4: resolution: {integrity: sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==} engines: {node: '>= 0.4'} dev: true - /is-ci/3.0.1: + /is-ci@3.0.1: resolution: {integrity: sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==} hasBin: true dependencies: ci-info: 3.3.2 dev: true - /is-core-module/2.10.0: + /is-core-module@2.10.0: resolution: {integrity: sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==} dependencies: has: 1.0.3 dev: true - /is-date-object/1.0.5: + /is-date-object@1.0.5: resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} engines: {node: '>= 0.4'} dependencies: has-tostringtag: 1.0.0 dev: true - /is-directory/0.3.1: + /is-directory@0.3.1: resolution: {integrity: sha512-yVChGzahRFvbkscn2MlwGismPO12i9+znNruC5gVEntG3qu0xQMzsGg/JFbrsqDOHtHFPci+V5aP5T9I+yeKqw==} engines: {node: '>=0.10.0'} dev: true - /is-extglob/2.1.1: + /is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} dev: true - /is-fullwidth-code-point/2.0.0: + /is-fullwidth-code-point@2.0.0: resolution: {integrity: sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==} engines: {node: '>=4'} dev: true - /is-fullwidth-code-point/3.0.0: + /is-fullwidth-code-point@3.0.0: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} dev: true - /is-generator-fn/2.1.0: + /is-generator-fn@2.1.0: resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==} engines: {node: '>=6'} dev: true - /is-glob/4.0.3: + /is-glob@4.0.3: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} dependencies: is-extglob: 2.1.1 dev: true - /is-hex-prefixed/1.0.0: + /is-hex-prefixed@1.0.0: resolution: {integrity: sha512-WvtOiug1VFrE9v1Cydwm+FnXd3+w9GaeVUss5W4v/SLy3UW00vP+6iNF2SdnfiBoLy4bTqVdkftNGTUeOFVsbA==} engines: {node: '>=6.5.0', npm: '>=3'} dev: true - /is-negative-zero/2.0.2: + /is-negative-zero@2.0.2: resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==} engines: {node: '>= 0.4'} dev: true - /is-number-object/1.0.7: + /is-number-object@1.0.7: resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} engines: {node: '>= 0.4'} dependencies: has-tostringtag: 1.0.0 dev: true - /is-number/7.0.0: + /is-number@7.0.0: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} dev: true - /is-plain-obj/1.1.0: + /is-plain-obj@1.1.0: resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} engines: {node: '>=0.10.0'} dev: true - /is-plain-obj/2.1.0: + /is-plain-obj@2.1.0: resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} engines: {node: '>=8'} dev: true - /is-regex/1.1.4: + /is-regex@1.1.4: resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} engines: {node: '>= 0.4'} dependencies: @@ -4800,64 +4839,64 @@ packages: has-tostringtag: 1.0.0 dev: true - /is-shared-array-buffer/1.0.2: + /is-shared-array-buffer@1.0.2: resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==} dependencies: call-bind: 1.0.2 dev: true - /is-stream/2.0.1: + /is-stream@2.0.1: resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} engines: {node: '>=8'} dev: true - /is-string/1.0.7: + /is-string@1.0.7: resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} engines: {node: '>= 0.4'} dependencies: has-tostringtag: 1.0.0 dev: true - /is-subdir/1.2.0: + /is-subdir@1.2.0: resolution: {integrity: sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw==} engines: {node: '>=4'} dependencies: better-path-resolve: 1.0.0 dev: true - /is-symbol/1.0.4: + /is-symbol@1.0.4: resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} engines: {node: '>= 0.4'} dependencies: has-symbols: 1.0.3 dev: true - /is-unicode-supported/0.1.0: + /is-unicode-supported@0.1.0: resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} engines: {node: '>=10'} dev: true - /is-weakref/1.0.2: + /is-weakref@1.0.2: resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} dependencies: call-bind: 1.0.2 dev: true - /is-windows/1.0.2: + /is-windows@1.0.2: resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} engines: {node: '>=0.10.0'} dev: true - /isexe/2.0.0: + /isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} dev: true - /istanbul-lib-coverage/3.2.0: + /istanbul-lib-coverage@3.2.0: resolution: {integrity: sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==} engines: {node: '>=8'} dev: true - /istanbul-lib-instrument/5.2.0: + /istanbul-lib-instrument@5.2.0: resolution: {integrity: sha512-6Lthe1hqXHBNsqvgDzGO6l03XNeu3CrG4RqQ1KM9+l5+jNGpEJfIELx1NS3SEHmJQA8np/u+E4EPRKRiu6m19A==} engines: {node: '>=8'} dependencies: @@ -4870,7 +4909,7 @@ packages: - supports-color dev: true - /istanbul-lib-report/3.0.0: + /istanbul-lib-report@3.0.0: resolution: {integrity: sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==} engines: {node: '>=8'} dependencies: @@ -4879,18 +4918,18 @@ packages: supports-color: 7.2.0 dev: true - /istanbul-lib-source-maps/4.0.1: + /istanbul-lib-source-maps@4.0.1: resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} engines: {node: '>=10'} dependencies: - debug: 4.3.4 + debug: 4.3.4(supports-color@8.1.1) istanbul-lib-coverage: 3.2.0 source-map: 0.6.1 transitivePeerDependencies: - supports-color dev: true - /istanbul-reports/3.1.5: + /istanbul-reports@3.1.5: resolution: {integrity: sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==} engines: {node: '>=8'} dependencies: @@ -4898,7 +4937,7 @@ packages: istanbul-lib-report: 3.0.0 dev: true - /jest-changed-files/28.1.3: + /jest-changed-files@28.1.3: resolution: {integrity: sha512-esaOfUWJXk2nfZt9SPyC8gA1kNfdKLkQWyzsMlqq8msYSlNKfmZxfRgZn4Cd4MGVUF+7v6dBs0d5TOAKa7iIiA==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} dependencies: @@ -4906,7 +4945,7 @@ packages: p-limit: 3.1.0 dev: true - /jest-circus/28.1.3: + /jest-circus@28.1.3: resolution: {integrity: sha512-cZ+eS5zc79MBwt+IhQhiEp0OeBddpc1n8MBo1nMB8A7oPMKEO+Sre+wHaLJexQUj9Ya/8NOBY0RESUgYjB6fow==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} dependencies: @@ -4933,7 +4972,7 @@ packages: - supports-color dev: true - /jest-cli/28.1.3_6caleeh6c3yahw3yaj3duy3aa4: + /jest-cli@28.1.3(@types/node@18.6.4)(ts-node@10.9.1): resolution: {integrity: sha512-roY3kvrv57Azn1yPgdTebPAXvdR2xfezaKKYzVxZ6It/5NCxzJym6tUI5P1zkdWhfUYkxEI9uZWcQdaFLo8mJQ==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} hasBin: true @@ -4943,14 +4982,14 @@ packages: node-notifier: optional: true dependencies: - '@jest/core': 28.1.3_ts-node@10.9.1 + '@jest/core': 28.1.3(ts-node@10.9.1) '@jest/test-result': 28.1.3 '@jest/types': 28.1.3 chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.10 import-local: 3.1.0 - jest-config: 28.1.3_6caleeh6c3yahw3yaj3duy3aa4 + jest-config: 28.1.3(@types/node@18.6.4)(ts-node@10.9.1) jest-util: 28.1.3 jest-validate: 28.1.3 prompts: 2.4.2 @@ -4961,7 +5000,7 @@ packages: - ts-node dev: true - /jest-config/28.1.3_6caleeh6c3yahw3yaj3duy3aa4: + /jest-config@28.1.3(@types/node@18.6.4)(ts-node@10.9.1): resolution: {integrity: sha512-MG3INjByJ0J4AsNBm7T3hsuxKQqFIiRo/AUqb1q9LRKI5UU6Aar9JHbr9Ivn1TVwfUD9KirRoM/T6u8XlcQPHQ==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} peerDependencies: @@ -4977,7 +5016,7 @@ packages: '@jest/test-sequencer': 28.1.3 '@jest/types': 28.1.3 '@types/node': 18.6.4 - babel-jest: 28.1.3_@babel+core@7.18.10 + babel-jest: 28.1.3(@babel/core@7.18.10) chalk: 4.1.2 ci-info: 3.3.2 deepmerge: 4.2.2 @@ -4996,12 +5035,12 @@ packages: pretty-format: 28.1.3 slash: 3.0.0 strip-json-comments: 3.1.1 - ts-node: 10.9.1_hn66opzbaneygq52jmwjxha6su + ts-node: 10.9.1(@types/node@18.6.4)(typescript@4.7.4) transitivePeerDependencies: - supports-color dev: true - /jest-diff/28.1.3: + /jest-diff@28.1.3: resolution: {integrity: sha512-8RqP1B/OXzjjTWkqMX67iqgwBVJRgCyKD3L9nq+6ZqJMdvjE8RgHktqZ6jNrkdMT+dJuYNI3rhQpxaz7drJHfw==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} dependencies: @@ -5011,14 +5050,14 @@ packages: pretty-format: 28.1.3 dev: true - /jest-docblock/28.1.1: + /jest-docblock@28.1.1: resolution: {integrity: sha512-3wayBVNiOYx0cwAbl9rwm5kKFP8yHH3d/fkEaL02NPTkDojPtheGB7HZSFY4wzX+DxyrvhXz0KSCVksmCknCuA==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} dependencies: detect-newline: 3.1.0 dev: true - /jest-each/28.1.3: + /jest-each@28.1.3: resolution: {integrity: sha512-arT1z4sg2yABU5uogObVPvSlSMQlDA48owx07BDPAiasW0yYpYHYOo4HHLz9q0BVzDVU4hILFjzJw0So9aCL/g==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} dependencies: @@ -5029,7 +5068,7 @@ packages: pretty-format: 28.1.3 dev: true - /jest-environment-node/28.1.3: + /jest-environment-node@28.1.3: resolution: {integrity: sha512-ugP6XOhEpjAEhGYvp5Xj989ns5cB1K6ZdjBYuS30umT4CQEETaxSiPcZ/E1kFktX4GkrcM4qu07IIlDYX1gp+A==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} dependencies: @@ -5041,24 +5080,24 @@ packages: jest-util: 28.1.3 dev: true - /jest-esbuild/0.2.9_jest@28.1.3: + /jest-esbuild@0.2.9(jest@28.1.3): resolution: {integrity: sha512-GfcQgHf8XPwUydEurYTRdrhrDblVFXtgOsKmE/7KADxbsC0c5xpxQBarak4X7K0wl5XXfTmw7Qtat2V0/ssreg==} peerDependencies: jest: '>=27' dependencies: - debug: 4.3.4 + debug: 4.3.4(supports-color@8.1.1) esbuild: 0.14.53 - jest: 28.1.3_6caleeh6c3yahw3yaj3duy3aa4 + jest: 28.1.3(@types/node@18.6.4)(ts-node@10.9.1) transitivePeerDependencies: - supports-color dev: true - /jest-get-type/28.0.2: + /jest-get-type@28.0.2: resolution: {integrity: sha512-ioj2w9/DxSYHfOm5lJKCdcAmPJzQXmbM/Url3rhlghrPvT3tt+7a/+oXc9azkKmLvoiXjtV83bEWqi+vs5nlPA==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} dev: true - /jest-haste-map/28.1.3: + /jest-haste-map@28.1.3: resolution: {integrity: sha512-3S+RQWDXccXDKSWnkHa/dPwt+2qwA8CJzR61w3FoYCvoo3Pn8tvGcysmMF0Bj0EX5RYvAI2EIvC57OmotfdtKA==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} dependencies: @@ -5077,7 +5116,7 @@ packages: fsevents: 2.3.2 dev: true - /jest-leak-detector/28.1.3: + /jest-leak-detector@28.1.3: resolution: {integrity: sha512-WFVJhnQsiKtDEo5lG2mM0v40QWnBM+zMdHHyJs8AWZ7J0QZJS59MsyKeJHWhpBZBH32S48FOVvGyOFT1h0DlqA==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} dependencies: @@ -5085,7 +5124,7 @@ packages: pretty-format: 28.1.3 dev: true - /jest-matcher-utils/28.1.3: + /jest-matcher-utils@28.1.3: resolution: {integrity: sha512-kQeJ7qHemKfbzKoGjHHrRKH6atgxMk8Enkk2iPQ3XwO6oE/KYD8lMYOziCkeSB9G4adPM4nR1DE8Tf5JeWH6Bw==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} dependencies: @@ -5095,7 +5134,7 @@ packages: pretty-format: 28.1.3 dev: true - /jest-message-util/28.1.3: + /jest-message-util@28.1.3: resolution: {integrity: sha512-PFdn9Iewbt575zKPf1286Ht9EPoJmYT7P0kY+RibeYZ2XtOr53pDLEFoTWXbd1h4JiGiWpTBC84fc8xMXQMb7g==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} dependencies: @@ -5110,7 +5149,7 @@ packages: stack-utils: 2.0.5 dev: true - /jest-mock/28.1.3: + /jest-mock@28.1.3: resolution: {integrity: sha512-o3J2jr6dMMWYVH4Lh/NKmDXdosrsJgi4AviS8oXLujcjpCMBb1FMsblDnOXKZKfSiHLxYub1eS0IHuRXsio9eA==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} dependencies: @@ -5118,7 +5157,7 @@ packages: '@types/node': 18.6.4 dev: true - /jest-pnp-resolver/1.2.2_jest-resolve@28.1.3: + /jest-pnp-resolver@1.2.2(jest-resolve@28.1.3): resolution: {integrity: sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==} engines: {node: '>=6'} peerDependencies: @@ -5130,12 +5169,12 @@ packages: jest-resolve: 28.1.3 dev: true - /jest-regex-util/28.0.2: + /jest-regex-util@28.0.2: resolution: {integrity: sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} dev: true - /jest-resolve-dependencies/28.1.3: + /jest-resolve-dependencies@28.1.3: resolution: {integrity: sha512-qa0QO2Q0XzQoNPouMbCc7Bvtsem8eQgVPNkwn9LnS+R2n8DaVDPL/U1gngC0LTl1RYXJU0uJa2BMC2DbTfFrHA==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} dependencies: @@ -5145,14 +5184,14 @@ packages: - supports-color dev: true - /jest-resolve/28.1.3: + /jest-resolve@28.1.3: resolution: {integrity: sha512-Z1W3tTjE6QaNI90qo/BJpfnvpxtaFTFw5CDgwpyE/Kz8U/06N1Hjf4ia9quUhCh39qIGWF1ZuxFiBiJQwSEYKQ==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} dependencies: chalk: 4.1.2 graceful-fs: 4.2.10 jest-haste-map: 28.1.3 - jest-pnp-resolver: 1.2.2_jest-resolve@28.1.3 + jest-pnp-resolver: 1.2.2(jest-resolve@28.1.3) jest-util: 28.1.3 jest-validate: 28.1.3 resolve: 1.22.1 @@ -5160,7 +5199,7 @@ packages: slash: 3.0.0 dev: true - /jest-runner/28.1.3: + /jest-runner@28.1.3: resolution: {integrity: sha512-GkMw4D/0USd62OVO0oEgjn23TM+YJa2U2Wu5zz9xsQB1MxWKDOlrnykPxnMsN0tnJllfLPinHTka61u0QhaxBA==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} dependencies: @@ -5189,7 +5228,7 @@ packages: - supports-color dev: true - /jest-runtime/28.1.3: + /jest-runtime@28.1.3: resolution: {integrity: sha512-NU+881ScBQQLc1JHG5eJGU7Ui3kLKrmwCPPtYsJtBykixrM2OhVQlpMmFWJjMyDfdkGgBMNjXCGB/ebzsgNGQw==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} dependencies: @@ -5219,13 +5258,13 @@ packages: - supports-color dev: true - /jest-snapshot/28.1.3: + /jest-snapshot@28.1.3: resolution: {integrity: sha512-4lzMgtiNlc3DU/8lZfmqxN3AYD6GGLbl+72rdBpXvcV+whX7mDrREzkPdp2RnmfIiWBg1YbuFSkXduF2JcafJg==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} dependencies: '@babel/core': 7.18.10 '@babel/generator': 7.18.10 - '@babel/plugin-syntax-typescript': 7.18.6_@babel+core@7.18.10 + '@babel/plugin-syntax-typescript': 7.18.6(@babel/core@7.18.10) '@babel/traverse': 7.18.11 '@babel/types': 7.18.10 '@jest/expect-utils': 28.1.3 @@ -5233,7 +5272,7 @@ packages: '@jest/types': 28.1.3 '@types/babel__traverse': 7.18.0 '@types/prettier': 2.7.0 - babel-preset-current-node-syntax: 1.0.1_@babel+core@7.18.10 + babel-preset-current-node-syntax: 1.0.1(@babel/core@7.18.10) chalk: 4.1.2 expect: 28.1.3 graceful-fs: 4.2.10 @@ -5250,7 +5289,7 @@ packages: - supports-color dev: true - /jest-util/28.1.3: + /jest-util@28.1.3: resolution: {integrity: sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} dependencies: @@ -5262,7 +5301,7 @@ packages: picomatch: 2.3.1 dev: true - /jest-validate/28.1.3: + /jest-validate@28.1.3: resolution: {integrity: sha512-SZbOGBWEsaTxBGCOpsRWlXlvNkvTkY0XxRfh7zYmvd8uL5Qzyg0CHAXiXKROflh801quA6+/DsT4ODDthOC/OA==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} dependencies: @@ -5274,7 +5313,7 @@ packages: pretty-format: 28.1.3 dev: true - /jest-watcher/28.1.3: + /jest-watcher@28.1.3: resolution: {integrity: sha512-t4qcqj9hze+jviFPUN3YAtAEeFnr/azITXQEMARf5cMwKY2SMBRnCQTXLixTl20OR6mLh9KLMrgVJgJISym+1g==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} dependencies: @@ -5288,7 +5327,7 @@ packages: string-length: 4.0.2 dev: true - /jest-worker/28.1.3: + /jest-worker@28.1.3: resolution: {integrity: sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} dependencies: @@ -5297,7 +5336,7 @@ packages: supports-color: 8.1.1 dev: true - /jest/28.1.3_6caleeh6c3yahw3yaj3duy3aa4: + /jest@28.1.3(@types/node@18.6.4)(ts-node@10.9.1): resolution: {integrity: sha512-N4GT5on8UkZgH0O5LUavMRV1EDEhNTL0KEfRmDIeZHSV7p2XgLoY9t9VDUgL6o+yfdgYHVxuz81G8oB9VG5uyA==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} hasBin: true @@ -5307,29 +5346,29 @@ packages: node-notifier: optional: true dependencies: - '@jest/core': 28.1.3_ts-node@10.9.1 + '@jest/core': 28.1.3(ts-node@10.9.1) '@jest/types': 28.1.3 import-local: 3.1.0 - jest-cli: 28.1.3_6caleeh6c3yahw3yaj3duy3aa4 + jest-cli: 28.1.3(@types/node@18.6.4)(ts-node@10.9.1) transitivePeerDependencies: - '@types/node' - supports-color - ts-node dev: true - /joycon/3.1.1: + /joycon@3.1.1: resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} engines: {node: '>=10'} dev: true - /js-sha3/0.8.0: + /js-sha3@0.8.0: resolution: {integrity: sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==} - /js-tokens/4.0.0: + /js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} dev: true - /js-yaml/3.14.1: + /js-yaml@3.14.1: resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} hasBin: true dependencies: @@ -5337,58 +5376,58 @@ packages: esprima: 4.0.1 dev: true - /js-yaml/4.1.0: + /js-yaml@4.1.0: resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} hasBin: true dependencies: argparse: 2.0.1 dev: true - /jsesc/2.5.2: + /jsesc@2.5.2: resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} engines: {node: '>=4'} hasBin: true dev: true - /json-parse-better-errors/1.0.2: + /json-parse-better-errors@1.0.2: resolution: {integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==} dev: true - /json-parse-even-better-errors/2.3.1: + /json-parse-even-better-errors@2.3.1: resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} dev: true - /json-schema-traverse/0.4.1: + /json-schema-traverse@0.4.1: resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} dev: true - /json-schema-traverse/1.0.0: + /json-schema-traverse@1.0.0: resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} dev: true - /json-stable-stringify-without-jsonify/1.0.1: + /json-stable-stringify-without-jsonify@1.0.1: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} dev: true - /json5/2.2.1: + /json5@2.2.1: resolution: {integrity: sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==} engines: {node: '>=6'} hasBin: true dev: true - /jsonfile/2.4.0: + /jsonfile@2.4.0: resolution: {integrity: sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw==} optionalDependencies: graceful-fs: 4.2.10 dev: true - /jsonfile/4.0.0: + /jsonfile@4.0.0: resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} optionalDependencies: graceful-fs: 4.2.10 dev: true - /jsonfile/6.1.0: + /jsonfile@6.1.0: resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} dependencies: universalify: 2.0.0 @@ -5396,7 +5435,7 @@ packages: graceful-fs: 4.2.10 dev: true - /jsx-ast-utils/3.3.2: + /jsx-ast-utils@3.3.2: resolution: {integrity: sha512-4ZCADZHRkno244xlNnn4AOG6sRQ7iBZ5BbgZ4vW4y5IZw7cVUD1PPeblm1xx/nfmMxPdt/LHsXZW8z/j58+l9Q==} engines: {node: '>=4.0'} dependencies: @@ -5404,7 +5443,7 @@ packages: object.assign: 4.1.2 dev: true - /keccak/3.0.2: + /keccak@3.0.2: resolution: {integrity: sha512-PyKKjkH53wDMLGrvmRGSNWgmSxZOUqbnXwKL9tmgbFYA1iAYqW21kfR7mZXV0MlESiefxQQE9X9fTa3X+2MPDQ==} engines: {node: '>=10.0.0'} requiresBuild: true @@ -5414,43 +5453,43 @@ packages: readable-stream: 3.6.0 dev: true - /kind-of/6.0.3: + /kind-of@6.0.3: resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} engines: {node: '>=0.10.0'} dev: true - /klaw/1.3.1: + /klaw@1.3.1: resolution: {integrity: sha512-TED5xi9gGQjGpNnvRWknrwAB1eL5GciPfVFOt3Vk1OJCVDQbzuSfrF3hkUQKlsgKrG1F+0t5W0m+Fje1jIt8rw==} optionalDependencies: graceful-fs: 4.2.10 dev: true - /kleur/3.0.3: + /kleur@3.0.3: resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} engines: {node: '>=6'} dev: true - /kleur/4.1.5: + /kleur@4.1.5: resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} engines: {node: '>=6'} dev: true - /language-subtag-registry/0.3.22: + /language-subtag-registry@0.3.22: resolution: {integrity: sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==} dev: true - /language-tags/1.0.5: + /language-tags@1.0.5: resolution: {integrity: sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ==} dependencies: language-subtag-registry: 0.3.22 dev: true - /level-supports/4.0.1: + /level-supports@4.0.1: resolution: {integrity: sha512-PbXpve8rKeNcZ9C1mUicC9auIYFyGpkV9/i6g76tLgANwWhtG2v7I4xNBUlkn3lE2/dZF3Pi0ygYGtLc4RXXdA==} engines: {node: '>=12'} dev: true - /level-transcoder/1.0.1: + /level-transcoder@1.0.1: resolution: {integrity: sha512-t7bFwFtsQeD8cl8NIoQ2iwxA0CL/9IFw7/9gAjOonH0PWTTiRfY7Hq+Ejbsxh86tXobDQ6IOiddjNYIfOBs06w==} engines: {node: '>=12'} dependencies: @@ -5458,7 +5497,7 @@ packages: module-error: 1.0.2 dev: true - /level/8.0.0: + /level@8.0.0: resolution: {integrity: sha512-ypf0jjAk2BWI33yzEaaotpq7fkOPALKAgDBxggO6Q9HGX2MRXn0wbP1Jn/tJv1gtL867+YOjOB49WaUF3UoJNQ==} engines: {node: '>=12'} dependencies: @@ -5466,12 +5505,12 @@ packages: classic-level: 1.2.0 dev: true - /leven/3.1.0: + /leven@3.1.0: resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} engines: {node: '>=6'} dev: true - /levn/0.3.0: + /levn@0.3.0: resolution: {integrity: sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==} engines: {node: '>= 0.8.0'} dependencies: @@ -5479,7 +5518,7 @@ packages: type-check: 0.3.2 dev: true - /levn/0.4.1: + /levn@0.4.1: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} dependencies: @@ -5487,21 +5526,21 @@ packages: type-check: 0.4.0 dev: true - /lilconfig/2.0.6: + /lilconfig@2.0.6: resolution: {integrity: sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg==} engines: {node: '>=10'} dev: true - /lines-and-columns/1.2.4: + /lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} dev: true - /load-tsconfig/0.2.3: + /load-tsconfig@0.2.3: resolution: {integrity: sha512-iyT2MXws+dc2Wi6o3grCFtGXpeMvHmJqS27sMPGtV2eUu4PeFnG+33I8BlFK1t1NWMjOpcx9bridn5yxLDX2gQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dev: true - /load-yaml-file/0.2.0: + /load-yaml-file@0.2.0: resolution: {integrity: sha512-OfCBkGEw4nN6JLtgRidPX6QxjBQGQf72q3si2uvqyFEMbycSFFHwAZeXx6cJgFM9wmLrf9zBwCP3Ivqa+LLZPw==} engines: {node: '>=6'} dependencies: @@ -5511,7 +5550,7 @@ packages: strip-bom: 3.0.0 dev: true - /locate-path/2.0.0: + /locate-path@2.0.0: resolution: {integrity: sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==} engines: {node: '>=4'} dependencies: @@ -5519,41 +5558,41 @@ packages: path-exists: 3.0.0 dev: true - /locate-path/5.0.0: + /locate-path@5.0.0: resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} engines: {node: '>=8'} dependencies: p-locate: 4.1.0 dev: true - /locate-path/6.0.0: + /locate-path@6.0.0: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} dependencies: p-locate: 5.0.0 dev: true - /lodash.merge/4.6.2: + /lodash.merge@4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} dev: true - /lodash.sortby/4.7.0: + /lodash.sortby@4.7.0: resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} dev: true - /lodash.startcase/4.4.0: + /lodash.startcase@4.4.0: resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} dev: true - /lodash.truncate/4.4.2: + /lodash.truncate@4.4.2: resolution: {integrity: sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==} dev: true - /lodash/4.17.21: + /lodash@4.17.21: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} dev: true - /log-symbols/4.1.0: + /log-symbols@4.1.0: resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} engines: {node: '>=10'} dependencies: @@ -5561,74 +5600,74 @@ packages: is-unicode-supported: 0.1.0 dev: true - /loose-envify/1.4.0: + /loose-envify@1.4.0: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true dependencies: js-tokens: 4.0.0 dev: true - /lru-cache/4.1.5: + /lru-cache@4.1.5: resolution: {integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==} dependencies: pseudomap: 1.0.2 yallist: 2.1.2 dev: true - /lru-cache/5.1.1: + /lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} dependencies: yallist: 3.1.1 dev: true - /lru-cache/6.0.0: + /lru-cache@6.0.0: resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} engines: {node: '>=10'} dependencies: yallist: 4.0.0 dev: true - /lru_map/0.3.3: + /lru_map@0.3.3: resolution: {integrity: sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ==} dev: true - /make-dir/3.1.0: + /make-dir@3.1.0: resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} engines: {node: '>=8'} dependencies: semver: 6.3.0 dev: true - /make-error/1.3.6: + /make-error@1.3.6: resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} dev: true - /makeerror/1.0.12: + /makeerror@1.0.12: resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} dependencies: tmpl: 1.0.5 dev: true - /map-obj/1.0.1: + /map-obj@1.0.1: resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==} engines: {node: '>=0.10.0'} dev: true - /map-obj/4.3.0: + /map-obj@4.3.0: resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==} engines: {node: '>=8'} dev: true - /match-all/1.2.6: + /match-all@1.2.6: resolution: {integrity: sha512-0EESkXiTkWzrQQntBu2uzKvLu6vVkUGz40nGPbSZuegcfE5UuSzNjLaIu76zJWuaT/2I3Z/8M06OlUOZLGwLlQ==} dev: true - /mcl-wasm/0.7.9: + /mcl-wasm@0.7.9: resolution: {integrity: sha512-iJIUcQWA88IJB/5L15GnJVnSQJmf/YaxxV6zRavv83HILHaJQb6y0iFyDMdDO0gN8X37tdxmAOrH/P8B6RB8sQ==} engines: {node: '>=8.9.0'} dev: true - /md5.js/1.3.5: + /md5.js@1.3.5: resolution: {integrity: sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==} dependencies: hash-base: 3.1.0 @@ -5636,7 +5675,7 @@ packages: safe-buffer: 5.2.1 dev: true - /memory-level/1.0.0: + /memory-level@1.0.0: resolution: {integrity: sha512-UXzwewuWeHBz5krr7EvehKcmLFNoXxGcvuYhC41tRnkrTbJohtS7kVn9akmgirtRygg+f7Yjsfi8Uu5SGSQ4Og==} engines: {node: '>=12'} dependencies: @@ -5645,12 +5684,12 @@ packages: module-error: 1.0.2 dev: true - /memorystream/0.3.1: + /memorystream@0.3.1: resolution: {integrity: sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==} engines: {node: '>= 0.10.0'} dev: true - /meow/6.1.1: + /meow@6.1.1: resolution: {integrity: sha512-3YffViIt2QWgTy6Pale5QpopX/IvU3LPL03jOTqp6pGj3VjesdO/U8CuHMKpnQr4shCNCM5fd5XFFvIIl6JBHg==} engines: {node: '>=8'} dependencies: @@ -5667,16 +5706,16 @@ packages: yargs-parser: 18.1.3 dev: true - /merge-stream/2.0.0: + /merge-stream@2.0.0: resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} dev: true - /merge2/1.4.1: + /merge2@1.4.1: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} dev: true - /merkletreejs/0.2.32: + /merkletreejs@0.2.32: resolution: {integrity: sha512-TostQBiwYRIwSE5++jGmacu3ODcKAgqb0Y/pnIohXS7sWxh1gCkSptbmF1a43faehRDpcHf7J/kv0Ml2D/zblQ==} engines: {node: '>= 7.6.0'} dependencies: @@ -5687,7 +5726,7 @@ packages: web3-utils: 1.7.5 dev: true - /micromatch/4.0.5: + /micromatch@4.0.5: resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} engines: {node: '>=8.6'} dependencies: @@ -5695,60 +5734,60 @@ packages: picomatch: 2.3.1 dev: true - /mime-db/1.52.0: + /mime-db@1.52.0: resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} engines: {node: '>= 0.6'} dev: true - /mime-types/2.1.35: + /mime-types@2.1.35: resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} engines: {node: '>= 0.6'} dependencies: mime-db: 1.52.0 dev: true - /mimic-fn/1.2.0: + /mimic-fn@1.2.0: resolution: {integrity: sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==} engines: {node: '>=4'} dev: true - /mimic-fn/2.1.0: + /mimic-fn@2.1.0: resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} engines: {node: '>=6'} dev: true - /min-indent/1.0.1: + /min-indent@1.0.1: resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} engines: {node: '>=4'} dev: true - /minimalistic-assert/1.0.1: + /minimalistic-assert@1.0.1: resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} - /minimalistic-crypto-utils/1.0.1: + /minimalistic-crypto-utils@1.0.1: resolution: {integrity: sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==} - /minimatch/3.1.2: + /minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} dependencies: brace-expansion: 1.1.11 dev: true - /minimatch/5.0.1: + /minimatch@5.0.1: resolution: {integrity: sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==} engines: {node: '>=10'} dependencies: brace-expansion: 2.0.1 dev: true - /minimatch/5.1.0: + /minimatch@5.1.0: resolution: {integrity: sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==} engines: {node: '>=10'} dependencies: brace-expansion: 2.0.1 dev: true - /minimist-options/4.1.0: + /minimist-options@4.1.0: resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==} engines: {node: '>= 6'} dependencies: @@ -5757,29 +5796,29 @@ packages: kind-of: 6.0.3 dev: true - /minimist/1.2.6: + /minimist@1.2.6: resolution: {integrity: sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==} dev: true - /mixme/0.5.4: + /mixme@0.5.4: resolution: {integrity: sha512-3KYa4m4Vlqx98GPdOHghxSdNtTvcP8E0kkaJ5Dlh+h2DRzF7zpuVVcA8B0QpKd11YJeP9QQ7ASkKzOeu195Wzw==} engines: {node: '>= 8.0.0'} dev: true - /mkdirp/0.5.6: + /mkdirp@0.5.6: resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} hasBin: true dependencies: minimist: 1.2.6 dev: true - /mnemonist/0.38.5: + /mnemonist@0.38.5: resolution: {integrity: sha512-bZTFT5rrPKtPJxj8KSV0WkPyNxl72vQepqqVUAW2ARUpUSF2qXMB6jZj7hW5/k7C1rtpzqbD/IIbJwLXUjCHeg==} dependencies: obliterator: 2.0.4 dev: true - /mocha/10.0.0: + /mocha@10.0.0: resolution: {integrity: sha512-0Wl+elVUD43Y0BqPZBzZt8Tnkw9CMUdNYnUsTfOM1vuhJVZL+kiesFYsqwBkEEuEixaiPe5ZQdqDgX2jddhmoA==} engines: {node: '>= 14.0.0'} hasBin: true @@ -5788,7 +5827,7 @@ packages: ansi-colors: 4.1.1 browser-stdout: 1.3.1 chokidar: 3.5.3 - debug: 4.3.4_supports-color@8.1.1 + debug: 4.3.4(supports-color@8.1.1) diff: 5.0.0 escape-string-regexp: 4.0.0 find-up: 5.0.0 @@ -5808,20 +5847,20 @@ packages: yargs-unparser: 2.0.0 dev: true - /module-error/1.0.2: + /module-error@1.0.2: resolution: {integrity: sha512-0yuvsqSCv8LbaOKhnsQ/T5JhyFlCYLPXK3U2sgV10zoKQwzs/MyfuQUOZQ1V/6OCOJsK/TRgNVrPuPDqtdMFtA==} engines: {node: '>=10'} dev: true - /ms/2.1.2: + /ms@2.1.2: resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} dev: true - /ms/2.1.3: + /ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} dev: true - /murmur-128/0.2.1: + /murmur-128@0.2.1: resolution: {integrity: sha512-WseEgiRkI6aMFBbj8Cg9yBj/y+OdipwVC7zUo3W2W1JAJITwouUOtpqsmGSg67EQmwwSyod7hsVsWY5LsrfQVg==} dependencies: encode-utf8: 1.0.3 @@ -5829,11 +5868,11 @@ packages: imul: 1.0.1 dev: true - /mute-stream/0.0.7: + /mute-stream@0.0.7: resolution: {integrity: sha512-r65nCZhrbXXb6dXOACihYApHw2Q6pV0M3V0PSxd74N0+D8nzAdEAITq2oAjA1jVnKI+tGvEBUpqiMh0+rW6zDQ==} dev: true - /mz/2.7.0: + /mz@2.7.0: resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} dependencies: any-promise: 1.3.0 @@ -5841,53 +5880,53 @@ packages: thenify-all: 1.6.0 dev: true - /nanoid/3.3.3: + /nanoid@3.3.3: resolution: {integrity: sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true dev: true - /nanoid/3.3.4: + /nanoid@3.3.4: resolution: {integrity: sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true dev: true - /napi-macros/2.0.0: + /napi-macros@2.0.0: resolution: {integrity: sha512-A0xLykHtARfueITVDernsAWdtIMbOJgKgcluwENp3AlsKN/PloyO10HtmoqnFAQAcxPkgZN7wdfPfEd0zNGxbg==} dev: true - /natural-compare/1.4.0: + /natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} dev: true - /nice-try/1.0.5: + /nice-try@1.0.5: resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==} dev: true - /node-addon-api/2.0.2: + /node-addon-api@2.0.2: resolution: {integrity: sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==} dev: true - /node-gyp-build/4.5.0: + /node-gyp-build@4.5.0: resolution: {integrity: sha512-2iGbaQBV+ITgCz76ZEjmhUKAKVf7xfY1sRl4UiKQspfZMH2h06SyhNsnSVy50cwkFQDGLyif6m/6uFXHkOZ6rg==} hasBin: true dev: true - /node-int64/0.4.0: + /node-int64@0.4.0: resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} dev: true - /node-releases/2.0.6: + /node-releases@2.0.6: resolution: {integrity: sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==} dev: true - /nofilter/1.0.4: + /nofilter@1.0.4: resolution: {integrity: sha512-N8lidFp+fCz+TD51+haYdbDGrcBWwuHX40F5+z0qkUjMJ5Tp+rdSuAkMJ9N9eoolDlEVTf6u5icM+cNKkKW2mA==} engines: {node: '>=8'} dev: true - /normalize-package-data/2.5.0: + /normalize-package-data@2.5.0: resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} dependencies: hosted-git-info: 2.8.9 @@ -5896,19 +5935,19 @@ packages: validate-npm-package-license: 3.0.4 dev: true - /normalize-path/3.0.0: + /normalize-path@3.0.0: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} dev: true - /npm-run-path/4.0.1: + /npm-run-path@4.0.1: resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} engines: {node: '>=8'} dependencies: path-key: 3.1.1 dev: true - /number-to-bn/1.7.0: + /number-to-bn@1.7.0: resolution: {integrity: sha512-wsJ9gfSz1/s4ZsJN01lyonwuxA1tml6X1yBDnfpMglypcBRFZZkus26EdPSlqS5GJfYddVZa22p3VNb3z5m5Ig==} engines: {node: '>=6.5.0', npm: '>=3'} dependencies: @@ -5916,26 +5955,26 @@ packages: strip-hex-prefix: 1.0.0 dev: true - /object-assign/4.1.1: + /object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} dev: true - /object-hash/3.0.0: + /object-hash@3.0.0: resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} engines: {node: '>= 6'} dev: true - /object-inspect/1.12.2: + /object-inspect@1.12.2: resolution: {integrity: sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==} dev: true - /object-keys/1.1.1: + /object-keys@1.1.1: resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} engines: {node: '>= 0.4'} dev: true - /object.assign/4.1.2: + /object.assign@4.1.2: resolution: {integrity: sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==} engines: {node: '>= 0.4'} dependencies: @@ -5945,7 +5984,7 @@ packages: object-keys: 1.1.1 dev: true - /object.entries/1.1.5: + /object.entries@1.1.5: resolution: {integrity: sha512-TyxmjUoZggd4OrrU1W66FMDG6CuqJxsFvymeyXI51+vQLN67zYfZseptRge703kKQdo4uccgAKebXFcRCzk4+g==} engines: {node: '>= 0.4'} dependencies: @@ -5954,7 +5993,7 @@ packages: es-abstract: 1.20.1 dev: true - /object.fromentries/2.0.5: + /object.fromentries@2.0.5: resolution: {integrity: sha512-CAyG5mWQRRiBU57Re4FKoTBjXfDoNwdFVH2Y1tS9PqCsfUTymAohOkEMSG3aRNKmv4lV3O7p1et7c187q6bynw==} engines: {node: '>= 0.4'} dependencies: @@ -5963,14 +6002,14 @@ packages: es-abstract: 1.20.1 dev: true - /object.hasown/1.1.1: + /object.hasown@1.1.1: resolution: {integrity: sha512-LYLe4tivNQzq4JdaWW6WO3HMZZJWzkkH8fnI6EebWl0VZth2wL2Lovm74ep2/gZzlaTdV62JZHEqHQ2yVn8Q/A==} dependencies: define-properties: 1.1.4 es-abstract: 1.20.1 dev: true - /object.values/1.1.5: + /object.values@1.1.5: resolution: {integrity: sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==} engines: {node: '>= 0.4'} dependencies: @@ -5979,31 +6018,31 @@ packages: es-abstract: 1.20.1 dev: true - /obliterator/2.0.4: + /obliterator@2.0.4: resolution: {integrity: sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ==} dev: true - /once/1.4.0: + /once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} dependencies: wrappy: 1.0.2 dev: true - /onetime/2.0.1: + /onetime@2.0.1: resolution: {integrity: sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==} engines: {node: '>=4'} dependencies: mimic-fn: 1.2.0 dev: true - /onetime/5.1.2: + /onetime@5.1.2: resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} engines: {node: '>=6'} dependencies: mimic-fn: 2.1.0 dev: true - /optionator/0.8.3: + /optionator@0.8.3: resolution: {integrity: sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==} engines: {node: '>= 0.8.0'} dependencies: @@ -6015,7 +6054,7 @@ packages: word-wrap: 1.2.3 dev: true - /optionator/0.9.1: + /optionator@0.9.1: resolution: {integrity: sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==} engines: {node: '>= 0.8.0'} dependencies: @@ -6027,94 +6066,94 @@ packages: word-wrap: 1.2.3 dev: true - /os-tmpdir/1.0.2: + /os-tmpdir@1.0.2: resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} engines: {node: '>=0.10.0'} dev: true - /outdent/0.5.0: + /outdent@0.5.0: resolution: {integrity: sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==} dev: true - /p-filter/2.1.0: + /p-filter@2.1.0: resolution: {integrity: sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==} engines: {node: '>=8'} dependencies: p-map: 2.1.0 dev: true - /p-limit/1.3.0: + /p-limit@1.3.0: resolution: {integrity: sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==} engines: {node: '>=4'} dependencies: p-try: 1.0.0 dev: true - /p-limit/2.3.0: + /p-limit@2.3.0: resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} engines: {node: '>=6'} dependencies: p-try: 2.2.0 dev: true - /p-limit/3.1.0: + /p-limit@3.1.0: resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} engines: {node: '>=10'} dependencies: yocto-queue: 0.1.0 dev: true - /p-locate/2.0.0: + /p-locate@2.0.0: resolution: {integrity: sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==} engines: {node: '>=4'} dependencies: p-limit: 1.3.0 dev: true - /p-locate/4.1.0: + /p-locate@4.1.0: resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} engines: {node: '>=8'} dependencies: p-limit: 2.3.0 dev: true - /p-locate/5.0.0: + /p-locate@5.0.0: resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} engines: {node: '>=10'} dependencies: p-limit: 3.1.0 dev: true - /p-map/2.1.0: + /p-map@2.1.0: resolution: {integrity: sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==} engines: {node: '>=6'} dev: true - /p-map/4.0.0: + /p-map@4.0.0: resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} engines: {node: '>=10'} dependencies: aggregate-error: 3.1.0 dev: true - /p-try/1.0.0: + /p-try@1.0.0: resolution: {integrity: sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==} engines: {node: '>=4'} dev: true - /p-try/2.2.0: + /p-try@2.2.0: resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} engines: {node: '>=6'} dev: true - /parent-module/1.0.1: + /parent-module@1.0.1: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} dependencies: callsites: 3.1.0 dev: true - /parse-json/4.0.0: + /parse-json@4.0.0: resolution: {integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==} engines: {node: '>=4'} dependencies: @@ -6122,7 +6161,7 @@ packages: json-parse-better-errors: 1.0.2 dev: true - /parse-json/5.2.0: + /parse-json@5.2.0: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} engines: {node: '>=8'} dependencies: @@ -6132,45 +6171,45 @@ packages: lines-and-columns: 1.2.4 dev: true - /path-exists/3.0.0: + /path-exists@3.0.0: resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} engines: {node: '>=4'} dev: true - /path-exists/4.0.0: + /path-exists@4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} dev: true - /path-is-absolute/1.0.1: + /path-is-absolute@1.0.1: resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} engines: {node: '>=0.10.0'} dev: true - /path-is-inside/1.0.2: + /path-is-inside@1.0.2: resolution: {integrity: sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==} dev: true - /path-key/2.0.1: + /path-key@2.0.1: resolution: {integrity: sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==} engines: {node: '>=4'} dev: true - /path-key/3.1.1: + /path-key@3.1.1: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} dev: true - /path-parse/1.0.7: + /path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} dev: true - /path-type/4.0.0: + /path-type@4.0.0: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} dev: true - /pbkdf2/3.1.2: + /pbkdf2@3.1.2: resolution: {integrity: sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==} engines: {node: '>=0.12'} dependencies: @@ -6181,38 +6220,38 @@ packages: sha.js: 2.4.11 dev: true - /picocolors/1.0.0: + /picocolors@1.0.0: resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} dev: true - /picomatch/2.3.1: + /picomatch@2.3.1: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} dev: true - /pify/2.3.0: + /pify@2.3.0: resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} engines: {node: '>=0.10.0'} dev: true - /pify/4.0.1: + /pify@4.0.1: resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} engines: {node: '>=6'} dev: true - /pirates/4.0.5: + /pirates@4.0.5: resolution: {integrity: sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==} engines: {node: '>= 6'} dev: true - /pkg-dir/4.2.0: + /pkg-dir@4.2.0: resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} engines: {node: '>=8'} dependencies: find-up: 4.1.0 dev: true - /postcss-import/14.1.0_postcss@8.4.14: + /postcss-import@14.1.0(postcss@8.4.14): resolution: {integrity: sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==} engines: {node: '>=10.0.0'} peerDependencies: @@ -6224,7 +6263,7 @@ packages: resolve: 1.22.1 dev: true - /postcss-js/4.0.0_postcss@8.4.14: + /postcss-js@4.0.0(postcss@8.4.14): resolution: {integrity: sha512-77QESFBwgX4irogGVPgQ5s07vLvFqWr228qZY+w6lW599cRlK/HmnlivnnVUxkjHnCu4J16PDMHcH+e+2HbvTQ==} engines: {node: ^12 || ^14 || >= 16} peerDependencies: @@ -6234,23 +6273,7 @@ packages: postcss: 8.4.14 dev: true - /postcss-load-config/3.1.4: - resolution: {integrity: sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==} - engines: {node: '>= 10'} - peerDependencies: - postcss: '>=8.0.9' - ts-node: '>=9.0.0' - peerDependenciesMeta: - postcss: - optional: true - ts-node: - optional: true - dependencies: - lilconfig: 2.0.6 - yaml: 1.10.2 - dev: true - - /postcss-load-config/3.1.4_pe6iykxod2v7i2uk6okjazxzki: + /postcss-load-config@3.1.4(postcss@8.4.14)(ts-node@10.9.1): resolution: {integrity: sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==} engines: {node: '>= 10'} peerDependencies: @@ -6264,11 +6287,11 @@ packages: dependencies: lilconfig: 2.0.6 postcss: 8.4.14 - ts-node: 10.9.1_hn66opzbaneygq52jmwjxha6su + ts-node: 10.9.1(@types/node@18.6.4)(typescript@4.7.4) yaml: 1.10.2 dev: true - /postcss-nested/5.0.6_postcss@8.4.14: + /postcss-nested@5.0.6(postcss@8.4.14): resolution: {integrity: sha512-rKqm2Fk0KbA8Vt3AdGN0FB9OBOMDVajMG6ZCf/GoHgdxUJ4sBFp0A/uMIRm+MJUdo33YXEtjqIz8u7DAp8B7DA==} engines: {node: '>=12.0'} peerDependencies: @@ -6278,7 +6301,7 @@ packages: postcss-selector-parser: 6.0.10 dev: true - /postcss-selector-parser/6.0.10: + /postcss-selector-parser@6.0.10: resolution: {integrity: sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==} engines: {node: '>=4'} dependencies: @@ -6286,11 +6309,11 @@ packages: util-deprecate: 1.0.2 dev: true - /postcss-value-parser/4.2.0: + /postcss-value-parser@4.2.0: resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} dev: true - /postcss/8.4.14: + /postcss@8.4.14: resolution: {integrity: sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==} engines: {node: ^10 || ^12 || >=14} dependencies: @@ -6299,7 +6322,7 @@ packages: source-map-js: 1.0.2 dev: true - /preferred-pm/3.0.3: + /preferred-pm@3.0.3: resolution: {integrity: sha512-+wZgbxNES/KlJs9q40F/1sfOd/j7f1O9JaHcW5Dsn3aUUOZg3L2bjpVUcKV2jvtElYfoTuQiNeMfQJ4kwUAhCQ==} engines: {node: '>=10'} dependencies: @@ -6309,17 +6332,17 @@ packages: which-pm: 2.0.0 dev: true - /prelude-ls/1.1.2: + /prelude-ls@1.1.2: resolution: {integrity: sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==} engines: {node: '>= 0.8.0'} dev: true - /prelude-ls/1.2.1: + /prelude-ls@1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} dev: true - /prettier-plugin-solidity/1.0.0-dev.23_prettier@2.7.1: + /prettier-plugin-solidity@1.0.0-dev.23(prettier@2.7.1): resolution: {integrity: sha512-440/jZzvtDJcqtoRCQiigo1DYTPAZ85pjNg7gvdd+Lds6QYgID8RyOdygmudzHdFmV2UfENt//A8tzx7iS58GA==} engines: {node: '>=12'} peerDependencies: @@ -6334,20 +6357,20 @@ packages: string-width: 4.2.3 dev: true - /prettier/1.19.1: + /prettier@1.19.1: resolution: {integrity: sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==} engines: {node: '>=4'} hasBin: true dev: true - /prettier/2.7.1: + /prettier@2.7.1: resolution: {integrity: sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==} engines: {node: '>=10.13.0'} hasBin: true requiresBuild: true dev: true - /pretty-format/28.1.3: + /pretty-format@28.1.3: resolution: {integrity: sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} dependencies: @@ -6357,12 +6380,12 @@ packages: react-is: 18.2.0 dev: true - /progress/2.0.3: + /progress@2.0.3: resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} engines: {node: '>=0.4.0'} dev: true - /prompts/2.4.2: + /prompts@2.4.2: resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} engines: {node: '>= 6'} dependencies: @@ -6370,7 +6393,7 @@ packages: sisteransi: 1.0.5 dev: true - /prop-types/15.8.1: + /prop-types@15.8.1: resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} dependencies: loose-envify: 1.4.0 @@ -6378,43 +6401,43 @@ packages: react-is: 16.13.1 dev: true - /pseudomap/1.0.2: + /pseudomap@1.0.2: resolution: {integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==} dev: true - /punycode/2.1.1: + /punycode@2.1.1: resolution: {integrity: sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==} engines: {node: '>=6'} dev: true - /qs/6.11.0: + /qs@6.11.0: resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==} engines: {node: '>=0.6'} dependencies: side-channel: 1.0.4 dev: true - /queue-microtask/1.2.3: + /queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} dev: true - /quick-lru/4.0.1: + /quick-lru@4.0.1: resolution: {integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==} engines: {node: '>=8'} dev: true - /quick-lru/5.1.1: + /quick-lru@5.1.1: resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} engines: {node: '>=10'} dev: true - /randombytes/2.1.0: + /randombytes@2.1.0: resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} dependencies: safe-buffer: 5.2.1 dev: true - /raw-body/2.5.1: + /raw-body@2.5.1: resolution: {integrity: sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==} engines: {node: '>= 0.8'} dependencies: @@ -6424,21 +6447,21 @@ packages: unpipe: 1.0.0 dev: true - /react-is/16.13.1: + /react-is@16.13.1: resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} dev: true - /react-is/18.2.0: + /react-is@18.2.0: resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} dev: true - /read-cache/1.0.0: + /read-cache@1.0.0: resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} dependencies: pify: 2.3.0 dev: true - /read-pkg-up/7.0.1: + /read-pkg-up@7.0.1: resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} engines: {node: '>=8'} dependencies: @@ -6447,7 +6470,7 @@ packages: type-fest: 0.8.1 dev: true - /read-pkg/5.2.0: + /read-pkg@5.2.0: resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} engines: {node: '>=8'} dependencies: @@ -6457,7 +6480,7 @@ packages: type-fest: 0.6.0 dev: true - /read-yaml-file/1.1.0: + /read-yaml-file@1.1.0: resolution: {integrity: sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==} engines: {node: '>=6'} dependencies: @@ -6467,7 +6490,7 @@ packages: strip-bom: 3.0.0 dev: true - /readable-stream/3.6.0: + /readable-stream@3.6.0: resolution: {integrity: sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==} engines: {node: '>= 6'} dependencies: @@ -6476,14 +6499,14 @@ packages: util-deprecate: 1.0.2 dev: true - /readdirp/3.6.0: + /readdirp@3.6.0: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} dependencies: picomatch: 2.3.1 dev: true - /redent/3.0.0: + /redent@3.0.0: resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} engines: {node: '>=8'} dependencies: @@ -6491,16 +6514,16 @@ packages: strip-indent: 3.0.0 dev: true - /regenerator-runtime/0.13.9: + /regenerator-runtime@0.13.9: resolution: {integrity: sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==} dev: true - /regexp-tree/0.1.24: + /regexp-tree@0.1.24: resolution: {integrity: sha512-s2aEVuLhvnVJW6s/iPgEGK6R+/xngd2jNQ+xy4bXNDKxZKJH6jpPHY6kVeVv1IeLCHgswRj+Kl3ELaDjG6V1iw==} hasBin: true dev: true - /regexp.prototype.flags/1.4.3: + /regexp.prototype.flags@1.4.3: resolution: {integrity: sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==} engines: {node: '>= 0.4'} dependencies: @@ -6509,64 +6532,64 @@ packages: functions-have-names: 1.2.3 dev: true - /regexpp/2.0.1: + /regexpp@2.0.1: resolution: {integrity: sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==} engines: {node: '>=6.5.0'} dev: true - /regexpp/3.2.0: + /regexpp@3.2.0: resolution: {integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==} engines: {node: '>=8'} dev: true - /require-directory/2.1.1: + /require-directory@2.1.1: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} dev: true - /require-from-string/2.0.2: + /require-from-string@2.0.2: resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} engines: {node: '>=0.10.0'} dev: true - /require-main-filename/2.0.0: + /require-main-filename@2.0.0: resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} dev: true - /resolve-cwd/3.0.0: + /resolve-cwd@3.0.0: resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} engines: {node: '>=8'} dependencies: resolve-from: 5.0.0 dev: true - /resolve-from/3.0.0: + /resolve-from@3.0.0: resolution: {integrity: sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==} engines: {node: '>=4'} dev: true - /resolve-from/4.0.0: + /resolve-from@4.0.0: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} dev: true - /resolve-from/5.0.0: + /resolve-from@5.0.0: resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} engines: {node: '>=8'} dev: true - /resolve.exports/1.1.0: + /resolve.exports@1.1.0: resolution: {integrity: sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ==} engines: {node: '>=10'} dev: true - /resolve/1.17.0: + /resolve@1.17.0: resolution: {integrity: sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==} dependencies: path-parse: 1.0.7 dev: true - /resolve/1.22.1: + /resolve@1.22.1: resolution: {integrity: sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==} hasBin: true dependencies: @@ -6575,7 +6598,7 @@ packages: supports-preserve-symlinks-flag: 1.0.0 dev: true - /resolve/2.0.0-next.4: + /resolve@2.0.0-next.4: resolution: {integrity: sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==} hasBin: true dependencies: @@ -6584,7 +6607,7 @@ packages: supports-preserve-symlinks-flag: 1.0.0 dev: true - /restore-cursor/2.0.0: + /restore-cursor@2.0.0: resolution: {integrity: sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==} engines: {node: '>=4'} dependencies: @@ -6592,47 +6615,47 @@ packages: signal-exit: 3.0.7 dev: true - /reusify/1.0.4: + /reusify@1.0.4: resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} dev: true - /rimraf/2.6.3: + /rimraf@2.6.3: resolution: {integrity: sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==} hasBin: true dependencies: glob: 7.2.3 dev: true - /rimraf/2.7.1: + /rimraf@2.7.1: resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==} hasBin: true dependencies: glob: 7.2.0 dev: true - /rimraf/3.0.2: + /rimraf@3.0.2: resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} hasBin: true dependencies: glob: 7.2.3 dev: true - /ripemd160/2.0.2: + /ripemd160@2.0.2: resolution: {integrity: sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==} dependencies: hash-base: 3.1.0 inherits: 2.0.4 dev: true - /rlp/2.2.7: + /rlp@2.2.7: resolution: {integrity: sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ==} hasBin: true dependencies: bn.js: 5.2.1 dev: true - /rollup/2.77.2: + /rollup@2.77.2: resolution: {integrity: sha512-m/4YzYgLcpMQbxX3NmAqDvwLATZzxt8bIegO78FZLl+lAgKJBd1DRAOeEiZcKOIOPjxE6ewHWHNgGEalFXuz1g==} engines: {node: '>=10.0.0'} hasBin: true @@ -6640,56 +6663,56 @@ packages: fsevents: 2.3.2 dev: true - /run-async/2.4.1: + /run-async@2.4.1: resolution: {integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==} engines: {node: '>=0.12.0'} dev: true - /run-parallel-limit/1.1.0: + /run-parallel-limit@1.1.0: resolution: {integrity: sha512-jJA7irRNM91jaKc3Hcl1npHsFLOXOoTkPCUL1JEa1R82O2miplXXRaGdjW/KM/98YQWDhJLiSs793CnXfblJUw==} dependencies: queue-microtask: 1.2.3 dev: true - /run-parallel/1.2.0: + /run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} dependencies: queue-microtask: 1.2.3 dev: true - /rustbn.js/0.2.0: + /rustbn.js@0.2.0: resolution: {integrity: sha512-4VlvkRUuCJvr2J6Y0ImW7NvTCriMi7ErOAqWk1y69vAdoNIzCF3yPmgeNzx+RQTLEDFq5sHfscn1MwHxP9hNfA==} dev: true - /rxjs/6.6.7: + /rxjs@6.6.7: resolution: {integrity: sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==} engines: {npm: '>=2.0.0'} dependencies: tslib: 1.14.1 dev: true - /safe-buffer/5.1.2: + /safe-buffer@5.1.2: resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} dev: true - /safe-buffer/5.2.1: + /safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} dev: true - /safe-regex/2.1.1: + /safe-regex@2.1.1: resolution: {integrity: sha512-rx+x8AMzKb5Q5lQ95Zoi6ZbJqwCLkqi3XuJXp5P3rT8OEc6sZCJG5AE5dU3lsgRr/F4Bs31jSlVN+j5KrsGu9A==} dependencies: regexp-tree: 0.1.24 dev: true - /safer-buffer/2.1.2: + /safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} dev: true - /scrypt-js/3.0.1: + /scrypt-js@3.0.1: resolution: {integrity: sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==} - /secp256k1/4.0.3: + /secp256k1@4.0.3: resolution: {integrity: sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA==} engines: {node: '>=10.0.0'} requiresBuild: true @@ -6699,17 +6722,17 @@ packages: node-gyp-build: 4.5.0 dev: true - /semver/5.7.1: + /semver@5.7.1: resolution: {integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==} hasBin: true dev: true - /semver/6.3.0: + /semver@6.3.0: resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==} hasBin: true dev: true - /semver/7.3.7: + /semver@7.3.7: resolution: {integrity: sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==} engines: {node: '>=10'} hasBin: true @@ -6717,25 +6740,25 @@ packages: lru-cache: 6.0.0 dev: true - /serialize-javascript/6.0.0: + /serialize-javascript@6.0.0: resolution: {integrity: sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==} dependencies: randombytes: 2.1.0 dev: true - /set-blocking/2.0.0: + /set-blocking@2.0.0: resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} dev: true - /setimmediate/1.0.5: + /setimmediate@1.0.5: resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} dev: true - /setprototypeof/1.2.0: + /setprototypeof@1.2.0: resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} dev: true - /sha.js/2.4.11: + /sha.js@2.4.11: resolution: {integrity: sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==} hasBin: true dependencies: @@ -6743,31 +6766,31 @@ packages: safe-buffer: 5.2.1 dev: true - /shebang-command/1.2.0: + /shebang-command@1.2.0: resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} engines: {node: '>=0.10.0'} dependencies: shebang-regex: 1.0.0 dev: true - /shebang-command/2.0.0: + /shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} dependencies: shebang-regex: 3.0.0 dev: true - /shebang-regex/1.0.0: + /shebang-regex@1.0.0: resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==} engines: {node: '>=0.10.0'} dev: true - /shebang-regex/3.0.0: + /shebang-regex@3.0.0: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} dev: true - /side-channel/1.0.4: + /side-channel@1.0.4: resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} dependencies: call-bind: 1.0.2 @@ -6775,20 +6798,20 @@ packages: object-inspect: 1.12.2 dev: true - /signal-exit/3.0.7: + /signal-exit@3.0.7: resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} dev: true - /sisteransi/1.0.5: + /sisteransi@1.0.5: resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} dev: true - /slash/3.0.0: + /slash@3.0.0: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} dev: true - /slice-ansi/2.1.0: + /slice-ansi@2.1.0: resolution: {integrity: sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==} engines: {node: '>=6'} dependencies: @@ -6797,7 +6820,7 @@ packages: is-fullwidth-code-point: 2.0.0 dev: true - /slice-ansi/4.0.0: + /slice-ansi@4.0.0: resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==} engines: {node: '>=10'} dependencies: @@ -6806,7 +6829,7 @@ packages: is-fullwidth-code-point: 3.0.0 dev: true - /smartwrap/2.0.2: + /smartwrap@2.0.2: resolution: {integrity: sha512-vCsKNQxb7PnCNd2wY1WClWifAc2lwqsG8OaswpJkVJsvMGcnEntdTCDajZCkk93Ay1U3t/9puJmb525Rg5MZBA==} engines: {node: '>=6'} hasBin: true @@ -6819,14 +6842,14 @@ packages: yargs: 15.4.1 dev: true - /solc/0.7.3_debug@4.3.4: + /solc@0.7.3(debug@4.3.4): resolution: {integrity: sha512-GAsWNAjGzIDg7VxzP6mPjdurby3IkGCjQcM8GFYZT6RyaoUZKmMU6Y7YwG+tFGhv7dwZ8rmR4iwFDrrD99JwqA==} engines: {node: '>=8.0.0'} hasBin: true dependencies: command-exists: 1.2.9 commander: 3.0.2 - follow-redirects: 1.15.2_debug@4.3.4 + follow-redirects: 1.15.2(debug@4.3.4) fs-extra: 0.30.0 js-sha3: 0.8.0 memorystream: 0.3.1 @@ -6837,7 +6860,7 @@ packages: - debug dev: true - /solhint/3.3.7: + /solhint@3.3.7: resolution: {integrity: sha512-NjjjVmXI3ehKkb3aNtRJWw55SUVJ8HMKKodwe0HnejA+k0d2kmhw7jvpa+MCTbcEgt8IWSwx0Hu6aCo/iYOZzQ==} hasBin: true dependencies: @@ -6861,100 +6884,100 @@ packages: - supports-color dev: true - /solidity-comments-extractor/0.0.7: + /solidity-comments-extractor@0.0.7: resolution: {integrity: sha512-wciNMLg/Irp8OKGrh3S2tfvZiZ0NEyILfcRCXCD4mp7SgK/i9gzLfhY2hY7VMCQJ3kH9UB9BzNdibIVMchzyYw==} dev: true - /source-map-js/1.0.2: + /source-map-js@1.0.2: resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} engines: {node: '>=0.10.0'} dev: true - /source-map-support/0.5.13: + /source-map-support@0.5.13: resolution: {integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==} dependencies: buffer-from: 1.1.2 source-map: 0.6.1 dev: true - /source-map-support/0.5.21: + /source-map-support@0.5.21: resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} dependencies: buffer-from: 1.1.2 source-map: 0.6.1 dev: true - /source-map/0.6.1: + /source-map@0.6.1: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} dev: true - /source-map/0.8.0-beta.0: + /source-map@0.8.0-beta.0: resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} engines: {node: '>= 8'} dependencies: whatwg-url: 7.1.0 dev: true - /spawndamnit/2.0.0: + /spawndamnit@2.0.0: resolution: {integrity: sha512-j4JKEcncSjFlqIwU5L/rp2N5SIPsdxaRsIv678+TZxZ0SRDJTm8JrxJMjE/XuiEZNEir3S8l0Fa3Ke339WI4qA==} dependencies: cross-spawn: 5.1.0 signal-exit: 3.0.7 dev: true - /spdx-correct/3.1.1: + /spdx-correct@3.1.1: resolution: {integrity: sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==} dependencies: spdx-expression-parse: 3.0.1 spdx-license-ids: 3.0.11 dev: true - /spdx-exceptions/2.3.0: + /spdx-exceptions@2.3.0: resolution: {integrity: sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==} dev: true - /spdx-expression-parse/3.0.1: + /spdx-expression-parse@3.0.1: resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} dependencies: spdx-exceptions: 2.3.0 spdx-license-ids: 3.0.11 dev: true - /spdx-license-ids/3.0.11: + /spdx-license-ids@3.0.11: resolution: {integrity: sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g==} dev: true - /sprintf-js/1.0.3: + /sprintf-js@1.0.3: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} dev: true - /stack-utils/2.0.5: + /stack-utils@2.0.5: resolution: {integrity: sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA==} engines: {node: '>=10'} dependencies: escape-string-regexp: 2.0.0 dev: true - /stacktrace-parser/0.1.10: + /stacktrace-parser@0.1.10: resolution: {integrity: sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg==} engines: {node: '>=6'} dependencies: type-fest: 0.7.1 dev: true - /statuses/2.0.1: + /statuses@2.0.1: resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} engines: {node: '>= 0.8'} dev: true - /stream-transform/2.1.3: + /stream-transform@2.1.3: resolution: {integrity: sha512-9GHUiM5hMiCi6Y03jD2ARC1ettBXkQBoQAe7nJsPknnI0ow10aXjTnew8QtYQmLjzn974BnmWEAJgCY6ZP1DeQ==} dependencies: mixme: 0.5.4 dev: true - /string-length/4.0.2: + /string-length@4.0.2: resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} engines: {node: '>=10'} dependencies: @@ -6962,7 +6985,7 @@ packages: strip-ansi: 6.0.1 dev: true - /string-width/2.1.1: + /string-width@2.1.1: resolution: {integrity: sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==} engines: {node: '>=4'} dependencies: @@ -6970,7 +6993,7 @@ packages: strip-ansi: 4.0.0 dev: true - /string-width/3.1.0: + /string-width@3.1.0: resolution: {integrity: sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==} engines: {node: '>=6'} dependencies: @@ -6979,7 +7002,7 @@ packages: strip-ansi: 5.2.0 dev: true - /string-width/4.2.3: + /string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} dependencies: @@ -6988,7 +7011,7 @@ packages: strip-ansi: 6.0.1 dev: true - /string.prototype.matchall/4.0.7: + /string.prototype.matchall@4.0.7: resolution: {integrity: sha512-f48okCX7JiwVi1NXCVWcFnZgADDC/n2vePlQ/KUCNqCikLLilQvwjMO8+BHVKvgzH0JB0J9LEPgxOGT02RoETg==} dependencies: call-bind: 1.0.2 @@ -7001,7 +7024,7 @@ packages: side-channel: 1.0.4 dev: true - /string.prototype.trimend/1.0.5: + /string.prototype.trimend@1.0.5: resolution: {integrity: sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog==} dependencies: call-bind: 1.0.2 @@ -7009,7 +7032,7 @@ packages: es-abstract: 1.20.1 dev: true - /string.prototype.trimstart/1.0.5: + /string.prototype.trimstart@1.0.5: resolution: {integrity: sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg==} dependencies: call-bind: 1.0.2 @@ -7017,73 +7040,73 @@ packages: es-abstract: 1.20.1 dev: true - /string_decoder/1.3.0: + /string_decoder@1.3.0: resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} dependencies: safe-buffer: 5.2.1 dev: true - /strip-ansi/4.0.0: + /strip-ansi@4.0.0: resolution: {integrity: sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==} engines: {node: '>=4'} dependencies: ansi-regex: 3.0.1 dev: true - /strip-ansi/5.2.0: + /strip-ansi@5.2.0: resolution: {integrity: sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==} engines: {node: '>=6'} dependencies: ansi-regex: 4.1.1 dev: true - /strip-ansi/6.0.1: + /strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} dependencies: ansi-regex: 5.0.1 dev: true - /strip-bom/3.0.0: + /strip-bom@3.0.0: resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} engines: {node: '>=4'} dev: true - /strip-bom/4.0.0: + /strip-bom@4.0.0: resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} engines: {node: '>=8'} dev: true - /strip-final-newline/2.0.0: + /strip-final-newline@2.0.0: resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} engines: {node: '>=6'} dev: true - /strip-hex-prefix/1.0.0: + /strip-hex-prefix@1.0.0: resolution: {integrity: sha512-q8d4ue7JGEiVcypji1bALTos+0pWtyGlivAWyPuTkHzuTCJqrK9sWxYQZUq6Nq3cuyv3bm734IhHvHtGGURU6A==} engines: {node: '>=6.5.0', npm: '>=3'} dependencies: is-hex-prefixed: 1.0.0 dev: true - /strip-indent/3.0.0: + /strip-indent@3.0.0: resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} engines: {node: '>=8'} dependencies: min-indent: 1.0.1 dev: true - /strip-json-comments/2.0.1: + /strip-json-comments@2.0.1: resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} engines: {node: '>=0.10.0'} dev: true - /strip-json-comments/3.1.1: + /strip-json-comments@3.1.1: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} dev: true - /sucrase/3.25.0: + /sucrase@3.25.0: resolution: {integrity: sha512-WxTtwEYXSmZArPGStGBicyRsg5TBEFhT5b7N+tF+zauImP0Acy+CoUK0/byJ8JNPK/5lbpWIVuFagI4+0l85QQ==} engines: {node: '>=8'} hasBin: true @@ -7096,28 +7119,28 @@ packages: ts-interface-checker: 0.1.13 dev: true - /supports-color/5.5.0: + /supports-color@5.5.0: resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} engines: {node: '>=4'} dependencies: has-flag: 3.0.0 dev: true - /supports-color/7.2.0: + /supports-color@7.2.0: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} dependencies: has-flag: 4.0.0 dev: true - /supports-color/8.1.1: + /supports-color@8.1.1: resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} engines: {node: '>=10'} dependencies: has-flag: 4.0.0 dev: true - /supports-hyperlinks/2.2.0: + /supports-hyperlinks@2.2.0: resolution: {integrity: sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ==} engines: {node: '>=8'} dependencies: @@ -7125,12 +7148,12 @@ packages: supports-color: 7.2.0 dev: true - /supports-preserve-symlinks-flag/1.0.0: + /supports-preserve-symlinks-flag@1.0.0: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} dev: true - /table/5.4.6: + /table@5.4.6: resolution: {integrity: sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==} engines: {node: '>=6.0.0'} dependencies: @@ -7140,7 +7163,7 @@ packages: string-width: 3.1.0 dev: true - /table/6.8.0: + /table@6.8.0: resolution: {integrity: sha512-s/fitrbVeEyHKFa7mFdkuQMWlH1Wgw/yEXMt5xACT4ZpzWFluehAxRtUUQKPuWhaLAWhFcVx6w3oC8VKaUfPGA==} engines: {node: '>=10.0.0'} dependencies: @@ -7151,7 +7174,7 @@ packages: strip-ansi: 6.0.1 dev: true - /tailwindcss/3.1.7_pe6iykxod2v7i2uk6okjazxzki: + /tailwindcss@3.1.7(postcss@8.4.14)(ts-node@10.9.1): resolution: {integrity: sha512-r7mgumZ3k0InfVPpGWcX8X/Ut4xBfv+1O/+C73ar/m01LxGVzWvPxF/w6xIUPEztrCoz7axfx0SMdh8FH8ZvRQ==} engines: {node: '>=12.13.0'} hasBin: true @@ -7172,10 +7195,10 @@ packages: object-hash: 3.0.0 picocolors: 1.0.0 postcss: 8.4.14 - postcss-import: 14.1.0_postcss@8.4.14 - postcss-js: 4.0.0_postcss@8.4.14 - postcss-load-config: 3.1.4_pe6iykxod2v7i2uk6okjazxzki - postcss-nested: 5.0.6_postcss@8.4.14 + postcss-import: 14.1.0(postcss@8.4.14) + postcss-js: 4.0.0(postcss@8.4.14) + postcss-load-config: 3.1.4(postcss@8.4.14)(ts-node@10.9.1) + postcss-nested: 5.0.6(postcss@8.4.14) postcss-selector-parser: 6.0.10 postcss-value-parser: 4.2.0 quick-lru: 5.1.1 @@ -7184,12 +7207,12 @@ packages: - ts-node dev: true - /term-size/2.2.1: + /term-size@2.2.1: resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} engines: {node: '>=8'} dev: true - /terminal-link/2.1.1: + /terminal-link@2.1.1: resolution: {integrity: sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==} engines: {node: '>=8'} dependencies: @@ -7197,7 +7220,7 @@ packages: supports-hyperlinks: 2.2.0 dev: true - /test-exclude/6.0.0: + /test-exclude@6.0.0: resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} engines: {node: '>=8'} dependencies: @@ -7206,81 +7229,81 @@ packages: minimatch: 3.1.2 dev: true - /text-table/0.2.0: + /text-table@0.2.0: resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} dev: true - /thenify-all/1.6.0: + /thenify-all@1.6.0: resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} engines: {node: '>=0.8'} dependencies: thenify: 3.3.1 dev: true - /thenify/3.3.1: + /thenify@3.3.1: resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} dependencies: any-promise: 1.3.0 dev: true - /through/2.3.8: + /through@2.3.8: resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} dev: true - /tmp/0.0.33: + /tmp@0.0.33: resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} engines: {node: '>=0.6.0'} dependencies: os-tmpdir: 1.0.2 dev: true - /tmpl/1.0.5: + /tmpl@1.0.5: resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} dev: true - /to-fast-properties/2.0.0: + /to-fast-properties@2.0.0: resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} engines: {node: '>=4'} dev: true - /to-regex-range/5.0.1: + /to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} dependencies: is-number: 7.0.0 dev: true - /toidentifier/1.0.1: + /toidentifier@1.0.1: resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} engines: {node: '>=0.6'} dev: true - /tr46/1.0.1: + /tr46@1.0.1: resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} dependencies: punycode: 2.1.1 dev: true - /tree-kill/1.2.2: + /tree-kill@1.2.2: resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} hasBin: true dev: true - /treeify/1.1.0: + /treeify@1.1.0: resolution: {integrity: sha512-1m4RA7xVAJrSGrrXGs0L3YTwyvBs2S8PbRHaLZAkFw7JR8oIFwYtysxlBZhYIa7xSyiYJKZ3iGrrk55cGA3i9A==} engines: {node: '>=0.6'} dev: true - /trim-newlines/3.0.1: + /trim-newlines@3.0.1: resolution: {integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==} engines: {node: '>=8'} dev: true - /ts-interface-checker/0.1.13: + /ts-interface-checker@0.1.13: resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} dev: true - /ts-node/10.9.1_hn66opzbaneygq52jmwjxha6su: + /ts-node@10.9.1(@types/node@18.6.4)(typescript@4.7.4): resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} hasBin: true peerDependencies: @@ -7311,7 +7334,7 @@ packages: yn: 3.1.1 dev: true - /tsconfig-paths/4.1.0: + /tsconfig-paths@4.1.0: resolution: {integrity: sha512-AHx4Euop/dXFC+Vx589alFba8QItjF+8hf8LtmuiCwHyI4rHXQtOOENaM8kvYf5fR0dRChy3wzWIZ9WbB7FWow==} engines: {node: '>=6'} dependencies: @@ -7320,15 +7343,15 @@ packages: strip-bom: 3.0.0 dev: true - /tslib/1.14.1: + /tslib@1.14.1: resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} dev: true - /tsort/0.0.1: + /tsort@0.0.1: resolution: {integrity: sha512-Tyrf5mxF8Ofs1tNoxA13lFeZ2Zrbd6cKbuH3V+MQ5sb6DtBj5FjrXVsRWT8YvNAQTqNoz66dz1WsbigI22aEnw==} dev: true - /tsup/6.2.1_ltanrvuoktvcmn7biuqju6k57a: + /tsup@6.2.1(postcss@8.4.14)(ts-node@10.9.1)(typescript@4.7.4): resolution: {integrity: sha512-KhBhCqVA3bHrIWhkcqTUA7R69H05IcBlHEtCVLEu42XDGUzz+bDqCcfu5PwpkKJ8DqK5tpdgM/qmyk4DdUbkZw==} engines: {node: '>=14'} hasBin: true @@ -7344,52 +7367,16 @@ packages: typescript: optional: true dependencies: - bundle-require: 3.0.4_esbuild@0.14.53 + bundle-require: 3.0.4(esbuild@0.14.53) cac: 6.7.12 chokidar: 3.5.3 - debug: 4.3.4 + debug: 4.3.4(supports-color@8.1.1) esbuild: 0.14.53 execa: 5.1.1 globby: 11.1.0 joycon: 3.1.1 postcss: 8.4.14 - postcss-load-config: 3.1.4_pe6iykxod2v7i2uk6okjazxzki - resolve-from: 5.0.0 - rollup: 2.77.2 - source-map: 0.8.0-beta.0 - sucrase: 3.25.0 - tree-kill: 1.2.2 - typescript: 4.7.4 - transitivePeerDependencies: - - supports-color - - ts-node - dev: true - - /tsup/6.2.1_typescript@4.7.4: - resolution: {integrity: sha512-KhBhCqVA3bHrIWhkcqTUA7R69H05IcBlHEtCVLEu42XDGUzz+bDqCcfu5PwpkKJ8DqK5tpdgM/qmyk4DdUbkZw==} - engines: {node: '>=14'} - hasBin: true - peerDependencies: - '@swc/core': ^1 - postcss: ^8.4.12 - typescript: ^4.1.0 - peerDependenciesMeta: - '@swc/core': - optional: true - postcss: - optional: true - typescript: - optional: true - dependencies: - bundle-require: 3.0.4_esbuild@0.14.53 - cac: 6.7.12 - chokidar: 3.5.3 - debug: 4.3.4 - esbuild: 0.14.53 - execa: 5.1.1 - globby: 11.1.0 - joycon: 3.1.1 - postcss-load-config: 3.1.4 + postcss-load-config: 3.1.4(postcss@8.4.14)(ts-node@10.9.1) resolve-from: 5.0.0 rollup: 2.77.2 source-map: 0.8.0-beta.0 @@ -7401,7 +7388,7 @@ packages: - ts-node dev: true - /tsutils/3.21.0_typescript@4.7.4: + /tsutils@3.21.0(typescript@4.7.4): resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} engines: {node: '>= 6'} peerDependencies: @@ -7411,7 +7398,7 @@ packages: typescript: 4.7.4 dev: true - /tty-table/4.1.6: + /tty-table@4.1.6: resolution: {integrity: sha512-kRj5CBzOrakV4VRRY5kUWbNYvo/FpOsz65DzI5op9P+cHov3+IqPbo1JE1ZnQGkHdZgNFDsrEjrfqqy/Ply9fw==} engines: {node: '>=8.0.0'} hasBin: true @@ -7425,70 +7412,70 @@ packages: yargs: 17.5.1 dev: true - /tweetnacl-util/0.15.1: + /tweetnacl-util@0.15.1: resolution: {integrity: sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw==} dev: true - /tweetnacl/1.0.3: + /tweetnacl@1.0.3: resolution: {integrity: sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==} dev: true - /type-check/0.3.2: + /type-check@0.3.2: resolution: {integrity: sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==} engines: {node: '>= 0.8.0'} dependencies: prelude-ls: 1.1.2 dev: true - /type-check/0.4.0: + /type-check@0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} dependencies: prelude-ls: 1.2.1 dev: true - /type-detect/4.0.8: + /type-detect@4.0.8: resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} engines: {node: '>=4'} dev: true - /type-fest/0.13.1: + /type-fest@0.13.1: resolution: {integrity: sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==} engines: {node: '>=10'} dev: true - /type-fest/0.20.2: + /type-fest@0.20.2: resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} engines: {node: '>=10'} dev: true - /type-fest/0.21.3: + /type-fest@0.21.3: resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} engines: {node: '>=10'} dev: true - /type-fest/0.6.0: + /type-fest@0.6.0: resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} engines: {node: '>=8'} dev: true - /type-fest/0.7.1: + /type-fest@0.7.1: resolution: {integrity: sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==} engines: {node: '>=8'} dev: true - /type-fest/0.8.1: + /type-fest@0.8.1: resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} engines: {node: '>=8'} dev: true - /typescript/4.7.4: + /typescript@4.7.4: resolution: {integrity: sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==} engines: {node: '>=4.2.0'} hasBin: true dev: true - /unbox-primitive/1.0.2: + /unbox-primitive@1.0.2: resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} dependencies: call-bind: 1.0.2 @@ -7497,27 +7484,27 @@ packages: which-boxed-primitive: 1.0.2 dev: true - /undici/5.10.0: + /undici@5.10.0: resolution: {integrity: sha512-c8HsD3IbwmjjbLvoZuRI26TZic+TSEe8FPMLLOkN1AfYRhdjnKBU6yL+IwcSCbdZiX4e5t0lfMDLDCqj4Sq70g==} engines: {node: '>=12.18'} dev: true - /universalify/0.1.2: + /universalify@0.1.2: resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} engines: {node: '>= 4.0.0'} dev: true - /universalify/2.0.0: + /universalify@2.0.0: resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==} engines: {node: '>= 10.0.0'} dev: true - /unpipe/1.0.0: + /unpipe@1.0.0: resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} engines: {node: '>= 0.8'} dev: true - /update-browserslist-db/1.0.5_browserslist@4.21.3: + /update-browserslist-db@1.0.5(browserslist@4.21.3): resolution: {integrity: sha512-dteFFpCyvuDdr9S/ff1ISkKt/9YZxKjI9WlRR99c180GaztJtRa/fn18FdxGVKVsnPY7/a/FDN68mcvUmP4U7Q==} hasBin: true peerDependencies: @@ -7528,34 +7515,34 @@ packages: picocolors: 1.0.0 dev: true - /uri-js/4.4.1: + /uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} dependencies: punycode: 2.1.1 dev: true - /utf8/3.0.0: + /utf8@3.0.0: resolution: {integrity: sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ==} dev: true - /util-deprecate/1.0.2: + /util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} dev: true - /uuid/8.3.2: + /uuid@8.3.2: resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} hasBin: true dev: true - /v8-compile-cache-lib/3.0.1: + /v8-compile-cache-lib@3.0.1: resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} dev: true - /v8-compile-cache/2.3.0: + /v8-compile-cache@2.3.0: resolution: {integrity: sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==} dev: true - /v8-to-istanbul/9.0.1: + /v8-to-istanbul@9.0.1: resolution: {integrity: sha512-74Y4LqY74kLE6IFyIjPtkSTWzUZmj8tdHT9Ii/26dvQ6K9Dl2NbEfj0XgU2sHCtKgt5VupqhlO/5aWuqS+IY1w==} engines: {node: '>=10.12.0'} dependencies: @@ -7564,26 +7551,26 @@ packages: convert-source-map: 1.8.0 dev: true - /validate-npm-package-license/3.0.4: + /validate-npm-package-license@3.0.4: resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} dependencies: spdx-correct: 3.1.1 spdx-expression-parse: 3.0.1 dev: true - /walker/1.0.8: + /walker@1.0.8: resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} dependencies: makeerror: 1.0.12 dev: true - /wcwidth/1.0.1: + /wcwidth@1.0.1: resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} dependencies: defaults: 1.0.3 dev: true - /web3-utils/1.7.5: + /web3-utils@1.7.5: resolution: {integrity: sha512-9AqNOziQky4wNQadEwEfHiBdOZqopIHzQQVzmvvv6fJwDSMhP+khqmAZC7YTiGjs0MboyZ8tWNivqSO1699XQw==} engines: {node: '>=8.0.0'} dependencies: @@ -7596,11 +7583,11 @@ packages: utf8: 3.0.0 dev: true - /webidl-conversions/4.0.2: + /webidl-conversions@4.0.2: resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} dev: true - /whatwg-url/7.1.0: + /whatwg-url@7.1.0: resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} dependencies: lodash.sortby: 4.7.0 @@ -7608,7 +7595,7 @@ packages: webidl-conversions: 4.0.2 dev: true - /which-boxed-primitive/1.0.2: + /which-boxed-primitive@1.0.2: resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} dependencies: is-bigint: 1.0.4 @@ -7618,11 +7605,11 @@ packages: is-symbol: 1.0.4 dev: true - /which-module/2.0.0: + /which-module@2.0.0: resolution: {integrity: sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==} dev: true - /which-pm/2.0.0: + /which-pm@2.0.0: resolution: {integrity: sha512-Lhs9Pmyph0p5n5Z3mVnN0yWcbQYUAD7rbQUiMsQxOJ3T57k7RFe35SUwWMf7dsbDZks1uOmw4AecB/JMDj3v/w==} engines: {node: '>=8.15'} dependencies: @@ -7630,14 +7617,14 @@ packages: path-exists: 4.0.0 dev: true - /which/1.3.1: + /which@1.3.1: resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} hasBin: true dependencies: isexe: 2.0.0 dev: true - /which/2.0.2: + /which@2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} engines: {node: '>= 8'} hasBin: true @@ -7645,16 +7632,16 @@ packages: isexe: 2.0.0 dev: true - /word-wrap/1.2.3: + /word-wrap@1.2.3: resolution: {integrity: sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==} engines: {node: '>=0.10.0'} dev: true - /workerpool/6.2.1: + /workerpool@6.2.1: resolution: {integrity: sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==} dev: true - /wrap-ansi/6.2.0: + /wrap-ansi@6.2.0: resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} engines: {node: '>=8'} dependencies: @@ -7663,7 +7650,7 @@ packages: strip-ansi: 6.0.1 dev: true - /wrap-ansi/7.0.0: + /wrap-ansi@7.0.0: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} dependencies: @@ -7672,11 +7659,11 @@ packages: strip-ansi: 6.0.1 dev: true - /wrappy/1.0.2: + /wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} dev: true - /write-file-atomic/4.0.1: + /write-file-atomic@4.0.1: resolution: {integrity: sha512-nSKUxgAbyioruk6hU87QzVbY279oYT6uiwgDoujth2ju4mJ+TZau7SQBhtbTmUyuNYTuXnSyRn66FV0+eCgcrQ==} engines: {node: ^12.13.0 || ^14.15.0 || >=16} dependencies: @@ -7684,14 +7671,14 @@ packages: signal-exit: 3.0.7 dev: true - /write/1.0.3: + /write@1.0.3: resolution: {integrity: sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==} engines: {node: '>=4'} dependencies: mkdirp: 0.5.6 dev: true - /ws/7.4.6: + /ws@7.4.6: resolution: {integrity: sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==} engines: {node: '>=8.3.0'} peerDependencies: @@ -7703,7 +7690,7 @@ packages: utf-8-validate: optional: true - /ws/7.5.9: + /ws@7.5.9: resolution: {integrity: sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==} engines: {node: '>=8.3.0'} peerDependencies: @@ -7716,38 +7703,38 @@ packages: optional: true dev: true - /xtend/4.0.2: + /xtend@4.0.2: resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} engines: {node: '>=0.4'} dev: true - /y18n/4.0.3: + /y18n@4.0.3: resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} dev: true - /y18n/5.0.8: + /y18n@5.0.8: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} dev: true - /yallist/2.1.2: + /yallist@2.1.2: resolution: {integrity: sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==} dev: true - /yallist/3.1.1: + /yallist@3.1.1: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} dev: true - /yallist/4.0.0: + /yallist@4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} dev: true - /yaml/1.10.2: + /yaml@1.10.2: resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} engines: {node: '>= 6'} dev: true - /yargs-parser/18.1.3: + /yargs-parser@18.1.3: resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==} engines: {node: '>=6'} dependencies: @@ -7755,17 +7742,17 @@ packages: decamelize: 1.2.0 dev: true - /yargs-parser/20.2.4: + /yargs-parser@20.2.4: resolution: {integrity: sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==} engines: {node: '>=10'} dev: true - /yargs-parser/21.1.1: + /yargs-parser@21.1.1: resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} engines: {node: '>=12'} dev: true - /yargs-unparser/2.0.0: + /yargs-unparser@2.0.0: resolution: {integrity: sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==} engines: {node: '>=10'} dependencies: @@ -7775,7 +7762,7 @@ packages: is-plain-obj: 2.1.0 dev: true - /yargs/15.4.1: + /yargs@15.4.1: resolution: {integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==} engines: {node: '>=8'} dependencies: @@ -7792,7 +7779,7 @@ packages: yargs-parser: 18.1.3 dev: true - /yargs/16.2.0: + /yargs@16.2.0: resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} engines: {node: '>=10'} dependencies: @@ -7805,7 +7792,7 @@ packages: yargs-parser: 20.2.4 dev: true - /yargs/17.5.1: + /yargs@17.5.1: resolution: {integrity: sha512-t6YAJcxDkNX7NFYiVtKvWUz8l+PaKTLiL63mJYWR2GnHq2gjEWISzsLp9wg3aY36dY1j+gfIEL3pIF+XlJJfbA==} engines: {node: '>=12'} dependencies: @@ -7818,17 +7805,17 @@ packages: yargs-parser: 21.1.1 dev: true - /yn/3.1.1: + /yn@3.1.1: resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} engines: {node: '>=6'} dev: true - /yocto-queue/0.1.0: + /yocto-queue@0.1.0: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} dev: true - /zksync-web3/0.8.1_ethers@5.7.1: + /zksync-web3@0.8.1(ethers@5.7.1): resolution: {integrity: sha512-1A4aHPQ3MyuGjpv5X/8pVEN+MdZqMjfVmiweQSRjOlklXYu65wT9BGEOtCmMs5d3gIvLp4ssfTeuR5OCKOD2kw==} peerDependencies: ethers: ~5.7.0 @@ -7836,7 +7823,7 @@ packages: ethers: 5.7.1 dev: true - github.com/uniswap/v3-periphery/80f26c86c57b8a5e4b913f42844d4c8bd274d058_hardhat@2.11.2: + github.com/uniswap/v3-periphery/80f26c86c57b8a5e4b913f42844d4c8bd274d058(hardhat@2.11.2): resolution: {tarball: https://codeload.github.com/uniswap/v3-periphery/tar.gz/80f26c86c57b8a5e4b913f42844d4c8bd274d058} id: github.com/uniswap/v3-periphery/80f26c86c57b8a5e4b913f42844d4c8bd274d058 name: '@uniswap/v3-periphery' @@ -7848,7 +7835,7 @@ packages: '@uniswap/v2-core': 1.0.1 '@uniswap/v3-core': 1.0.0 base64-sol: 1.0.1 - hardhat-watcher: 2.5.0_hardhat@2.11.2 + hardhat-watcher: 2.5.0(hardhat@2.11.2) transitivePeerDependencies: - hardhat dev: true diff --git a/remappings.txt b/remappings.txt index 4752bbfa0..087934b82 100644 --- a/remappings.txt +++ b/remappings.txt @@ -1,6 +1,8 @@ -@enzyme/=contracts/ @openzeppelin-solc-0.7/=node_modules/@openzeppelin-solc-0.7/ @openzeppelin/=node_modules/@openzeppelin/ @uniswap/=node_modules/@uniswap/ +base64-sol/=node_modules/base64-sol/ ds-test/=lib/forge-std/lib/ds-test/src/ forge-std/=lib/forge-std/src/ +hardhat-deploy/=node_modules/hardhat-deploy/ +hardhat/=node_modules/hardhat/ diff --git a/tests/bases/IntegrationTest.sol b/tests/bases/IntegrationTest.sol new file mode 100644 index 000000000..822dcb595 --- /dev/null +++ b/tests/bases/IntegrationTest.sol @@ -0,0 +1,152 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity 0.8.17; + +import {Test} from "forge-std/Test.sol"; + +import {CommonUtils} from "tests/utils/CommonUtils.sol"; +import {CoreUtils, ICoreDeployment} from "tests/utils/CoreUtils.sol"; + +import {IERC20} from "tests/interfaces/external/IERC20.sol"; +import {IWETH} from "tests/interfaces/external/IWETH.sol"; + +abstract contract IntegrationTest is Test, CoreUtils, CommonUtils { + IERC20 internal mlnToken; + IWETH internal wethToken; + IWETH internal wrappedNativeToken; + + IERC20 internal standardPrimitive; + IERC20 internal nonStandardPrimitive; + + ICoreDeployment.Deployment internal core; + + function setUp() public virtual { + setUpStandaloneEnvironment(); + } + + function setUpMainnetEnvironment(uint256 _forkBlock) internal { + setUpMainnetEnvironment(_forkBlock, true); + } + + function setUpPolygonEnvironment(uint256 _forkBlock) internal { + setUpPolygonEnvironment(_forkBlock, true); + } + + function setUpStandaloneEnvironment() internal { + setUpStandaloneEnvironment(true); + } + + function setUpMainnetEnvironment(uint256 _forkBlock, bool _setReleaseLive) internal { + vm.createSelectFork("mainnet", _forkBlock); + + setUpEnvironment({ + _setReleaseLive: _setReleaseLive, + _wethToken: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2, + _mlnToken: 0xec67005c4E498Ec7f55E092bd1d35cbC47C91892, + _wrappedNativeToken: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2, + _gasRelayHub: 0x9e59Ea5333cD4f402dAc320a04fafA023fe3810D, + _gasRelayTrustedForwarder: 0xca57e5D6218AeB093D76372B51Ba355CfB3C6Cd0, + _gasRelayDepositCooldown: 1 days, + _gasRelayDepositMaxTotal: 1 ether, + _gasRelayRelayFeeMaxBase: 0, + _gasRelayFeeMaxPercent: 10, + _vaultMlnBurner: address(0), // TODO: This requires per-network config + _vaultPositionsLimit: 20, + _chainlinkStaleRateThreshold: 3650 days, + _ethUsdAggregator: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + }); + } + + function setUpPolygonEnvironment(uint256 _forkBlock, bool _setReleaseLive) internal { + vm.createSelectFork("polygon", _forkBlock); + + setUpEnvironment({ + _setReleaseLive: _setReleaseLive, + _wethToken: 0x7ceB23fD6bC0adD59E62ac25578270cFf1b9f619, + _mlnToken: 0xa9f37D84c856fDa3812ad0519Dad44FA0a3Fe207, + _wrappedNativeToken: 0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270, + _gasRelayHub: address(0), + _gasRelayTrustedForwarder: address(0), + _gasRelayDepositCooldown: 1 days, + _gasRelayDepositMaxTotal: 1 ether, + _gasRelayRelayFeeMaxBase: 0, + _gasRelayFeeMaxPercent: 10, + _vaultMlnBurner: address(0), // TODO: This requires per-network config + _vaultPositionsLimit: 20, + _chainlinkStaleRateThreshold: 3650 days, + _ethUsdAggregator: 0xF9680D99D6C9589e2a93a78A04A279e509205945 + }); + } + + function setUpStandaloneEnvironment(bool _setReleaseLive) internal { + // Warp beyond Chainlink aggregator staleness threshold + skip(3650 days); + + setUpEnvironment({ + _setReleaseLive: _setReleaseLive, + _wethToken: makeAddr("WethToken"), // TODO: Deploy a mock + _mlnToken: makeAddr("MlnToken"), // TODO: Deploy a mock + _wrappedNativeToken: makeAddr("WrappedNativeToken"), // TODO: Deploy a mock + _gasRelayHub: makeAddr("GasRelayHub"), // TODO: Deploy a mock + _gasRelayTrustedForwarder: makeAddr("GasRelayTrustedForwarder"), // TODO: Deploy a mock + _gasRelayDepositCooldown: 1 days, + _gasRelayDepositMaxTotal: 1 ether, + _gasRelayRelayFeeMaxBase: 0, + _gasRelayFeeMaxPercent: 10, + _vaultMlnBurner: makeAddr("VaultMlnBurner"), // TODO: Deploy a mock + _vaultPositionsLimit: 20, + _chainlinkStaleRateThreshold: 3650 days, + _ethUsdAggregator: address(0) // TODO: Deploy a mock + }); + } + + function setUpEnvironment( + bool _setReleaseLive, + address _wethToken, + address _mlnToken, + address _wrappedNativeToken, + address _gasRelayHub, + address _gasRelayTrustedForwarder, + uint256 _gasRelayDepositCooldown, + uint256 _gasRelayDepositMaxTotal, + uint256 _gasRelayRelayFeeMaxBase, + uint256 _gasRelayFeeMaxPercent, + address _vaultMlnBurner, + uint256 _vaultPositionsLimit, + uint256 _chainlinkStaleRateThreshold, + address _ethUsdAggregator + ) private { + mlnToken = IERC20(_mlnToken); + wethToken = IWETH(_wethToken); + wrappedNativeToken = IWETH(_wrappedNativeToken); + + vm.label(_mlnToken, "MLN"); + vm.label(_wethToken, "WETH"); + + if (_wethToken != _wrappedNativeToken) { + vm.label(_wrappedNativeToken, "WrappedNativeToken"); + } + + core = deployRelease({ + _wethToken: wethToken, + _mlnToken: mlnToken, + _wrappedNativeToken: wrappedNativeToken, + _gasRelayHub: _gasRelayHub, + _gasRelayTrustedForwarder: _gasRelayTrustedForwarder, + _gasRelayDepositCooldown: _gasRelayDepositCooldown, + _gasRelayDepositMaxTotal: _gasRelayDepositMaxTotal, + _gasRelayRelayFeeMaxBase: _gasRelayRelayFeeMaxBase, + _gasRelayFeeMaxPercent: _gasRelayFeeMaxPercent, + _vaultMlnBurner: _vaultMlnBurner, + _vaultPositionsLimit: _vaultPositionsLimit, + _chainlinkStaleRateThreshold: _chainlinkStaleRateThreshold, + _ethUsdAggregator: _ethUsdAggregator + }); + + if (_setReleaseLive) { + setReleaseLive(core); + } + + standardPrimitive = createRegisteredPrimitive(core.release.valueInterpreter, 18); + nonStandardPrimitive = createRegisteredPrimitive(core.release.valueInterpreter, 8); + } +} diff --git a/tests/bases/UnitTest.sol b/tests/bases/UnitTest.sol new file mode 100644 index 000000000..8aa5f4225 --- /dev/null +++ b/tests/bases/UnitTest.sol @@ -0,0 +1,7 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity 0.8.17; + +import {Test} from "forge-std/Test.sol"; +import {CommonUtils} from "tests/utils/CommonUtils.sol"; + +abstract contract UnitTest is Test, CommonUtils {} diff --git a/tests/interfaces/external/IAaveV2LendingPool.sol b/tests/interfaces/external/IAaveV2LendingPool.sol new file mode 100644 index 000000000..c4afbcbb9 --- /dev/null +++ b/tests/interfaces/external/IAaveV2LendingPool.sol @@ -0,0 +1,57 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity 0.8.17; + +/// @title IAaveV2LendingPool interface +/// @author Enzyme Council +interface IAaveV2LendingPool { + struct ReserveConfigurationMap { + //bit 0-15: LTV + //bit 16-31: Liq. threshold + //bit 32-47: Liq. bonus + //bit 48-55: Decimals + //bit 56: Reserve is active + //bit 57: reserve is frozen + //bit 58: borrowing is enabled + //bit 59: stable rate borrowing enabled + //bit 60-63: reserved + //bit 64-79: reserve factor + uint256 data; + } + + struct ReserveData { + //stores the reserve configuration + ReserveConfigurationMap configuration; + //the liquidity index. Expressed in ray + uint128 liquidityIndex; + //variable borrow index. Expressed in ray + uint128 variableBorrowIndex; + //the current supply rate. Expressed in ray + uint128 currentLiquidityRate; + //the current variable borrow rate. Expressed in ray + uint128 currentVariableBorrowRate; + //the current stable borrow rate. Expressed in ray + uint128 currentStableBorrowRate; + uint40 lastUpdateTimestamp; + //tokens addresses + address aTokenAddress; + address stableDebtTokenAddress; + address variableDebtTokenAddress; + //address of the interest rate strategy + address interestRateStrategyAddress; + //the id of the reserve. Represents the position in the list of the active reserves + uint8 id; + } + + function borrow(address _underlying, uint256 _amount, uint256 _rateMode, uint16 _referralCode, address _to) + external; + + function deposit(address _underlying, uint256 _amount, address _to, uint16 _referralCode) external; + + function getReserveData(address _asset) external returns (ReserveData memory reserveData_); + + function repay(address _underlying, uint256 _amount, uint256 _rateMode, address _to) + external + returns (uint256 actualAmount_); + + function withdraw(address _underlying, uint256 _amount, address _to) external returns (uint256 actualAmount_); +} diff --git a/tests/interfaces/external/IChainlinkAggregator.sol b/tests/interfaces/external/IChainlinkAggregator.sol new file mode 100644 index 000000000..0d1bc4c1e --- /dev/null +++ b/tests/interfaces/external/IChainlinkAggregator.sol @@ -0,0 +1,8 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity 0.8.17; + +/// @title IChainlinkAggregator Interface +/// @author Enzyme Council +interface IChainlinkAggregator { + function latestRoundData() external view returns (uint80, int256, uint256, uint256, uint80); +} diff --git a/tests/interfaces/external/IERC20.sol b/tests/interfaces/external/IERC20.sol new file mode 100644 index 000000000..9639c048e --- /dev/null +++ b/tests/interfaces/external/IERC20.sol @@ -0,0 +1,7 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity 0.8.17; + +import {IERC20 as IERC20Base} from "@openzeppelin/contractsV4/token/ERC20/ERC20.sol"; +import {IERC20Metadata} from "@openzeppelin/contractsV4/token/ERC20/extensions/IERC20Metadata.sol"; + +interface IERC20 is IERC20Base, IERC20Metadata {} diff --git a/tests/interfaces/external/IWETH.sol b/tests/interfaces/external/IWETH.sol new file mode 100644 index 000000000..64bc9babb --- /dev/null +++ b/tests/interfaces/external/IWETH.sol @@ -0,0 +1,34 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity 0.8.17; + +/// @title IWETH Interface +/// @author Enzyme Council +interface IWETH { + event Approval(address indexed owner, address indexed spender, uint256 value); + + event Transfer(address indexed from, address indexed to, uint256 value); + + event Deposit(address indexed destination, uint256 value); + + event Withdrawal(address indexed source, uint256 value); + + function allowance(address _owner, address _spender) external view returns (uint256 amount_); + + function approve(address _spender, uint256 _amount) external returns (bool success_); + + function balanceOf(address _account) external view returns (uint256 balance_); + + function decimals() external view returns (uint8 decimals_); + + function symbol() external view returns (string memory symbol_); + + function totalSupply() external view returns (uint256 supply_); + + function transfer(address _recipient, uint256 _amount) external returns (bool success_); + + function transferFrom(address _sender, address _recipient, uint256 _amount) external returns (bool success_); + + function deposit() external payable; + + function withdraw(uint256 amount_) external; +} diff --git a/tests/persistent/Dispatcher.t.sol b/tests/persistent/Dispatcher.t.sol deleted file mode 100644 index cb57854b5..000000000 --- a/tests/persistent/Dispatcher.t.sol +++ /dev/null @@ -1,208 +0,0 @@ -// SPDX-License-Identifier: GPL-3.0 - -/* - This file is part of the Enzyme Protocol. - - (c) Enzyme Council - - For the full license information, please view the LICENSE - file that was distributed with this source code. -*/ - -pragma solidity 0.6.12; - -import "forge-std/console2.sol"; - -import {Test} from "forge-std/Test.sol"; -import {MockVaultLib} from "@enzyme/mocks/MockVaultLib.sol"; -import {Dispatcher} from "@enzyme/persistent/dispatcher/Dispatcher.sol"; -import {IMigrationHookHandler} from "@enzyme/persistent/dispatcher/IMigrationHookHandler.sol"; - -abstract contract DispatcherTest is Test { - Dispatcher internal dispatcher; - - function addr(string memory _name) public pure returns (address) { - return address(bytes20(uint160(uint256(keccak256(bytes(_name)))))); - } - - function setUp() public virtual { - dispatcher = new Dispatcher(); - } -} - -contract ConstructorTest is DispatcherTest { - function testInitialState() public { - assertEq(address(this), dispatcher.getOwner()); - assertEq(address(0), dispatcher.getNominatedOwner()); - } -} - -contract SetNominatedOwnerTest is DispatcherTest { - event NominatedOwnerSet(address indexed nominatedOwner); - - function testHappyPath() public { - assertEq(address(0), dispatcher.getNominatedOwner()); - - vm.expectEmit(true, true, true, true); - emit NominatedOwnerSet(address(1337)); - - dispatcher.setNominatedOwner(address(1337)); - assertEq(address(1337), dispatcher.getNominatedOwner()); - assertEq(address(this), dispatcher.getOwner()); - } - - function testAnonCannotSet() public { - vm.prank(address(1337)); - vm.expectRevert("Only the contract owner can call this function"); - dispatcher.setNominatedOwner(address(1337)); - } - - function testDoesNotAllowEmptyNextOwner() public { - vm.expectRevert("setNominatedOwner: _nextNominatedOwner cannot be empty"); - dispatcher.setNominatedOwner(address(0)); - } - - function testDoesNotAllowIdenticalNextOwner() public { - vm.expectRevert("setNominatedOwner: _nextNominatedOwner is already the owner"); - dispatcher.setNominatedOwner(address(this)); - } - - function testDoesNotAllowRepeatedNomination() public { - dispatcher.setNominatedOwner(address(1337)); - - vm.expectRevert("setNominatedOwner: _nextNominatedOwner is already nominated"); - dispatcher.setNominatedOwner(address(1337)); - } -} - -contract RemoveNominatedOwnerTest is DispatcherTest { - event NominatedOwnerRemoved(address indexed nominatedOwner); - - function testHappyPath() public { - dispatcher.setNominatedOwner(address(1337)); - - vm.expectEmit(true, true, true, true); - emit NominatedOwnerRemoved(address(1337)); - - dispatcher.removeNominatedOwner(); - assertEq(address(this), dispatcher.getOwner()); - } - - function testAnonCannotRemove() public { - dispatcher.setNominatedOwner(address(1337)); - - vm.prank(address(1337)); - vm.expectRevert("Only the contract owner can call this function"); - dispatcher.removeNominatedOwner(); - } -} - -contract ClaimOwnershipTest is DispatcherTest { - event OwnershipTransferred(address indexed prevOwner, address indexed nextOwner); - - function testHappyPath() public { - dispatcher.setNominatedOwner(address(1337)); - - vm.expectEmit(true, true, true, true); - emit OwnershipTransferred(address(this), address(1337)); - - vm.prank(address(1337)); - dispatcher.claimOwnership(); - - assertEq(address(1337), dispatcher.getOwner()); - assertEq(address(0), dispatcher.getNominatedOwner()); - } - - function testAnonCannotClaimOwnership() public { - dispatcher.setNominatedOwner(address(1337)); - - vm.expectRevert("claimOwnership: Only the nominatedOwner can call this function"); - dispatcher.claimOwnership(); - } -} - -contract DeployVaultProxyTest is DispatcherTest { - event AccessorSet(address prevAccessor, address nextAccessor); - event OwnerSet(address prevOwner, address nextOwner); - event VaultLibSet(address prevVaultLib, address nextVaultLib); - event VaultProxyDeployed( - address indexed fundDeployer, - address indexed owner, - address vaultProxy, - address indexed vaultLib, - address vaultAccessor, - string fundName - ); - - function setUp() public override { - super.setUp(); - - vm.etch(addr("dummy vault accessor"), "Dummy Vault Accessor"); - vm.etch(addr("dummy fund deployer"), "Dummy Fund Deployer"); - dispatcher.setCurrentFundDeployer(addr("dummy fund deployer")); - } - - function testHappyPath() public { - address mocKVaultLib = address(new MockVaultLib()); - - vm.expectEmit(true, true, true, true); - emit AccessorSet(address(0), addr("dummy vault accessor")); - - vm.expectEmit(true, true, true, true); - emit OwnerSet(address(0), addr("alice")); - - vm.expectEmit(true, true, true, true); - emit VaultLibSet(address(0), mocKVaultLib); - - vm.expectEmit(true, true, true, true); - emit VaultProxyDeployed( - addr("dummy fund deployer"), - addr("alice"), - computeCreateAddress(address(dispatcher), 1), - mocKVaultLib, - addr("dummy vault accessor"), - "Dummy Fund" - ); - - vm.prank(addr("dummy fund deployer")); - address vault = dispatcher.deployVaultProxy( - mocKVaultLib, - addr("alice"), - addr("dummy vault accessor"), - "Dummy Fund" - ); - - assertEq(addr("dummy fund deployer"), dispatcher.getFundDeployerForVaultProxy(vault)); - assertEq(address(dispatcher), MockVaultLib(vault).getCreator()); - assertEq(addr("dummy vault accessor"), MockVaultLib(vault).getAccessor()); - assertEq(addr("alice"), MockVaultLib(vault).getOwner()); - assertEq(address(0), MockVaultLib(vault).getMigrator()); - assertEq("Dummy Fund", MockVaultLib(vault).name()); - assertEq("", MockVaultLib(vault).symbol()); - assertEq(uint256(18), MockVaultLib(vault).decimals()); - } - - function testDoesNotAllowBadVaultLib() public { - vm.prank(addr("dummy fund deployer")); - - vm.expectRevert(); - dispatcher.deployVaultProxy( - addr("dummy vault lib"), - addr("alice"), - addr("dummy vault accessor"), - "Dummy Fund" - ); - } - - function testDoesNotAllowNonContractVaultAccessor() public { - vm.prank(addr("dummy fund deployer")); - - vm.expectRevert("deployVaultProxy: Non-contract _vaultAccessor"); - dispatcher.deployVaultProxy( - addr("dummy vault lib"), - addr("alice"), - addr("non-contract vault accessor"), - "Dummy Fund" - ); - } -} diff --git a/tests/tests/core/address-list-registry/AddressListRegistry.t.sol b/tests/tests/core/address-list-registry/AddressListRegistry.t.sol new file mode 100644 index 000000000..046ca5f25 --- /dev/null +++ b/tests/tests/core/address-list-registry/AddressListRegistry.t.sol @@ -0,0 +1,529 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity 0.8.17; + +import {UnitTest} from "tests/bases/UnitTest.sol"; +import {DeploymentUtils} from "tests/utils/core/DeploymentUtils.sol"; +import {UpdateType} from "tests/utils/core/ListRegistryUtils.sol"; + +import {IAddressListRegistry} from "tests/interfaces/internal/IAddressListRegistry.sol"; +import {IDispatcher} from "tests/interfaces/internal/IDispatcher.sol"; + +abstract contract AddressListRegistryTest is UnitTest, DeploymentUtils { + address internal dispatcher = makeAddr("DummyDispatcher"); + IAddressListRegistry internal registry; + + function setUp() public virtual { + registry = deployAddressListRegistry(IDispatcher(dispatcher)); + } + + function makeArray(address _first) internal pure returns (address[] memory list_) { + list_ = new address[](1); + list_[0] = _first; + } + + function makeArray(address _first, address _second) internal pure returns (address[] memory list_) { + list_ = new address[](2); + list_[0] = _first; + list_[1] = _second; + } + + function makeArray(address _first, address _second, address _third) + internal + pure + returns (address[] memory list_) + { + list_ = new address[](3); + list_[0] = _first; + list_[1] = _second; + list_[2] = _third; + } + + function makeArray(uint256 _first) internal pure returns (uint256[] memory list_) { + list_ = new uint256[](1); + list_[0] = _first; + } + + function makeArray(uint256 _first, uint256 _second) internal pure returns (uint256[] memory list_) { + list_ = new uint256[](2); + list_[0] = _first; + list_[1] = _second; + } + + function makeArray(uint256 _first, uint256 _second, uint256 _third) + internal + pure + returns (uint256[] memory list_) + { + list_ = new uint256[](3); + list_[0] = _first; + list_[1] = _second; + list_[2] = _third; + } +} + +contract AddressListRegistryConstructorTest is AddressListRegistryTest { + function testInitialState() public { + assertEq(dispatcher, registry.getDispatcher()); + + // The first list at position 0 is created as an empty list. + assertEq(1, registry.getListCount()); + assertEq(uint256(UpdateType.None), uint256(registry.getListUpdateType(0))); + assertEq(address(0), registry.getListOwner(0)); + } +} + +contract AddressListRegistrySetListOwnerTest is AddressListRegistryTest { + event ListOwnerSet(uint256 indexed id, address indexed nextOwner); + + function testDoesNotAllowArbitraryCaller() public { + uint256 bobsList = registry.createList(bob, uint8(UpdateType.AddAndRemove), makeArray(address(123))); + + vm.prank(alice); + vm.expectRevert("Only callable by list owner"); + registry.setListOwner(bobsList, alice); + } + + function testAllowsTransferOfOwnershipByTheCurrentOwner() public { + uint256 bobsList = registry.createList(bob, uint8(UpdateType.AddAndRemove), makeArray(address(123))); + + assertEq(bob, registry.getListOwner(bobsList)); + + vm.expectEmit(true, true, true, true, address(registry)); + emit ListOwnerSet(bobsList, alice); + + vm.prank(bob); + registry.setListOwner(bobsList, alice); + + assertEq(alice, registry.getListOwner(bobsList)); + } +} + +contract AddressListRegistrySetListUpdateTypeTest is AddressListRegistryTest { + event ListUpdateTypeSet(uint256 indexed id, UpdateType prevUpdateType, UpdateType indexed nextUpdateType); + + function assertAllowedUpdateTypeChange(UpdateType _prevUpdateType, UpdateType _nextUpdateType) public { + uint256 bobsList = registry.createList(bob, uint8(_prevUpdateType), makeArray(address(123))); + + assertEq(uint256(_prevUpdateType), uint256(registry.getListUpdateType(bobsList))); + + vm.expectEmit(true, true, true, true, address(registry)); + emit ListUpdateTypeSet(bobsList, _prevUpdateType, _nextUpdateType); + + vm.prank(bob); + registry.setListUpdateType(bobsList, uint8(_nextUpdateType)); + + assertEq(uint256(_nextUpdateType), uint256(registry.getListUpdateType(bobsList))); + } + + function assertForbiddenUpdateTypeChange(UpdateType _prevUpdateType, UpdateType _nextUpdateType) public { + uint256 bobsList = registry.createList(bob, uint8(_prevUpdateType), makeArray(address(123))); + + assertEq(uint256(_prevUpdateType), uint256(registry.getListUpdateType(bobsList))); + + vm.prank(bob); + vm.expectRevert("setListUpdateType: _nextUpdateType not allowed"); + registry.setListUpdateType(bobsList, uint8(_nextUpdateType)); + + assertEq(uint256(_prevUpdateType), uint256(registry.getListUpdateType(bobsList))); + } + + function testDoesNotAllowArbitraryCaller() public { + uint256 bobsList = registry.createList(bob, uint8(UpdateType.AddAndRemove), makeArray(address(123))); + + vm.prank(alice); + vm.expectRevert("Only callable by list owner"); + registry.setListUpdateType(bobsList, uint8(UpdateType.None)); + } + + // TODO: This could be modeled better using tabled testing: https://github.com/foundry-rs/foundry/issues/858 + function testAllowedUpdateTypeChanges() public { + assertAllowedUpdateTypeChange(UpdateType.AddAndRemove, UpdateType.AddOnly); + assertAllowedUpdateTypeChange(UpdateType.AddAndRemove, UpdateType.RemoveOnly); + assertAllowedUpdateTypeChange(UpdateType.AddAndRemove, UpdateType.None); + assertAllowedUpdateTypeChange(UpdateType.AddOnly, UpdateType.None); + assertAllowedUpdateTypeChange(UpdateType.RemoveOnly, UpdateType.None); + } + + // TODO: This could be modeled better using tabled testing: https://github.com/foundry-rs/foundry/issues/858 + function testForbiddenUpdateTypeChanges() public { + assertForbiddenUpdateTypeChange(UpdateType.RemoveOnly, UpdateType.AddAndRemove); + assertForbiddenUpdateTypeChange(UpdateType.AddOnly, UpdateType.AddAndRemove); + assertForbiddenUpdateTypeChange(UpdateType.None, UpdateType.AddOnly); + assertForbiddenUpdateTypeChange(UpdateType.None, UpdateType.RemoveOnly); + assertForbiddenUpdateTypeChange(UpdateType.None, UpdateType.AddAndRemove); + } +} + +contract AddressListRegistryCreateListTest is AddressListRegistryTest { + event ItemAddedToList(uint256 indexed id, address item); + event ListCreated(address indexed creator, address indexed owner, uint256 id, UpdateType updateType); + + // TODO: This is an example for fuzzy testing in foundry. This particular example could possibly be modeled better + // using fixed testing tables (https://github.com/foundry-rs/foundry/issues/858) but it's still a good and simple demo. + function testFuzzyHappyPath(uint8 _enumIndex, address _firstValue, address _secondValue, address _otherValue) + public + { + // Assume that `otherValue` is neither `firstValue` nor `secondValue` and that both values are different. + vm.assume(_firstValue != _otherValue); + vm.assume(_secondValue != _otherValue); + vm.assume(_firstValue != _secondValue); + + // Assume that `enumIndex` is the uint representation of one of the available UpdateTypes. + vm.assume(_enumIndex <= 3); + UpdateType updateType = UpdateType(_enumIndex); + + vm.expectEmit(true, true, true, true, address(registry)); + emit ListCreated(bob, bob, 1, updateType); + + vm.expectEmit(true, true, true, true, address(registry)); + emit ItemAddedToList(1, _firstValue); + + vm.expectEmit(true, true, true, true, address(registry)); + emit ItemAddedToList(1, _secondValue); + + vm.prank(bob); + uint256 listId = registry.createList(bob, uint8(updateType), makeArray(_firstValue, _secondValue)); + + assertEq(1, listId); + assertEq(2, registry.getListCount()); + assertEq(bob, registry.getListOwner(listId)); + assertEq(uint256(updateType), uint256(registry.getListUpdateType(listId))); + + assertTrue(registry.isInList(listId, _firstValue)); + assertTrue(registry.isInList(listId, _secondValue)); + assertFalse(registry.isInList(listId, _otherValue)); + } +} + +contract AddressListRegistryAddToListTest is AddressListRegistryTest { + event ItemAddedToList(uint256 indexed id, address item); + + function testDoesNotAllowArbitraryCaller() public { + uint256 bobsList = registry.createList(bob, uint8(UpdateType.AddAndRemove), makeArray(address(123))); + + vm.prank(alice); + vm.expectRevert("Only callable by list owner"); + registry.addToList(bobsList, makeArray(address(123))); + } + + function testAllowsListOwnedByDispatcherToBeUpdatedByDispatcherOwner() public { + uint256 dispatchersList = + registry.createList(dispatcher, uint8(UpdateType.AddAndRemove), makeArray(address(123))); + + // Pretend that bob is the dispatcher owner. + vm.mockCall(dispatcher, abi.encodeWithSelector(IDispatcher.getOwner.selector), abi.encode(bob)); + + // Calling the function as alice should fail. + vm.prank(alice); + vm.expectRevert("Only callable by list owner"); + registry.addToList(dispatchersList, makeArray(address(123))); + + // Calling the function as bob should succeed. + vm.prank(bob); + registry.addToList(dispatchersList, makeArray(address(123))); + } + + function testDoesNotAllowUpdatingListIfUpdateTypeIsNone() public { + uint256 bobsList = registry.createList(bob, uint8(UpdateType.None), makeArray(address(123))); + + vm.prank(bob); + vm.expectRevert("addToList: Cannot add to list"); + registry.addToList(bobsList, makeArray(address(123))); + } + + function testDoesNotAllowUpdatingListIfUpdateTypeIsRemoveOnly() public { + uint256 bobsList = registry.createList(bob, uint8(UpdateType.RemoveOnly), makeArray(address(123))); + + vm.prank(bob); + vm.expectRevert("addToList: Cannot add to list"); + registry.addToList(bobsList, makeArray(address(123))); + } + + function testCorrectlyHandlesUpdateTypeAddOnly() public { + uint256 bobsList = registry.createList(bob, uint8(UpdateType.AddOnly), makeArray(address(123))); + + assertTrue(registry.isInList(bobsList, address(123))); + assertFalse(registry.isInList(bobsList, address(456))); + assertFalse(registry.isInList(bobsList, address(1337))); + + vm.expectEmit(true, true, true, true, address(registry)); + emit ItemAddedToList(bobsList, address(456)); + + vm.expectEmit(true, true, true, true, address(registry)); + emit ItemAddedToList(bobsList, address(1337)); + + vm.prank(bob); + registry.addToList(bobsList, makeArray(address(456), address(1337))); + + assertTrue(registry.isInList(bobsList, address(123))); + assertTrue(registry.isInList(bobsList, address(456))); + assertTrue(registry.isInList(bobsList, address(1337))); + } + + function testCorrectlyHandlesUpdateTypeAddAndRemove() public { + uint256 bobsList = registry.createList(bob, uint8(UpdateType.AddAndRemove), makeArray(address(123))); + + assertTrue(registry.isInList(bobsList, address(123))); + assertFalse(registry.isInList(bobsList, address(456))); + assertFalse(registry.isInList(bobsList, address(1337))); + + vm.expectEmit(true, true, true, true, address(registry)); + emit ItemAddedToList(bobsList, address(456)); + + vm.expectEmit(true, true, true, true, address(registry)); + emit ItemAddedToList(bobsList, address(1337)); + + vm.prank(bob); + registry.addToList(bobsList, makeArray(address(456), address(1337))); + + assertTrue(registry.isInList(bobsList, address(123))); + assertTrue(registry.isInList(bobsList, address(456))); + assertTrue(registry.isInList(bobsList, address(1337))); + } +} + +contract AddressListRegistryRemoveFromListTest is AddressListRegistryTest { + event ItemRemovedFromList(uint256 indexed id, address item); + + function testDoesNotAllowArbitraryCaller() public { + uint256 bobsList = + registry.createList(bob, uint8(UpdateType.AddAndRemove), makeArray(address(123), address(456))); + + vm.prank(alice); + vm.expectRevert("Only callable by list owner"); + registry.removeFromList(bobsList, makeArray(address(123), address(456))); + } + + function testDoesNotAllowRemovingFromListIfUpdateTypeIsNone() public { + uint256 bobsList = registry.createList(bob, uint8(UpdateType.None), makeArray(address(123))); + + vm.prank(bob); + vm.expectRevert("removeFromList: Cannot remove from list"); + registry.removeFromList(bobsList, makeArray(address(123))); + } + + function testDoesNotAllowRemovingFromListIfUpdateTypeIsAddOnly() public { + uint256 bobsList = registry.createList(bob, uint8(UpdateType.AddOnly), makeArray(address(123))); + + vm.prank(bob); + vm.expectRevert("removeFromList: Cannot remove from list"); + registry.removeFromList(bobsList, makeArray(address(123))); + } + + // TODO: This is a test that is expected to fail and passes if it does. This would be better implemented using negative + // assertions as described here: https://github.com/foundry-rs/foundry/issues/509 + function testFailSilentlyIgnoresRemovalOfNonExistentItems() public { + uint256 bobsList = registry.createList(bob, uint8(UpdateType.AddAndRemove), makeArray(address(123))); + + assertTrue(registry.isInList(bobsList, address(123))); + assertFalse(registry.isInList(bobsList, address(456))); + + // This expectEmit will fail because address(456) is not in the list and we expect it to NOT emit an event for its + // removal. But because our test uses the `fail` modifier, it will pass. + vm.expectEmit(true, true, true, true, address(registry)); + emit ItemRemovedFromList(bobsList, address(456)); + + vm.prank(bob); + registry.removeFromList(bobsList, makeArray(address(456))); + } + + function testCorrectlyHandlesUpdateTypeRemoveOnly() public { + uint256 bobsList = + registry.createList(bob, uint8(UpdateType.RemoveOnly), makeArray(address(123), address(456), address(1337))); + + assertTrue(registry.isInList(bobsList, address(123))); + assertTrue(registry.isInList(bobsList, address(456))); + assertTrue(registry.isInList(bobsList, address(1337))); + + vm.expectEmit(true, true, true, true, address(registry)); + emit ItemRemovedFromList(bobsList, address(456)); + + vm.prank(bob); + registry.removeFromList(bobsList, makeArray(address(456), address(1337))); + + assertTrue(registry.isInList(bobsList, address(123))); + assertFalse(registry.isInList(bobsList, address(456))); + assertFalse(registry.isInList(bobsList, address(1337))); + } + + function testCorrectlyHandlesUpdateTypeAddAndRemove() public { + uint256 bobsList = registry.createList( + bob, uint8(UpdateType.AddAndRemove), makeArray(address(123), address(456), address(1337)) + ); + + assertTrue(registry.isInList(bobsList, address(123))); + assertTrue(registry.isInList(bobsList, address(456))); + assertTrue(registry.isInList(bobsList, address(1337))); + + vm.expectEmit(true, true, true, true, address(registry)); + emit ItemRemovedFromList(bobsList, address(456)); + + vm.prank(bob); + registry.removeFromList(bobsList, makeArray(address(456), address(1337))); + + assertTrue(registry.isInList(bobsList, address(123))); + assertFalse(registry.isInList(bobsList, address(456))); + assertFalse(registry.isInList(bobsList, address(1337))); + } +} + +contract AddressListRegistryListSearchTest is AddressListRegistryTest { + function assumeFuzzParameters( + address _inNoLists, + address _inFirstListOnly, + address _inSecondListOnly, + address _inAllListsA, + address _inAllListsB + ) public pure { + // Assume that `_inNoLists` doesn't equal any other fuzz value. + vm.assume(_inNoLists != _inFirstListOnly); + vm.assume(_inNoLists != _inSecondListOnly); + vm.assume(_inNoLists != _inAllListsA); + vm.assume(_inNoLists != _inAllListsB); + + // Assume that there are no duplicates in any of the other values either. + vm.assume(_inFirstListOnly != _inAllListsA); + vm.assume(_inFirstListOnly != _inAllListsB); + + vm.assume(_inSecondListOnly != _inAllListsA); + vm.assume(_inSecondListOnly != _inAllListsB); + + vm.assume(_inSecondListOnly != _inFirstListOnly); + } + + function createLists( + address _inNoLists, + address _inFirstListOnly, + address _inSecondListOnly, + address _inAllListsA, + address _inAllListsB + ) public returns (uint256 firstList_, uint256 secondList_, uint256 emptyList_) { + assumeFuzzParameters(_inNoLists, _inFirstListOnly, _inSecondListOnly, _inAllListsA, _inAllListsB); + + address[] memory firstListItems = makeArray(_inFirstListOnly, _inAllListsA, _inAllListsB); + address[] memory secondListItems = makeArray(_inSecondListOnly, _inAllListsA, _inAllListsB); + + firstList_ = registry.createList(bob, uint8(UpdateType.None), firstListItems); + secondList_ = registry.createList(bob, uint8(UpdateType.None), secondListItems); + emptyList_ = registry.createList(bob, uint8(UpdateType.None), new address[](0)); + } + + function testIsInAllLists( + address _inNoLists, + address _inFirstListOnly, + address _inSecondListOnly, + address _inAllListsA, + address _inAllListsB + ) public { + (uint256 firstList, uint256 secondList, uint256 emptyList) = + createLists(_inNoLists, _inFirstListOnly, _inSecondListOnly, _inAllListsA, _inAllListsB); + + assertFalse(registry.isInAllLists(makeArray(firstList, secondList), _inNoLists)); + assertFalse(registry.isInAllLists(makeArray(firstList, secondList), _inFirstListOnly)); + assertFalse(registry.isInAllLists(makeArray(firstList, secondList, emptyList), _inAllListsA)); + assertTrue(registry.isInAllLists(makeArray(firstList, secondList), _inAllListsB)); + } + + function testIsInSomeOfLists( + address _inNoLists, + address _inFirstListOnly, + address _inSecondListOnly, + address _inAllListsA, + address _inAllListsB + ) public { + (uint256 firstList, uint256 secondList, uint256 emptyList) = + createLists(_inNoLists, _inFirstListOnly, _inSecondListOnly, _inAllListsA, _inAllListsB); + + assertFalse(registry.isInSomeOfLists(makeArray(firstList, secondList, emptyList), _inNoLists)); + assertTrue(registry.isInSomeOfLists(makeArray(firstList, secondList, emptyList), _inFirstListOnly)); + assertTrue(registry.isInSomeOfLists(makeArray(firstList, secondList, emptyList), _inAllListsA)); + } + + function testAreAllInList( + address _inNoLists, + address _inFirstListOnly, + address _inSecondListOnly, + address _inAllListsA, + address _inAllListsB + ) public { + (uint256 firstList, uint256 secondList, uint256 emptyList) = + createLists(_inNoLists, _inFirstListOnly, _inSecondListOnly, _inAllListsA, _inAllListsB); + + assertFalse(registry.areAllInList(firstList, makeArray(_inFirstListOnly, _inAllListsA, _inNoLists))); + assertFalse(registry.areAllInList(emptyList, makeArray(_inAllListsA))); + assertTrue(registry.areAllInList(firstList, makeArray(_inFirstListOnly, _inAllListsA))); + assertTrue(registry.areAllInList(secondList, makeArray(_inSecondListOnly, _inAllListsA, _inAllListsB))); + } + + function testAreAllNotInList( + address _inNoLists, + address _inFirstListOnly, + address _inSecondListOnly, + address _inAllListsA, + address _inAllListsB + ) public { + (uint256 firstList, uint256 secondList, uint256 emptyList) = + createLists(_inNoLists, _inFirstListOnly, _inSecondListOnly, _inAllListsA, _inAllListsB); + + assertFalse(registry.areAllNotInList(firstList, makeArray(_inNoLists, _inAllListsA))); + assertTrue(registry.areAllNotInList(secondList, makeArray(_inNoLists, _inFirstListOnly))); + assertTrue(registry.areAllNotInList(emptyList, makeArray(_inAllListsA))); + } + + function testAreAllInAllLists( + address _inNoLists, + address _inFirstListOnly, + address _inSecondListOnly, + address _inAllListsA, + address _inAllListsB + ) public { + (uint256 firstList, uint256 secondList, uint256 emptyList) = + createLists(_inNoLists, _inFirstListOnly, _inSecondListOnly, _inAllListsA, _inAllListsB); + + assertFalse( + registry.areAllInAllLists(makeArray(firstList, secondList), makeArray(_inAllListsA, _inFirstListOnly)) + ); + assertFalse(registry.areAllInAllLists(makeArray(firstList, emptyList), makeArray(_inAllListsB))); + assertTrue(registry.areAllInAllLists(makeArray(firstList, secondList), makeArray(_inAllListsA, _inAllListsB))); + } + + function testAreAllInSomeOfLists( + address _inNoLists, + address _inFirstListOnly, + address _inSecondListOnly, + address _inAllListsA, + address _inAllListsB + ) public { + (uint256 firstList, uint256 secondList, uint256 emptyList) = + createLists(_inNoLists, _inFirstListOnly, _inSecondListOnly, _inAllListsA, _inAllListsB); + + assertFalse( + registry.areAllInSomeOfLists( + makeArray(firstList, secondList, emptyList), makeArray(_inFirstListOnly, _inSecondListOnly, _inNoLists) + ) + ); + assertTrue( + registry.areAllInSomeOfLists( + makeArray(firstList, secondList, emptyList), makeArray(_inFirstListOnly, _inSecondListOnly) + ) + ); + } + + function testAreAllNotInAnyOfLists( + address _inNoLists, + address _inFirstListOnly, + address _inSecondListOnly, + address _inAllListsA, + address _inAllListsB + ) public { + (uint256 firstList, uint256 secondList, uint256 emptyList) = + createLists(_inNoLists, _inFirstListOnly, _inSecondListOnly, _inAllListsA, _inAllListsB); + + assertFalse( + registry.areAllNotInAnyOfLists(makeArray(firstList, secondList), makeArray(_inSecondListOnly, _inNoLists)) + ); + assertTrue( + registry.areAllNotInAnyOfLists(makeArray(firstList, emptyList), makeArray(_inSecondListOnly, _inNoLists)) + ); + } +} diff --git a/tests/tests/core/dispatcher/Dispatcher.t.sol b/tests/tests/core/dispatcher/Dispatcher.t.sol new file mode 100644 index 000000000..cdc2a234d --- /dev/null +++ b/tests/tests/core/dispatcher/Dispatcher.t.sol @@ -0,0 +1,115 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity 0.8.17; + +import {UnitTest} from "tests/bases/UnitTest.sol"; +import {DeploymentUtils} from "tests/utils/core/DeploymentUtils.sol"; + +import {IDispatcher} from "tests/interfaces/internal/IDispatcher.sol"; + +abstract contract DispatcherTest is UnitTest, DeploymentUtils { + IDispatcher internal dispatcher; + + function setUp() public virtual { + dispatcher = deployDispatcher(); + } +} + +contract DispatcherConstructorTest is DispatcherTest { + function testInitialState() public { + assertEq(address(this), dispatcher.getOwner()); + assertEq(address(0), dispatcher.getNominatedOwner()); + } +} + +contract DispatcherSetMigrationTimelockTest is DispatcherTest { + function testDisallowsCallByRandomAddress() public { + vm.prank(makeAddr("NotOwner")); + vm.expectRevert("Only the contract owner can call this function"); + dispatcher.setMigrationTimelock(1); + } + + function testDoesNotALlowSettingTimelockTwice() public { + dispatcher.setMigrationTimelock(1); + vm.expectRevert("setMigrationTimelock: _nextTimelock is the current timelock"); + dispatcher.setMigrationTimelock(1); + } + + function testCorrectlyHandlesSettingNewMigrationTimelock() public { + dispatcher.setMigrationTimelock(1); + assertEq(1, dispatcher.getMigrationTimelock()); + } +} + +contract DispatcherSetSharesTokenSymbolTest is DispatcherTest { + event SharesTokenSymbolSet(string _nextSymbol); + + function testDisallowsCallByRandomAddress() public { + vm.prank(makeAddr("NotOwner")); + vm.expectRevert("Only the contract owner can call this function"); + dispatcher.setSharesTokenSymbol("TEST"); + } + + function testCorrectlyUpdatesSharesTokenSymbol() public { + expectEmit(address(dispatcher)); + emit SharesTokenSymbolSet("TEST"); + + dispatcher.setSharesTokenSymbol("TEST"); + assertEq("TEST", dispatcher.getSharesTokenSymbol()); + } +} + +contract DispatcherSetCurrentFundDeployerTest is DispatcherTest { + event CurrentFundDeployerSet(address prevFundDeployer, address nextFundDeployer); + + function testDisallowsCallByRandomAddress() public { + vm.prank(makeAddr("NotOwner")); + vm.expectRevert("Only the contract owner can call this function"); + dispatcher.setCurrentFundDeployer(makeAddr("NewFundDeployer")); + } + + function testCorrectlyUpdatesCurrentFundDeployer() public { + address dummyFundDeployer = makeAddr("DummyFundDeployer"); + vm.etch(dummyFundDeployer, "empty"); + + dispatcher.setCurrentFundDeployer(dummyFundDeployer); + assertEq(dummyFundDeployer, dispatcher.getCurrentFundDeployer()); + } + + function testDoesNotAllowEmptyCurrentFundDeployer() public { + vm.expectRevert("setCurrentFundDeployer: _nextFundDeployer cannot be empty"); + dispatcher.setCurrentFundDeployer(address(0)); + } + + function testDoesNotAllowFundDeployerToBeNonContract() public { + vm.expectRevert("setCurrentFundDeployer: Non-contract _nextFundDeployer"); + dispatcher.setCurrentFundDeployer(makeAddr("NotAContract")); + } + + function testDoesNotAllowRepeatedCurrentFundDeployer() public { + address dummyFundDeployer = makeAddr("DummyFundDeployer"); + vm.etch(dummyFundDeployer, "empty"); + + dispatcher.setCurrentFundDeployer(dummyFundDeployer); + vm.expectRevert("setCurrentFundDeployer: _nextFundDeployer is already currentFundDeployer"); + dispatcher.setCurrentFundDeployer(dummyFundDeployer); + } + + function testCorrectlySetsNewFundDeployer() public { + address firstDummyFundDeployer = makeAddr("FirstDummyFundDeployer"); + address secondDummyFundDeployer = makeAddr("SecondDummyFundDeployer"); + vm.etch(firstDummyFundDeployer, "empty"); + vm.etch(secondDummyFundDeployer, "empty"); + + expectEmit(address(dispatcher)); + emit CurrentFundDeployerSet(address(0), firstDummyFundDeployer); + + dispatcher.setCurrentFundDeployer(firstDummyFundDeployer); + assertEq(firstDummyFundDeployer, dispatcher.getCurrentFundDeployer()); + + expectEmit(address(dispatcher)); + emit CurrentFundDeployerSet(firstDummyFundDeployer, secondDummyFundDeployer); + + dispatcher.setCurrentFundDeployer(secondDummyFundDeployer); + assertEq(secondDummyFundDeployer, dispatcher.getCurrentFundDeployer()); + } +} diff --git a/tests/tests/core/dispatcher/DispatcherOwnership.t.sol b/tests/tests/core/dispatcher/DispatcherOwnership.t.sol new file mode 100644 index 000000000..40ba2df07 --- /dev/null +++ b/tests/tests/core/dispatcher/DispatcherOwnership.t.sol @@ -0,0 +1,94 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity 0.8.17; + +import {DispatcherTest} from "./Dispatcher.t.sol"; + +contract DispatcherSetNominatedOwnerTest is DispatcherTest { + event NominatedOwnerSet(address indexed nominatedOwner); + + address internal nominatedOwner = makeAddr("NominatedOwner"); + + function testHappyPath() public { + assertEq(address(0), dispatcher.getNominatedOwner()); + + expectEmit(address(dispatcher)); + emit NominatedOwnerSet(nominatedOwner); + + dispatcher.setNominatedOwner(nominatedOwner); + assertEq(nominatedOwner, dispatcher.getNominatedOwner()); + assertEq(address(this), dispatcher.getOwner()); + } + + function testAnonCannotSet() public { + vm.prank(nominatedOwner); + vm.expectRevert("Only the contract owner can call this function"); + dispatcher.setNominatedOwner(nominatedOwner); + } + + function testDoesNotAllowEmptyNextOwner() public { + vm.expectRevert("setNominatedOwner: _nextNominatedOwner cannot be empty"); + dispatcher.setNominatedOwner(address(0)); + } + + function testDoesNotAllowIdenticalNextOwner() public { + vm.expectRevert("setNominatedOwner: _nextNominatedOwner is already the owner"); + dispatcher.setNominatedOwner(address(this)); + } + + function testDoesNotAllowRepeatedNomination() public { + dispatcher.setNominatedOwner(nominatedOwner); + + vm.expectRevert("setNominatedOwner: _nextNominatedOwner is already nominated"); + dispatcher.setNominatedOwner(nominatedOwner); + } +} + +contract DispatcherRemoveNominatedOwnerTest is DispatcherTest { + event NominatedOwnerRemoved(address indexed nominatedOwner); + + address internal nominatedOwner = makeAddr("NominatedOwner"); + + function testHappyPath() public { + dispatcher.setNominatedOwner(nominatedOwner); + + expectEmit(address(dispatcher)); + emit NominatedOwnerRemoved(nominatedOwner); + + dispatcher.removeNominatedOwner(); + assertEq(address(this), dispatcher.getOwner()); + } + + function testAnonCannotRemove() public { + dispatcher.setNominatedOwner(nominatedOwner); + + vm.prank(nominatedOwner); + vm.expectRevert("Only the contract owner can call this function"); + dispatcher.removeNominatedOwner(); + } +} + +contract DispatcherClaimOwnershipTest is DispatcherTest { + event OwnershipTransferred(address indexed prevOwner, address indexed nextOwner); + + address internal nominatedOwner = makeAddr("NominatedOwner"); + + function testHappyPath() public { + dispatcher.setNominatedOwner(nominatedOwner); + + expectEmit(address(dispatcher)); + emit OwnershipTransferred(address(this), nominatedOwner); + + vm.prank(nominatedOwner); + dispatcher.claimOwnership(); + + assertEq(nominatedOwner, dispatcher.getOwner()); + assertEq(address(0), dispatcher.getNominatedOwner()); + } + + function testAnonCannotClaimOwnership() public { + dispatcher.setNominatedOwner(address(1337)); + + vm.expectRevert("claimOwnership: Only the nominatedOwner can call this function"); + dispatcher.claimOwnership(); + } +} diff --git a/tests/tests/core/dispatcher/DispatcherVaultCreation.t.sol b/tests/tests/core/dispatcher/DispatcherVaultCreation.t.sol new file mode 100644 index 000000000..e18b1d5fe --- /dev/null +++ b/tests/tests/core/dispatcher/DispatcherVaultCreation.t.sol @@ -0,0 +1,84 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity 0.8.17; + +import {DispatcherTest} from "./Dispatcher.t.sol"; + +import {IVault} from "tests/interfaces/internal/IVault.sol"; + +contract DispatcherVaultCreationTest is DispatcherTest { + event AccessorSet(address prevAccessor, address nextAccessor); + event OwnerSet(address prevOwner, address nextOwner); + event VaultLibSet(address prevVaultLib, address nextVaultLib); + event VaultProxyDeployed( + address indexed fundDeployer, + address indexed owner, + address vaultProxy, + address indexed vaultLib, + address vaultAccessor, + string fundName + ); + + string internal vaultName = "Test Vault"; + address internal dummyVaultAccessor = makeAddr("DummyVaultAccessor"); + address internal dummyFundDeployer = makeAddr("DummyFundDeployer"); + + function setUp() public override { + super.setUp(); + + vm.etch(dummyVaultAccessor, "empty"); + vm.etch(dummyFundDeployer, "empty"); + dispatcher.setCurrentFundDeployer(dummyFundDeployer); + } + + function testHappyPath() public { + address mockVaultLib = address(deployCode("MockVaultLib.sol")); + + vm.expectEmit(true, true, true, true); + emit AccessorSet(address(0), dummyVaultAccessor); + + vm.expectEmit(true, true, true, true); + emit OwnerSet(address(0), alice); + + vm.expectEmit(true, true, true, true); + emit VaultLibSet(address(0), mockVaultLib); + + vm.expectEmit(true, true, true, true); + emit VaultProxyDeployed( + dummyFundDeployer, + alice, + computeCreateAddress(address(dispatcher), 1), + mockVaultLib, + dummyVaultAccessor, + vaultName + ); + + vm.prank(dummyFundDeployer); + address vault = dispatcher.deployVaultProxy(mockVaultLib, alice, dummyVaultAccessor, vaultName); + + assertEq(dummyFundDeployer, dispatcher.getFundDeployerForVaultProxy(vault)); + assertEq(address(dispatcher), IVault(vault).getCreator()); + assertEq(dummyVaultAccessor, IVault(vault).getAccessor()); + assertEq(alice, IVault(vault).getOwner()); + assertEq(address(0), IVault(vault).getMigrator()); + assertEq(vaultName, IVault(vault).name()); + assertEq("", IVault(vault).symbol()); + assertEq(uint256(18), IVault(vault).decimals()); + } + + function testDoesNotAllowBadVaultLib() public { + address invalidVaultLib = makeAddr("InvalidVaultLib"); + + vm.prank(dummyFundDeployer); + vm.expectRevert(); + dispatcher.deployVaultProxy(invalidVaultLib, alice, dummyVaultAccessor, vaultName); + } + + function testDoesNotAllowNonContractVaultAccessor() public { + address mockVaultLib = address(deployCode("MockVaultLib.sol")); + address invalidVaultAccessor = makeAddr("InvalidVaultAccessor"); + + vm.prank(dummyFundDeployer); + vm.expectRevert("deployVaultProxy: Non-contract _vaultAccessor"); + dispatcher.deployVaultProxy(mockVaultLib, alice, invalidVaultAccessor, vaultName); + } +} diff --git a/tests/tests/core/dispatcher/DispatcherVaultMigration.t.sol b/tests/tests/core/dispatcher/DispatcherVaultMigration.t.sol new file mode 100644 index 000000000..066a0b6ea --- /dev/null +++ b/tests/tests/core/dispatcher/DispatcherVaultMigration.t.sol @@ -0,0 +1,624 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity 0.8.17; + +import {UnitTest} from "tests/bases/UnitTest.sol"; +import {MigrationOutHook} from "tests/utils/core/VaultUtils.sol"; +import {DispatcherTest} from "./Dispatcher.t.sol"; + +import {IMigrationHookHandler} from "tests/interfaces/internal/IMigrationHookHandler.sol"; +import {IVault} from "tests/interfaces/internal/IVault.sol"; + +contract MockFundDeployer is IMigrationHookHandler { + function invokeMigrationInCancelHook(address, address, address, address) external override {} + + function invokeMigrationOutHook(uint8, address, address, address, address) external virtual override {} +} + +contract MockFailingFundDeployer is MockFundDeployer { + MigrationOutHook internal immutable REVERTING_HOOK; + + constructor(MigrationOutHook _revertingHook) { + REVERTING_HOOK = _revertingHook; + } + + function invokeMigrationOutHook(uint8 _hook, address, address, address, address) external view override { + require(_hook != uint8(REVERTING_HOOK), "test revert"); + } +} + +abstract contract DispatcherVaultMigrationTest is DispatcherTest { + string internal vaultName = "Test Vault"; + address internal dummyPrevVaultAccessor = makeAddr("DummyPrevVaultAccessor"); + address internal dummyNextVaultAccessor = makeAddr("DummyNextVaultAccessor"); + address internal mockPrevFundDeployer = address(new MockFundDeployer()); + address internal mockNextFundDeployer = address(new MockFundDeployer()); + address internal mockPrevVaultLib; + address internal mockNextVaultLib; + + function setUp() public override { + super.setUp(); + + vm.etch(dummyPrevVaultAccessor, "empty"); + vm.etch(dummyNextVaultAccessor, "empty"); + + dispatcher.setCurrentFundDeployer(mockPrevFundDeployer); + + mockPrevVaultLib = address(deployCode("MockVaultLib.sol")); + mockNextVaultLib = address(deployCode("MockVaultLib.sol")); + } + + function createTestVault() internal returns (address vaultProxy_) { + vm.prank(dispatcher.getCurrentFundDeployer()); + vaultProxy_ = dispatcher.deployVaultProxy(mockPrevVaultLib, alice, dummyPrevVaultAccessor, vaultName); + + vm.label(vaultProxy_, "TestVault"); + } +} + +contract DispatcherSignalMigrationTest is DispatcherVaultMigrationTest { + event MigrationOutHookFailed( + bytes failureReturnData, + MigrationOutHook hook, + address indexed vaultProxy, + address indexed prevFundDeployer, + address indexed nextFundDeployer, + address nextVaultAccessor, + address nextVaultLib + ); + + event MigrationSignaled( + address indexed vaultProxy, + address indexed prevFundDeployer, + address indexed nextFundDeployer, + address nextVaultAccessor, + address nextVaultLib, + uint256 executableTimestamp + ); + + function testCanOnlyBeCalledByCurrentFundDeployer() public { + address vaultProxy = createTestVault(); + dispatcher.setCurrentFundDeployer(mockNextFundDeployer); + + vm.prank(alice); + vm.expectRevert("Only the current FundDeployer can call this function"); + dispatcher.signalMigration(vaultProxy, dummyNextVaultAccessor, mockNextVaultLib, false); + } + + function testDoesNotAllowNonContractVaultAccessor() public { + address invalidVaultAccessor = makeAddr("InvalidVaultAccessor"); + address vaultProxy = createTestVault(); + dispatcher.setCurrentFundDeployer(mockNextFundDeployer); + + vm.prank(mockNextFundDeployer); + vm.expectRevert("signalMigration: Non-contract _nextVaultAccessor"); + dispatcher.signalMigration(vaultProxy, invalidVaultAccessor, mockNextVaultLib, false); + } + + function testDoesNotAllowNonExistentVaultProxy() public { + address nonExistentVaultProxy = makeAddr("NonExistentVaultProxy"); + dispatcher.setCurrentFundDeployer(mockNextFundDeployer); + + vm.prank(mockNextFundDeployer); + vm.expectRevert("signalMigration: _vaultProxy does not exist"); + dispatcher.signalMigration(nonExistentVaultProxy, dummyNextVaultAccessor, mockNextVaultLib, false); + } + + function testCannotBeCalledIfVaultIsAlreadyOnCurrentVersion() public { + address vaultProxy = createTestVault(); + + vm.prank(mockPrevFundDeployer); + vm.expectRevert("signalMigration: Can only migrate to a new FundDeployer"); + dispatcher.signalMigration(vaultProxy, dummyNextVaultAccessor, mockNextVaultLib, false); + } + + function testCorrectlyHandlesMigationOutHookPreSignalFailure() public { + address failingFundDeployer = address(new MockFailingFundDeployer(MigrationOutHook.PreSignal)); + + dispatcher.setCurrentFundDeployer(failingFundDeployer); + address vaultProxy = createTestVault(); + dispatcher.setCurrentFundDeployer(mockNextFundDeployer); + + vm.prank(mockNextFundDeployer); + vm.expectRevert(formatError("MigrationOutHook.PreSignal: ", "test revert")); + dispatcher.signalMigration(vaultProxy, dummyNextVaultAccessor, mockNextVaultLib, false); + + vm.expectEmit(true, true, true, true); + emit MigrationOutHookFailed( + formatError("test revert"), + MigrationOutHook.PreSignal, + vaultProxy, + failingFundDeployer, + mockNextFundDeployer, + dummyNextVaultAccessor, + mockNextVaultLib + ); + + vm.prank(mockNextFundDeployer); + dispatcher.signalMigration(vaultProxy, dummyNextVaultAccessor, mockNextVaultLib, true); + } + + function testCorrectlyHandlesPostSignalMigrationOriginHookFailure() public { + address failingFundDeployer = address(new MockFailingFundDeployer(MigrationOutHook.PostSignal)); + + dispatcher.setCurrentFundDeployer(failingFundDeployer); + address vaultProxy = createTestVault(); + dispatcher.setCurrentFundDeployer(mockNextFundDeployer); + + vm.prank(mockNextFundDeployer); + vm.expectRevert(formatError("MigrationOutHook.PostSignal: ", "test revert")); + dispatcher.signalMigration(vaultProxy, dummyNextVaultAccessor, mockNextVaultLib, false); + + vm.expectEmit(true, true, true, true); + emit MigrationOutHookFailed( + formatError("test revert"), + MigrationOutHook.PostSignal, + vaultProxy, + failingFundDeployer, + mockNextFundDeployer, + dummyNextVaultAccessor, + mockNextVaultLib + ); + + vm.prank(mockNextFundDeployer); + dispatcher.signalMigration(vaultProxy, dummyNextVaultAccessor, mockNextVaultLib, true); + } + + function testCorrectlySignalsMigration() public { + address prevFundDeployer = address(new MockFundDeployer()); + address nextFundDeployer = address(new MockFundDeployer()); + + dispatcher.setCurrentFundDeployer(prevFundDeployer); + address vaultProxy = createTestVault(); + dispatcher.setCurrentFundDeployer(nextFundDeployer); + + uint256 migrationTimelock = dispatcher.getMigrationTimelock(); + uint256 executableTimestamp = block.timestamp + migrationTimelock; + + vm.expectEmit(true, true, true, true); + emit MigrationSignaled( + vaultProxy, + prevFundDeployer, + nextFundDeployer, + dummyNextVaultAccessor, + mockNextVaultLib, + executableTimestamp + ); + + vm.expectCall( + prevFundDeployer, + abi.encodeWithSelector( + IMigrationHookHandler.invokeMigrationOutHook.selector, + MigrationOutHook.PreSignal, + vaultProxy, + nextFundDeployer, + dummyNextVaultAccessor, + mockNextVaultLib + ) + ); + + vm.expectCall( + prevFundDeployer, + abi.encodeWithSelector( + IMigrationHookHandler.invokeMigrationOutHook.selector, + MigrationOutHook.PostSignal, + vaultProxy, + nextFundDeployer, + dummyNextVaultAccessor, + mockNextVaultLib + ) + ); + + vm.prank(nextFundDeployer); + dispatcher.signalMigration(vaultProxy, dummyNextVaultAccessor, mockNextVaultLib, false); + + ( + address detailsNextFundDeployer, + address detailsNextVaultAccessor, + address detailsNextVaultLib, + uint256 detailsExecutableTimestamp + ) = dispatcher.getMigrationRequestDetailsForVaultProxy(vaultProxy); + + assertEq(nextFundDeployer, detailsNextFundDeployer); + assertEq(dummyNextVaultAccessor, detailsNextVaultAccessor); + assertEq(mockNextVaultLib, detailsNextVaultLib); + assertEq(executableTimestamp, detailsExecutableTimestamp); + } +} + +contract DispatcherCancelMigrationTest is DispatcherVaultMigrationTest { + event MigrationCancelled( + address indexed vaultProxy, + address indexed prevFundDeployer, + address indexed nextFundDeployer, + address nextVaultAccessor, + address nextVaultLib, + uint256 executableTimestamp + ); + + function testDoesNotAllowNonExistentMigrationRequest() public { + address vaultProxy = createTestVault(); + + vm.prank(alice); + vm.expectRevert("cancelMigration: No migration request exists"); + dispatcher.cancelMigration(vaultProxy, false); + } + + function testCanNotBeCancelledByArbitraryAccount() public { + address prevFundDeployer = address(new MockFundDeployer()); + address nextFundDeployer = address(new MockFundDeployer()); + + dispatcher.setCurrentFundDeployer(prevFundDeployer); + address vaultProxy = createTestVault(); + dispatcher.setCurrentFundDeployer(nextFundDeployer); + + vm.prank(nextFundDeployer); + dispatcher.signalMigration(vaultProxy, dummyNextVaultAccessor, mockNextVaultLib, false); + + vm.prank(makeAddr("NotAlice")); + vm.expectRevert("cancelMigration: Not an allowed caller"); + dispatcher.cancelMigration(vaultProxy, false); + } + + function testCorrectlyCancelsMigrationRequest() public { + address prevFundDeployer = address(new MockFundDeployer()); + address nextFundDeployer = address(new MockFundDeployer()); + + dispatcher.setCurrentFundDeployer(prevFundDeployer); + address vaultProxy = createTestVault(); + dispatcher.setCurrentFundDeployer(nextFundDeployer); + + vm.prank(nextFundDeployer); + dispatcher.signalMigration(vaultProxy, dummyNextVaultAccessor, mockNextVaultLib, false); + + ( + address detailsFundDeployerBeforeCancel, + address detailsVaultAccessorBeforeCancel, + address detailsVaultLibBeforeCancel, + uint256 detailsExecutableTimestampBeforeCancel + ) = dispatcher.getMigrationRequestDetailsForVaultProxy(vaultProxy); + + vm.expectEmit(true, true, true, true); + emit MigrationCancelled( + vaultProxy, + prevFundDeployer, + detailsFundDeployerBeforeCancel, + detailsVaultAccessorBeforeCancel, + detailsVaultLibBeforeCancel, + detailsExecutableTimestampBeforeCancel + ); + + vm.expectCall( + nextFundDeployer, + abi.encodeWithSelector( + IMigrationHookHandler.invokeMigrationInCancelHook.selector, + vaultProxy, + prevFundDeployer, + dummyNextVaultAccessor, + mockNextVaultLib + ) + ); + + vm.prank(alice); + dispatcher.cancelMigration(vaultProxy, false); + + ( + address detailsFundDeployerAfterCancel, + address detailsVaultAccessorAfterCancel, + address detailsVaultLibAfterCancel, + uint256 detailsExecutableTimestampAfterCancel + ) = dispatcher.getMigrationRequestDetailsForVaultProxy(vaultProxy); + + assertEq(address(0), detailsFundDeployerAfterCancel); + assertEq(address(0), detailsVaultAccessorAfterCancel); + assertEq(address(0), detailsVaultLibAfterCancel); + assertEq(uint256(0), detailsExecutableTimestampAfterCancel); + } + + function testCorrectlyHandlesPostCancelMigrationOriginHookFailure() public { + // TODO + } + + function testCorrectlyHandlesPostCancelMigrationTargetHookFailure() public { + // TODO + } +} + +contract DispatcherExecuteMigrationTest is DispatcherVaultMigrationTest { + event MigrationExecuted( + address indexed vaultProxy, + address indexed prevFundDeployer, + address indexed nextFundDeployer, + address nextVaultAccessor, + address nextVaultLib, + uint256 executableTimestamp + ); + + function testDoesNotAllowBadVaultLib() public { + address vaultProxy = createTestVault(); + address badVaultLib = makeAddr("BadVaultLib"); + dispatcher.setCurrentFundDeployer(mockNextFundDeployer); + + vm.prank(mockNextFundDeployer); + dispatcher.signalMigration(vaultProxy, dummyNextVaultAccessor, badVaultLib, false); + + uint256 executableTimestamp = block.timestamp + dispatcher.getMigrationTimelock(); + vm.warp(executableTimestamp); + + vm.prank(mockNextFundDeployer); + vm.expectRevert(); + dispatcher.executeMigration(vaultProxy, false); + } + + function testDoesNotAllowNonExistentMigrationRequest() public { + address vaultProxy = createTestVault(); + dispatcher.setCurrentFundDeployer(mockNextFundDeployer); + + vm.prank(mockNextFundDeployer); + vm.expectRevert("executeMigration: No migration request exists for _vaultProxy"); + dispatcher.executeMigration(vaultProxy, false); + } + + function testCanOnlyBeCalledByTargetFundDeployer() public { + address vaultProxy = createTestVault(); + dispatcher.setCurrentFundDeployer(mockNextFundDeployer); + + vm.prank(mockNextFundDeployer); + dispatcher.signalMigration(vaultProxy, dummyNextVaultAccessor, mockNextVaultLib, false); + + uint256 executableTimestamp = block.timestamp + dispatcher.getMigrationTimelock(); + vm.warp(executableTimestamp); + + vm.prank(mockPrevFundDeployer); + vm.expectRevert("executeMigration: Only the target FundDeployer can call this function"); + dispatcher.executeMigration(vaultProxy, false); + } + + function testCannotBeCalledWhenTargetFundDeployerIsNoLongerValid() public { + address vaultProxy = createTestVault(); + dispatcher.setCurrentFundDeployer(mockNextFundDeployer); + + vm.prank(mockNextFundDeployer); + dispatcher.signalMigration(vaultProxy, dummyNextVaultAccessor, mockNextVaultLib, false); + + vm.prank(mockNextFundDeployer); + vm.expectRevert("executeMigration: The migration timelock has not elapsed"); + dispatcher.executeMigration(vaultProxy, false); + + // Warp to 5 secs prior to the timelock expiry, which should also fail. + uint256 executableTimestamp = block.timestamp + dispatcher.getMigrationTimelock(); + vm.warp(executableTimestamp - 5); + + vm.prank(mockNextFundDeployer); + vm.expectRevert("executeMigration: The migration timelock has not elapsed"); + dispatcher.executeMigration(vaultProxy, false); + } + + function testCannotBeCalledWhenMigrationTimelockHasNotBeenMetYet() public { + address vaultProxy = createTestVault(); + dispatcher.setCurrentFundDeployer(mockNextFundDeployer); + + vm.prank(mockNextFundDeployer); + dispatcher.signalMigration(vaultProxy, dummyNextVaultAccessor, mockNextVaultLib, false); + + uint256 executableTimestamp = block.timestamp + dispatcher.getMigrationTimelock(); + vm.warp(executableTimestamp); + + address newFundDeployer = address(new MockFundDeployer()); + dispatcher.setCurrentFundDeployer(newFundDeployer); + + vm.prank(mockNextFundDeployer); + vm.expectRevert("executeMigration: The target FundDeployer is no longer the current FundDeployer"); + dispatcher.executeMigration(vaultProxy, false); + } + + function testCorrectlyExecutesMigrationRequest() public { + address vaultProxy = createTestVault(); + dispatcher.setCurrentFundDeployer(mockNextFundDeployer); + + vm.prank(mockNextFundDeployer); + dispatcher.signalMigration(vaultProxy, dummyNextVaultAccessor, mockNextVaultLib, false); + + uint256 executableTimestamp = block.timestamp + dispatcher.getMigrationTimelock(); + vm.warp(executableTimestamp); + + ( + address detailsFundDeployerBeforeMigration, + address detailsVaultAccessorBeforeMigration, + address detailsVaultLibBeforeMigration, + uint256 detailsExecutableTimestampBeforeMigration + ) = dispatcher.getMigrationRequestDetailsForVaultProxy(vaultProxy); + + vm.expectEmit(true, true, true, true); + emit MigrationExecuted( + vaultProxy, + mockPrevFundDeployer, + detailsFundDeployerBeforeMigration, + detailsVaultAccessorBeforeMigration, + detailsVaultLibBeforeMigration, + detailsExecutableTimestampBeforeMigration + ); + + vm.expectCall( + mockPrevFundDeployer, + abi.encodeWithSelector( + IMigrationHookHandler.invokeMigrationOutHook.selector, + MigrationOutHook.PreMigrate, + vaultProxy, + mockNextFundDeployer, + dummyNextVaultAccessor, + mockNextVaultLib + ) + ); + + vm.expectCall( + mockPrevFundDeployer, + abi.encodeWithSelector( + IMigrationHookHandler.invokeMigrationOutHook.selector, + MigrationOutHook.PostMigrate, + vaultProxy, + mockNextFundDeployer, + dummyNextVaultAccessor, + mockNextVaultLib + ) + ); + + vm.prank(mockNextFundDeployer); + dispatcher.executeMigration(vaultProxy, false); + + assertEq(mockNextVaultLib, IVault(vaultProxy).getVaultLib()); + assertEq(dummyNextVaultAccessor, IVault(vaultProxy).getAccessor()); + assertEq(dummyNextVaultAccessor, IVault(vaultProxy).getAccessor()); + + ( + address detailsFundDeployerAfterMigration, + address detailsVaultAccessorAfterMigration, + address detailsVaultLibAfterMigration, + uint256 detailsExecutableTimestampAfterMigration + ) = dispatcher.getMigrationRequestDetailsForVaultProxy(vaultProxy); + + assertEq(address(0), detailsFundDeployerAfterMigration); + assertEq(address(0), detailsVaultAccessorAfterMigration); + assertEq(address(0), detailsVaultLibAfterMigration); + assertEq(uint256(0), detailsExecutableTimestampAfterMigration); + } + + function testCorrectlyHandlesPreMigrationMigrationOriginHookFailure() public { + // TODO + } + + function testCorrectlyHandlesPreMigrationMigrationTargetHookFailure() public { + // TODO + } +} + +contract DispatcherHasExecutableMigrationRequestTest is DispatcherVaultMigrationTest { + function testReturnsFalseIfVaultProxyIsNotValid() public { + assertFalse(dispatcher.hasExecutableMigrationRequest(makeAddr("NonExistentVaultProxy"))); + } + + function testReturnsFalseIfVaultProxyHasNoMigrationRequest() public { + address vaultProxy = createTestVault(); + assertFalse(dispatcher.hasExecutableMigrationRequest(vaultProxy)); + } + + function testReturnsFalseIfVaultProxyHasMigrationRequestButTimelockHasNotBeenMet() public { + address vaultProxy = createTestVault(); + dispatcher.setCurrentFundDeployer(mockNextFundDeployer); + + vm.prank(mockNextFundDeployer); + dispatcher.signalMigration(vaultProxy, dummyNextVaultAccessor, mockNextVaultLib, false); + + assertFalse(dispatcher.hasExecutableMigrationRequest(vaultProxy)); + + // Warp to 5 secs prior to the timelock expiry, which should also return false. + uint256 executableTimestamp = block.timestamp + dispatcher.getMigrationTimelock(); + vm.warp(executableTimestamp - 5); + + assertFalse(dispatcher.hasExecutableMigrationRequest(vaultProxy)); + } + + function testReturnsTrueIfVaultProxyHasMigrationRequestAndTimelockHasBeenMet() public { + address vaultProxy = createTestVault(); + dispatcher.setCurrentFundDeployer(mockNextFundDeployer); + + vm.prank(mockNextFundDeployer); + dispatcher.signalMigration(vaultProxy, dummyNextVaultAccessor, mockNextVaultLib, false); + + uint256 executableTimestamp = block.timestamp + dispatcher.getMigrationTimelock(); + vm.warp(executableTimestamp); + + assertTrue(dispatcher.hasExecutableMigrationRequest(vaultProxy)); + + // Warp one day further into the future, which should still return true. + vm.warp(block.timestamp + 86400); + assertTrue(dispatcher.hasExecutableMigrationRequest(vaultProxy)); + } +} + +contract DispatcherHasMigrationRequestTest is DispatcherVaultMigrationTest { + function testReturnsFalseIfVaultProxyIsNotValid() public { + assertFalse(dispatcher.hasMigrationRequest(makeAddr("NonExistentVaultProxy"))); + } + + function testReturnsFalseIfVaultProxyHasNoMigrationRequest() public { + address vaultProxy = createTestVault(); + assertFalse(dispatcher.hasMigrationRequest(vaultProxy)); + } + + function testReturnsTrueIfVaultProxyHasMigrationRequest() public { + address vaultProxy = createTestVault(); + dispatcher.setCurrentFundDeployer(mockNextFundDeployer); + + vm.prank(mockNextFundDeployer); + dispatcher.signalMigration(vaultProxy, dummyNextVaultAccessor, mockNextVaultLib, false); + + assertTrue(dispatcher.hasMigrationRequest(vaultProxy)); + } + + function testReturnsFalseAfterMigrationHasBeenExecuted() public { + address vaultProxy = createTestVault(); + dispatcher.setCurrentFundDeployer(mockNextFundDeployer); + + vm.prank(mockNextFundDeployer); + dispatcher.signalMigration(vaultProxy, dummyNextVaultAccessor, mockNextVaultLib, false); + + uint256 executableTimestamp = block.timestamp + dispatcher.getMigrationTimelock(); + vm.warp(executableTimestamp); + + assertTrue(dispatcher.hasMigrationRequest(vaultProxy)); + + vm.prank(mockNextFundDeployer); + dispatcher.executeMigration(vaultProxy, false); + + assertFalse(dispatcher.hasMigrationRequest(vaultProxy)); + } + + function testReturnsFalseAfterMigrationHasBeenCancelled() public { + address vaultProxy = createTestVault(); + dispatcher.setCurrentFundDeployer(mockNextFundDeployer); + + vm.prank(mockNextFundDeployer); + dispatcher.signalMigration(vaultProxy, dummyNextVaultAccessor, mockNextVaultLib, false); + + assertTrue(dispatcher.hasMigrationRequest(vaultProxy)); + + vm.prank(mockNextFundDeployer); + dispatcher.cancelMigration(vaultProxy, false); + + assertFalse(dispatcher.hasMigrationRequest(vaultProxy)); + } +} + +contract DispatcherGetTimelockRemainingForMigrationRequestTest is DispatcherVaultMigrationTest { + function testReturnsZeroIfVaultProxyIsNotValid() public { + assertEq(uint256(0), dispatcher.getTimelockRemainingForMigrationRequest(makeAddr("NonExistentVaultProxy"))); + } + + function testReturnsZeroIfVaultProxyHasNoMigrationRequest() public { + address vaultProxy = createTestVault(); + assertEq(uint256(0), dispatcher.getTimelockRemainingForMigrationRequest(vaultProxy)); + } + + function testReturnsRemainingTimelockIfVaultProxyHasMigrationRequest() public { + address vaultProxy = createTestVault(); + dispatcher.setCurrentFundDeployer(mockNextFundDeployer); + + vm.prank(mockNextFundDeployer); + dispatcher.signalMigration(vaultProxy, dummyNextVaultAccessor, mockNextVaultLib, false); + + uint256 migrationTimelock = dispatcher.getMigrationTimelock(); + assertEq(migrationTimelock, dispatcher.getTimelockRemainingForMigrationRequest(vaultProxy)); + + // Warp to 5 seconds before the timelock expiry, which should return the remaining timelock. + vm.warp(block.timestamp + migrationTimelock - 5); + assertEq(uint256(5), dispatcher.getTimelockRemainingForMigrationRequest(vaultProxy)); + + // Warp to the exact timelock expiry time, which should return zero. + vm.warp(block.timestamp + migrationTimelock); + assertEq(uint256(0), dispatcher.getTimelockRemainingForMigrationRequest(vaultProxy)); + + // Warp one day further into the future, which should still return zero. + vm.warp(block.timestamp + 86400); + assertEq(uint256(0), dispatcher.getTimelockRemainingForMigrationRequest(vaultProxy)); + } +} diff --git a/tests/tests/core/external-positions/ExternalPositionFactory.t.sol b/tests/tests/core/external-positions/ExternalPositionFactory.t.sol new file mode 100644 index 000000000..ef2ae0b3d --- /dev/null +++ b/tests/tests/core/external-positions/ExternalPositionFactory.t.sol @@ -0,0 +1,240 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity 0.8.17; + +import {UnitTest} from "tests/bases/UnitTest.sol"; +import {DeploymentUtils} from "tests/utils/core/DeploymentUtils.sol"; + +import {IDispatcher} from "tests/interfaces/internal/IDispatcher.sol"; +import {IExternalPositionFactory} from "tests/interfaces/internal/IExternalPositionFactory.sol"; + +abstract contract ExternalPositionFactoryTest is UnitTest, DeploymentUtils { + event PositionDeployed( + address indexed vaultProxy, uint256 indexed typeId, address indexed constructLib, bytes constructData + ); + + event PositionDeployerAdded(address positionDeployer); + + event PositionDeployerRemoved(address positionDeployer); + + event PositionTypeAdded(uint256 typeId, string label); + + event PositionTypeLabelUpdated(uint256 indexed typeId, string label); + + address internal dummyDispatcherOwner = makeAddr("DummyDispatcherOwner"); + address internal dummyDispatcher = makeAddr("DummyDispatcher"); + IExternalPositionFactory internal factory; + + function setUp() public virtual { + factory = deployExternalPositionFactory(IDispatcher(dummyDispatcher)); + + mockGetOwner(dummyDispatcher, dummyDispatcherOwner); + } + + function mockGetOwner(address _dispatcher, address _dispatcherOwner) public { + vm.mockCall(_dispatcher, abi.encodeWithSelector(IDispatcher.getOwner.selector), abi.encode(_dispatcherOwner)); + } +} + +contract ExternalPositionFactoryConstructionTest is ExternalPositionFactoryTest { + function testInitialState() public { + assertEq(dummyDispatcher, factory.getDispatcher()); + } +} + +contract ExternalPositionFactoryOnlyDispatcherOwnerTest is ExternalPositionFactoryTest { + function testRevertsOnlyDispatcherOwner() public { + vm.prank(bob); + vm.expectRevert("Only the Dispatcher owner can call this function"); + factory.addPositionDeployers(new address[](0)); + } +} + +contract ExternalPositionFactoryDeployTest is ExternalPositionFactoryTest { + function testRevertIsNotPositionDeployer() public { + vm.expectRevert("deploy: Only a position deployer can call this function"); + factory.deploy({_vaultProxy: address(0), _typeId: uint256(0), _constructLib: address(0), _constructData: ""}); + } + + function testDeployWorks() public { + uint256 typeId = 1; + address vaultProxy = address(2); + address constructLib = address(1); + bytes memory constructData = ""; + + address[] memory accounts = new address[](1); + accounts[0] = bob; + + vm.prank(dummyDispatcherOwner); + factory.addPositionDeployers(accounts); + + vm.expectEmit(true, true, true, true, address(factory)); + + emit PositionDeployed({ + vaultProxy: vaultProxy, + typeId: typeId, + constructLib: constructLib, + constructData: constructData + }); + + // vm.mockCall(constructLib, constructData, ""); + + vm.prank(bob); + address externalPositionProxy = factory.deploy({ + _vaultProxy: vaultProxy, + _typeId: typeId, + _constructLib: constructLib, + _constructData: constructData + }); + + assertEq(factory.isExternalPositionProxy(externalPositionProxy), true); + } +} + +contract ExternalPositionFactoryTypesRegistryTest is ExternalPositionFactoryTest { + function setUp() public override { + super.setUp(); + vm.startPrank(dummyDispatcherOwner); + } + + function testAddNewPositionTypes() public { + string memory firstLabel = "test label 0"; + string memory secondLabel = "test label 1"; + uint256 firstTypeId = 0; + uint256 secondTypeId = 1; + + string[] memory labels = new string[](2); + labels[0] = firstLabel; + labels[1] = secondLabel; + + vm.expectEmit(true, true, true, true, address(factory)); + emit PositionTypeAdded({typeId: firstTypeId, label: firstLabel}); + vm.expectEmit(true, true, true, true, address(factory)); + emit PositionTypeAdded({typeId: secondTypeId, label: secondLabel}); + + factory.addNewPositionTypes(labels); + + assertEq(factory.getLabelForPositionType(firstTypeId), firstLabel); + assertEq(factory.getLabelForPositionType(secondTypeId), secondLabel); + } + + function testUdatePositionTypeLabels() public { + string memory firstLabel = "test label 0"; + string memory secondLabel = "test label 1"; + string memory thirdLabel = "test label 2"; + uint256 firstTypeId = 0; + uint256 secondTypeId = 1; + uint256 thirdTypeId = 2; + string memory secondLabelUpdated = "test label updated 1"; + string memory thirdLabelUpdated = "test label updated 2"; + + string[] memory labelsToAdd = new string[](3); + labelsToAdd[0] = firstLabel; + labelsToAdd[1] = secondLabel; + labelsToAdd[2] = thirdLabel; + + factory.addNewPositionTypes(labelsToAdd); + + string[] memory labelsToUpdte = new string[](2); + labelsToUpdte[0] = secondLabelUpdated; + labelsToUpdte[1] = thirdLabelUpdated; + + uint256[] memory typeIdsToUpdte = new uint256[](2); + typeIdsToUpdte[0] = secondTypeId; + typeIdsToUpdte[1] = thirdTypeId; + + vm.expectEmit(true, true, true, true, address(factory)); + emit PositionTypeLabelUpdated({typeId: secondTypeId, label: secondLabelUpdated}); + vm.expectEmit(true, true, true, true, address(factory)); + emit PositionTypeLabelUpdated({typeId: thirdTypeId, label: thirdLabelUpdated}); + + factory.updatePositionTypeLabels(typeIdsToUpdte, labelsToUpdte); + + assertEq(factory.getLabelForPositionType(firstTypeId), firstLabel); + assertEq(factory.getLabelForPositionType(secondTypeId), secondLabelUpdated); + assertEq(factory.getLabelForPositionType(thirdTypeId), thirdLabelUpdated); + } + + function testRevertsOnUdatePositionTypeLabelsWithUnequalArrays() public { + string[] memory labels = new string[](3); + labels[0] = ""; + labels[1] = ""; + labels[2] = ""; + + uint256[] memory typeIds = new uint256[](2); + typeIds[0] = 0; + typeIds[1] = 0; + + vm.expectRevert("updatePositionTypeLabels: Unequal arrays"); + factory.updatePositionTypeLabels(typeIds, labels); + } +} + +contract ExternalPositionFactoryPositionDeployersTest is ExternalPositionFactoryTest { + function setUp() public override { + super.setUp(); + vm.startPrank(dummyDispatcherOwner); + } + + function testAddPositionDeployers() public { + address[] memory accounts = new address[](2); + accounts[0] = bob; + accounts[1] = alice; + + for (uint256 i; i < accounts.length; i++) { + vm.expectEmit(true, true, true, true, address(factory)); + emit PositionDeployerAdded(accounts[i]); + } + + factory.addPositionDeployers(accounts); + + for (uint256 i; i < accounts.length; i++) { + assertEq(factory.isPositionDeployer(accounts[i]), true); + } + } + + function testRevertAlreadyAPositionDeployerAddTwice() public { + address[] memory accounts = new address[](2); + accounts[0] = bob; + accounts[1] = alice; + + factory.addPositionDeployers(accounts); + + vm.expectRevert("addPositionDeployers: Account is already a position deployer"); + factory.addPositionDeployers(accounts); + } + + function testRevertAlreadyAPositionDeployerAddNotUnique() public { + address[] memory accounts = new address[](2); + accounts[0] = bob; + accounts[1] = bob; + + vm.expectRevert("addPositionDeployers: Account is already a position deployer"); + factory.addPositionDeployers(accounts); + } + + function testRemovePositionDeployers() public { + address[] memory accounts = new address[](2); + accounts[0] = bob; + accounts[1] = alice; + + for (uint256 i; i < accounts.length; i++) { + vm.expectEmit(true, true, true, true, address(factory)); + emit PositionDeployerRemoved(accounts[i]); + } + + factory.addPositionDeployers(accounts); + factory.removePositionDeployers(accounts); + + for (uint256 i; i < accounts.length; i++) { + assertEq(factory.isPositionDeployer(accounts[i]), false); + } + } + + function testRevertAccountIsNotAPositionDeployer() public { + address[] memory accounts = new address[](1); + accounts[0] = bob; + + vm.expectRevert("removePositionDeployers: Account is not a position deployer"); + factory.removePositionDeployers(accounts); + } +} diff --git a/tests/tests/core/external-positions/ExternalPositionProxy.t.sol b/tests/tests/core/external-positions/ExternalPositionProxy.t.sol new file mode 100644 index 000000000..15bc5d122 --- /dev/null +++ b/tests/tests/core/external-positions/ExternalPositionProxy.t.sol @@ -0,0 +1,123 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity 0.8.17; + +import {UnitTest} from "tests/bases/UnitTest.sol"; +import {DeploymentUtils} from "tests/utils/core/DeploymentUtils.sol"; + +import {IDispatcher} from "tests/interfaces/internal/IDispatcher.sol"; +import {IExternalPosition} from "tests/interfaces/internal/IExternalPosition.sol"; +import {IExternalPositionFactory} from "tests/interfaces/internal/IExternalPositionFactory.sol"; +import {IExternalPositionProxy} from "tests/interfaces/internal/IExternalPositionProxy.sol"; +import {IExternalPositionVault} from "tests/interfaces/internal/IExternalPositionVault.sol"; + +abstract contract ExternalPositionProxyTest is UnitTest, DeploymentUtils { + address internal dummyVaultProxy = makeAddr("DummyVaultProxy"); + IExternalPositionFactory internal externalPositionFactory; + IExternalPositionProxy internal externalPositionProxy; + + function setUp() public virtual { + address[] memory positionDeployers = new address[](1); + positionDeployers[0] = address(this); + + // We deploy a semi-realistic dispatcher and factory to test proxy construction. Otherwise, we wouldn't be able to test + // the constructor validation logic in the ExternalPositionProxy since reverts produced with `deployCode` are not testable + // with `vm.expectRevert` currently: https://github.com/foundry-rs/foundry/issues/4589 + IDispatcher dispatcher = deployDispatcher(); + externalPositionFactory = deployExternalPositionFactory(dispatcher); + externalPositionFactory.addPositionDeployers(positionDeployers); + + externalPositionProxy = IExternalPositionProxy( + externalPositionFactory.deploy({ + _vaultProxy: dummyVaultProxy, + _typeId: 1, + _constructLib: makeAddr("DummyExternalPositionLib"), + _constructData: "" + }) + ); + } +} + +contract ExternalPositionProxyConstructionTest is ExternalPositionProxyTest { + function testConstruction() public { + uint256 typeId = 1; + address constructLib = makeAddr("DummyExternalPositionLib"); + bytes memory constructData = ""; + + IExternalPositionProxy externalPositionProxy = IExternalPositionProxy( + externalPositionFactory.deploy({ + _vaultProxy: dummyVaultProxy, + _typeId: typeId, + _constructLib: constructLib, + _constructData: constructData + }) + ); + + assertEq(externalPositionProxy.getVaultProxy(), dummyVaultProxy); + assertEq(externalPositionProxy.getExternalPositionType(), typeId); + } + + function testConstructionReverts() public { + uint256 typeId = 1; + address constructLib = address(new Reverter()); + bytes memory constructData = abi.encodeWithSignature("revertPlease()"); + + vm.expectRevert(formatError("revert from mock reverter")); + externalPositionFactory.deploy({ + _vaultProxy: dummyVaultProxy, + _typeId: typeId, + _constructLib: constructLib, + _constructData: constructData + }); + } +} + +contract ExternalPositionProxyReceiveCallFromVaultTest is ExternalPositionProxyTest { + function testReceiveCallFromVault() public { + address contractLogic = address(1); + bytes memory data = abi.encode(address(2)); + + vm.prank(dummyVaultProxy); + vm.mockCall( + dummyVaultProxy, + abi.encodeWithSelector(IExternalPositionVault.getExternalPositionLibForType.selector), + abi.encode(contractLogic) + ); + + bytes memory contractCallData = abi.encodeWithSelector(IExternalPosition.receiveCallFromVault.selector, data); + + vm.mockCall(contractLogic, contractCallData, ""); + vm.expectCall(contractLogic, contractCallData); + + externalPositionProxy.receiveCallFromVault(data); + } + + function testRevertsReceiveCallFromVault() public { + address reverter = address(new Reverter()); + bytes memory data = abi.encode(address(2)); + + vm.prank(dummyVaultProxy); + vm.mockCall( + dummyVaultProxy, + abi.encodeWithSelector(IExternalPositionVault.getExternalPositionLibForType.selector), + abi.encode(reverter) + ); + + bytes memory contractCallData = abi.encodeWithSelector(IExternalPosition.receiveCallFromVault.selector, data); + + vm.expectCall(reverter, contractCallData); + vm.expectRevert(formatError("revert from mock reverter")); + externalPositionProxy.receiveCallFromVault(data); + } + + function testRevertOnlyVaultCanMakeVall() public { + vm.prank(bob); + vm.expectRevert("receiveCallFromVault: Only the vault can make this call"); + externalPositionProxy.receiveCallFromVault(""); + } +} + +contract Reverter { + fallback() external payable { + revert("revert from mock reverter"); + } +} diff --git a/tests/tests/core/fund-deployer/FundDeployer.t.sol b/tests/tests/core/fund-deployer/FundDeployer.t.sol new file mode 100644 index 000000000..8588cc1ee --- /dev/null +++ b/tests/tests/core/fund-deployer/FundDeployer.t.sol @@ -0,0 +1,122 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity 0.8.17; + +import {IntegrationTest} from "tests/bases/IntegrationTest.sol"; + +import {IERC20} from "tests/interfaces/external/IERC20.sol"; +import {IComptroller} from "tests/interfaces/internal/IComptroller.sol"; +import {IFundDeployer} from "tests/interfaces/internal/IFundDeployer.sol"; +import {IVault} from "tests/interfaces/internal/IVault.sol"; +import {IVaultCore} from "tests/interfaces/internal/IVaultCore.sol"; + +// TODO: pseudo-constant setters (if no central router contract) +// TODO: setReleaseLive (relies on pseudo-constants) +// TODO: setGasLimitsForDestructCall (destruct calls might be removed all-together) + +contract FundDeployerTest is IntegrationTest { + // Comptroller events + + // ProtocolFeeCollector events + event InitializedForVault(address vaultProxy); + + // FundDeployer events + event ComptrollerProxyDeployed( + address indexed creator, + address comptrollerProxy, + address indexed denominationAsset, + uint256 sharesActionTimelock + ); + + event NewFundCreated(address indexed creator, address vaultProxy, address comptrollerProxy); + + function setUp() public override { + setUpStandaloneEnvironment(false); + } + + function test_getOwner_success() public { + address creator = makeAddr("FundDeployerCreator"); + + // Deploy a new FundDeployer from an expected account + vm.prank(creator); + IFundDeployer newFundDeployer = deployFundDeployer({ + _dispatcher: core.persistent.dispatcher, + _gasRelayPaymasterFactory: core.persistent.gasRelayPaymasterFactory + }); + + // Owner starts as the FundDeployer contract deployer + assertEq(newFundDeployer.getOwner(), creator); + + // Set release live after setting the pseudo vars + vm.startPrank(creator); + newFundDeployer.setComptrollerLib(core.release.comptrollerLib); + newFundDeployer.setProtocolFeeTracker(address(core.release.protocolFeeTracker)); + newFundDeployer.setVaultLib(core.release.vaultLib); + newFundDeployer.setReleaseLive(); + vm.stopPrank(); + + // Owner should be the Dispatcher owner + assertEq(newFundDeployer.getOwner(), core.persistent.dispatcher.getOwner()); + } + + function test_createNewFund_failWithNonLiveRelease() public { + vm.expectRevert("Release is not yet live"); + + core.release.fundDeployer.createNewFund({ + _fundOwner: makeAddr("FundOwner"), + _fundName: "My Fund", + _fundSymbol: "", + _denominationAsset: makeAddr("DenominationAsset"), + _sharesActionTimelock: 0, + _feeManagerConfigData: "", + _policyManagerConfigData: "" + }); + } + + function test_createNewFund_successWithNoExtraConfig() public { + setReleaseLive(core); + + address fundCreator = makeAddr("FundCreator"); + address fundOwner = makeAddr("FundOwner"); + string memory fundName = "My Fund"; + uint256 sharesActionTimelock = 123; + + // Add denomination asset to the asset universe + address denominationAsset = address(standardPrimitive); + address expectedComptrollerProxy = predictComptrollerProxyAddress(core.release.fundDeployer); + address expectedVaultProxyAddress = predictVaultProxyAddress(core.persistent.dispatcher); + + expectEmit(address(core.release.fundDeployer)); + emit ComptrollerProxyDeployed(fundCreator, expectedComptrollerProxy, denominationAsset, sharesActionTimelock); + + // TODO: Should this be tested in the protocol fee tracker tests? + expectEmit(address(core.release.protocolFeeTracker)); + emit InitializedForVault(expectedVaultProxyAddress); + + expectEmit(address(core.release.fundDeployer)); + emit NewFundCreated(fundCreator, expectedVaultProxyAddress, expectedComptrollerProxy); + + vm.prank(fundCreator); + (address comptrollerProxy, address vaultProxy) = core.release.fundDeployer.createNewFund({ + _fundOwner: fundOwner, + _fundName: fundName, + _fundSymbol: "", + _denominationAsset: denominationAsset, + _sharesActionTimelock: sharesActionTimelock, + _feeManagerConfigData: "", + _policyManagerConfigData: "" + }); + + // Assert the correct ComptrollerProxy state values + assertEq(IComptroller(comptrollerProxy).getDenominationAsset(), denominationAsset); + assertEq(IComptroller(comptrollerProxy).getSharesActionTimelock(), sharesActionTimelock); + assertEq(IComptroller(comptrollerProxy).getVaultProxy(), vaultProxy); + + // Assert the correct VaultProxy state values + assertEq(IVault(vaultProxy).getAccessor(), comptrollerProxy); + assertEq(IVault(vaultProxy).getOwner(), fundOwner); + assertEq(IERC20(vaultProxy).name(), fundName); + assertEq(IERC20(vaultProxy).symbol(), "ENZF"); + + // TODO: calls the active() lifecycle function (?) + } +} diff --git a/tests/tests/core/fund-deployer/FundDeployerMigrationIn.t.sol b/tests/tests/core/fund-deployer/FundDeployerMigrationIn.t.sol new file mode 100644 index 000000000..371b1e878 --- /dev/null +++ b/tests/tests/core/fund-deployer/FundDeployerMigrationIn.t.sol @@ -0,0 +1,305 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity 0.8.17; + +import {IntegrationTest} from "tests/bases/IntegrationTest.sol"; + +import {IERC20} from "tests/interfaces/external/IERC20.sol"; +import {IComptroller} from "tests/interfaces/internal/IComptroller.sol"; +import {IFundDeployer} from "tests/interfaces/internal/IFundDeployer.sol"; +import {IVault} from "tests/interfaces/internal/IVault.sol"; +import {IVaultCore} from "tests/interfaces/internal/IVaultCore.sol"; + +contract FundDeployerMigrationInTest is IntegrationTest { + bool internal bypassPrevReleaseFailure; // Don't bypass failures by default + address internal migrator; + address internal vaultOwner; + IVaultCore internal vaultProxyCore; + + function setUp() public virtual override { + setUpStandaloneEnvironment(false); + + // Create VaultProxy attached to another release + vaultProxyCore = IVaultCore( + createVaultFromMockFundDeployer({ + _dispatcher: core.persistent.dispatcher, + _vaultLibAddress: core.release.fundDeployer.getVaultLib() + }) + ); + vaultOwner = vaultProxyCore.getOwner(); + + // Set the `migrator` role on the vault + migrator = makeAddr("Migrator"); + vm.prank(vaultProxyCore.getOwner()); + IVault(address(vaultProxyCore)).setMigrator(migrator); + } +} + +contract FundDeployerCreateMigrationRequestTest is FundDeployerMigrationInTest { + event MigrationRequestCreated(address indexed creator, address indexed vaultProxy, address comptrollerProxy); + + function test_failWithNonLiveRelease() public { + vm.expectRevert("Release is not yet live"); + vm.prank(vaultOwner); + + core.release.fundDeployer.createMigrationRequest({ + _vaultProxy: address(vaultProxyCore), + _denominationAsset: address(standardPrimitive), + _sharesActionTimelock: 123, + _feeManagerConfigData: "", + _policyManagerConfigData: "", + _bypassPrevReleaseFailure: bypassPrevReleaseFailure + }); + } + + function test_failWithNonMigrator() public { + setReleaseLive(core); + + address randomSigner = makeAddr("RandomSigner"); + + vm.expectRevert("Only a permissioned migrator can call this function"); + vm.prank(randomSigner); + + core.release.fundDeployer.createMigrationRequest({ + _vaultProxy: address(vaultProxyCore), + _denominationAsset: address(standardPrimitive), + _sharesActionTimelock: 123, + _feeManagerConfigData: "", + _policyManagerConfigData: "", + _bypassPrevReleaseFailure: bypassPrevReleaseFailure + }); + } + + function test_success() public { + setReleaseLive(core); + + address expectedComptrollerProxy = predictComptrollerProxyAddress(core.release.fundDeployer); + + // Define migration request params + address migrationRequestCaller = vaultProxyCore.getOwner(); + address denominationAsset = address(standardPrimitive); + uint256 sharesActionTimelock = 123; + + // Prepare event assertions + expectEmit(address(core.release.fundDeployer)); + emit MigrationRequestCreated(migrationRequestCaller, address(vaultProxyCore), address(expectedComptrollerProxy)); + + // Create migration request + vm.prank(migrationRequestCaller); + IComptroller comptrollerProxy = IComptroller( + core.release.fundDeployer.createMigrationRequest({ + _vaultProxy: address(vaultProxyCore), + _denominationAsset: denominationAsset, + _sharesActionTimelock: sharesActionTimelock, + _feeManagerConfigData: "", + _policyManagerConfigData: "", + _bypassPrevReleaseFailure: bypassPrevReleaseFailure + }) + ); + + // Assert the Dispatcher stored the MigrationRequest. + // `executableTimestamp` is programmatic. + (address nextFundDeployer, address nextVaultAccessor, address nextVaultLib,) = + core.persistent.dispatcher.getMigrationRequestDetailsForVaultProxy(address(vaultProxyCore)); + assertEq(nextFundDeployer, address(core.release.fundDeployer)); + assertEq(nextVaultAccessor, address(comptrollerProxy)); + assertEq(nextVaultLib, core.release.fundDeployer.getVaultLib()); + + // Assert the correct ComptrollerProxy state values + assertEq(comptrollerProxy.getVaultProxy(), address(vaultProxyCore)); + assertEq(comptrollerProxy.getDenominationAsset(), denominationAsset); + assertEq(comptrollerProxy.getSharesActionTimelock(), sharesActionTimelock); + + // TODO: Assert the extensions were called correctly + } + + function test_successWithMigratorCaller() public { + setReleaseLive(core); + + address expectedComptrollerProxy = predictComptrollerProxyAddress(core.release.fundDeployer); + + // Prepare event assertions + expectEmit(address(core.release.fundDeployer)); + emit MigrationRequestCreated(migrator, address(vaultProxyCore), address(expectedComptrollerProxy)); + + // Create migration request + vm.prank(migrator); + core.release.fundDeployer.createMigrationRequest({ + _vaultProxy: address(vaultProxyCore), + _denominationAsset: address(standardPrimitive), + _sharesActionTimelock: 123, + _feeManagerConfigData: "", + _policyManagerConfigData: "", + _bypassPrevReleaseFailure: bypassPrevReleaseFailure + }); + } +} + +contract FundDeployerCancelMigrationTest is FundDeployerMigrationInTest { + address internal nextComptrollerProxyAddress; + + function setUp() public virtual override { + super.setUp(); + + // Set release live + setReleaseLive(core); + + // Create migration request + vm.prank(vaultOwner); + nextComptrollerProxyAddress = core.release.fundDeployer.createMigrationRequest({ + _vaultProxy: address(vaultProxyCore), + _denominationAsset: address(standardPrimitive), + _sharesActionTimelock: 123, + _feeManagerConfigData: "", + _policyManagerConfigData: "", + _bypassPrevReleaseFailure: bypassPrevReleaseFailure + }); + } + + function test_failWithNonMigrator() public { + address randomSigner = makeAddr("RandomSigner"); + + vm.expectRevert("Only a permissioned migrator can call this function"); + vm.prank(randomSigner); + + core.release.fundDeployer.cancelMigration({ + _vaultProxy: address(vaultProxyCore), + _bypassPrevReleaseFailure: bypassPrevReleaseFailure + }); + } + + // Also tests `invokeMigrationInCancelHook()` + function test_success() public { + // Assert Dispatcher.cancelMigration() will be called correctly + vm.expectCall( + address(core.persistent.dispatcher), + abi.encodeWithSelector( + core.persistent.dispatcher.cancelMigration.selector, address(vaultProxyCore), bypassPrevReleaseFailure + ) + ); + // Assert ComptrollerProxy.destructUnactivated() will be called + vm.expectCall(nextComptrollerProxyAddress, abi.encodeWithSelector(IComptroller.destructUnactivated.selector)); + vm.prank(vaultOwner); + + core.release.fundDeployer.cancelMigration({ + _vaultProxy: address(vaultProxyCore), + _bypassPrevReleaseFailure: bypassPrevReleaseFailure + }); + } + + function test_successWithFailureBypass() public { + bypassPrevReleaseFailure = true; + + // Assert Dispatcher.cancelMigration() will be called correctly + vm.expectCall( + address(core.persistent.dispatcher), + abi.encodeWithSelector( + core.persistent.dispatcher.cancelMigration.selector, address(vaultProxyCore), bypassPrevReleaseFailure + ) + ); + vm.prank(vaultOwner); + + core.release.fundDeployer.cancelMigration({ + _vaultProxy: address(vaultProxyCore), + _bypassPrevReleaseFailure: bypassPrevReleaseFailure + }); + } + + function test_successWithMigratorCaller() public { + vm.prank(migrator); + + core.release.fundDeployer.cancelMigration({ + _vaultProxy: address(vaultProxyCore), + _bypassPrevReleaseFailure: bypassPrevReleaseFailure + }); + } +} + +contract FundDeployerExecuteMigrationTest is FundDeployerMigrationInTest { + address internal nextComptrollerProxyAddress; + + function setUp() public virtual override { + super.setUp(); + + // Set release live + setReleaseLive(core); + + // Create migration request + vm.prank(vaultOwner); + nextComptrollerProxyAddress = core.release.fundDeployer.createMigrationRequest({ + _vaultProxy: address(vaultProxyCore), + _denominationAsset: address(standardPrimitive), + _sharesActionTimelock: 123, + _feeManagerConfigData: "", + _policyManagerConfigData: "", + _bypassPrevReleaseFailure: bypassPrevReleaseFailure + }); + + // Warp beyond the migration timelock + (,,, uint256 executionTimestamp) = + core.persistent.dispatcher.getMigrationRequestDetailsForVaultProxy(address(vaultProxyCore)); + vm.warp(executionTimestamp + 1); + } + + function test_failWithNonMigrator() public { + address randomSigner = makeAddr("RandomSigner"); + + vm.expectRevert("Only a permissioned migrator can call this function"); + vm.prank(randomSigner); + + core.release.fundDeployer.executeMigration({ + _vaultProxy: address(vaultProxyCore), + _bypassPrevReleaseFailure: bypassPrevReleaseFailure + }); + } + + function test_success() public { + // Assert Dispatcher.executeMigration() will be called correctly + vm.expectCall( + address(core.persistent.dispatcher), + abi.encodeWithSelector( + core.persistent.dispatcher.executeMigration.selector, address(vaultProxyCore), bypassPrevReleaseFailure + ) + ); + // Assert ProtocolFeeTracker.initializeForVault() will be called correctly + vm.expectCall( + address(core.release.protocolFeeTracker), + abi.encodeWithSelector(core.release.protocolFeeTracker.initializeForVault.selector, address(vaultProxyCore)) + ); + // Assert ComptrollerProxy.activate() will be called correctly + vm.expectCall(nextComptrollerProxyAddress, abi.encodeWithSelector(IComptroller.activate.selector, true)); + + vm.prank(vaultOwner); + + core.release.fundDeployer.executeMigration({ + _vaultProxy: address(vaultProxyCore), + _bypassPrevReleaseFailure: bypassPrevReleaseFailure + }); + } + + function test_successWithFailureBypass() public { + bypassPrevReleaseFailure = true; + + // Assert Dispatcher.executeMigration() will be called correctly + vm.expectCall( + address(core.persistent.dispatcher), + abi.encodeWithSelector( + core.persistent.dispatcher.executeMigration.selector, address(vaultProxyCore), bypassPrevReleaseFailure + ) + ); + vm.prank(vaultOwner); + + core.release.fundDeployer.executeMigration({ + _vaultProxy: address(vaultProxyCore), + _bypassPrevReleaseFailure: bypassPrevReleaseFailure + }); + } + + function test_successWithMigratorCaller() public { + vm.prank(migrator); + + core.release.fundDeployer.executeMigration({ + _vaultProxy: address(vaultProxyCore), + _bypassPrevReleaseFailure: bypassPrevReleaseFailure + }); + } +} diff --git a/tests/tests/core/uint-list-registry/UintListRegistry.t.sol b/tests/tests/core/uint-list-registry/UintListRegistry.t.sol new file mode 100644 index 000000000..1c17ff075 --- /dev/null +++ b/tests/tests/core/uint-list-registry/UintListRegistry.t.sol @@ -0,0 +1,496 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity 0.8.17; + +import {UnitTest} from "tests/bases/UnitTest.sol"; +import {DeploymentUtils} from "tests/utils/core/DeploymentUtils.sol"; +import {UpdateType} from "tests/utils/core/ListRegistryUtils.sol"; + +import {IDispatcher} from "tests/interfaces/internal/IDispatcher.sol"; +import {IUintListRegistry} from "tests/interfaces/internal/IUintListRegistry.sol"; + +abstract contract UintListRegistryTest is UnitTest, DeploymentUtils { + address internal dispatcher = makeAddr("DummyDispatcher"); + IUintListRegistry internal registry; + + function setUp() public { + registry = deployUintListRegistry(IDispatcher(dispatcher)); + } + + function makeArray(uint256 _first) public pure returns (uint256[] memory list_) { + list_ = new uint256[](1); + list_[0] = _first; + } + + function makeArray(uint256 _first, uint256 _second) public pure returns (uint256[] memory list_) { + list_ = new uint256[](2); + list_[0] = _first; + list_[1] = _second; + } + + function makeArray(uint256 _first, uint256 _second, uint256 _third) public pure returns (uint256[] memory list_) { + list_ = new uint256[](3); + list_[0] = _first; + list_[1] = _second; + list_[2] = _third; + } +} + +contract UintListRegistryConstructorTest is UintListRegistryTest { + function testInitialState() public { + assertEq(dispatcher, registry.getDispatcher()); + + // The first list at position 0 is created as an empty list. + assertEq(1, registry.getListCount()); + assertEq(uint256(UpdateType.None), uint256(registry.getListUpdateType(0))); + assertEq(address(0), registry.getListOwner(0)); + } +} + +contract UintListRegistrySetListOwnerTest is UintListRegistryTest { + event ListOwnerSet(uint256 indexed id, address indexed nextOwner); + + function testDoesNotAllowArbitraryCaller() public { + uint256 bobsList = registry.createList(bob, uint8(UpdateType.AddAndRemove), makeArray(123)); + + vm.prank(alice); + vm.expectRevert("Only callable by list owner"); + registry.setListOwner(bobsList, alice); + } + + function testAllowsTransferOfOwnershipByTheCurrentOwner() public { + uint256 bobsList = registry.createList(bob, uint8(UpdateType.AddAndRemove), makeArray(123)); + + assertEq(bob, registry.getListOwner(bobsList)); + + vm.expectEmit(true, true, true, true, address(registry)); + emit ListOwnerSet(bobsList, alice); + + vm.prank(bob); + registry.setListOwner(bobsList, alice); + + assertEq(alice, registry.getListOwner(bobsList)); + } +} + +contract UintListRegistrySetListUpdateTypeTest is UintListRegistryTest { + event ListUpdateTypeSet(uint256 indexed id, UpdateType prevUpdateType, UpdateType indexed nextUpdateType); + + function assertAllowedUpdateTypeChange(UpdateType _prevUpdateType, UpdateType _nextUpdateType) public { + uint256 bobsList = registry.createList(bob, uint8(_prevUpdateType), makeArray(123)); + + assertEq(uint256(_prevUpdateType), uint256(registry.getListUpdateType(bobsList))); + + vm.expectEmit(true, true, true, true, address(registry)); + emit ListUpdateTypeSet(bobsList, _prevUpdateType, _nextUpdateType); + + vm.prank(bob); + registry.setListUpdateType(bobsList, uint8(_nextUpdateType)); + + assertEq(uint256(_nextUpdateType), uint256(registry.getListUpdateType(bobsList))); + } + + function assertForbiddenUpdateTypeChange(UpdateType _prevUpdateType, UpdateType _nextUpdateType) public { + uint256 bobsList = registry.createList(bob, uint8(_prevUpdateType), makeArray(123)); + + assertEq(uint256(_prevUpdateType), uint256(registry.getListUpdateType(bobsList))); + + vm.prank(bob); + vm.expectRevert("setListUpdateType: _nextUpdateType not allowed"); + registry.setListUpdateType(bobsList, uint8(_nextUpdateType)); + + assertEq(uint256(_prevUpdateType), uint256(registry.getListUpdateType(bobsList))); + } + + function testDoesNotAllowArbitraryCaller() public { + uint256 bobsList = registry.createList(bob, uint8(UpdateType.AddAndRemove), makeArray(123)); + + vm.prank(alice); + vm.expectRevert("Only callable by list owner"); + registry.setListUpdateType(bobsList, uint8(UpdateType.None)); + } + + // TODO: This could be modeled better using tabled testing: https://github.com/foundry-rs/foundry/issues/858 + function testAllowedUpdateTypeChanges() public { + assertAllowedUpdateTypeChange(UpdateType.AddAndRemove, UpdateType.AddOnly); + assertAllowedUpdateTypeChange(UpdateType.AddAndRemove, UpdateType.RemoveOnly); + assertAllowedUpdateTypeChange(UpdateType.AddAndRemove, UpdateType.None); + assertAllowedUpdateTypeChange(UpdateType.AddOnly, UpdateType.None); + assertAllowedUpdateTypeChange(UpdateType.RemoveOnly, UpdateType.None); + } + + // TODO: This could be modeled better using tabled testing: https://github.com/foundry-rs/foundry/issues/858 + function testForbiddenUpdateTypeChanges() public { + assertForbiddenUpdateTypeChange(UpdateType.RemoveOnly, UpdateType.AddAndRemove); + assertForbiddenUpdateTypeChange(UpdateType.AddOnly, UpdateType.AddAndRemove); + assertForbiddenUpdateTypeChange(UpdateType.None, UpdateType.AddOnly); + assertForbiddenUpdateTypeChange(UpdateType.None, UpdateType.RemoveOnly); + assertForbiddenUpdateTypeChange(UpdateType.None, UpdateType.AddAndRemove); + } +} + +contract UintListRegistryCreateListTest is UintListRegistryTest { + event ItemAddedToList(uint256 indexed id, uint256 item); + event ListCreated(address indexed creator, address indexed owner, uint256 id, UpdateType updateType); + + // TODO: This is an example for fuzzy testing in foundry. This particular example could possibly be modeled better + // using fixed testing tables (https://github.com/foundry-rs/foundry/issues/858) but it's still a good and simple demo. + function testFuzzyHappyPath(uint8 _enumIndex, uint8 _firstValue, uint8 _secondValue, uint8 _otherValue) public { + // Assume that `otherValue` is neither `firstValue` nor `secondValue` and that both values are different. + vm.assume(_firstValue != _otherValue); + vm.assume(_secondValue != _otherValue); + vm.assume(_firstValue != _secondValue); + + // Assume that `enumIndex` is the uint representation of one of the available UpdateTypes. + vm.assume(_enumIndex <= 3); + UpdateType updateType = UpdateType(_enumIndex); + + vm.expectEmit(true, true, true, true, address(registry)); + emit ListCreated(bob, bob, 1, updateType); + + vm.expectEmit(true, true, true, true, address(registry)); + emit ItemAddedToList(1, _firstValue); + + vm.expectEmit(true, true, true, true, address(registry)); + emit ItemAddedToList(1, _secondValue); + + vm.prank(bob); + uint256 listId = registry.createList(bob, uint8(updateType), makeArray(_firstValue, _secondValue)); + + assertEq(1, listId); + assertEq(2, registry.getListCount()); + assertEq(bob, registry.getListOwner(listId)); + assertEq(uint256(updateType), uint256(registry.getListUpdateType(listId))); + + assertTrue(registry.isInList(listId, _firstValue)); + assertTrue(registry.isInList(listId, _secondValue)); + assertFalse(registry.isInList(listId, _otherValue)); + } +} + +contract UintListRegistryAddToListTest is UintListRegistryTest { + event ItemAddedToList(uint256 indexed id, uint256 item); + + function testDoesNotAllowArbitraryCaller() public { + uint256 bobsList = registry.createList(bob, uint8(UpdateType.AddAndRemove), makeArray(123)); + + vm.prank(alice); + vm.expectRevert("Only callable by list owner"); + registry.addToList(bobsList, makeArray(123)); + } + + function testAllowsListOwnedByDispatcherToBeUpdatedByDispatcherOwner() public { + uint256 dispatchersList = registry.createList(dispatcher, uint8(UpdateType.AddAndRemove), makeArray(123)); + + // Pretend that bob is the dispatcher owner. + vm.mockCall(dispatcher, abi.encodeWithSelector(IDispatcher.getOwner.selector), abi.encode(bob)); + + // Calling the function as alice should fail. + vm.prank(alice); + vm.expectRevert("Only callable by list owner"); + registry.addToList(dispatchersList, makeArray(123)); + + // Calling the function as bob should succeed. + vm.prank(bob); + registry.addToList(dispatchersList, makeArray(123)); + } + + function testDoesNotAllowUpdatingListIfUpdateTypeIsNone() public { + uint256 bobsList = registry.createList(bob, uint8(UpdateType.None), makeArray(123)); + + vm.prank(bob); + vm.expectRevert("addToList: Cannot add to list"); + registry.addToList(bobsList, makeArray(123)); + } + + function testDoesNotAllowUpdatingListIfUpdateTypeIsRemoveOnly() public { + uint256 bobsList = registry.createList(bob, uint8(UpdateType.RemoveOnly), makeArray(123)); + + vm.prank(bob); + vm.expectRevert("addToList: Cannot add to list"); + registry.addToList(bobsList, makeArray(123)); + } + + function testCorrectlyHandlesUpdateTypeAddOnly() public { + uint256 bobsList = registry.createList(bob, uint8(UpdateType.AddOnly), makeArray(123)); + + assertTrue(registry.isInList(bobsList, 123)); + assertFalse(registry.isInList(bobsList, 456)); + assertFalse(registry.isInList(bobsList, 1337)); + + vm.expectEmit(true, true, true, true, address(registry)); + emit ItemAddedToList(bobsList, 456); + + vm.expectEmit(true, true, true, true, address(registry)); + emit ItemAddedToList(bobsList, 1337); + + vm.prank(bob); + registry.addToList(bobsList, makeArray(456, 1337)); + + assertTrue(registry.isInList(bobsList, 123)); + assertTrue(registry.isInList(bobsList, 456)); + assertTrue(registry.isInList(bobsList, 1337)); + } + + function testCorrectlyHandlesUpdateTypeAddAndRemove() public { + uint256 bobsList = registry.createList(bob, uint8(UpdateType.AddAndRemove), makeArray(123)); + + assertTrue(registry.isInList(bobsList, 123)); + assertFalse(registry.isInList(bobsList, 456)); + assertFalse(registry.isInList(bobsList, 1337)); + + vm.expectEmit(true, true, true, true, address(registry)); + emit ItemAddedToList(bobsList, 456); + + vm.expectEmit(true, true, true, true, address(registry)); + emit ItemAddedToList(bobsList, 1337); + + vm.prank(bob); + registry.addToList(bobsList, makeArray(456, 1337)); + + assertTrue(registry.isInList(bobsList, 123)); + assertTrue(registry.isInList(bobsList, 456)); + assertTrue(registry.isInList(bobsList, 1337)); + } +} + +contract UintListRegistryRemoveFromListTest is UintListRegistryTest { + event ItemRemovedFromList(uint256 indexed id, uint256 item); + + function testDoesNotAllowArbitraryCaller() public { + uint256 bobsList = registry.createList(bob, uint8(UpdateType.AddAndRemove), makeArray(123, 456)); + + vm.prank(alice); + vm.expectRevert("Only callable by list owner"); + registry.removeFromList(bobsList, makeArray(123, 456)); + } + + function testDoesNotAllowRemovingFromListIfUpdateTypeIsNone() public { + uint256 bobsList = registry.createList(bob, uint8(UpdateType.None), makeArray(123)); + + vm.prank(bob); + vm.expectRevert("removeFromList: Cannot remove from list"); + registry.removeFromList(bobsList, makeArray(123)); + } + + function testDoesNotAllowRemovingFromListIfUpdateTypeIsAddOnly() public { + uint256 bobsList = registry.createList(bob, uint8(UpdateType.AddOnly), makeArray(123)); + + vm.prank(bob); + vm.expectRevert("removeFromList: Cannot remove from list"); + registry.removeFromList(bobsList, makeArray(123)); + } + + // TODO: This is a test that is expected to fail and passes if it does. This would be better implemented using negative + // assertions as described here: https://github.com/foundry-rs/foundry/issues/509 + function testFailSilentlyIgnoresRemovalOfNonExistentItems() public { + uint256 bobsList = registry.createList(bob, uint8(UpdateType.AddAndRemove), makeArray(123)); + + assertTrue(registry.isInList(bobsList, 123)); + assertFalse(registry.isInList(bobsList, 456)); + + // This expectEmit will fail because 456 is not in the list and we expect it to NOT emit an event for its + // removal. But because our test uses the `fail` modifier, it will pass. + vm.expectEmit(true, true, true, true, address(registry)); + emit ItemRemovedFromList(bobsList, 456); + + vm.prank(bob); + registry.removeFromList(bobsList, makeArray(456)); + } + + function testCorrectlyHandlesUpdateTypeRemoveOnly() public { + uint256 bobsList = registry.createList(bob, uint8(UpdateType.RemoveOnly), makeArray(123, 456, 1337)); + + assertTrue(registry.isInList(bobsList, 123)); + assertTrue(registry.isInList(bobsList, 456)); + assertTrue(registry.isInList(bobsList, 1337)); + + vm.expectEmit(true, true, true, true, address(registry)); + emit ItemRemovedFromList(bobsList, 456); + + vm.prank(bob); + registry.removeFromList(bobsList, makeArray(456, 1337)); + + assertTrue(registry.isInList(bobsList, 123)); + assertFalse(registry.isInList(bobsList, 456)); + assertFalse(registry.isInList(bobsList, 1337)); + } + + function testCorrectlyHandlesUpdateTypeAddAndRemove() public { + uint256 bobsList = registry.createList(bob, uint8(UpdateType.AddAndRemove), makeArray(123, 456, 1337)); + + assertTrue(registry.isInList(bobsList, 123)); + assertTrue(registry.isInList(bobsList, 456)); + assertTrue(registry.isInList(bobsList, 1337)); + + vm.expectEmit(true, true, true, true, address(registry)); + emit ItemRemovedFromList(bobsList, 456); + + vm.prank(bob); + registry.removeFromList(bobsList, makeArray(456, 1337)); + + assertTrue(registry.isInList(bobsList, 123)); + assertFalse(registry.isInList(bobsList, 456)); + assertFalse(registry.isInList(bobsList, 1337)); + } +} + +contract UintListRegistryListSearchTest is UintListRegistryTest { + function assumeFuzzParameters( + uint256 _inNoLists, + uint256 _inFirstListOnly, + uint256 _inSecondListOnly, + uint256 _inAllListsA, + uint256 _inAllListsB + ) public pure { + // Assume that `_inNoLists` doesn't equal any other fuzz value. + vm.assume(_inNoLists != _inFirstListOnly); + vm.assume(_inNoLists != _inSecondListOnly); + vm.assume(_inNoLists != _inAllListsA); + vm.assume(_inNoLists != _inAllListsB); + + // Assume that there are no duplicates in any of the other values either. + vm.assume(_inFirstListOnly != _inAllListsA); + vm.assume(_inFirstListOnly != _inAllListsB); + + vm.assume(_inSecondListOnly != _inAllListsA); + vm.assume(_inSecondListOnly != _inAllListsB); + + vm.assume(_inSecondListOnly != _inFirstListOnly); + } + + function createLists( + uint256 _inNoLists, + uint256 _inFirstListOnly, + uint256 _inSecondListOnly, + uint256 _inAllListsA, + uint256 _inAllListsB + ) public returns (uint256 firstList_, uint256 secondList_, uint256 emptyList_) { + assumeFuzzParameters(_inNoLists, _inFirstListOnly, _inSecondListOnly, _inAllListsA, _inAllListsB); + + uint256[] memory firstListItems = makeArray(_inFirstListOnly, _inAllListsA, _inAllListsB); + uint256[] memory secondListItems = makeArray(_inSecondListOnly, _inAllListsA, _inAllListsB); + + firstList_ = registry.createList(bob, uint8(UpdateType.None), firstListItems); + secondList_ = registry.createList(bob, uint8(UpdateType.None), secondListItems); + emptyList_ = registry.createList(bob, uint8(UpdateType.None), new uint256[](0)); + } + + function testIsInAllLists( + uint256 _inNoLists, + uint256 _inFirstListOnly, + uint256 _inSecondListOnly, + uint256 _inAllListsA, + uint256 _inAllListsB + ) public { + (uint256 firstList, uint256 secondList, uint256 emptyList) = + createLists(_inNoLists, _inFirstListOnly, _inSecondListOnly, _inAllListsA, _inAllListsB); + + assertFalse(registry.isInAllLists(makeArray(firstList, secondList), _inNoLists)); + assertFalse(registry.isInAllLists(makeArray(firstList, secondList), _inFirstListOnly)); + assertFalse(registry.isInAllLists(makeArray(firstList, secondList, emptyList), _inAllListsA)); + assertTrue(registry.isInAllLists(makeArray(firstList, secondList), _inAllListsB)); + } + + function testIsInSomeOfLists( + uint256 _inNoLists, + uint256 _inFirstListOnly, + uint256 _inSecondListOnly, + uint256 _inAllListsA, + uint256 _inAllListsB + ) public { + (uint256 firstList, uint256 secondList, uint256 emptyList) = + createLists(_inNoLists, _inFirstListOnly, _inSecondListOnly, _inAllListsA, _inAllListsB); + + assertFalse(registry.isInSomeOfLists(makeArray(firstList, secondList, emptyList), _inNoLists)); + assertTrue(registry.isInSomeOfLists(makeArray(firstList, secondList, emptyList), _inFirstListOnly)); + assertTrue(registry.isInSomeOfLists(makeArray(firstList, secondList, emptyList), _inAllListsA)); + } + + function testAreAllInList( + uint256 _inNoLists, + uint256 _inFirstListOnly, + uint256 _inSecondListOnly, + uint256 _inAllListsA, + uint256 _inAllListsB + ) public { + (uint256 firstList, uint256 secondList, uint256 emptyList) = + createLists(_inNoLists, _inFirstListOnly, _inSecondListOnly, _inAllListsA, _inAllListsB); + + assertFalse(registry.areAllInList(firstList, makeArray(_inFirstListOnly, _inAllListsA, _inNoLists))); + assertFalse(registry.areAllInList(emptyList, makeArray(_inAllListsA))); + assertTrue(registry.areAllInList(firstList, makeArray(_inFirstListOnly, _inAllListsA))); + assertTrue(registry.areAllInList(secondList, makeArray(_inSecondListOnly, _inAllListsA, _inAllListsB))); + } + + function testAreAllNotInList( + uint256 _inNoLists, + uint256 _inFirstListOnly, + uint256 _inSecondListOnly, + uint256 _inAllListsA, + uint256 _inAllListsB + ) public { + (uint256 firstList, uint256 secondList, uint256 emptyList) = + createLists(_inNoLists, _inFirstListOnly, _inSecondListOnly, _inAllListsA, _inAllListsB); + + assertFalse(registry.areAllNotInList(firstList, makeArray(_inNoLists, _inAllListsA))); + assertTrue(registry.areAllNotInList(secondList, makeArray(_inNoLists, _inFirstListOnly))); + assertTrue(registry.areAllNotInList(emptyList, makeArray(_inAllListsA))); + } + + function testAreAllInAllLists( + uint256 _inNoLists, + uint256 _inFirstListOnly, + uint256 _inSecondListOnly, + uint256 _inAllListsA, + uint256 _inAllListsB + ) public { + (uint256 firstList, uint256 secondList, uint256 emptyList) = + createLists(_inNoLists, _inFirstListOnly, _inSecondListOnly, _inAllListsA, _inAllListsB); + + assertFalse( + registry.areAllInAllLists(makeArray(firstList, secondList), makeArray(_inAllListsA, _inFirstListOnly)) + ); + assertFalse(registry.areAllInAllLists(makeArray(firstList, emptyList), makeArray(_inAllListsB))); + assertTrue(registry.areAllInAllLists(makeArray(firstList, secondList), makeArray(_inAllListsA, _inAllListsB))); + } + + function testAreAllInSomeOfLists( + uint256 _inNoLists, + uint256 _inFirstListOnly, + uint256 _inSecondListOnly, + uint256 _inAllListsA, + uint256 _inAllListsB + ) public { + (uint256 firstList, uint256 secondList, uint256 emptyList) = + createLists(_inNoLists, _inFirstListOnly, _inSecondListOnly, _inAllListsA, _inAllListsB); + + assertFalse( + registry.areAllInSomeOfLists( + makeArray(firstList, secondList, emptyList), makeArray(_inFirstListOnly, _inSecondListOnly, _inNoLists) + ) + ); + assertTrue( + registry.areAllInSomeOfLists( + makeArray(firstList, secondList, emptyList), makeArray(_inFirstListOnly, _inSecondListOnly) + ) + ); + } + + function testAreAllNotInAnyOfLists( + uint256 _inNoLists, + uint256 _inFirstListOnly, + uint256 _inSecondListOnly, + uint256 _inAllListsA, + uint256 _inAllListsB + ) public { + (uint256 firstList, uint256 secondList, uint256 emptyList) = + createLists(_inNoLists, _inFirstListOnly, _inSecondListOnly, _inAllListsA, _inAllListsB); + + assertFalse( + registry.areAllNotInAnyOfLists(makeArray(firstList, secondList), makeArray(_inSecondListOnly, _inNoLists)) + ); + assertTrue( + registry.areAllNotInAnyOfLists(makeArray(firstList, emptyList), makeArray(_inSecondListOnly, _inNoLists)) + ); + } +} diff --git a/tests/tests/fees/performance/PerformanceFeeIntegration.t.sol b/tests/tests/fees/performance/PerformanceFeeIntegration.t.sol new file mode 100644 index 000000000..1ece8edd5 --- /dev/null +++ b/tests/tests/fees/performance/PerformanceFeeIntegration.t.sol @@ -0,0 +1,83 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity 0.8.17; + +import {IntegrationTest} from "tests/bases/IntegrationTest.sol"; +import {PerformanceFeeUtils} from "tests/utils/fees/PerformanceFeeUtils.sol"; + +import {IERC20} from "tests/interfaces/external/IERC20.sol"; +import {IComptroller} from "tests/interfaces/internal/IComptroller.sol"; +import {IPerformanceFee} from "tests/interfaces/internal/IPerformanceFee.sol"; +import {IVault} from "tests/interfaces/internal/IVault.sol"; + +contract PerformanceFeeTest is IntegrationTest, PerformanceFeeUtils { + IPerformanceFee internal performanceFee; + + function setUp() public override { + super.setUp(); + + performanceFee = deployPerformanceFee(core.release.feeManager); + } + + function test_integration() public { + address vaultOwner = makeAddr("VaultOwner"); + address feeRecipient = makeAddr("FeeRecipient"); + address sharesBuyer = makeAddr("SharesBuyer"); + + IERC20 denominationAsset = nonStandardPrimitive; + uint8 denominationAssetDecimals = denominationAsset.decimals(); + uint256 denominationAssetUnit = 10 ** denominationAssetDecimals; + + uint256 feeRate = 1_000; // 10% + + address[] memory fees = new address[](1); + fees[0] = address(performanceFee); + + bytes[] memory settings = new bytes[](1); + settings[0] = abi.encode(feeRate, feeRecipient); + + bytes memory feeManagerConfigData = abi.encode(fees, settings); + + (IComptroller comptrollerProxy, IVault vaultProxy) = createVault({ + _fundDeployer: core.release.fundDeployer, + _vaultOwner: vaultOwner, + _denominationAsset: address(denominationAsset), + _sharesActionTimelock: 0, + _feeManagerConfigData: feeManagerConfigData, + _policyManagerConfigData: "" + }); + IERC20 sharesToken = IERC20(address(vaultProxy)); + + // buy shares + uint256 depositAmount = denominationAssetUnit * 5; + buyShares({_sharesBuyer: sharesBuyer, _comptrollerProxy: comptrollerProxy, _amountToDeposit: depositAmount}); + + uint256 depositorInitialSharesBal = sharesToken.balanceOf(sharesBuyer); + + // redeem some shares; no performance paid out + redeemSharesInKind({ + _redeemer: sharesBuyer, + _comptrollerProxy: comptrollerProxy, + _sharesQuantity: depositorInitialSharesBal / 3 + }); + + // bump performance by sending denom asset to vault + uint256 performanceBumpPercent = ONE_PERCENT * 20; + deal( + address(denominationAsset), + address(vaultProxy), + (depositAmount * performanceBumpPercent) / ONE_HUNDRED_PERCENT + ); + + // redeem some more shares + redeemSharesInKind({ + _redeemer: sharesBuyer, + _comptrollerProxy: comptrollerProxy, + _sharesQuantity: depositorInitialSharesBal / 3 + }); + + // validate fee payout + // assertGt(sharesToken.balanceOf(feeRecipient), 0); + + // TODO: IMPROVE TEST CASE; stack-too-deep, more assertions, fuzz? + } +} diff --git a/tests/tests/fees/performance/PerformanceFeeUnit.t.sol b/tests/tests/fees/performance/PerformanceFeeUnit.t.sol new file mode 100644 index 000000000..69fca2ca9 --- /dev/null +++ b/tests/tests/fees/performance/PerformanceFeeUnit.t.sol @@ -0,0 +1,116 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity 0.8.17; + +import {IERC20} from "@openzeppelin/contractsV4/token/ERC20/IERC20.sol"; +import {Address} from "@openzeppelin/contractsV4/utils/Address.sol"; +import {UnitTest} from "tests/bases/UnitTest.sol"; +import {FeeHook} from "tests/utils/fees/FeeUtils.sol"; +import {PerformanceFeeUtils} from "tests/utils/fees/PerformanceFeeUtils.sol"; + +import {IComptroller} from "tests/interfaces/internal/IComptroller.sol"; +import {IFeeManager} from "tests/interfaces/internal/IFeeManager.sol"; +import {IPerformanceFee} from "tests/interfaces/internal/IPerformanceFee.sol"; + +contract PerformanceFeeTest is UnitTest, PerformanceFeeUtils { + using Address for address; + + event ActivatedForFund(address indexed comptrollerProxy, uint256 highWaterMark); + event FundSettingsAdded(address indexed comptrollerProxy, uint256 rate); + + IPerformanceFee internal performanceFee; + address internal feeManager = makeAddr("FeeManager"); + + function setUp() public { + performanceFee = deployPerformanceFee({_feeManager: IFeeManager(feeManager)}); + } + + function test_activateForFund_success(uint256 _grossShareValue) public { + address _comptrollerProxy = makeAddr("ComptrollerProxy"); + + // ComptrollerProxy.calcGrossShareValue() = grossShareValue + vm.mockCall({ + callee: _comptrollerProxy, + data: abi.encodeWithSelector(IComptroller.calcGrossShareValue.selector), + returnData: abi.encode(_grossShareValue) + }); + + expectEmit(address(performanceFee)); + emit ActivatedForFund(_comptrollerProxy, _grossShareValue); + + vm.prank(feeManager); + performanceFee.activateForFund(_comptrollerProxy, address(0)); + + assertEq(performanceFee.getFeeInfoForFund(_comptrollerProxy).highWaterMark, _grossShareValue); + } + + function test_addFundSettings_failsWithRateOfZero() public { + vm.expectRevert("addFundSettings: feeRate must be greater than 0"); + vm.prank(feeManager); + performanceFee.addFundSettings(address(0), abi.encode(0, address(0))); + } + + function test_addFundSettings_failsWithRateOverOneHundredPercent() public { + vm.expectRevert("addFundSettings: feeRate max exceeded"); + vm.prank(feeManager); + performanceFee.addFundSettings(address(0), abi.encode(ONE_HUNDRED_PERCENT + 1, address(0))); + } + + function test_addFundSettings_success(uint256 _feeRate) public { + address feeRecipient = makeAddr("FeeRecipient"); + address comptrollerProxy = makeAddr("ComptrollerProxy"); + + _feeRate = bound(_feeRate, 1, ONE_HUNDRED_PERCENT); + + expectEmit(address(performanceFee)); + emit FundSettingsAdded(comptrollerProxy, _feeRate); + + vm.prank(feeManager); + performanceFee.addFundSettings(comptrollerProxy, abi.encode(_feeRate, feeRecipient)); + + assertEq(performanceFee.getFeeInfoForFund(comptrollerProxy).rate, _feeRate); + } + + function test_settlesOnHook() public { + for (uint256 i; i < uint256(type(FeeHook).max); i++) { + bytes memory returnData = address(performanceFee).functionStaticCall( + abi.encodeWithSelector(performanceFee.settlesOnHook.selector, i) + ); + + (bool updates, bool usesGav) = abi.decode(returnData, (bool, bool)); + + // Only these hooks are used, and all use GAV + if ( + i == uint256(FeeHook.PreBuyShares) || i == uint256(FeeHook.PreRedeemShares) + || i == uint256(FeeHook.Continuous) + ) { + assertTrue(updates); + assertTrue(usesGav); + } else { + assertFalse(updates); + assertFalse(usesGav); + } + } + } + + function test_updatesOnHook() public { + for (uint256 i; i < uint256(type(FeeHook).max); i++) { + bytes memory returnData = address(performanceFee).functionStaticCall( + abi.encodeWithSelector(performanceFee.updatesOnHook.selector, i) + ); + + (bool updates, bool usesGav) = abi.decode(returnData, (bool, bool)); + + // Only these hooks are used, and all use GAV + if ( + i == uint256(FeeHook.PostBuyShares) || i == uint256(FeeHook.PreRedeemShares) + || i == uint256(FeeHook.Continuous) + ) { + assertTrue(updates); + assertTrue(usesGav); + } else { + assertFalse(updates); + assertFalse(usesGav); + } + } + } +} diff --git a/tests/tests/infrastracture/ValueInterpreter.t.sol b/tests/tests/infrastracture/ValueInterpreter.t.sol new file mode 100644 index 000000000..1882ae277 --- /dev/null +++ b/tests/tests/infrastracture/ValueInterpreter.t.sol @@ -0,0 +1,109 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity 0.8.17; + +import {IntegrationTest} from "tests/bases/IntegrationTest.sol"; +import {IComptroller} from "tests/interfaces/internal/IComptroller.sol"; +import {IVault} from "tests/interfaces/internal/IVault.sol"; +import {IERC20} from "tests/interfaces/external/IERC20.sol"; +import {ChainlinkRateAsset} from "tests/utils/core/AssetUniverseUtils.sol"; + +contract ValueInterpreterTest is IntegrationTest { + function test_wethPrice(address _quoteAsset, uint256 _result) internal { + uint256 value = core.release.valueInterpreter.calcCanonicalAssetValue({ + _baseAsset: address(core.config.wethToken), + _amount: 1 ether, + _quoteAsset: _quoteAsset + }); + + assert(value == _result); + } + + function getInverseValue(address _baseAsset, address _quoteAsset, uint256 _baseAssetAmount) + internal + returns (uint256) + { + uint256 value = core.release.valueInterpreter.calcCanonicalAssetValue({ + _baseAsset: _baseAsset, + _amount: _baseAssetAmount, + _quoteAsset: _quoteAsset + }); + + uint256 inverseValue = core.release.valueInterpreter.calcCanonicalAssetValue({ + _baseAsset: _quoteAsset, + _amount: value, + _quoteAsset: _baseAsset + }); + + return inverseValue; + } +} + +contract ValueInterpreterTestEthereum is ValueInterpreterTest { + address internal constant DAI = 0x6B175474E89094C44Da98b954EedeAC495271d0F; + address internal constant DAI_AGGREGATOR = 0x773616E4d11A78F511299002da57A0a94577F1f4; + + function setUp() public override { + setUpMainnetEnvironment(16733210); + addPrimitive({ + _valueInterpreter: core.release.valueInterpreter, + _token: address(core.config.wethToken), + _aggregator: core.config.ethUsdAggregator, + _rateAsset: ChainlinkRateAsset.USD + }); + + addPrimitive({ + _valueInterpreter: core.release.valueInterpreter, + _token: DAI, + _aggregator: DAI_AGGREGATOR, + _rateAsset: ChainlinkRateAsset.ETH + }); + } + + function test_wethPrice() public { + test_wethPrice(DAI, 1647056889690851868858); // 1647.056889690852 DAI + } + + function test_InverseValuesAreEqual(uint256 _wethAmount) public { + _wethAmount = bound(_wethAmount, 10, 10_000_000 ether); + + uint256 inverseValue = getInverseValue(address(core.config.wethToken), DAI, _wethAmount); + + // allow rounding error of 1 wei + assert(_wethAmount - inverseValue <= 1); + } +} + +contract ValueInterpreterTestPolygon is ValueInterpreterTest { + address internal constant DAI = 0x8f3Cf7ad23Cd3CaDbD9735AFf958023239c6A063; + address internal constant DAI_AGGREGATOR = 0x4746DeC9e833A82EC7C2C1356372CcF2cfcD2F3D; + + function setUp() public override { + setUpPolygonEnvironment(39841068); + addPrimitive({ + _valueInterpreter: core.release.valueInterpreter, + _token: address(core.config.wethToken), + _aggregator: core.config.ethUsdAggregator, + _rateAsset: ChainlinkRateAsset.USD + }); + + addPrimitive({ + _valueInterpreter: core.release.valueInterpreter, + _token: DAI, + _aggregator: DAI_AGGREGATOR, + _rateAsset: ChainlinkRateAsset.USD + }); + } + + function test_wethPrice() public { + test_wethPrice(DAI, 1656907072121636490947); // 1647.056889690852 DAI + } + + function test_InverseValuesAreEqual(uint256 _wethAmount) public { + _wethAmount = bound(_wethAmount, 10, 10_000_000 ether); + + uint256 inverseValue = getInverseValue(address(core.config.wethToken), DAI, _wethAmount); + + // allow rounding error of 1 wei + assert(_wethAmount - inverseValue <= 1); + } +} diff --git a/tests/tests/policies/CumulativeSlippageTolerancePolicy.t.sol b/tests/tests/policies/CumulativeSlippageTolerancePolicy.t.sol new file mode 100644 index 000000000..d023f6e36 --- /dev/null +++ b/tests/tests/policies/CumulativeSlippageTolerancePolicy.t.sol @@ -0,0 +1,438 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity 0.8.17; + +import {IntegrationTest} from "tests/bases/IntegrationTest.sol"; +import {MockedAdapter, SpendAssetsHandleType} from "tests/utils/core/AdapterUtils.sol"; +import {TestAggregator} from "tests/utils/core/AssetUniverseUtils.sol"; +import {UpdateType} from "tests/utils/core/ListRegistryUtils.sol"; +import {CumulativeSlippageTolerancePolicyUtils} from "tests/utils/policies/CumulativeSlippageTolerancePolicyUtils.sol"; + +import {IERC20} from "tests/interfaces/external/IERC20.sol"; +import {IComptroller} from "tests/interfaces/internal/IComptroller.sol"; +import {ICumulativeSlippageTolerancePolicy} from "tests/interfaces/internal/ICumulativeSlippageTolerancePolicy.sol"; +import {IVault} from "tests/interfaces/internal/IVault.sol"; + +contract CumulativeSlippageTolerancePolicyTest is IntegrationTest, CumulativeSlippageTolerancePolicyUtils { + uint256 private constant ONE_HUNDRED_PERCENT_FOR_POLICY = 1 ether; // 10 ** 18 + bytes private constant ERROR_MESSAGE_FOR_POLICY = "Rule evaluated to false: CUMULATIVE_SLIPPAGE_TOLERANCE"; + // keccak256(abi.encodePacked("mln.vaultCall.any") + bytes32 private constant ANY_VAULT_CALL = 0x5bf1898dd28c4d29f33c4c1bb9b8a7e2f6322847d70be63e8f89de024d08a669; + + address internal vaultOwner = makeAddr("VaultOwner"); + address internal sharesBuyer = makeAddr("SharesBuyer"); + + IVault internal vaultProxy; + IComptroller internal comptrollerProxy; + ICumulativeSlippageTolerancePolicy internal cumulativeSlippageTolerancePolicy; + MockedAdapter internal mockedAdapter; + IERC20 internal fakeToken0; + IERC20 internal fakeToken1; + uint256 internal vaultInitialBalance = 1 ether; + TestAggregator internal fakeToken0Aggregator; + TestAggregator internal fakeToken1Aggregator; + + function setUp() public override { + super.setUp(); + + mockedAdapter = deployMockedAdapter(); + + fakeToken0 = createTestToken(18, "Fake Token 0", "FK0"); + + fakeToken0Aggregator = TestAggregator(address(createTestAggregator(1 ether))); + + addPrimitive({ + _valueInterpreter: core.release.valueInterpreter, + _token: address(fakeToken0), + _aggregator: address(fakeToken0Aggregator) + }); + + fakeToken1 = createTestToken(18, "Fake Token 1", "FK1"); + + fakeToken1Aggregator = TestAggregator(address(createTestAggregator(1 ether))); + + addPrimitive({ + _valueInterpreter: core.release.valueInterpreter, + _token: address(fakeToken1), + _aggregator: address(fakeToken1Aggregator) + }); + } + + function createVaultWithPolicy( + uint64 _tolerance, + uint256 _pricelessAssetBypassTimelock, + uint256 _pricelessAssetBypassTimeLimit, + uint256 _tolerancePeriodDuration, + address[] memory _bypassableAdaptersListItems + ) internal { + // TODO: Create address list utils. + uint256 bypassableAdaptersListId = core.persistent.addressListRegistry.createList({ + _owner: vaultOwner, + _initialItems: _bypassableAdaptersListItems, + _updateType: uint8(UpdateType.AddAndRemove) + }); + + cumulativeSlippageTolerancePolicy = deployCumulativeSlippageTolerancePolicy({ + _wethToken: wethToken, + _policyManager: core.release.policyManager, + _addressListRegistry: core.persistent.addressListRegistry, + _valueInterpreter: core.release.valueInterpreter, + _bypassableAdaptersListId: bypassableAdaptersListId, + _tolerancePeriodDuration: _tolerancePeriodDuration, + _pricelessAssetBypassTimelock: _pricelessAssetBypassTimelock, + _pricelessAssetBypassTimeLimit: _pricelessAssetBypassTimeLimit + }); + + address[] memory policies = new address[](1); + policies[0] = address(cumulativeSlippageTolerancePolicy); + + bytes[] memory settingsData = new bytes[](1); + settingsData[0] = encodeCumulativeSlippageTolerancePolicySettings({_tolerance: _tolerance}); + + (comptrollerProxy, vaultProxy) = createVaultAndBuyShares({ + _fundDeployer: core.release.fundDeployer, + _vaultOwner: vaultOwner, + _sharesBuyer: sharesBuyer, + _denominationAsset: address(fakeToken0), + _amountToDeposit: vaultInitialBalance, + _sharesActionTimelock: 0, + _policyManagerConfigData: encodePolicyManagerConfigData(policies, settingsData), + _feeManagerConfigData: "" + }); + } + + function test_ConsecutiveCalls(uint64 _tolerance, uint256 _spendAssetAmount, uint256 _callsNumber) public { + _callsNumber = bound(_callsNumber, 1, 10); + _spendAssetAmount = bound(_spendAssetAmount, _callsNumber, (vaultInitialBalance / _callsNumber)); + _tolerance = + uint64(bound(_tolerance, ONE_HUNDRED_PERCENT_FOR_POLICY / 1000, ONE_HUNDRED_PERCENT_FOR_POLICY - 1)); // 0.1% - 99.99...% + + createVaultWithPolicy({ + _tolerance: _tolerance, + _tolerancePeriodDuration: 1 days, + _pricelessAssetBypassTimelock: 0, + _pricelessAssetBypassTimeLimit: 0, + _bypassableAdaptersListItems: new address[](0) + }); + + uint256 minIncomingAssetAmount = amountWithSlippage(_spendAssetAmount, _tolerance / _callsNumber) + 1; + + bytes memory callArgs = getEncodedAdapterCallArgs({ + _spendAssetAmount: _spendAssetAmount, + _minIncomingAssetAmount: minIncomingAssetAmount + }); + + for (uint256 i = 0; i < _callsNumber; ++i) { + callOnIntegration({ + _integrationManager: core.release.integrationManager, + _comptrollerProxy: comptrollerProxy, + _caller: vaultOwner, + _callArgs: callArgs + }); + } + } + + function test_RevertLastCallConsecutiveCalls(uint64 _tolerance, uint256 _spendAssetAmount, uint256 _callsNumber) + public + { + _callsNumber = bound(_callsNumber, 1, 10); + _spendAssetAmount = bound(_spendAssetAmount, 10000 * _callsNumber, (vaultInitialBalance / _callsNumber)); + _tolerance = + uint64(bound(_tolerance, ONE_HUNDRED_PERCENT_FOR_POLICY / 1000, ONE_HUNDRED_PERCENT_FOR_POLICY - 1)); // 0.1% - 99.99...% + + createVaultWithPolicy({ + _tolerance: _tolerance, + _tolerancePeriodDuration: 1 days, + _pricelessAssetBypassTimelock: 0, + _pricelessAssetBypassTimeLimit: 0, + _bypassableAdaptersListItems: new address[](0) + }); + + uint256 minIncomingAssetAmount = amountWithSlippage(_spendAssetAmount, _tolerance / _callsNumber); + + bytes memory callArgs = getEncodedAdapterCallArgs({ + _spendAssetAmount: _spendAssetAmount, + _minIncomingAssetAmount: minIncomingAssetAmount + }); + + for (uint256 i = 0; i < _callsNumber - 1; ++i) { + callOnIntegration({ + _integrationManager: core.release.integrationManager, + _comptrollerProxy: comptrollerProxy, + _caller: vaultOwner, + _callArgs: callArgs + }); + } + + bytes memory lastCallArgs = getEncodedAdapterCallArgs({ + _spendAssetAmount: _spendAssetAmount, + _minIncomingAssetAmount: minIncomingAssetAmount - 1 + }); + + vm.expectRevert(ERROR_MESSAGE_FOR_POLICY); + + callOnIntegration({ + _integrationManager: core.release.integrationManager, + _comptrollerProxy: comptrollerProxy, + _caller: vaultOwner, + _callArgs: lastCallArgs + }); + } + + function test_CallsTolerancePeriod( + uint256 _tolerancePeriodDuration, + uint64 _tolerance, + uint256 _spendAssetAmount, + uint256 _callsNumber + ) public { + _callsNumber = bound(_callsNumber, 1, 10); + _spendAssetAmount = bound(_spendAssetAmount, _callsNumber, (vaultInitialBalance / (_callsNumber + 1))); + _tolerance = + uint64(bound(_tolerance, ONE_HUNDRED_PERCENT_FOR_POLICY / 1000, ONE_HUNDRED_PERCENT_FOR_POLICY - 1)); // 0.1% - 99.99...% + _tolerancePeriodDuration = bound(_tolerancePeriodDuration, _callsNumber * 10000, (52 weeks) * 3); + + createVaultWithPolicy({ + _tolerance: _tolerance, + _tolerancePeriodDuration: _tolerancePeriodDuration, + _pricelessAssetBypassTimelock: 0, + _pricelessAssetBypassTimeLimit: 0, + _bypassableAdaptersListItems: new address[](0) + }); + + callOnIntegration({ + _integrationManager: core.release.integrationManager, + _comptrollerProxy: comptrollerProxy, + _caller: vaultOwner, + _callArgs: getEncodedAdapterCallArgs({ + _spendAssetAmount: _spendAssetAmount, + _minIncomingAssetAmount: amountWithSlippage(_spendAssetAmount, _tolerance) + 1 + }) + }); + + uint256 minIncomingAssetAmount = amountWithSlippage(_spendAssetAmount, _tolerance / _callsNumber) + 1; + + for (uint256 i = 0; i < _callsNumber; ++i) { + skip((_tolerancePeriodDuration / _callsNumber) + 1); + + callOnIntegration({ + _integrationManager: core.release.integrationManager, + _comptrollerProxy: comptrollerProxy, + _caller: vaultOwner, + _callArgs: getEncodedAdapterCallArgs({ + _spendAssetAmount: _spendAssetAmount, + _minIncomingAssetAmount: minIncomingAssetAmount + }) + }); + } + } + + function test_RevertLastCallCallsTolerancePeriod( + uint256 _tolerancePeriodDuration, + uint64 _tolerance, + uint256 _spendAssetAmount, + uint256 _callsNumber + ) public { + _callsNumber = bound(_callsNumber, 1, 10); + _spendAssetAmount = bound(_spendAssetAmount, _callsNumber * 100, (vaultInitialBalance / (_callsNumber + 1))); + _tolerance = + uint64(bound(_tolerance, ONE_HUNDRED_PERCENT_FOR_POLICY / 1000, ONE_HUNDRED_PERCENT_FOR_POLICY - 1)); // 0.1% - 99.99...% + _tolerancePeriodDuration = bound(_tolerancePeriodDuration, _callsNumber * 10000, (52 weeks) * 3); + + createVaultWithPolicy({ + _tolerance: _tolerance, + _tolerancePeriodDuration: _tolerancePeriodDuration, + _pricelessAssetBypassTimelock: 0, + _pricelessAssetBypassTimeLimit: 0, + _bypassableAdaptersListItems: new address[](0) + }); + + callOnIntegration({ + _integrationManager: core.release.integrationManager, + _comptrollerProxy: comptrollerProxy, + _caller: vaultOwner, + _callArgs: getEncodedAdapterCallArgs({ + _spendAssetAmount: _spendAssetAmount, + _minIncomingAssetAmount: amountWithSlippage(_spendAssetAmount, _tolerance) + 1 + }) + }); + + uint256 minIncomingAssetAmount = amountWithSlippage(_spendAssetAmount, _tolerance / _callsNumber) + 1; + + for (uint256 i = 0; i < _callsNumber - 1; ++i) { + skip((_tolerancePeriodDuration / _callsNumber) + 1); + + callOnIntegration({ + _integrationManager: core.release.integrationManager, + _comptrollerProxy: comptrollerProxy, + _caller: vaultOwner, + _callArgs: getEncodedAdapterCallArgs({ + _spendAssetAmount: _spendAssetAmount, + _minIncomingAssetAmount: minIncomingAssetAmount + }) + }); + } + + skip((_tolerancePeriodDuration / _callsNumber) - _callsNumber - 1); + + uint256 lastCallMinIncomingAssetAmount; + + if (_callsNumber == 1) { + lastCallMinIncomingAssetAmount = minIncomingAssetAmount - _callsNumber; + } else { + lastCallMinIncomingAssetAmount = minIncomingAssetAmount - _callsNumber - 1; + } + + bytes memory lastCallArgs = getEncodedAdapterCallArgs({ + _spendAssetAmount: _spendAssetAmount, + _minIncomingAssetAmount: lastCallMinIncomingAssetAmount + }); + + vm.expectRevert(ERROR_MESSAGE_FOR_POLICY); + + callOnIntegration({ + _integrationManager: core.release.integrationManager, + _comptrollerProxy: comptrollerProxy, + _caller: vaultOwner, + _callArgs: lastCallArgs + }); + } + + function test_SkipCheckForBypassableAdaptersList() public { + address[] memory bypassableAdaptersListItems = new address[](1); + bypassableAdaptersListItems[0] = address(mockedAdapter); + + createVaultWithPolicy({ + _tolerance: uint64((ONE_HUNDRED_PERCENT_FOR_POLICY * 3) / 100), // 3% + _tolerancePeriodDuration: 1 days, + _pricelessAssetBypassTimelock: 0, + _pricelessAssetBypassTimeLimit: 0, + _bypassableAdaptersListItems: bypassableAdaptersListItems + }); + + callOnIntegration({ + _integrationManager: core.release.integrationManager, + _comptrollerProxy: comptrollerProxy, + _caller: vaultOwner, + _callArgs: getEncodedAdapterCallArgs({ + _spendAssetAmount: vaultInitialBalance, + _minIncomingAssetAmount: amountWithSlippage(vaultInitialBalance, (4 * ONE_HUNDRED_PERCENT_FOR_POLICY) / 100) // 4% + }) + }); + } + + function test_PricelessAssetsInNotTakenIntoAccount() public { + createVaultWithPolicy({ + _tolerance: uint64((ONE_HUNDRED_PERCENT_FOR_POLICY * 3) / 100), // 3% + _tolerancePeriodDuration: 1 days, + _pricelessAssetBypassTimelock: 0, // start immediately + _pricelessAssetBypassTimeLimit: 1 days, + _bypassableAdaptersListItems: new address[](0) + }); + + fakeToken0Aggregator.setPrice(0); + registerVaultCallStartAssetBypassTimelock(); + + vm.prank(vaultOwner); + + comptrollerProxy.vaultCallOnContract({ + _contract: address(cumulativeSlippageTolerancePolicy), + _selector: ICumulativeSlippageTolerancePolicy.startAssetBypassTimelock.selector, + _encodedArgs: abi.encode(fakeToken0) + }); + + callOnIntegration({ + _integrationManager: core.release.integrationManager, + _comptrollerProxy: comptrollerProxy, + _caller: vaultOwner, + _callArgs: getEncodedAdapterCallArgs({ + _spendAssetAmount: vaultInitialBalance, + _minIncomingAssetAmount: amountWithSlippage(vaultInitialBalance, (4 * ONE_HUNDRED_PERCENT_FOR_POLICY) / 100) // 4% + }) + }); + } + + function test_RevertPricelessAssetsOutNotTakenIntoAccount() public { + createVaultWithPolicy({ + _tolerance: uint64((ONE_HUNDRED_PERCENT_FOR_POLICY * 3) / 100), // 3% + _tolerancePeriodDuration: 1 days, + _pricelessAssetBypassTimelock: 0, // start immediately + _pricelessAssetBypassTimeLimit: 1 days, + _bypassableAdaptersListItems: new address[](0) + }); + + fakeToken1Aggregator.setPrice(0); + + registerVaultCallStartAssetBypassTimelock(); + + vm.prank(vaultOwner); + + comptrollerProxy.vaultCallOnContract({ + _contract: address(cumulativeSlippageTolerancePolicy), + _selector: ICumulativeSlippageTolerancePolicy.startAssetBypassTimelock.selector, + _encodedArgs: abi.encode(fakeToken1) + }); + + bytes memory callArgs = getEncodedAdapterCallArgs({ + _spendAssetAmount: vaultInitialBalance, + _minIncomingAssetAmount: amountWithSlippage(vaultInitialBalance, (1 * ONE_HUNDRED_PERCENT_FOR_POLICY) / 100) // 1% + }); + + vm.expectRevert(ERROR_MESSAGE_FOR_POLICY); + + callOnIntegration({ + _integrationManager: core.release.integrationManager, + _comptrollerProxy: comptrollerProxy, + _caller: vaultOwner, + _callArgs: callArgs + }); + } + + function registerVaultCallStartAssetBypassTimelock() internal { + address[] memory contracts = new address[](1); + contracts[0] = address(cumulativeSlippageTolerancePolicy); + + bytes4[] memory selectors = new bytes4[](1); + selectors[0] = ICumulativeSlippageTolerancePolicy.startAssetBypassTimelock.selector; + + bytes32[] memory dataHashes = new bytes32[](1); + dataHashes[0] = ANY_VAULT_CALL; + + registerVaultCalls({ + _fundDeployer: core.release.fundDeployer, + _contracts: contracts, + _selectors: selectors, + _dataHashes: dataHashes + }); + } + + function amountWithSlippage(uint256 _amount, uint256 _slippage) internal pure returns (uint256) { + return (_amount * (ONE_HUNDRED_PERCENT_FOR_POLICY - _slippage)) / ONE_HUNDRED_PERCENT_FOR_POLICY; + } + + function getEncodedAdapterCallArgs(uint256 _spendAssetAmount, uint256 _minIncomingAssetAmount) + internal + view + returns (bytes memory) + { + address[] memory spendAssets = new address[](1); + spendAssets[0] = address(fakeToken0); + + address[] memory incomingAssets = new address[](1); + incomingAssets[0] = address(fakeToken1); + + uint256[] memory spendAssetAmounts = new uint256[](1); + spendAssetAmounts[0] = _spendAssetAmount; + + uint256[] memory minIncomingAssetAmounts = new uint256[](1); + minIncomingAssetAmounts[0] = _minIncomingAssetAmount; + + bytes memory integrationData = mockedAdapter.encodeAssetsForAction({ + _spendAssetsHandleType: SpendAssetsHandleType.Transfer, + _spendAssets: spendAssets, + _spendAssetAmounts: spendAssetAmounts, + _incomingAssets: incomingAssets, + _minIncomingAssetAmounts: minIncomingAssetAmounts + }); + + return abi.encode(address(mockedAdapter), MockedAdapter.action.selector, integrationData); + } +} diff --git a/tests/tests/protocols/aave/AaveV2Adapter.t.sol b/tests/tests/protocols/aave/AaveV2Adapter.t.sol new file mode 100644 index 000000000..eda68688e --- /dev/null +++ b/tests/tests/protocols/aave/AaveV2Adapter.t.sol @@ -0,0 +1,89 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity 0.8.17; + +import {IntegrationTest} from "tests/bases/IntegrationTest.sol"; +import { + AaveV2Utils, + LENDING_POOL_ADDRESS_ETHEREUM, + LENDING_POOL_ADDRESS_POLYGON, + LENDING_POOL_ADDRESS_PROVIDER_ADDRESS_ETHEREUM, + LENDING_POOL_ADDRESS_PROVIDER_ADDRESS_POLYGON +} from "tests/utils/protocols/aave/AaveV2Utils.sol"; + +import {IERC20} from "tests/interfaces/external/IERC20.sol"; +import {IAaveV2Adapter} from "tests/interfaces/internal/IAaveV2Adapter.sol"; +import {IComptroller} from "tests/interfaces/internal/IComptroller.sol"; +import {IVault} from "tests/interfaces/internal/IVault.sol"; + +abstract contract AaveV2AdapterTest is IntegrationTest, AaveV2Utils { + address internal vaultOwner = makeAddr("VaultOwner"); + address internal sharesBuyer = makeAddr("SharesBuyer"); + + IVault internal vaultProxy; + IComptroller internal comptrollerProxy; + address internal externalPositionProxy; + address internal aWeth; + + IAaveV2Adapter internal aaveV2Adapter; + address internal lendingPool; + address internal lendingPoolAddressProvider; + + function setUpAave() internal { + (aaveV2Adapter,) = deployAaveV2ATokenListOwnerAndAdapter({ + _addressListRegistry: core.persistent.addressListRegistry, + _integrationManager: core.release.integrationManager, + _lendingPool: lendingPool, + _lendingPoolAddressProvider: lendingPoolAddressProvider + }); + + aWeth = getATokenAddress({_token: address(wethToken), _lendingPool: lendingPool}); + addPrimitive({ + _valueInterpreter: core.release.valueInterpreter, + _token: aWeth, + _aggregator: address(createTestAggregator(1)) + }); + + (comptrollerProxy, vaultProxy) = createVaultAndBuyShares({ + _fundDeployer: core.release.fundDeployer, + _vaultOwner: vaultOwner, + _sharesBuyer: sharesBuyer, + _denominationAsset: address(wethToken), + _amountToDeposit: 1000 ether + }); + } + + function testLend() public { + uint256 amountToLend = 1 ether; + bytes memory integrationData = abi.encode(aWeth, amountToLend); + bytes memory callArgs = abi.encode(address(aaveV2Adapter), IAaveV2Adapter.lend.selector, integrationData); + + callOnIntegration({ + _integrationManager: core.release.integrationManager, + _comptrollerProxy: comptrollerProxy, + _caller: vaultOwner, + _callArgs: callArgs + }); + + assertEq(IERC20(aWeth).balanceOf(address(vaultProxy)), amountToLend); + } +} + +contract AaveV2AdapterTestEthereum is AaveV2AdapterTest { + function setUp() public override { + lendingPool = LENDING_POOL_ADDRESS_ETHEREUM; + lendingPoolAddressProvider = LENDING_POOL_ADDRESS_PROVIDER_ADDRESS_ETHEREUM; + + setUpMainnetEnvironment(16733210); + setUpAave(); + } +} + +contract AaveV2AdapterTestPolygon is AaveV2AdapterTest { + function setUp() public override { + lendingPool = LENDING_POOL_ADDRESS_POLYGON; + lendingPoolAddressProvider = LENDING_POOL_ADDRESS_PROVIDER_ADDRESS_POLYGON; + + setUpPolygonEnvironment(39841068); + setUpAave(); + } +} diff --git a/tests/tests/protocols/kiln/KilnStakingPosition.t.sol b/tests/tests/protocols/kiln/KilnStakingPosition.t.sol new file mode 100644 index 000000000..58c9f2284 --- /dev/null +++ b/tests/tests/protocols/kiln/KilnStakingPosition.t.sol @@ -0,0 +1,75 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity 0.8.17; + +import {IntegrationTest} from "tests/bases/IntegrationTest.sol"; +import {Actions, KilnUtils, STAKING_CONTRACT_ADDRESS_ETHEREUM} from "tests/utils/protocols/kiln/KilnUtils.sol"; + +import {IERC20} from "tests/interfaces/external/IERC20.sol"; +import {IComptroller} from "tests/interfaces/internal/IComptroller.sol"; +import {IKilnStakingPositionLib} from "tests/interfaces/internal/IKilnStakingPositionLib.sol"; +import {IKilnStakingPositionParser} from "tests/interfaces/internal/IKilnStakingPositionParser.sol"; +import {IVault} from "tests/interfaces/internal/IVault.sol"; + +contract KilnStakingPositionTest is IntegrationTest, KilnUtils { + address internal vaultOwner = makeAddr("VaultOwner"); + address internal sharesBuyer = makeAddr("SharesBuyer"); + + IKilnStakingPositionParser internal kilnStakingPositionParser; + IKilnStakingPositionLib internal kilnStakingPositionLib; + address internal kilnStakingExternalPositionProxyAddress; + uint256 internal kilnStakinTypeId; + + IVault internal vaultProxy; + IComptroller internal comptrollerProxy; + + function setUp() public override { + setUpMainnetEnvironment(16733210); + + (kilnStakingPositionLib, kilnStakingPositionParser, kilnStakinTypeId) = deployKilnStaking({ + _stakingContract: STAKING_CONTRACT_ADDRESS_ETHEREUM, + _wethToken: wethToken, + _dispatcher: core.persistent.dispatcher, + _externalPositionManager: core.release.externalPositionManager, + _addressListRegistry: core.persistent.addressListRegistry + }); + + (comptrollerProxy, vaultProxy) = createVaultAndBuyShares({ + _fundDeployer: core.release.fundDeployer, + _vaultOwner: vaultOwner, + _denominationAsset: address(wethToken), + _amountToDeposit: 1000 ether, + _sharesBuyer: sharesBuyer + }); + + kilnStakingExternalPositionProxyAddress = address( + createExternalPosition({ + _externalPositionManager: core.release.externalPositionManager, + _comptrollerProxy: comptrollerProxy, + _typeId: kilnStakinTypeId + }) + ); + } + + function testStake() public { + uint256 validatorAmount = 5; + uint256 actionId = uint256(Actions.Stake); + bytes memory actionArgs = abi.encode(STAKING_CONTRACT_ADDRESS_ETHEREUM, validatorAmount); + bytes memory callArgs = abi.encode(kilnStakingExternalPositionProxyAddress, actionId, actionArgs); + + callOnExternalPosition({ + _externalPositionManager: core.release.externalPositionManager, + _comptrollerProxy: comptrollerProxy, + _vaultOwner: vaultOwner, + _callArgs: callArgs + }); + + (address[] memory assets_, uint256[] memory amounts_) = + IKilnStakingPositionLib(kilnStakingExternalPositionProxyAddress).getManagedAssets(); + + address weth = assets_[0]; + uint256 amount = amounts_[0]; + + assertEq(weth, address(wethToken)); + assertEq(amount, validatorAmount * 32 ether); + } +} diff --git a/tests/utils/CommonUtils.sol b/tests/utils/CommonUtils.sol new file mode 100644 index 000000000..1ca211a9f --- /dev/null +++ b/tests/utils/CommonUtils.sol @@ -0,0 +1,14 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity 0.8.17; + +import {ErrorUtils} from "tests/utils/common/ErrorUtils.sol"; +import {EventUtils} from "tests/utils/common/EventUtils.sol"; +import {TokenUtils} from "tests/utils/common/TokenUtils.sol"; + +abstract contract CommonUtils is TokenUtils, EventUtils, ErrorUtils { + address internal alice = makeAddr("Alice"); + address internal bob = makeAddr("Bob"); + + uint256 internal constant ONE_HUNDRED_PERCENT = 10_000; + uint256 internal constant ONE_PERCENT = ONE_HUNDRED_PERCENT / 100; +} diff --git a/tests/utils/CoreUtils.sol b/tests/utils/CoreUtils.sol new file mode 100644 index 000000000..ccfe0ee5a --- /dev/null +++ b/tests/utils/CoreUtils.sol @@ -0,0 +1,18 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity 0.8.17; + +import {AdapterUtils} from "tests/utils/core/AdapterUtils.sol"; +import {AssetUniverseUtils} from "tests/utils/core/AssetUniverseUtils.sol"; +import {DeploymentUtils, ICoreDeployment} from "tests/utils/core/DeploymentUtils.sol"; +import {ExternalPositionUtils} from "tests/utils/core/ExternalPositionUtils.sol"; +import {PolicyUtils} from "tests/utils/core/PolicyUtils.sol"; +import {VaultUtils} from "tests/utils/core/VaultUtils.sol"; + +abstract contract CoreUtils is + AdapterUtils, + PolicyUtils, + AssetUniverseUtils, + DeploymentUtils, + ExternalPositionUtils, + VaultUtils +{} diff --git a/tests/utils/common/ErrorUtils.sol b/tests/utils/common/ErrorUtils.sol new file mode 100644 index 000000000..d840e6009 --- /dev/null +++ b/tests/utils/common/ErrorUtils.sol @@ -0,0 +1,14 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity 0.8.17; + +import {Test} from "forge-std/Test.sol"; + +abstract contract ErrorUtils is Test { + function formatError(string memory _error) public pure returns (bytes memory) { + return abi.encodeWithSignature("Error(string)", _error); + } + + function formatError(string memory _prefix, string memory _error) public pure returns (bytes memory) { + return abi.encodePacked(_prefix, abi.encodeWithSignature("Error(string)", _error)); + } +} diff --git a/tests/utils/common/EventUtils.sol b/tests/utils/common/EventUtils.sol new file mode 100644 index 000000000..a4f4ef5eb --- /dev/null +++ b/tests/utils/common/EventUtils.sol @@ -0,0 +1,56 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity 0.8.17; + +import {Test} from "forge-std/Test.sol"; +import {VmSafe} from "forge-std/Vm.sol"; + +abstract contract EventUtils is Test { + function expectEmit(address _emitter) internal { + vm.expectEmit(true, true, true, true, _emitter); + } + + function filterLogsMatchingSelector(VmSafe.Log[] memory _logs, bytes32 _selector, address _emitter) + internal + pure + returns (VmSafe.Log[] memory logsWithSelector_) + { + uint256 logsMatchCount; + bool[] memory logsMatch = new bool[](_logs.length); + for (uint256 i; i < _logs.length; i++) { + VmSafe.Log memory log = _logs[i]; + + if (log.emitter == _emitter && log.topics[0] == _selector) { + logsMatch[i] = true; + logsMatchCount++; + } + } + + logsWithSelector_ = new VmSafe.Log[](logsMatchCount); + uint256 logsWithSelectorIndex; + for (uint256 i; i < _logs.length; i++) { + if (logsMatch[i]) { + logsWithSelector_[logsWithSelectorIndex] = _logs[i]; + + logsWithSelectorIndex++; + } + } + + return logsWithSelector_; + } + + function assertAtLeastOneEventMatches(VmSafe.Log[] memory _logs, bytes32 _selector, address _emitter) + internal + pure + { + VmSafe.Log[] memory logsWithSelector = filterLogsMatchingSelector(_logs, _selector, _emitter); + require(logsWithSelector.length > 0, "No matching events found"); + } + + function assertExactlyOneEventMatches(VmSafe.Log[] memory _logs, bytes32 _selector, address _emitter) + internal + pure + { + VmSafe.Log[] memory logsWithSelector = filterLogsMatchingSelector(_logs, _selector, _emitter); + require(logsWithSelector.length == 1, "More than one matching event found"); + } +} diff --git a/tests/utils/common/TokenUtils.sol b/tests/utils/common/TokenUtils.sol new file mode 100644 index 000000000..17a701d64 --- /dev/null +++ b/tests/utils/common/TokenUtils.sol @@ -0,0 +1,45 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity 0.8.17; + +import {ERC20 as ERC20Base} from "@openzeppelin/contractsV4/token/ERC20/ERC20.sol"; +import {Test} from "forge-std/Test.sol"; + +import {IERC20} from "tests/interfaces/external/IERC20.sol"; + +abstract contract TokenUtils is Test { + function createTestToken(uint8 _decimals, string memory _name, string memory _symbol) + internal + returns (IERC20 token_) + { + address tokenAddress = address(new TestToken(_name, _symbol, _decimals)); + vm.label(tokenAddress, _name); + + return IERC20(tokenAddress); + } + + function createTestToken(uint8 _decimals) internal returns (IERC20 token_) { + return createTestToken(_decimals, "Test Token", "TEST"); + } + + function createTestToken() internal returns (IERC20 token_) { + return createTestToken(18); + } + + function increaseTokenBalance(IERC20 _token, address _to, uint256 _amount) internal { + uint256 balance = _token.balanceOf(_to); + + deal(address(_token), _to, balance + _amount); + } +} + +contract TestToken is ERC20Base { + uint8 internal immutable DECIMALS; + + constructor(string memory _name, string memory _symbol, uint8 _decimals) ERC20Base(_name, _symbol) { + DECIMALS = _decimals; + } + + function decimals() public view virtual override returns (uint8) { + return DECIMALS; + } +} diff --git a/tests/utils/core/AdapterUtils.sol b/tests/utils/core/AdapterUtils.sol new file mode 100644 index 000000000..736be5da9 --- /dev/null +++ b/tests/utils/core/AdapterUtils.sol @@ -0,0 +1,103 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity 0.8.17; + +import {Test} from "forge-std/Test.sol"; +import {TokenUtils} from "tests/utils/common/TokenUtils.sol"; + +import {IERC20} from "tests/interfaces/external/IERC20.sol"; +import {IComptroller} from "tests/interfaces/internal/IComptroller.sol"; +import {IIntegrationManager} from "tests/interfaces/internal/IIntegrationManager.sol"; + +enum SpendAssetsHandleType { + None, + Approve, + Transfer +} + +abstract contract AdapterUtils is Test { + function callOnIntegration( + IIntegrationManager _integrationManager, + IComptroller _comptrollerProxy, + address _caller, + bytes memory _callArgs + ) internal { + address integrationManager = address(_integrationManager); + uint256 actionId = uint256(0); + + vm.prank(_caller); + _comptrollerProxy.callOnExtension(integrationManager, actionId, _callArgs); + } + + function deployMockedAdapter() public returns (MockedAdapter) { + return new MockedAdapter(); + } +} + +contract MockedAdapter is TokenUtils { + constructor() {} + + function encodeAssetsForAction( + SpendAssetsHandleType _spendAssetsHandleType, + address[] memory _spendAssets, + uint256[] memory _spendAssetAmounts, + address[] memory _incomingAssets, + uint256[] memory _minIncomingAssetAmounts + ) public pure returns (bytes memory actionData_) { + return abi.encode( + _spendAssetsHandleType, _spendAssets, _spendAssetAmounts, _incomingAssets, _minIncomingAssetAmounts + ); + } + + function parseAssetsForAction(address, bytes4, bytes calldata _actionData) + public + pure + returns ( + SpendAssetsHandleType spendAssetsHandleType_, + address[] memory spendAssets_, + uint256[] memory spendAssetAmounts_, + address[] memory incomingAssets_, + uint256[] memory minIncomingAssetAmounts_ + ) + { + return __decodeIntegrationData(_actionData); + } + + function action(address _vaultProxy, bytes calldata _integrationData, bytes calldata _assetData) external { + (address[] memory spendAssets, uint256[] memory spendAssetAmounts, address[] memory incomingAssets) = + __decodeAssetData(_assetData); + + (,,,, uint256[] memory minIncomingAssetAmounts_) = __decodeIntegrationData(_integrationData); + + for (uint256 i; i < spendAssets.length; ++i) { + IERC20(spendAssets[i]).transfer(makeAddr("externalProtocol"), spendAssetAmounts[i]); + } + + for (uint256 i; i < incomingAssets.length; ++i) { + increaseTokenBalance(IERC20(incomingAssets[i]), _vaultProxy, minIncomingAssetAmounts_[i]); + } + } + + function __decodeIntegrationData(bytes memory _integrationData) + internal + pure + returns ( + SpendAssetsHandleType spendAssetsHandleType_, + address[] memory spendAssets_, + uint256[] memory spendAssetAmounts_, + address[] memory incomingAssets_, + uint256[] memory minIncomingAssetAmounts_ + ) + { + (spendAssetsHandleType_, spendAssets_, spendAssetAmounts_, incomingAssets_, minIncomingAssetAmounts_) = + abi.decode(_integrationData, (SpendAssetsHandleType, address[], uint256[], address[], uint256[])); + } + + /// @dev Helper to decode the _assetData param passed to adapter call + function __decodeAssetData(bytes memory _assetData) + internal + pure + returns (address[] memory spendAssets_, uint256[] memory spendAssetAmounts_, address[] memory incomingAssets_) + { + return abi.decode(_assetData, (address[], uint256[], address[])); + } +} diff --git a/tests/utils/core/AssetUniverseUtils.sol b/tests/utils/core/AssetUniverseUtils.sol new file mode 100644 index 000000000..ee0c4b43f --- /dev/null +++ b/tests/utils/core/AssetUniverseUtils.sol @@ -0,0 +1,148 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity 0.8.17; + +import {Test} from "forge-std/Test.sol"; +import {TokenUtils} from "tests/utils/common/TokenUtils.sol"; + +import {IChainlinkAggregator} from "tests/interfaces/external/IChainlinkAggregator.sol"; +import {IERC20} from "tests/interfaces/external/IERC20.sol"; +import {IValueInterpreter} from "tests/interfaces/internal/IValueInterpreter.sol"; + +enum ChainlinkRateAsset { + ETH, + USD +} + +abstract contract AssetUniverseUtils is Test, TokenUtils { + function createTestAggregator(uint256 _price) internal returns (IChainlinkAggregator aggregator_) { + return IChainlinkAggregator(address(new TestAggregator(_price))); + } + + function updateTestAggregator(IChainlinkAggregator _aggregator, uint256 _price) internal { + // TODO: This is a bit of a hack. + TestAggregator(address(_aggregator)).setPrice(_price); + } + + function createInvalidPriceTestAggregator() internal returns (IChainlinkAggregator aggregator_) { + return IChainlinkAggregator(address(new TestAggregatorInvalidPrice())); + } + + function createRegisteredPrimitive(IValueInterpreter _valueInterpreter, uint8 _decimals) + internal + returns (IERC20 token_) + { + token_ = createTestToken(_decimals); + + addPrimitive({ + _valueInterpreter: _valueInterpreter, + _token: address(token_), + _aggregator: address(createTestAggregator(1 ether)), + _rateAsset: ChainlinkRateAsset.ETH + }); + + return token_; + } + + function createRegisteredPrimitive(IValueInterpreter _valueInterpreter) internal returns (IERC20 token_) { + return createRegisteredPrimitive(_valueInterpreter, 18); + } + + function addPrimitive(IValueInterpreter _valueInterpreter, address _token, address _aggregator) internal { + addPrimitive(_valueInterpreter, _token, _aggregator, ChainlinkRateAsset.ETH); + } + + function addPrimitive( + IValueInterpreter _valueInterpreter, + address _token, + address _aggregator, + ChainlinkRateAsset _rateAsset + ) internal { + address[] memory primitives = new address[](1); + primitives[0] = _token; + + address[] memory aggregators = new address[](1); + aggregators[0] = _aggregator; + + ChainlinkRateAsset[] memory rateAssets = new ChainlinkRateAsset[](1); + + rateAssets[0] = _rateAsset; + + addPrimitives(_valueInterpreter, primitives, aggregators, rateAssets); + } + + function addPrimitives( + IValueInterpreter _valueInterpreter, + address[] memory _primitives, + address[] memory _aggregators, + ChainlinkRateAsset[] memory _rateAssets + ) internal { + uint8[] memory rateAssetsUint8 = new uint8[](_rateAssets.length); + for (uint256 i; i < _rateAssets.length; i++) { + rateAssetsUint8[i] = uint8(_rateAssets[i]); + } + + vm.prank(getValueInterpreterOwner(_valueInterpreter)); + + _valueInterpreter.addPrimitives(_primitives, _aggregators, rateAssetsUint8); + } + + function addDerivatives( + IValueInterpreter _valueInterpreter, + address[] memory _derivatives, + address[] memory _priceFeeds + ) internal { + vm.prank(getValueInterpreterOwner(_valueInterpreter)); + + _valueInterpreter.addDerivatives(_derivatives, _priceFeeds); + } + + function addDerivative(IValueInterpreter _valueInterpreter, address _derivative, address _priceFeed) internal { + address[] memory _derivatives = new address[](1); + _derivatives[0] = _derivative; + + address[] memory _priceFeeds = new address[](1); + _priceFeeds[0] = _priceFeed; + + addDerivatives({_valueInterpreter: _valueInterpreter, _derivatives: _derivatives, _priceFeeds: _priceFeeds}); + } + + function removePrimitive(IValueInterpreter _valueInterpreter, address _primitive) internal { + address[] memory primitives = new address[](1); + primitives[0] = _primitive; + + removePrimitives(_valueInterpreter, primitives); + } + + function removePrimitives(IValueInterpreter _valueInterpreter, address[] memory _primitives) internal { + vm.prank(getValueInterpreterOwner(_valueInterpreter)); + + _valueInterpreter.removePrimitives(_primitives); + } + + // TODO: Build a proper contract locator util for all contracts that have references between one another. + function getValueInterpreterOwner(IValueInterpreter _valueInterpreter) internal view returns (address owner_) { + return _valueInterpreter.getOwner(); + } +} + +contract TestAggregator is IChainlinkAggregator { + uint256 internal price; + + constructor(uint256 _price) { + setPrice(_price); + } + + function setPrice(uint256 _price) public { + price = _price; + } + + function latestRoundData() external view virtual returns (uint80, int256, uint256, uint256, uint80) { + return (0, int256(price), 0, block.timestamp, 0); + } +} + +contract TestAggregatorInvalidPrice is TestAggregator(1) { + function latestRoundData() external pure override returns (uint80, int256, uint256, uint256, uint80) { + revert("Invalid price"); + } +} diff --git a/tests/utils/core/DeploymentUtils.sol b/tests/utils/core/DeploymentUtils.sol new file mode 100644 index 000000000..1ee94c591 --- /dev/null +++ b/tests/utils/core/DeploymentUtils.sol @@ -0,0 +1,501 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity 0.8.17; + +import {Test} from "forge-std/Test.sol"; + +import {IERC20} from "tests/interfaces/external/IERC20.sol"; +import {IWETH} from "tests/interfaces/external/IWETH.sol"; +import {IAddressListRegistry} from "tests/interfaces/internal/IAddressListRegistry.sol"; +import {IDispatcher} from "tests/interfaces/internal/IDispatcher.sol"; +import {IExternalPositionFactory} from "tests/interfaces/internal/IExternalPositionFactory.sol"; +import {IExternalPositionManager} from "tests/interfaces/internal/IExternalPositionManager.sol"; +import {IFeeManager} from "tests/interfaces/internal/IFeeManager.sol"; +import {IFundDeployer} from "tests/interfaces/internal/IFundDeployer.sol"; +import {IGasRelayPaymasterLib} from "tests/interfaces/internal/IGasRelayPaymasterLib.sol"; +import {IIntegrationManager} from "tests/interfaces/internal/IIntegrationManager.sol"; +import {IPolicyManager} from "tests/interfaces/internal/IPolicyManager.sol"; +import {IProtocolFeeReserve} from "tests/interfaces/internal/IProtocolFeeReserve.sol"; +import {IProtocolFeeTracker} from "tests/interfaces/internal/IProtocolFeeTracker.sol"; +import {IUintListRegistry} from "tests/interfaces/internal/IUintListRegistry.sol"; +import {IValueInterpreter} from "tests/interfaces/internal/IValueInterpreter.sol"; +import {IGasRelayPaymasterFactory} from "tests/interfaces/internal/IGasRelayPaymasterFactory.sol"; + +interface ICoreDeployment { + struct Deployment { + Config config; + Persistent persistent; + Release release; + } + + struct Config { + IWETH wrappedNativeToken; + IWETH wethToken; + IERC20 mlnToken; + address gasRelayHub; + address gasRelayTrustedForwarder; + uint256 gasRelayDepositCooldown; + uint256 gasRelayDepositMaxTotal; + uint256 gasRelayRelayFeeMaxBase; + uint256 gasRelayFeeMaxPercent; + address vaultMlnBurner; + uint256 vaultPositionsLimit; + uint256 chainlinkStaleRateThreshold; + address ethUsdAggregator; + } + + struct Persistent { + IDispatcher dispatcher; + IExternalPositionFactory externalPositionFactory; + IGasRelayPaymasterLib gasRelayPaymasterLib; + IGasRelayPaymasterFactory gasRelayPaymasterFactory; + address protocolFeeReserveLib; + IProtocolFeeReserve protocolFeeReserveProxy; + IAddressListRegistry addressListRegistry; + IUintListRegistry uintListRegistry; + } + + struct Release { + IFundDeployer fundDeployer; + IValueInterpreter valueInterpreter; + IPolicyManager policyManager; + IExternalPositionManager externalPositionManager; + IFeeManager feeManager; + IIntegrationManager integrationManager; + address comptrollerLib; + IProtocolFeeTracker protocolFeeTracker; + address vaultLib; + } +} + +abstract contract DeploymentUtils is Test { + function deployRelease(ICoreDeployment.Deployment memory _previousDeployment) + internal + returns (ICoreDeployment.Deployment memory) + { + return deployRelease( + _previousDeployment, + _previousDeployment.config.vaultMlnBurner, + _previousDeployment.config.vaultPositionsLimit, + _previousDeployment.config.chainlinkStaleRateThreshold + ); + } + + function deployRelease( + ICoreDeployment.Deployment memory _previousDeployment, + address _vaultMlnBurner, + uint256 _vaultPositionsLimit, + uint256 _chainlinkStaleRateThreshold + ) internal returns (ICoreDeployment.Deployment memory deployment_) { + deployment_.config = ICoreDeployment.Config({ + wrappedNativeToken: _previousDeployment.config.wrappedNativeToken, + wethToken: _previousDeployment.config.wethToken, + mlnToken: _previousDeployment.config.mlnToken, + gasRelayHub: _previousDeployment.config.gasRelayHub, + gasRelayTrustedForwarder: _previousDeployment.config.gasRelayTrustedForwarder, + gasRelayDepositCooldown: _previousDeployment.config.gasRelayDepositCooldown, + gasRelayDepositMaxTotal: _previousDeployment.config.gasRelayDepositMaxTotal, + gasRelayRelayFeeMaxBase: _previousDeployment.config.gasRelayRelayFeeMaxBase, + gasRelayFeeMaxPercent: _previousDeployment.config.gasRelayFeeMaxPercent, + ethUsdAggregator: _previousDeployment.config.ethUsdAggregator, + vaultMlnBurner: _vaultMlnBurner, + vaultPositionsLimit: _vaultPositionsLimit, + chainlinkStaleRateThreshold: _chainlinkStaleRateThreshold + }); + deployment_.persistent = ICoreDeployment.Persistent({ + dispatcher: _previousDeployment.persistent.dispatcher, + externalPositionFactory: _previousDeployment.persistent.externalPositionFactory, + gasRelayPaymasterLib: _previousDeployment.persistent.gasRelayPaymasterLib, + gasRelayPaymasterFactory: _previousDeployment.persistent.gasRelayPaymasterFactory, + protocolFeeReserveLib: _previousDeployment.persistent.protocolFeeReserveLib, + protocolFeeReserveProxy: _previousDeployment.persistent.protocolFeeReserveProxy, + addressListRegistry: _previousDeployment.persistent.addressListRegistry, + uintListRegistry: _previousDeployment.persistent.uintListRegistry + }); + deployment_.release = deployReleaseCore(deployment_.config, deployment_.persistent); + } + + function deployRelease( + IWETH _wrappedNativeToken, + IWETH _wethToken, + IERC20 _mlnToken, + address _gasRelayHub, + address _gasRelayTrustedForwarder, + uint256 _gasRelayDepositCooldown, + uint256 _gasRelayDepositMaxTotal, + uint256 _gasRelayRelayFeeMaxBase, + uint256 _gasRelayFeeMaxPercent, + address _vaultMlnBurner, + uint256 _vaultPositionsLimit, + uint256 _chainlinkStaleRateThreshold, + address _ethUsdAggregator + ) internal returns (ICoreDeployment.Deployment memory deployment_) { + deployment_.config = ICoreDeployment.Config({ + wrappedNativeToken: _wrappedNativeToken, + wethToken: _wethToken, + mlnToken: _mlnToken, + gasRelayHub: _gasRelayHub, + gasRelayTrustedForwarder: _gasRelayTrustedForwarder, + gasRelayDepositCooldown: _gasRelayDepositCooldown, + gasRelayDepositMaxTotal: _gasRelayDepositMaxTotal, + gasRelayRelayFeeMaxBase: _gasRelayRelayFeeMaxBase, + gasRelayFeeMaxPercent: _gasRelayFeeMaxPercent, + vaultMlnBurner: _vaultMlnBurner, + vaultPositionsLimit: _vaultPositionsLimit, + chainlinkStaleRateThreshold: _chainlinkStaleRateThreshold, + ethUsdAggregator: _ethUsdAggregator + }); + deployment_.persistent = deployPersistentCore(deployment_.config); + deployment_.release = deployReleaseCore(deployment_.config, deployment_.persistent); + } + + function deployPersistentCore(ICoreDeployment.Config memory _config) + private + returns (ICoreDeployment.Persistent memory persistent_) + { + persistent_.dispatcher = deployDispatcher(); + persistent_.externalPositionFactory = deployExternalPositionFactory({_dispatcher: persistent_.dispatcher}); + persistent_.gasRelayPaymasterLib = deployGasRelayPaymasterLib({ + _wrappedNativeToken: _config.wrappedNativeToken, + _gasRelayHub: _config.gasRelayHub, + _gasRelayTrustedForwarder: _config.gasRelayTrustedForwarder, + _gasRelayDepositCooldown: _config.gasRelayDepositCooldown, + _gasRelayDepositMaxTotal: _config.gasRelayDepositMaxTotal, + _gasRelayRelayFeeMaxBase: _config.gasRelayRelayFeeMaxBase, + _gasRelayRelayFeeMaxPercent: _config.gasRelayFeeMaxPercent + }); + + persistent_.gasRelayPaymasterFactory = deployGasRelayPaymasterFactory({ + _dispatcher: persistent_.dispatcher, + _gasRelayPaymasterLib: persistent_.gasRelayPaymasterLib + }); + persistent_.protocolFeeReserveLib = deployProtocolFeeReserveLib(); + persistent_.protocolFeeReserveProxy = deployProtocolFeeReserveProxy({ + _dispatcher: persistent_.dispatcher, + _protocolFeeReserveLib: persistent_.protocolFeeReserveLib + }); + persistent_.addressListRegistry = deployAddressListRegistry({_dispatcher: persistent_.dispatcher}); + persistent_.uintListRegistry = deployUintListRegistry({_dispatcher: persistent_.dispatcher}); + } + + function deployReleaseCore(ICoreDeployment.Config memory _config, ICoreDeployment.Persistent memory _persistent) + private + returns (ICoreDeployment.Release memory release_) + { + release_.fundDeployer = deployFundDeployer({ + _dispatcher: _persistent.dispatcher, + _gasRelayPaymasterFactory: _persistent.gasRelayPaymasterFactory + }); + release_.valueInterpreter = deployValueInterpreter({ + _fundDeployer: release_.fundDeployer, + _wethToken: _config.wethToken, + _chainlinkStaleRateThreshold: _config.chainlinkStaleRateThreshold + }); + release_.policyManager = deployPolicyManager({ + _fundDeployer: release_.fundDeployer, + _gasRelayPaymasterFactory: _persistent.gasRelayPaymasterFactory + }); + release_.externalPositionManager = deployExternalPositionManager({ + _fundDeployer: release_.fundDeployer, + _externalPositionFactory: _persistent.externalPositionFactory, + _policyManager: release_.policyManager + }); + release_.feeManager = deployFeeManager({_fundDeployer: release_.fundDeployer}); + release_.integrationManager = deployIntegrationManager({ + _fundDeployer: release_.fundDeployer, + _policyManager: release_.policyManager, + _valueInterpreter: release_.valueInterpreter + }); + release_.comptrollerLib = deployComptrollerLib( + ComptrollerLibParams({ + mlnToken: _config.mlnToken, + wrappedNativeToken: _config.wrappedNativeToken, + dispatcher: _persistent.dispatcher, + fundDeployer: release_.fundDeployer, + policyManager: release_.policyManager, + feeManager: release_.feeManager, + valueInterpreter: release_.valueInterpreter, + integrationManager: release_.integrationManager, + externalPositionManager: release_.externalPositionManager, + gasRelayPaymasterFactory: _persistent.gasRelayPaymasterFactory, + protocolFeeReserveProxy: _persistent.protocolFeeReserveProxy + }) + ); + release_.protocolFeeTracker = deployProtocolFeeTracker({_fundDeployer: release_.fundDeployer}); + release_.vaultLib = deployVaultLib({ + _mlnToken: _config.mlnToken, + _vaultMlnBurner: _config.vaultMlnBurner, + _wrappedNativeToken: _config.wrappedNativeToken, + _vaultPositionsLimit: _config.vaultPositionsLimit, + _externalPositionManager: release_.externalPositionManager, + _gasRelayPaymasterFactory: _persistent.gasRelayPaymasterFactory, + _protocolFeeReserveProxy: _persistent.protocolFeeReserveProxy, + _protocolFeeTracker: release_.protocolFeeTracker + }); + + setFundDeployerPseudoVars({ + _fundDeployer: release_.fundDeployer, + _protocolFeeTracker: release_.protocolFeeTracker, + _comptrollerLib: release_.comptrollerLib, + _vaultLib: release_.vaultLib + }); + setExternalPositionFactoryPositionDeployers({ + _externalPositionManager: release_.externalPositionManager, + _externalPositionFactory: _persistent.externalPositionFactory, + _dispatcher: _persistent.dispatcher + }); + + if (_config.ethUsdAggregator != address(0)) { + setValueInterpreterEthUsdAggregator({ + _valueInterpreter: release_.valueInterpreter, + _fundDeployer: release_.fundDeployer, + _ethUsdAggregator: _config.ethUsdAggregator + }); + } + } + + function setExternalPositionFactoryPositionDeployers(ICoreDeployment.Deployment memory _deployment) internal { + setExternalPositionFactoryPositionDeployers({ + _externalPositionManager: _deployment.release.externalPositionManager, + _externalPositionFactory: _deployment.persistent.externalPositionFactory, + _dispatcher: _deployment.persistent.dispatcher + }); + } + + function setExternalPositionFactoryPositionDeployers( + IExternalPositionManager _externalPositionManager, + IExternalPositionFactory _externalPositionFactory, + IDispatcher _dispatcher + ) private { + address[] memory deployers = new address[](1); + deployers[0] = address(_externalPositionManager); + vm.prank(_dispatcher.getOwner()); + _externalPositionFactory.addPositionDeployers(deployers); + } + + function setValueInterpreterEthUsdAggregator( + IValueInterpreter _valueInterpreter, + IFundDeployer _fundDeployer, + address _ethUsdAggregator + ) private { + vm.prank(_fundDeployer.getOwner()); + _valueInterpreter.setEthUsdAggregator(_ethUsdAggregator); + } + + function setFundDeployerPseudoVars(ICoreDeployment.Deployment memory _deployment) internal { + setFundDeployerPseudoVars({ + _fundDeployer: _deployment.release.fundDeployer, + _protocolFeeTracker: _deployment.release.protocolFeeTracker, + _comptrollerLib: _deployment.release.comptrollerLib, + _vaultLib: _deployment.release.vaultLib + }); + } + + function setFundDeployerPseudoVars( + IFundDeployer _fundDeployer, + IProtocolFeeTracker _protocolFeeTracker, + address _comptrollerLib, + address _vaultLib + ) private { + vm.startPrank(_fundDeployer.getOwner()); + _fundDeployer.setProtocolFeeTracker(address(_protocolFeeTracker)); + _fundDeployer.setComptrollerLib(address(_comptrollerLib)); + _fundDeployer.setVaultLib(address(_vaultLib)); + vm.stopPrank(); + } + + function setReleaseLive(ICoreDeployment.Deployment memory _deployment) internal { + setReleaseLive({_dispatcher: _deployment.persistent.dispatcher, _fundDeployer: _deployment.release.fundDeployer}); + } + + function setReleaseLive(IDispatcher _dispatcher, IFundDeployer _fundDeployer) private { + vm.prank(_fundDeployer.getOwner()); + _fundDeployer.setReleaseLive(); + vm.prank(_dispatcher.getOwner()); + _dispatcher.setCurrentFundDeployer(address(_fundDeployer)); + } + + // Persistent + + function deployDispatcher() internal returns (IDispatcher) { + address addr = deployCode("Dispatcher.sol"); + return IDispatcher(addr); + } + + function deployExternalPositionFactory(IDispatcher _dispatcher) internal returns (IExternalPositionFactory) { + bytes memory args = abi.encode(_dispatcher); + address addr = deployCode("ExternalPositionFactory.sol", args); + return IExternalPositionFactory(addr); + } + + function deployGasRelayPaymasterLib( + IWETH _wrappedNativeToken, + address _gasRelayHub, + address _gasRelayTrustedForwarder, + uint256 _gasRelayDepositCooldown, + uint256 _gasRelayDepositMaxTotal, + uint256 _gasRelayRelayFeeMaxBase, + uint256 _gasRelayRelayFeeMaxPercent + ) internal returns (IGasRelayPaymasterLib) { + bytes memory args = abi.encode( + _wrappedNativeToken, + _gasRelayHub, + _gasRelayTrustedForwarder, + _gasRelayDepositCooldown, + _gasRelayDepositMaxTotal, + _gasRelayRelayFeeMaxBase, + _gasRelayRelayFeeMaxPercent + ); + return IGasRelayPaymasterLib(deployCode("GasRelayPaymasterLib.sol", args)); + } + + function deployGasRelayPaymasterFactory(IDispatcher _dispatcher, IGasRelayPaymasterLib _gasRelayPaymasterLib) + internal + returns (IGasRelayPaymasterFactory) + { + bytes memory args = abi.encode(_dispatcher, _gasRelayPaymasterLib); + address addr = deployCode("GasRelayPaymasterFactory.sol", args); + return IGasRelayPaymasterFactory(addr); + } + + function deployProtocolFeeReserveLib() internal returns (address) { + return deployCode("ProtocolFeeReserveLib.sol"); + } + + function deployProtocolFeeReserveProxy(IDispatcher _dispatcher, address _protocolFeeReserveLib) + internal + returns (IProtocolFeeReserve) + { + bytes memory construct = abi.encodeWithSignature("init(address)", _dispatcher); + bytes memory args = abi.encode(construct, _protocolFeeReserveLib); + address addr = deployCode("ProtocolFeeReserveProxy.sol", args); + return IProtocolFeeReserve(addr); + } + + function deployAddressListRegistry(IDispatcher _dispatcher) internal returns (IAddressListRegistry) { + bytes memory args = abi.encode(_dispatcher); + address addr = deployCode("AddressListRegistry.sol", args); + return IAddressListRegistry(addr); + } + + function deployUintListRegistry(IDispatcher _dispatcher) internal returns (IUintListRegistry) { + bytes memory args = abi.encode(_dispatcher); + address addr = deployCode("UintListRegistry.sol", args); + return IUintListRegistry(addr); + } + + // Release + + // TODO: This is required because we run into a stack-too-deep error otherwise. + struct ComptrollerLibParams { + IDispatcher dispatcher; + IProtocolFeeReserve protocolFeeReserveProxy; + IFundDeployer fundDeployer; + IValueInterpreter valueInterpreter; + IExternalPositionManager externalPositionManager; + IFeeManager feeManager; + IIntegrationManager integrationManager; + IPolicyManager policyManager; + IGasRelayPaymasterFactory gasRelayPaymasterFactory; + IERC20 mlnToken; + IWETH wrappedNativeToken; + } + + function deployComptrollerLib(ComptrollerLibParams memory params) internal returns (address) { + bytes memory args = abi.encode( + params.dispatcher, + params.protocolFeeReserveProxy, + params.fundDeployer, + params.valueInterpreter, + params.externalPositionManager, + params.feeManager, + params.integrationManager, + params.policyManager, + params.gasRelayPaymasterFactory, + params.mlnToken, + params.wrappedNativeToken + ); + return deployCode("ComptrollerLib.sol", args); + } + + function deployExternalPositionManager( + IFundDeployer _fundDeployer, + IExternalPositionFactory _externalPositionFactory, + IPolicyManager _policyManager + ) internal returns (IExternalPositionManager) { + bytes memory args = abi.encode(_fundDeployer, _externalPositionFactory, _policyManager); + address addr = deployCode("ExternalPositionManager.sol", args); + return IExternalPositionManager(addr); + } + + function deployFeeManager(IFundDeployer _fundDeployer) internal returns (IFeeManager) { + bytes memory args = abi.encode(_fundDeployer); + address addr = deployCode("FeeManager.sol", args); + return IFeeManager(addr); + } + + function deployFundDeployer(IDispatcher _dispatcher, IGasRelayPaymasterFactory _gasRelayPaymasterFactory) + internal + returns (IFundDeployer) + { + bytes memory args = abi.encode(_dispatcher, _gasRelayPaymasterFactory); + address addr = deployCode("FundDeployer.sol", args); + return IFundDeployer(addr); + } + + function deployIntegrationManager( + IFundDeployer _fundDeployer, + IPolicyManager _policyManager, + IValueInterpreter _valueInterpreter + ) internal returns (IIntegrationManager) { + bytes memory args = abi.encode(_fundDeployer, _policyManager, _valueInterpreter); + address addr = deployCode("IntegrationManager.sol", args); + return IIntegrationManager(addr); + } + + function deployPolicyManager(IFundDeployer _fundDeployer, IGasRelayPaymasterFactory _gasRelayPaymasterFactory) + internal + returns (IPolicyManager) + { + bytes memory args = abi.encode(_fundDeployer, _gasRelayPaymasterFactory); + address addr = deployCode("PolicyManager.sol", args); + return IPolicyManager(addr); + } + + function deployProtocolFeeTracker(IFundDeployer _fundDeployer) internal returns (IProtocolFeeTracker) { + bytes memory args = abi.encode(_fundDeployer); + address addr = deployCode("ProtocolFeeTracker.sol", args); + return IProtocolFeeTracker(addr); + } + + function deployValueInterpreter(IWETH _wethToken, IFundDeployer _fundDeployer, uint256 _chainlinkStaleRateThreshold) + internal + returns (IValueInterpreter) + { + bytes memory args = abi.encode(_fundDeployer, _wethToken, _chainlinkStaleRateThreshold); + address addr = deployCode("ValueInterpreter.sol", args); + return IValueInterpreter(addr); + } + + function deployVaultLib( + IERC20 _mlnToken, + address _vaultMlnBurner, + IWETH _wrappedNativeToken, + uint256 _vaultPositionsLimit, + IExternalPositionManager _externalPositionManager, + IGasRelayPaymasterFactory _gasRelayPaymasterFactory, + IProtocolFeeReserve _protocolFeeReserveProxy, + IProtocolFeeTracker _protocolFeeTracker + ) internal returns (address) { + bytes memory args = abi.encode( + _externalPositionManager, + _gasRelayPaymasterFactory, + _protocolFeeReserveProxy, + _protocolFeeTracker, + _mlnToken, + _vaultMlnBurner, + _wrappedNativeToken, + _vaultPositionsLimit + ); + return deployCode("VaultLib.sol", args); + } +} diff --git a/tests/utils/core/ExternalPositionUtils.sol b/tests/utils/core/ExternalPositionUtils.sol new file mode 100644 index 000000000..8a0355ca7 --- /dev/null +++ b/tests/utils/core/ExternalPositionUtils.sol @@ -0,0 +1,77 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity 0.8.17; + +import {Test} from "forge-std/Test.sol"; + +import {IComptroller} from "tests/interfaces/internal/IComptroller.sol"; +import {IDispatcher} from "tests/interfaces/internal/IDispatcher.sol"; +import {IExternalPositionFactory} from "tests/interfaces/internal/IExternalPositionFactory.sol"; +import {IExternalPositionManager} from "tests/interfaces/internal/IExternalPositionManager.sol"; +import {IExternalPositionProxy} from "tests/interfaces/internal/IExternalPositionProxy.sol"; +import {IVault} from "tests/interfaces/internal/IVault.sol"; + +enum ExternalPositionManagerActions { + CreateExternalPosition, + CallOnExternalPosition, + RemoveExternalPosition, + ReactivateExternalPosition +} + +abstract contract ExternalPositionUtils is Test { + function callOnExternalPosition( + IExternalPositionManager _externalPositionManager, + IComptroller _comptrollerProxy, + address _vaultOwner, + bytes memory _callArgs + ) internal { + address externalPositionManager = address(_externalPositionManager); + uint256 actionId = uint256(ExternalPositionManagerActions.CallOnExternalPosition); + + vm.prank(_vaultOwner); + _comptrollerProxy.callOnExtension(externalPositionManager, actionId, _callArgs); + } + + function createExternalPosition( + IExternalPositionManager _externalPositionManager, + IComptroller _comptrollerProxy, + uint256 _typeId + ) internal returns (IExternalPositionProxy externalPositionProxy_) { + address externalPositionManager = address(_externalPositionManager); + + bytes memory callArgs = abi.encode(_typeId, "", ""); + uint256 actionId = uint256(ExternalPositionManagerActions.CreateExternalPosition); + + IVault vaultProxy = IVault(payable(_comptrollerProxy.getVaultProxy())); + + vm.prank(vaultProxy.getOwner()); + _comptrollerProxy.callOnExtension(externalPositionManager, actionId, callArgs); + + address[] memory activeExternalPositions = vaultProxy.getActiveExternalPositions(); + + return IExternalPositionProxy(activeExternalPositions[activeExternalPositions.length - 1]); + } + + function registerExternalPositions( + IExternalPositionManager _externalPositionManager, + string[] memory _labels, + address[] memory _libs, + address[] memory _parsers + ) internal returns (uint256[] memory typeIds) { + IExternalPositionFactory externalPositionFactory = + IExternalPositionFactory(_externalPositionManager.getExternalPositionFactory()); + uint256 oldPositionTypeCounter = externalPositionFactory.getPositionTypeCounter(); + address dispatcherOwner = IDispatcher(externalPositionFactory.getDispatcher()).getOwner(); + + typeIds = new uint256[](_labels.length); + for (uint256 i; i < _labels.length; i++) { + typeIds[i] = oldPositionTypeCounter + i; + } + + vm.startPrank(dispatcherOwner); + externalPositionFactory.addNewPositionTypes(_labels); + _externalPositionManager.updateExternalPositionTypesInfo(typeIds, _libs, _parsers); + vm.stopPrank(); + + return typeIds; + } +} diff --git a/tests/utils/core/ListRegistryUtils.sol b/tests/utils/core/ListRegistryUtils.sol new file mode 100644 index 000000000..ccbf3cf54 --- /dev/null +++ b/tests/utils/core/ListRegistryUtils.sol @@ -0,0 +1,9 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity 0.8.17; + +enum UpdateType { + None, + AddOnly, + RemoveOnly, + AddAndRemove +} diff --git a/tests/utils/core/PolicyUtils.sol b/tests/utils/core/PolicyUtils.sol new file mode 100644 index 000000000..f4dd3d44d --- /dev/null +++ b/tests/utils/core/PolicyUtils.sol @@ -0,0 +1,14 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity 0.8.17; + +import {Test} from "forge-std/Test.sol"; + +abstract contract PolicyUtils is Test { + function encodePolicyManagerConfigData(address[] memory _policies, bytes[] memory _settingsData) + internal + pure + returns (bytes memory configData_) + { + return abi.encode(_policies, _settingsData); + } +} diff --git a/tests/utils/core/VaultUtils.sol b/tests/utils/core/VaultUtils.sol new file mode 100644 index 000000000..86502e6cb --- /dev/null +++ b/tests/utils/core/VaultUtils.sol @@ -0,0 +1,232 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity 0.8.17; + +import {Test} from "forge-std/Test.sol"; + +import {IERC20} from "tests/interfaces/external/IERC20.sol"; +import {IComptroller} from "tests/interfaces/internal/IComptroller.sol"; +import {IDispatcher} from "tests/interfaces/internal/IDispatcher.sol"; +import {IFundDeployer} from "tests/interfaces/internal/IFundDeployer.sol"; +import {IMigrationHookHandler} from "tests/interfaces/internal/IMigrationHookHandler.sol"; +import {IVault} from "tests/interfaces/internal/IVault.sol"; + +enum MigrationOutHook { + PreSignal, + PostSignal, + PreMigrate, + PostMigrate, + PostCancel +} + +abstract contract VaultUtils is Test { + function seedVault(IVault _vaultProxy, IERC20 _dealToken, uint256 _dealAmount) internal { + deal(address(_vaultProxy), address(_dealToken), _dealAmount); + } + + function predictVaultProxyAddress(IDispatcher _dispatcher) internal view returns (address) { + return computeCreateAddress(address(_dispatcher), vm.getNonce(address(_dispatcher))); + } + + function predictComptrollerProxyAddress(IFundDeployer _fundDeployer) internal view returns (address) { + return computeCreateAddress(address(_fundDeployer), vm.getNonce(address(_fundDeployer))); + } + + function createVault( + IFundDeployer _fundDeployer, + address _vaultOwner, + address _denominationAsset, + uint256 _sharesActionTimelock + ) internal returns (IComptroller comptrollerProxy_, IVault vaultProxy_) { + return createVault(_fundDeployer, _vaultOwner, _denominationAsset, _sharesActionTimelock, "", ""); + } + + function createVault(IFundDeployer _fundDeployer, address _vaultOwner, address _denominationAsset) + internal + returns (IComptroller comptrollerProxy_, IVault vaultProxy_) + { + return createVault(_fundDeployer, _vaultOwner, _denominationAsset, 0, "", ""); + } + + function createVault( + IFundDeployer _fundDeployer, + address _vaultOwner, + address _denominationAsset, + uint256 _sharesActionTimelock, + bytes memory _feeManagerConfigData, + bytes memory _policyManagerConfigData + ) internal returns (IComptroller comptrollerProxy_, IVault vaultProxy_) { + (address comptrollerProxy, address vaultProxy) = _fundDeployer.createNewFund( + _vaultOwner, + "testVault", + "TEST_VAULT", + _denominationAsset, + _sharesActionTimelock, + _feeManagerConfigData, + _policyManagerConfigData + ); + + comptrollerProxy_ = IComptroller(comptrollerProxy); + vaultProxy_ = IVault(vaultProxy); + } + + function createVaultAndBuyShares( + IFundDeployer _fundDeployer, + address _vaultOwner, + address _sharesBuyer, + address _denominationAsset, + uint256 _amountToDeposit, + uint256 _sharesActionTimelock, + bytes memory _feeManagerConfigData, + bytes memory _policyManagerConfigData + ) internal returns (IComptroller comptrollerProxy_, IVault vaultProxy_) { + (comptrollerProxy_, vaultProxy_) = createVault({ + _fundDeployer: _fundDeployer, + _vaultOwner: _vaultOwner, + _denominationAsset: _denominationAsset, + _sharesActionTimelock: _sharesActionTimelock, + _feeManagerConfigData: _feeManagerConfigData, + _policyManagerConfigData: _policyManagerConfigData + }); + + buyShares({_sharesBuyer: _sharesBuyer, _comptrollerProxy: comptrollerProxy_, _amountToDeposit: _amountToDeposit}); + } + + function createVaultAndBuyShares( + IFundDeployer _fundDeployer, + address _vaultOwner, + address _sharesBuyer, + address _denominationAsset, + uint256 _amountToDeposit + ) internal returns (IComptroller comptrollerProxy_, IVault vaultProxy_) { + return createVaultAndBuyShares({ + _fundDeployer: _fundDeployer, + _vaultOwner: _vaultOwner, + _sharesBuyer: _sharesBuyer, + _amountToDeposit: _amountToDeposit, + _denominationAsset: _denominationAsset, + _sharesActionTimelock: 0, + _feeManagerConfigData: "", + _policyManagerConfigData: "" + }); + } + + function createVaultAndBuyShares( + IFundDeployer _fundDeployer, + address _vaultOwner, + address _sharesBuyer, + address _denominationAsset, + uint256 _amountToDeposit, + bytes memory _policyManagerConfigData + ) internal returns (IComptroller comptrollerProxy_, IVault vaultProxy_) { + return createVaultAndBuyShares({ + _fundDeployer: _fundDeployer, + _vaultOwner: _vaultOwner, + _sharesBuyer: _sharesBuyer, + _amountToDeposit: _amountToDeposit, + _denominationAsset: _denominationAsset, + _sharesActionTimelock: 0, + _feeManagerConfigData: "", + _policyManagerConfigData: _policyManagerConfigData + }); + } + + function createVaultFromMockFundDeployer(IDispatcher _dispatcher, address _vaultLibAddress) + public + returns (address vaultProxyAddress_) + { + address mockFundDeployerAddress = makeAddr("createVaultFromMockFundDeployer: MockFundDeployer"); + address vaultOwner = makeAddr("createVaultFromMockFundDeployer: VaultOwner"); + + address originalFundDeployerAddress = _dispatcher.getCurrentFundDeployer(); + + // 1. Create MockFundDeployer with empty IMigrationHookHandler function calls + vm.mockCall({ + callee: mockFundDeployerAddress, + data: abi.encodeWithSelector(IMigrationHookHandler.invokeMigrationOutHook.selector), + returnData: "" + }); + vm.mockCall({ + callee: mockFundDeployerAddress, + data: abi.encodeWithSelector(IMigrationHookHandler.invokeMigrationInCancelHook.selector), + returnData: "" + }); + + // 2. Set MockFundDeployer as the current Dispatcher.FundDeployer + vm.prank(_dispatcher.getOwner()); + _dispatcher.setCurrentFundDeployer(mockFundDeployerAddress); + + // 3. Deploy new vaultProxy via the MockFundDeployer. + // Contract-ify a vault accessor by setting arbitrary bytecode, to pass isContract() requirement. + address prevVaultAccessorAddress = makeAddr("createVaultFromMockFundDeployer: VaultAccessor"); + vm.etch({target: prevVaultAccessorAddress, newRuntimeBytecode: "0x1"}); + + vm.prank(mockFundDeployerAddress); + vaultProxyAddress_ = _dispatcher.deployVaultProxy({ + _vaultLib: _vaultLibAddress, + _owner: vaultOwner, + _vaultAccessor: prevVaultAccessorAddress, + _fundName: "Test Vault Via Mock FundDeployer" + }); + + // 4. Re-set the original FundDeployer, if applicable + if (originalFundDeployerAddress != address(0)) { + vm.prank(_dispatcher.getOwner()); + _dispatcher.setCurrentFundDeployer(originalFundDeployerAddress); + } + + return vaultProxyAddress_; + } + + function buyShares(address _sharesBuyer, IComptroller _comptrollerProxy, uint256 _amountToDeposit) + internal + returns (uint256 sharesReceived_) + { + IERC20 denominationAsset = IERC20(_comptrollerProxy.getDenominationAsset()); + deal(address(denominationAsset), _sharesBuyer, _amountToDeposit); + + vm.startPrank(_sharesBuyer); + denominationAsset.approve(address(_comptrollerProxy), _amountToDeposit); + sharesReceived_ = _comptrollerProxy.buyShares({_investmentAmount: _amountToDeposit, _minSharesQuantity: 1}); + vm.stopPrank(); + } + + function buySharesOnBehalf( + address _sharesBuyer, + address _sharesRecipient, + IComptroller _comptrollerProxy, + uint256 _amountToDeposit + ) internal returns (uint256 sharesReceived_) { + IERC20 denominationAsset = IERC20(_comptrollerProxy.getDenominationAsset()); + deal(address(denominationAsset), _sharesBuyer, _amountToDeposit); + + vm.startPrank(_sharesRecipient); + denominationAsset.approve(address(_comptrollerProxy), _amountToDeposit); + sharesReceived_ = _comptrollerProxy.buySharesOnBehalf({ + _buyer: _sharesRecipient, + _investmentAmount: _amountToDeposit, + _minSharesQuantity: 1 + }); + vm.stopPrank(); + } + + function redeemSharesInKind(address _redeemer, IComptroller _comptrollerProxy, uint256 _sharesQuantity) + internal + returns (address[] memory payoutAssets_, uint256[] memory payoutAmounts_) + { + address[] memory noAssets = new address[](0); + + vm.prank(_redeemer); + return _comptrollerProxy.redeemSharesInKind(_redeemer, _sharesQuantity, noAssets, noAssets); + } + + function registerVaultCalls( + IFundDeployer _fundDeployer, + address[] memory _contracts, + bytes4[] memory _selectors, + bytes32[] memory _dataHashes + ) internal { + vm.prank(_fundDeployer.getOwner()); + + _fundDeployer.registerVaultCalls(_contracts, _selectors, _dataHashes); + } +} diff --git a/tests/utils/fees/FeeUtils.sol b/tests/utils/fees/FeeUtils.sol new file mode 100644 index 000000000..34542a7ac --- /dev/null +++ b/tests/utils/fees/FeeUtils.sol @@ -0,0 +1,18 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity 0.8.17; + +enum FeeHook { + Continuous, + PreBuyShares, + PostBuyShares, + PreRedeemShares +} + +enum SettlementType { + None, + Direct, + Mint, + Burn, + MintSharesOutstanding, + BurnSharesOutstanding +} diff --git a/tests/utils/fees/PerformanceFeeUtils.sol b/tests/utils/fees/PerformanceFeeUtils.sol new file mode 100644 index 000000000..84a9df5de --- /dev/null +++ b/tests/utils/fees/PerformanceFeeUtils.sol @@ -0,0 +1,13 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity 0.8.17; + +import {Test} from "forge-std/Test.sol"; + +import {IFeeManager} from "tests/interfaces/internal/IFeeManager.sol"; +import {IPerformanceFee} from "tests/interfaces/internal/IPerformanceFee.sol"; + +abstract contract PerformanceFeeUtils is Test { + function deployPerformanceFee(IFeeManager _feeManager) public returns (IPerformanceFee performanceFee_) { + return IPerformanceFee(deployCode("PerformanceFee.sol", abi.encode(address(_feeManager)))); + } +} diff --git a/tests/utils/policies/CumulativeSlippageTolerancePolicyUtils.sol b/tests/utils/policies/CumulativeSlippageTolerancePolicyUtils.sol new file mode 100644 index 000000000..582ee5e23 --- /dev/null +++ b/tests/utils/policies/CumulativeSlippageTolerancePolicyUtils.sol @@ -0,0 +1,47 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity 0.8.17; + +import {Test} from "forge-std/Test.sol"; + +import {IWETH} from "tests/interfaces/external/IWETH.sol"; +import {IAddressListRegistry} from "tests/interfaces/internal/IAddressListRegistry.sol"; +import {ICumulativeSlippageTolerancePolicy} from "tests/interfaces/internal/ICumulativeSlippageTolerancePolicy.sol"; +import {IPolicyManager} from "tests/interfaces/internal/IPolicyManager.sol"; +import {IValueInterpreter} from "tests/interfaces/internal/IValueInterpreter.sol"; + +abstract contract CumulativeSlippageTolerancePolicyUtils is Test { + function encodeCumulativeSlippageTolerancePolicySettings(uint64 _tolerance) + public + pure + returns (bytes memory settingsData_) + { + return abi.encode(_tolerance); + } + + function deployCumulativeSlippageTolerancePolicy( + IPolicyManager _policyManager, + IAddressListRegistry _addressListRegistry, + IValueInterpreter _valueInterpreter, + IWETH _wethToken, + uint256 _bypassableAdaptersListId, + uint256 _tolerancePeriodDuration, + uint256 _pricelessAssetBypassTimelock, + uint256 _pricelessAssetBypassTimeLimit + ) public returns (ICumulativeSlippageTolerancePolicy) { + return ICumulativeSlippageTolerancePolicy( + deployCode( + "CumulativeSlippageTolerancePolicy.sol", + abi.encode( + _policyManager, + _addressListRegistry, + _valueInterpreter, + _wethToken, + _bypassableAdaptersListId, + _tolerancePeriodDuration, + _pricelessAssetBypassTimelock, + _pricelessAssetBypassTimeLimit + ) + ) + ); + } +} diff --git a/tests/utils/protocols/aave/AaveV2Utils.sol b/tests/utils/protocols/aave/AaveV2Utils.sol new file mode 100644 index 000000000..5ea5d7ac8 --- /dev/null +++ b/tests/utils/protocols/aave/AaveV2Utils.sol @@ -0,0 +1,69 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity 0.8.17; + +import {Test} from "forge-std/Test.sol"; + +import {IAaveV2LendingPool} from "tests/interfaces/external/IAaveV2LendingPool.sol"; +import {IAaveV2Adapter} from "tests/interfaces/internal/IAaveV2Adapter.sol"; +import {IAaveV2ATokenListOwner} from "tests/interfaces/internal/IAaveV2ATokenListOwner.sol"; +import {IAddressListRegistry} from "tests/interfaces/internal/IAddressListRegistry.sol"; +import {IIntegrationManager} from "tests/interfaces/internal/IIntegrationManager.sol"; + +// Ethereum +address constant LENDING_POOL_ADDRESS_ETHEREUM = 0x7d2768dE32b0b80b7a3454c06BdAc94A69DDc7A9; +address constant LENDING_POOL_ADDRESS_PROVIDER_ADDRESS_ETHEREUM = 0xB53C1a33016B2DC2fF3653530bfF1848a515c8c5; + +// Polygon +address constant LENDING_POOL_ADDRESS_POLYGON = 0x8dFf5E27EA6b7AC08EbFdf9eB090F32ee9a30fcf; +address constant LENDING_POOL_ADDRESS_PROVIDER_ADDRESS_POLYGON = 0xd05e3E715d945B59290df0ae8eF85c1BdB684744; + +abstract contract AaveV2Utils is Test { + function deployAaveV2ATokenListOwnerAndAdapter( + IAddressListRegistry _addressListRegistry, + IIntegrationManager _integrationManager, + address _lendingPool, + address _lendingPoolAddressProvider + ) public returns (IAaveV2Adapter aaveV2Adapter_, IAaveV2ATokenListOwner aaveV2ATokenListOwner_) { + uint256 aTokenListId = _addressListRegistry.getListCount(); + + aaveV2ATokenListOwner_ = deployAaveV2ATokenListOwner({ + _addressListRegistry: _addressListRegistry, + _listDescription: "", + _lendingPoolAddressProvider: _lendingPoolAddressProvider + }); + + aaveV2Adapter_ = deployAaveV2Adapter({ + _integrationManager: _integrationManager, + _addressListRegistry: _addressListRegistry, + _aTokenListId: aTokenListId, + _lendingPool: _lendingPool + }); + + return (aaveV2Adapter_, aaveV2ATokenListOwner_); + } + + function deployAaveV2Adapter( + IIntegrationManager _integrationManager, + IAddressListRegistry _addressListRegistry, + uint256 _aTokenListId, + address _lendingPool + ) public returns (IAaveV2Adapter) { + bytes memory args = abi.encode(_integrationManager, _addressListRegistry, _aTokenListId, _lendingPool); + address addr = deployCode("AaveV2Adapter.sol", args); + return IAaveV2Adapter(addr); + } + + function deployAaveV2ATokenListOwner( + IAddressListRegistry _addressListRegistry, + string memory _listDescription, + address _lendingPoolAddressProvider + ) public returns (IAaveV2ATokenListOwner) { + bytes memory args = abi.encode(_addressListRegistry, _listDescription, _lendingPoolAddressProvider); + address addr = deployCode("AaveV2ATokenListOwner.sol", args); + return IAaveV2ATokenListOwner(addr); + } + + function getATokenAddress(address _token, address _lendingPool) internal returns (address) { + return IAaveV2LendingPool(_lendingPool).getReserveData(_token).aTokenAddress; + } +} diff --git a/tests/utils/protocols/kiln/KilnUtils.sol b/tests/utils/protocols/kiln/KilnUtils.sol new file mode 100644 index 000000000..8c500c137 --- /dev/null +++ b/tests/utils/protocols/kiln/KilnUtils.sol @@ -0,0 +1,89 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity 0.8.17; + +import {Test} from "forge-std/Test.sol"; +import {ExternalPositionUtils} from "tests/utils/core/ExternalPositionUtils.sol"; +import {UpdateType} from "tests/utils/core/ListRegistryUtils.sol"; + +import {IWETH} from "tests/interfaces/external/IWETH.sol"; +import {IAddressListRegistry} from "tests/interfaces/internal/IAddressListRegistry.sol"; +import {IDispatcher} from "tests/interfaces/internal/IDispatcher.sol"; +import {IExternalPositionManager} from "tests/interfaces/internal/IExternalPositionManager.sol"; +import {IKilnStakingPositionLib} from "tests/interfaces/internal/IKilnStakingPositionLib.sol"; +import {IKilnStakingPositionParser} from "tests/interfaces/internal/IKilnStakingPositionParser.sol"; + +enum Actions { + Stake, + ClaimFees, + WithdrawEth +} + +address constant STAKING_CONTRACT_ADDRESS_ETHEREUM = 0x0816DF553a89c4bFF7eBfD778A9706a989Dd3Ce3; + +abstract contract KilnUtils is Test, ExternalPositionUtils { + function deployKilnStaking( + address _stakingContract, + IWETH _wethToken, + IDispatcher _dispatcher, + IExternalPositionManager _externalPositionManager, + IAddressListRegistry _addressListRegistry + ) + public + returns ( + IKilnStakingPositionLib kilnStakingPositionLib_, + IKilnStakingPositionParser kilnStakingPositionParser_, + uint256 typeId_ + ) + { + address[] memory initialItems = new address[](1); + + initialItems[0] = _stakingContract; + + uint256 stakingContractsListId = _addressListRegistry.createList({ + _owner: address(_dispatcher), + _updateType: uint8(UpdateType.AddAndRemove), + _initialItems: initialItems + }); + + kilnStakingPositionLib_ = deployKilnStakingPositionLib(_wethToken); + kilnStakingPositionParser_ = deployKilnStakingPositionParser({ + _wethToken: _wethToken, + _addressListRegistry: _addressListRegistry, + _stakingContractsListId: stakingContractsListId + }); + + string[] memory labels = new string[](1); + labels[0] = "KILN_STAKING"; + + address[] memory libs = new address[](1); + libs[0] = address(kilnStakingPositionLib_); + + address[] memory parsers = new address[](1); + parsers[0] = address(kilnStakingPositionParser_); + + uint256[] memory typeIds = registerExternalPositions({ + _labels: labels, + _libs: libs, + _parsers: parsers, + _externalPositionManager: _externalPositionManager + }); + + return (kilnStakingPositionLib_, kilnStakingPositionParser_, typeIds[0]); + } + + function deployKilnStakingPositionParser( + IAddressListRegistry _addressListRegistry, + uint256 _stakingContractsListId, + IWETH _wethToken + ) public returns (IKilnStakingPositionParser) { + bytes memory args = abi.encode(_addressListRegistry, _stakingContractsListId, _wethToken); + address addr = deployCode("KilnStakingPositionParser.sol", args); + return IKilnStakingPositionParser(addr); + } + + function deployKilnStakingPositionLib(IWETH _weth) public returns (IKilnStakingPositionLib) { + bytes memory args = abi.encode(_weth); + address addr = deployCode("KilnStakingPositionLib.sol", args); + return IKilnStakingPositionLib(addr); + } +}