diff --git a/.changeset/beige-ladybugs-confess.md b/.changeset/beige-ladybugs-confess.md new file mode 100644 index 00000000000..e392a26d1ff --- /dev/null +++ b/.changeset/beige-ladybugs-confess.md @@ -0,0 +1,5 @@ +--- +"hardhat": patch +--- + +Added a notification when a new Hardhat version is available diff --git a/.changeset/bright-onions-switch.md b/.changeset/bright-onions-switch.md new file mode 100644 index 00000000000..03c26cffd10 --- /dev/null +++ b/.changeset/bright-onions-switch.md @@ -0,0 +1,5 @@ +--- +"@nomicfoundation/hardhat-chai-matchers": patch +--- + +Added support for Typed objects (thanks @RenanSouza2!) diff --git a/.changeset/curvy-cherries-beg.md b/.changeset/curvy-cherries-beg.md new file mode 100644 index 00000000000..7bfc3b19e36 --- /dev/null +++ b/.changeset/curvy-cherries-beg.md @@ -0,0 +1,7 @@ +--- +"@nomicfoundation/hardhat-chai-matchers": patch +"hardhat": patch +"@nomicfoundation/hardhat-viem": patch +--- + +Improved loading performance diff --git a/.changeset/dry-pianos-scream.md b/.changeset/dry-pianos-scream.md new file mode 100644 index 00000000000..d68408991c1 --- /dev/null +++ b/.changeset/dry-pianos-scream.md @@ -0,0 +1,5 @@ +--- +"hardhat": patch +--- + +Fixed a bug during project initialization when using yarn or pnpm diff --git a/.changeset/five-birds-invite.md b/.changeset/five-birds-invite.md new file mode 100644 index 00000000000..75af7c20a33 --- /dev/null +++ b/.changeset/five-birds-invite.md @@ -0,0 +1,6 @@ +--- +"hardhat": patch +--- + +Upgraded EDR to (https://github.com/NomicFoundation/edr/releases/tag/%40nomicfoundation%2Fedr%400.11.0): +- Replaced const enums with non-const enums in \*.d.ts files diff --git a/.changeset/lazy-hornets-clap.md b/.changeset/lazy-hornets-clap.md deleted file mode 100644 index 61606d5fb90..00000000000 --- a/.changeset/lazy-hornets-clap.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@nomicfoundation/hardhat-chai-matchers": patch ---- - -Fixed a problem when `.withArgs` was used with arrays with different length diff --git a/.changeset/modern-fishes-look.md b/.changeset/modern-fishes-look.md new file mode 100644 index 00000000000..bf302a7ff1a --- /dev/null +++ b/.changeset/modern-fishes-look.md @@ -0,0 +1,5 @@ +--- +"hardhat": patch +--- + +Added a fix to prevent submitting transactions with 0 priority fee (thanks @itsdevbear!) diff --git a/.changeset/polite-mugs-cry.m b/.changeset/polite-mugs-cry.m deleted file mode 100644 index b03cb1f534e..00000000000 --- a/.changeset/polite-mugs-cry.m +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@nomiclabs/hardhat-etherscan": patch ---- - -Fix URLs for the Aurora networks (thanks @zZoMROT!) diff --git a/.changeset/thin-peaches-taste.md b/.changeset/thin-peaches-taste.md new file mode 100644 index 00000000000..57044cfe199 --- /dev/null +++ b/.changeset/thin-peaches-taste.md @@ -0,0 +1,5 @@ +--- +"hardhat": patch +--- + +feat: support chainId values above 2^32 - 1 for local account transac… diff --git a/.changeset/twelve-mails-heal.md b/.changeset/twelve-mails-heal.md new file mode 100644 index 00000000000..c06c6ab6639 --- /dev/null +++ b/.changeset/twelve-mails-heal.md @@ -0,0 +1,5 @@ +--- +"@nomicfoundation/hardhat-verify": patch +--- + +Added support for programmatic verification in Sourcify diff --git a/.changeset/weak-frogs-care.md b/.changeset/weak-frogs-care.md new file mode 100644 index 00000000000..b19f6e7db93 --- /dev/null +++ b/.changeset/weak-frogs-care.md @@ -0,0 +1,5 @@ +--- +"hardhat": patch +--- + +Support chainId values above 2^32 - 1 for local account transactions diff --git a/.circleci/config.yml b/.circleci/config.yml new file mode 100644 index 00000000000..ad53a8e4982 --- /dev/null +++ b/.circleci/config.yml @@ -0,0 +1,26 @@ +# Use the latest 2.1 version of CircleCI pipeline process engine. +# See: https://circleci.com/docs/configuration-reference + +version: 2.1 +executors: + my-custom-executor: + docker: + - image: cimg/base:stable + auth: + # ensure you have first added these secrets + # visit app.circleci.com/settings/project/github/Dargon789/foundry/environment-variables + username: $DOCKER_HUB_USER + password: $DOCKER_HUB_PASSWORD +jobs: + web3-defi-game-project-: + + executor: my-custom-executor + steps: + - checkout + - run: | + # echo Hello, World! + +workflows: + my-custom-workflow: + jobs: + - web3-defi-game-project- diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json new file mode 100644 index 00000000000..724e1f254fb --- /dev/null +++ b/.devcontainer/devcontainer.json @@ -0,0 +1,15 @@ +{ + "name": "Hardhat + EDR", + "image": "mcr.microsoft.com/devcontainers/base:bullseye", + "features": { + "ghcr.io/devcontainers/features/node:1": { + "version": "16" /* Keep in sync with the oldest version of Node.js that Hardhat supports */ + }, + "ghcr.io/devcontainers/features/rust:1": { + "version": "1.70" /* Keep in sync with rust-toolchain */, + "profile": "default" + } + }, + /* libudev-dev is required by hardhat-ledger. pkg-config is required by EDR to use OpenSSL */ + "postCreateCommand": "sudo apt update && sudo apt install -y libudev-dev pkg-config" +} diff --git a/.gitattributes b/.gitattributes index 4583bf4050a..6428757b1a8 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,3 +1,6 @@ *.sol linguist-language=Solidity # prevent github actions to checkout files with crlf line endings -* -text +* text=auto + +*.sol text eol=lf +*.d.ts text eol=lf diff --git a/.github/ISSUE_TEMPLATE/custom.md b/.github/ISSUE_TEMPLATE/custom.md new file mode 100644 index 00000000000..f19013ff17e --- /dev/null +++ b/.github/ISSUE_TEMPLATE/custom.md @@ -0,0 +1,17 @@ +--- +name: +about: +title: '' +labels: '' +assignees: '' + +--- + +### Summary +A clear and concise description of the issue or feature request. + +### Motivation +Why is this change needed? What problem does it solve? + +### Details +Provide more details, such as steps to reproduce for a bug, or implementation ideas for a feature. diff --git a/.github/ISSUE_TEMPLATE/feature-request.yml b/.github/ISSUE_TEMPLATE/feature-request.yml index f959750f0cd..65a1636f60d 100644 --- a/.github/ISSUE_TEMPLATE/feature-request.yml +++ b/.github/ISSUE_TEMPLATE/feature-request.yml @@ -1,15 +1,18 @@ +--- name: Feature request -description: Suggest a new feature -body: - - type: textarea - id: feature-description - attributes: - label: "Describe the feature" - description: "A description of what you would like us to add to Hardhat and your use case for it" - validations: - required: true - - type: input - id: search-terms - attributes: - label: "Search terms" - description: "Include the search terms you used before opening this issue. This will make it easier for others to find it." +about: Suggest an idea for this project +title: '' +labels: '' +assignees: '' + +--- + +**Is your feature request related to a problem? Please describe.** A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] + +**Describe the solution you'd like** A clear and concise description of what you want to happen. + +**Describe alternatives you've considered** A clear and concise description of any alternative solutions or features you've considered. + +**Additional context** Add any other context or screenshots about the feature request here. + +--- diff --git a/.github/ISSUE_TEMPLATE/hardhat-3-alpha.yml b/.github/ISSUE_TEMPLATE/hardhat-3-alpha.yml new file mode 100644 index 00000000000..b3345f957ba --- /dev/null +++ b/.github/ISSUE_TEMPLATE/hardhat-3-alpha.yml @@ -0,0 +1,8 @@ +name: Hardhat 3 Alpha feedback +description: Give feedback about the Hardhat 3 Alpha. +labels: hardhat-3-alpha +body: + - type: textarea + attributes: + label: "Feedback" + placeholder: "Your feedback" diff --git a/.github/ISSUE_TEMPLATE/other-issue.md b/.github/ISSUE_TEMPLATE/other-issue.md index 438af3e4bee..51dee50954d 100644 --- a/.github/ISSUE_TEMPLATE/other-issue.md +++ b/.github/ISSUE_TEMPLATE/other-issue.md @@ -1,4 +1,12 @@ --- name: Other issue about: Other kind of issue. Please don't use this to ask questions. +title: '' +labels: '' +assignees: '' + --- + +### Description + +Please provide a clear and concise description of the issue. diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index ccb3f96bcc8..1ae7e34d852 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -7,6 +7,15 @@ Please: - consider the checklist items below - keep the ones that make sense for your PR, and - DELETE the items that DON'T make sense for your PR. + +## Note about small PRs and airdrop farming + +We generally really appreciate external contributions, and strongly encourage meaningful additions and fixes! However, due to a recent increase in small PRs potentially created to farm airdrops, we might need to close a PR without explanation if any of the following apply: + +- It is a change of very minor value that still requires additional review time/fixes (e.g. PRs fixing trivial spelling errors that can’t be merged in less than a couple of minutes due to incorrect suggestions) +- It introduces inconsequential changes (e.g. rewording phrases) +- The author of the PR does not respond in a timely manner +- We suspect the Github account of the author was created for airdrop farming --> - [ ] Because this PR includes a **bug fix**, relevant tests have been included. diff --git a/.github/actions/setup-env/action.yml b/.github/actions/setup-env/action.yml new file mode 100644 index 00000000000..4a1d77f36b3 --- /dev/null +++ b/.github/actions/setup-env/action.yml @@ -0,0 +1,43 @@ +name: Setup env +description: Sets up node and pnpm + +inputs: + pnpm-version: + description: Version of pnpm to install + required: false + default: "9" + node-version: + description: Version of node to install + required: false + default: "18" + cache-save: + description: Whether to save the pnpm cache + required: false + default: "false" +outputs: + cache-hit: + description: Whether the cache was restored + value: ${{ steps.setup-node.outputs.cache-hit || steps.cache-restore.outputs.cache-hit }} + +runs: + using: composite + steps: + - uses: pnpm/action-setup@v4 + with: + version: ${{ inputs.pnpm-version }} + - uses: actions/setup-node@v4 + id: setup-node + with: + node-version: ${{ inputs.node-version }} + cache: ${{ inputs.cache-save == 'true' && 'pnpm' || '' }} + cache-dependency-path: "**/pnpm-lock.yaml" + - id: pnpm + if: inputs.cache-save == 'false' + run: pnpm store path --silent | xargs -I {} -0 echo "path={}" | tee -a $GITHUB_OUTPUT + shell: bash + - uses: actions/cache/restore@v4 + id: cache-restore + if: inputs.cache-save == 'false' + with: + path: ${{ steps.pnpm.outputs.path }} + key: node-cache-${{ runner.os }}-pnpm-${{ hashFiles('**/pnpm-lock.yaml') }} diff --git a/.github/config/regression-tests.yml b/.github/config/regression-tests.yml new file mode 100644 index 00000000000..d5b63616ebf --- /dev/null +++ b/.github/config/regression-tests.yml @@ -0,0 +1,806 @@ +repositories: + Elytro-eth/soul-wallet-contract: + forge-version: v0.3.0 + hardhat-config: | + export default { + "paths": { + "sources": "contracts", + "tests": { + "solidity": "test" + } + }, + "solidity": { + "version": "0.8.24", + "remappings": [ + "@soulwallet-core/=lib/soulwallet-core/", + "@source/=contracts/", + "@arbitrum/nitro-contracts=lib/nitro-contracts/", + "@solady=lib/solady/", + "@solenv=lib/solenv/src/", + "@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/", + "@account-abstraction/=lib/account-abstraction/", + "@crypto-lib/=lib/crypto-lib/src/", + "forge-std/=lib/forge-std/src/", + "@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/" + ], + "settings": { + "viaIR": true, + "optimizer": { + "enabled": true, + "runs": 100000 + }, + "evmVersion": "cancun", + "metadata": { + "bytecodeHash": "none", + "appendCBOR": false + } + } + }, + "solidityTest": { + "testFail": true, + "rpcEndpoints": { + "goerli": "${GOERLI_RPC_URL}", + "arbitrumgoerli": "${ARBITRUM_GOERLI_RPC_URL}", + "optimismgoerli": "${OPTIMISM_GOERLI_RPC_URL}", + "etherum": "${ETHERUM_RPC_URL}", + "arbitrum": "${ARBITRUM_RPC_URL}", + "optimism": "${OPTIMISM_RPC_URL}", + "scrollsepolia": "${SCROLL_SEPOLIA_RPC_URL}", + "basesepolia": "${BASE_SEPOLIA_RPC_URL}" + } + } + }; + ignore: | + # unknown cheatcode with selector 0xce817d47 (startBroadcast(uint256)) + test/hooks/2fa/Crypto2FAHook.t.sol + test/automation/ClaimInterest.t.sol + test/modules/socialRecovery/SocialRecoveryModule.t.sol + + # unknown cheatcode with selector 0xf0259e92 (breakpoint(string)) + test/paymaster/ERC20Paymaster.t.sol + ref: fc7cc084563ad1bda870df841b77caa9ee3a3661 + PaulRBerg/prb-math: + forge-version: v0.3.0 + hardhat-config: | + export default { + "paths": { + "sources": "src", + "tests": { + "solidity": "test" + } + }, + "solidity": { + "version": "0.8.26", + "settings": { + "optimizer": { + "enabled": true, + "runs": 1000000 + }, + "evmVersion": "shanghai" + } + }, + "solidityTest": { + "fuzz": { + "runs": 256 + } + } + }; + ref: 93be53541f39a0c1e80818a9183b2acb3908ae74 + PaulRBerg/prb-proxy: + forge-version: v0.3.0 + hardhat-config: | + export default { + "paths": { + "sources": "src", + "tests": { + "solidity": "test" + } + }, + "solidity": { + "version": "0.8.23", + "settings": { + "optimizer": { + "enabled": true, + "runs": 200 + }, + "evmVersion": "paris", + "metadata": { + "bytecodeHash": "none", + "appendCBOR": false + } + } + }, + "solidityTest": { + "fuzz": { + "runs": 1000, + "maxTestRejects": 1000000 + }, + "fsPermissions": { + "read": [ + "./out-optimized" + ] + }, + "rpcEndpoints": { + "arbitrum": "https://arbitrum-mainnet.infura.io/v3/${API_KEY_INFURA}", + "avalanche": "https://avalanche-mainnet.infura.io/v3/${API_KEY_INFURA}", + "bnb_smart_chain": "https://bsc-dataseed.binance.org", + "gnosis_chain": "https://rpc.gnosischain.com", + "goerli": "https://goerli.infura.io/v3/${API_KEY_INFURA}", + "localhost": "http://localhost:8545", + "mainnet": "https://eth-mainnet.g.alchemy.com/v2/${API_KEY_ALCHEMY}", + "optimism": "https://optimism-mainnet.infura.io/v3/${API_KEY_INFURA}", + "polygon": "https://polygon-mainnet.infura.io/v3/${API_KEY_INFURA}", + "sepolia": "https://sepolia.infura.io/v3/${API_KEY_INFURA}" + } + } + }; + ref: e45f5325d4b6003227a6c4bdaefac9453f89de2e + PaulRBerg/prb-test: + forge-version: v0.3.0 + hardhat-config: | + export default { + "paths": { + "sources": "src", + "tests": { + "solidity": "test" + } + }, + "solidity": { + "version": "0.8.26", + "settings": { + "optimizer": { + "enabled": false + }, + "evmVersion": "shanghai" + } + }, + "solidityTest": { + "fuzz": { + "runs": 100, + "maxTestRejects": 100000 + } + } + }; + ref: cd07166bdd12c7c4a899cb53951653b53939a644 + ProjectOpenSea/seaport: + forge-version: v0.3.0 + hardhat-config: | + export default { + "paths": { + "sources": "contracts", + "tests": { + "solidity": "test/foundry" + } + }, + "solidity": { + "version": "0.8.24", + "remappings": [ + "@rari-capital/solmate/=lib/solmate/", + "ds-test/=lib/ds-test/src/", + "forge-std/=lib/forge-std/src/", + "murky/=lib/murky/src/", + "@openzeppelin/=lib/openzeppelin-contracts/", + "solarray/=lib/solarray/src/", + "solady/=lib/solady/", + "seaport-sol/=lib/seaport-sol/", + "seaport-types/=lib/seaport-types/", + "seaport-core/=lib/seaport-core/", + "seaport/=contracts/" + ], + "settings": { + "evmVersion": "cancun", + "optimizer": { + "runs": 4294967292 + } + } + }, + "solidityTest": { + "fuzz": { + "runs": 1000 + }, + "fsPermissions": { + "read": [ + "./optimized-out", + "./reference-out" + ], + "write": [ + "./call-metrics.txt", + "./mutation-metrics.txt", + "./assume-metrics.txt", + "./fuzz_debug.json" + ] + } + } + }; + ignore: | + # Invalid hex bytecode for contract (this is caused by the lack of support for dynamic linking) + test/foundry + ref: 585b2ef8376dd979171522027bbdb048c2a4999c + Uniswap/UniswapX: + forge-version: v0.3.0 + hardhat-config: | + export default { + "paths": { + "sources": "src", + "tests": { + "solidity": "test" + } + }, + "solidity": { + "version": "0.8.24", + "remappings": [ + "ds-test/=lib/forge-std/lib/ds-test/src/", + "forge-gas-snapshot/=lib/forge-gas-snapshot/src/", + "forge-std/=lib/forge-std/src/", + "openzeppelin-contracts/=lib/openzeppelin-contracts/contracts/", + "permit2/=lib/permit2/", + "solmate/=lib/solmate/", + "solarray/=lib/solarray/src/" + ], + "settings": { + "optimizer": { + "runs": 1000000 + } + } + }, + "solidityTest": { + "ffi": true, + "fsPermissions": { + "readWrite": [ + ".forge-snapshots/" + ] + } + } + }; + ignore: | + */integration/* + + # unknown cheatcode with selector 0x7fb5297f (startBroadcast()) + test/script/DeployDutch.t.sol + test/script/DeployExclusiveDutch.t.sol + test/script/DeployPriorityOrderReactor.t.sol + + # unknown cheatcode with selector 0x3cad9d7b (startSnapshotGas(string)) + test/base/EthOutput.t.sol + test/validation-contracts/ExclusiveFillerValidation.t.sol + test/lib/NonLinearDutchDecayLib.t.sol + test/base/ProtocolFees.t.sol + test/fill-macros/DirectTakerFillMacro.t.sol + test/executors/SwapRouter02Executor.t.sol + + # unknown cheatcode with selector 0xdd9fca12 (snapshotGasLastCall(string)) + test/base/BaseReactor.t.sol + test/reactors/PriorityOrderReactor.t.sol + test/reactors/V3DutchOrderReactor.t.sol + test/reactors/V2DutchOrderReactor.t.sol + test/reactors/LimitOrderReactor.t.sol + test/reactors/BaseDutchOrderReactor.t.sol + test/reactors/ExclusiveDutchOrderReactor.t.sol + test/reactors/DutchOrderReactor.t.sol + ref: 4013dfa4bc53b823b406b035a9b5eb579607eb99 + Vectorized/solady: + forge-version: v0.3.0 + hardhat-config: | + export default { + "paths": { + "sources": "src", + "tests": { + "solidity": "test" + } + }, + "solidity": { + "version": "0.8.28", + "remappings": [ + "forge-std=test/utils/forge-std/" + ], + "settings": { + "optimizer": { + "enabled": true, + "runs": 1000 + }, + "evmVersion": "cancun" + } + }, + "solidityTest": { + "blockGasLimit": BigInt(100000000), + "fsPermissions": { + "read": [ + "./test/data" + ] + }, + "fuzz": { + "runs": 256 + }, + "invariant": { + "depth": 15, + "runs": 10 + } + } + }; + ignore: | + */*7702* + */*Transient* + */ext/ithaca/* + */ext/zksync/* + + # testP256Normalized(uint256,bytes32): unknown cheatcode with selector 0xc453949e (publicKeyP256(uint256)) + test/P256.t.sol + test/WebAuthn.t.sol + + # https://github.com/NomicFoundation/hardhat/issues/6509 + # testBumpSlot(bytes32,uint256): Unknown error + test/LibStorage.t.sol + + # https://github.com/NomicFoundation/hardhat/issues/6509 + # testTargetGenerate(): Transaction reverted: contract call run out of gas and made the transaction revert + test/DeploylessPredeployQueryer.t.sol + ref: c9e079c0ca836dcc52777a1fa7227ef28e3537b3 + foundry-rs/forge-std: + forge-version: v0.3.0 + hardhat-config: | + export default { + "paths": { + "sources": "src", + "tests": { + "solidity": "test" + } + }, + "solidity": { + "version": "0.8.26", + "settings": { + "optimizer": { + "enabled": true, + "runs": 200 + } + } + }, + "solidityTest": { + "fsPermissions": { + "readWrite": [ + "./" + ] + }, + "rpcEndpoints": { + "mainnet": "https://eth-mainnet.alchemyapi.io/v2/WV407BEiBmjNJfKo9Uo_55u0z0ITyCOX", + "optimism_sepolia": "https://sepolia.optimism.io/", + "arbitrum_one_sepolia": "https://sepolia-rollup.arbitrum.io/rpc/", + "needs_undefined_env_var": "${UNDEFINED_RPC_URL_PLACEHOLDER}" + } + } + }; + ignore: | + # test_DeriveRememberKey(): unknown cheatcode with selector 0x6229498b (deriveKey(string,uint32)) + test/StdCheats.t.sol + + # StdUtilsForkTest.setUp(): Could not instantiate forked environment. Fork host: 'eth-mainnet.alchemyapi.io' (this is caused by using an invalid mainnet rpc endpoint) + test/StdUtils.t.sol + + # test_RevertIf_ChainBubbleUp(): call did not revert as expected (this is caused by using an invalid mainnet rpc endpoint) + # test_ChainRpcInitialization(): assertion failed: https://eth-mainnet.alchemyapi.io/v2/WV407BEiBmjNJfKo9Uo_55u0z0ITyCOX != https://eth.merkle.io + test/StdChains.t.sol + ref: 8ba9031ffcbe25aa0d1224d3ca263a995026e477 + kalidao/keep: + forge-version: v0.3.0 + hardhat-config: | + export default { + "paths": { + "sources": "contracts", + "tests": { + "solidity": "test" + } + }, + "solidity": { + "version": "0.8.18", + "remappings": [ + "@std/=lib/forge-std/src/", + "@solady/=lib/solady/", + "ds-test/=lib/forge-std/lib/ds-test/src/", + "forge-std/=lib/forge-std/src/" + ], + "settings": { + "optimizer": { + "runs": 9999999 + } + } + }, + "solidityTest": { + "testFail": true + } + }; + ref: 21213d34042b8a5a68afeb590f43018f08c81a58 + mds1/multicall: + forge-version: v0.3.0 + hardhat-config: | + export default { + "paths": { + "sources": "src", + "tests": { + "solidity": "src/test" + } + }, + "solidity": { + "version": "0.8.12", + "settings": { + "optimizer": { + "enabled": true, + "runs": 10000000 + } + }, + "remappings": [ + "forge-std/=lib/forge-std/src/", + "ds-test/=lib/forge-std/lib/ds-test/src/" + ] + }, + "solidityTest": { + "fuzz": { + "runs": 1000 + } + } + }; + ref: 19da7a56668b7b284901ef0551edb23905c6cd53 + pancakeswap/infinity-core: + forge-version: v0.3.0 + hardhat-config: | + export default { + "paths": { + "sources": "src", + "tests": { + "solidity": "test" + } + }, + "solidity": { + "version": "0.8.26", + "remappings": [ + "ds-test/=lib/forge-std/lib/ds-test/src/", + "forge-std/=lib/forge-std/src/", + "@openzeppelin/=lib/openzeppelin-contracts/", + "solmate/=lib/solmate/", + "forge-gas-snapshot/=lib/forge-gas-snapshot/src/" + ], + "settings": { + "viaIR": true, + "optimizer": { + "runs": 25666 + }, + "evmVersion": "cancun", + "metadata": { + "bytecodeHash": "none" + } + } + }, + "solidityTest": { + "testFail": true, + "ffi": true, + "fsPermissions": { + "readWrite": [ + ".forge-snapshots/" + ], + "read": [ + "./foundry-out", + "./script/config", + "./test/pool-cl/bin", + "./test/pool-bin/bin" + ] + }, + "blockGasLimit": BigInt(300000000), + "fuzz": { + "runs": 5 + } + } + }; + ignore: | + # https://github.com/NomicFoundation/hardhat/issues/6509 + # TokenLocker.setUp(): Transaction reverted without a reason string + test/vault/VaultReentrancy.t.sol + + # https://github.com/NomicFoundation/hardhat/issues/6509 + # The test is not safe to replay because it uses impure cheatcodes: function ffi(string[] calldata commandInput) external returns (bytes memory result); + # TickMathTestTest.test_getTickAtSqrtRatio_matchesJavascriptImplWithin1(): EvmError: Revert + # TickMathTestTest.test_getSqrtRatioAtTick_matchesJavaScriptImplByOneHundrethOfABip(): EvmError: Revert + test/pool-cl/libraries/TickMath.t.sol + + # unknown cheatcode with selector 0x3cad9d7b (startSnapshotGas(string)) + test/pool-cl/libraries/BitMath.t.sol + test/pool-cl/libraries/CLPosition.t.sol + test/pool-cl/libraries/LiquidityMath.t.sol + test/pool-cl/libraries/SqrtPriceMath.t.sol + test/pool-cl/libraries/SwapMath.t.sol + test/pool-cl/libraries/Tick.t.sol + + # unknown cheatcode with selector 0x51db805a (snapshotValue(string,uint256)) + test/pool-bin/BinPoolManager.t.sol + test/pool-cl/CLPoolManager.t.sol + test/vault/Vault.t.sol + + # unknown cheatcode with selector 0xdd9fca12 (snapshotGasLastCall(string)) + test/Extsload.t.sol + test/pool-bin/BinCustomCurveHook.t.sol + test/pool-bin/BinHook.t.sol + test/pool-bin/BinMintBurnFeeHook.t.sol + test/pool-bin/BinPoolManager.t.sol + test/pool-bin/libraries/BinPoolSwap.t.sol + test/pool-cl/CLCustomCurveHook.t.sol + test/pool-cl/CLMintBurnFeeHook.t.sol + test/pool-cl/libraries/TickBitmap.t.sol + ref: 9a050c44cdf801fd19753409e6a03a8026a1fd09 + pcaversaccio/createx: + forge-version: v0.3.0 + hardhat-config: | + export default { + "paths": { + "sources": "src", + "tests": { + "solidity": "test" + } + }, + "solidity": { + "version": "0.8.23", + "remappings": [ + "solady/=lib/solady/src/", + "forge-std/=lib/forge-std/src/", + "openzeppelin/=lib/openzeppelin-contracts/contracts/" + ], + "settings": { + "optimizer": { + "enabled": true, + "runs": 10000000 + }, + "viaIR": false, + "evmVersion": "paris", + "metadata": { + "bytecodeHash": "none" + } + } + }, + "solidityTest": { + "fuzz": { + "runs": 100 + }, + "fsPermissions": { + "readWrite": [ + "./" + ] + }, + "invariant": { + "runs": 256, + "depth": 15 + } + } + }; + ignore: | + # unknown cheatcode with selector 0x9cd23835 (snapshotState()) + test/public/CREATE2/CreateX.deployCreate2AndInit_4Args_CustomiseSalt.t.sol + test/public/CREATE2/CreateX.deployCreate2AndInit_4Args_CustomiseSalt.t.sol + test/public/CREATE2/CreateX.deployCreate2AndInit_5Args.t.sol + test/public/CREATE2/CreateX.deployCreate2AndInit_5Args.t.sol + test/public/CREATE2/CreateX.deployCreate2Clone_3Args.t.sol + test/public/CREATE3/CreateX.deployCreate3AndInit_4Args_CustomiseRefundAddress.t.sol + test/public/CREATE3/CreateX.deployCreate3AndInit_4Args_CustomiseRefundAddress.t.sol + test/public/CREATE2/CreateX.deployCreate2_2Args.t.sol + test/public/CREATE3/CreateX.deployCreate3AndInit_3Args.t.sol + test/public/CREATE3/CreateX.deployCreate3AndInit_3Args.t.sol + test/public/CREATE3/CreateX.deployCreate3_2Args.t.sol + test/public/CREATE3/CreateX.deployCreate3AndInit_5Args.t.sol + test/public/CREATE3/CreateX.deployCreate3AndInit_5Args.t.sol + test/public/CREATE3/CreateX.deployCreate3_1Arg.t.sol + test/public/CREATE3/CreateX.deployCreate3AndInit_4Args_CustomiseSalt.t.sol + test/public/CREATE3/CreateX.deployCreate3AndInit_4Args_CustomiseSalt.t.sol + test/internal/CreateX._generateSalt.t.sol + ref: ac7e49b93030145a646c6cffd62a81f447422309 + sablier-labs/lockup: + env: | + RPC_URL_MAINNET="https://eth-mainnet.g.alchemy.com/v2/" + forge-version: v0.3.0 + hardhat-config: | + export default { + "paths": { + "sources": "src", + "tests": { + "solidity": "tests" + } + }, + "solidity": { + "version": "0.8.26", + "remappings": [ + "@openzeppelin/contracts/=node_modules/@openzeppelin/contracts/", + "@prb/math/=node_modules/@prb/math/", + "forge-std/=node_modules/forge-std/", + "solady/=node_modules/solady/", + "solarray/=node_modules/solarray/" + ], + "settings": { + "optimizer": { + "enabled": true, + "runs": 570 + }, + "evmVersion": "shanghai", + "metadata": { + "bytecodeHash": "none" + } + } + }, + "solidityTest": { + "fsPermissions": { + "read": [ + "./out-optimized", + "package.json" + ], + "readWrite": [ + "./benchmark/results", + "./script/" + ] + }, + "blockGasLimit": BigInt(9223372036854775807), + "fuzz": { + "runs": 50, + "maxTestRejects": 1000000 + }, + "invariant": { + "runs": 20, + "depth": 20, + "failOnRevert": true, + "callOverride": false + }, + "sender": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", + "rpcEndpoints": { + "arbitrum": "${ARBITRUM_RPC_URL}", + "arbitrum_sepolia": "https://arbitrum-sepolia-rpc.publicnode.com", + "avalanche": "${AVALANCHE_RPC_URL}", + "base": "https://mainnet.base.org", + "base_sepolia": "https://sepolia.base.org", + "berachain_artio": "https://bartio.rpc.berachain.com/", + "blast": "https://rpc.blast.io", + "blast_sepolia": "https://sepolia.blast.io", + "bnb": "https://bsc-dataseed.binance.org", + "core_dao": "https://rpc.coredao.org", + "gnosis": "https://rpc.gnosischain.com", + "lightlink": "https://replicator.phoenix.lightlink.io/rpc/v1", + "linea": "https://rpc.linea.build", + "linea_sepolia": "https://rpc.sepolia.linea.build", + "localhost": "http://localhost:8545", + "mainnet": "${MAINNET_RPC_URL}", + "mode": "https://mainnet.mode.network/", + "mode_sepolia": "https://sepolia.mode.network/", + "morph": "https://rpc.morphl2.io", + "optimism": "${OPTIMISM_RPC_URL}", + "optimism_sepolia": "https://sepolia.optimism.io", + "polygon": "${POLYGON_RPC_URL}", + "scroll": "https://rpc.scroll.io/", + "sei": "https://evm-rpc.sei-apis.com", + "sei_testnet": "https://evm-rpc.arctic-1.seinetwork.io", + "sepolia": "${SEPOLIA_RPC_URL}", + "superseed": "https://mainnet.superseed.xyz", + "superseed_sepolia": "https://sepolia.superseed.xyz", + "taiko_hekla": "https://rpc.hekla.taiko.xyz", + "taiko_mainnet": "https://rpc.mainnet.taiko.xyz" + } + } + }; + ignore: | + # Invalid hex bytecode for contract (this is caused by the lack of support for dynamic linking) + tests + ref: a8528a6d0ca25f4f36eb9327fc87e08dc78ad0a6 + sablier-labs/v2-periphery: + env: | + RPC_URL_MAINNET="https://eth-mainnet.g.alchemy.com/v2/" + forge-version: v0.3.0 + hardhat-config: | + export default { + "paths": { + "sources": "src", + "tests": { + "solidity": "test" + } + }, + "solidity": { + "version": "0.8.26", + "remappings": [ + "@openzeppelin/contracts/=node_modules/@openzeppelin/contracts/", + "@prb/math/=node_modules/@prb/math/", + "@sablier/v2-core/=node_modules/@sablier/v2-core/", + "forge-std/=node_modules/forge-std/", + "solady/=node_modules/solady/" + ], + "settings": { + "optimizer": { + "enabled": true, + "runs": 10000 + }, + "evmVersion": "shanghai", + "metadata": { + "bytecodeHash": "none" + } + } + }, + "solidityTest": { + "blockTimestamp": BigInt(1714518000), + "fsPermissions": { + "read": [ + "./out-optimized", + "package.json" + ], + "readWrite": [ + "./benchmark/results", + "./cache" + ] + }, + "blockGasLimit": BigInt(9223372036854775807), + "sender": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", + "fuzz": { + "runs": 20, + "maxTestRejects": 1000000 + }, + "rpcEndpoints": { + "arbitrum": "${ARBITRUM_RPC_URL}", + "arbitrum_sepolia": "https://arbitrum-sepolia.blockpi.network/v1/rpc/public", + "avalanche": "${AVALANCHE_RPC_URL}", + "base": "https://mainnet.base.org", + "base_sepolia": "https://sepolia.base.org", + "bnb": "https://bsc-dataseed.binance.org", + "gnosis": "https://rpc.gnosischain.com", + "localhost": "http://localhost:8545", + "mainnet": "${MAINNET_RPC_URL}", + "optimism": "${OPTIMISM_RPC_URL}", + "optimism_sepolia": "https://sepolia.optimism.io", + "polygon": "${POLYGON_RPC_URL}", + "scroll": "https://rpc.scroll.io/", + "sepolia": "${SEPOLIA_RPC_URL}" + } + } + }; + ignore: | + # unknown cheatcode with selector 0x6229498b (deriveKey(string,uint32)) + test/utils/BaseScript.t.sol + + # Could not instantiate forked environment. Received invalid url. (this is caused by using an invalid url for one of the rpc endpoints) + test/fork/assets/USDC.t.sol + test/fork/assets/USDT.t.sol + ref: c3ea8d7f7aab4cb33c6b4517ba38d32ca35b1257 + transmissions11/solmate: + forge-version: v0.3.0 + hardhat-config: | + export default { + "paths": { + "sources": "src", + "tests": { + "solidity": "src/test" + } + }, + "solidity": { + "version": "0.8.15", + "remappings": [ + "ds-test/=lib/ds-test/src/" + ], + "settings": { + "optimizer": { + "runs": 1000000 + }, + "metadata": { + "bytecodeHash": "none" + } + } + }, + "solidityTest": { + "testFail": true + } + }; + ref: c93f7716c9909175d45f6ef80a34a650e2d24e56 + +runners: + ubuntu-latest: {} + windows-latest: {} + macos-latest: {} + +commands: + forge build: + pattern: 'Compiling (\d+) files with Solc \d+\.\d+' + template: "Compiled ${0} file(s)" + forge test: + pattern: 'Ran \d+ test suites in \d+\.\d+m?s \(\d+\.\d+m?s CPU time\): (\d+) tests passed, (\d+) failed, (\d+) skipped \((\d+) total tests\)' + template: "Ran ${3} tests (${0} passed, ${1} failed, ${2} skipped)" + hardhat compile: + pattern: 'Compiled (\d+) Solidity files with solc \d+\.\d+' + template: "Compiled ${0} file(s)" + hardhat test solidity: + pattern: 'Run (?:Failed|Passed): (\d+) tests, (\d+) passed, (\d+) failed, (\d+) skipped \(duration: \d+ ms\)' + template: "Ran ${0} tests (${1} passed, ${2} failed, ${3} skipped)" diff --git a/.github/dependabot.yml b/.github/dependabot.yml deleted file mode 100644 index 165b1817afd..00000000000 --- a/.github/dependabot.yml +++ /dev/null @@ -1,12 +0,0 @@ -# Please see the documentation for all configuration options: -# https://help.github.com/github/administering-a-repository/configuration-options-for-dependency-updates - -version: 2 -updates: - - package-ecosystem: "npm" - directory: "/" - schedule: - interval: "daily" - allow: - - dependency-name: "@solidity-parser/parser" - versioning-strategy: increase diff --git a/.github/workflows/LATEST_DEPENDENCY_VERSIONS.yml b/.github/workflows/LATEST_DEPENDENCY_VERSIONS.yml index 8247aaffcf5..c5c8dfdfc75 100644 --- a/.github/workflows/LATEST_DEPENDENCY_VERSIONS.yml +++ b/.github/workflows/LATEST_DEPENDENCY_VERSIONS.yml @@ -6,28 +6,32 @@ on: workflow_dispatch: jobs: - test-without-yarn-lock: - name: Test without yarn.lock + test-without-pnpm-lock-yaml: + name: Test without pnpm-lock.yaml strategy: matrix: system: ["ubuntu-latest", "windows-latest"] runs-on: ${{ matrix.system }} steps: + - uses: actions/checkout@v2 + - uses: pnpm/action-setup@v2 + with: + version: 8 - uses: actions/setup-node@v2 with: - node-version: 14 - - uses: actions/checkout@v2 - - name: Delete yarn.lock - run: "rm yarn.lock" + node-version: 16 + cache: "pnpm" + - name: Delete pnpm-lock.yaml + run: "rm pnpm-lock.yaml" - name: Install - run: yarn + run: pnpm install --no-frozen-lockfile - name: List dependencies - run: yarn list + run: pnpm list -r --depth 2 - name: Run tests env: DO_NOT_SET_THIS_ENV_VAR____IS_HARDHAT_CI: true FORCE_COLOR: 3 - run: yarn test || (echo "===== Retry =====" && yarn test) + run: pnpm test || (echo "===== Retry =====" && pnpm test) - name: Notify failures if: failure() uses: slackapi/slack-github-action@v1.18.0 diff --git a/.github/workflows/add-issue-to-project.yml b/.github/workflows/add-issue-to-project.yml index 5ab3e0b2dbe..ed7a7be4840 100644 --- a/.github/workflows/add-issue-to-project.yml +++ b/.github/workflows/add-issue-to-project.yml @@ -10,7 +10,9 @@ jobs: add-to-project: runs-on: ubuntu-latest steps: - - uses: actions/add-to-project@v0.4.0 + - uses: actions/add-to-project@244f685bbc3b7adfa8466e08b698b5577571133e # v1.0.2 with: project-url: https://github.com/orgs/NomicFoundation/projects/4 github-token: ${{ secrets.ADD_TO_PROJECT_PAT }} + labeled: area:edr + label-operator: NOT diff --git a/.github/workflows/add-label-to-new-issue.yml b/.github/workflows/add-label-to-new-issue.yml index c2c3426f02d..2bd47099b52 100644 --- a/.github/workflows/add-label-to-new-issue.yml +++ b/.github/workflows/add-label-to-new-issue.yml @@ -13,7 +13,7 @@ jobs: issues: write pull-requests: write steps: - - uses: actions/github-script@v6 + - uses: actions/github-script@v7 with: script: | const issue = await github.rest.issues.get({ @@ -27,11 +27,15 @@ jobs: ); if (statusLabel === undefined) { + console.log("Author association:", issue.data.author_association); + const isCollaborator = ["OWNER", "MEMBER", "COLLABORATOR"].includes(issue.data.author_association) + const label = isCollaborator ? "status:ready" : "status:triaging" + await github.rest.issues.addLabels({ owner: context.issue.owner, repo: context.issue.repo, issue_number: context.issue.number, - labels: ["status:triaging"] + labels: [label] }); } else { console.log(`Issue already has a status: ${statusLabel.name}`); diff --git a/.github/workflows/autoassign-issues.yml b/.github/workflows/autoassign-issues.yml new file mode 100644 index 00000000000..d01b641428d --- /dev/null +++ b/.github/workflows/autoassign-issues.yml @@ -0,0 +1,60 @@ +name: Issue autoassignment + +on: + issues: + types: [opened] + +jobs: + assign-new-issue: + runs-on: ubuntu-latest + permissions: + issues: write + steps: + - uses: actions/github-script@v6 + with: + script: | + // each user has a chance of (p - (previousP ?? 0)) to be assigned + const potentialAssignees = [ + ["fvictorio", 0.5], + ["schaable", 0.75], + ["ChristopherDedominici", 1.0], + ]; + + let assignee; + const r = Math.random(); + console.log("r:", r); + for (const [username, p] of potentialAssignees) { + if (r < p) { + assignee = username; + break; + } + } + + if (assignee === undefined) { + throw new Error("An assignee should've been set"); + } + + console.log("assignee:", assignee); + + console.log("Fetch issue", context.issue.number); + const issue = await github.rest.issues.get({ + owner: context.issue.owner, + repo: context.issue.repo, + issue_number: context.issue.number, + }); + + console.log("Author association:", issue.data.author_association); + const isCollaborator = ["OWNER", "MEMBER", "COLLABORATOR"].includes( + issue.data.author_association + ); + console.log("Is collaborator?", isCollaborator); + + // we only assign triage issues from external users + if (!isCollaborator) { + await github.rest.issues.addAssignees({ + owner: context.issue.owner, + repo: context.issue.repo, + issue_number: context.issue.number, + assignees: [assignee], + }); + } diff --git a/.github/workflows/autoassign-prs.yml b/.github/workflows/autoassign-prs.yml new file mode 100644 index 00000000000..f98c9f4f095 --- /dev/null +++ b/.github/workflows/autoassign-prs.yml @@ -0,0 +1,36 @@ +name: PR autoassignment + +on: + pull_request_target: + types: [opened] + +jobs: + assign-new-issue: + runs-on: ubuntu-latest + permissions: + pull-requests: write + steps: + - uses: actions/github-script@v7 + with: + script: | + const externalPrTriager = "kanej"; + + // Within the Github API PRs are issue objects + const pr = await github.rest.issues.get({ + owner: context.issue.owner, + repo: context.issue.repo, + issue_number: context.issue.number + }); + + const isCollaborator = ["OWNER", "MEMBER", "COLLABORATOR"].includes(pr.data.author_association) + + if (isCollaborator) { + return + } + + await github.rest.issues.addAssignees({ + owner: context.issue.owner, + repo: context.issue.repo, + issue_number: context.issue.number, + assignees: [externalPrTriager], + }); diff --git a/.github/workflows/cache.yml b/.github/workflows/cache.yml new file mode 100644 index 00000000000..0a62cbc1238 --- /dev/null +++ b/.github/workflows/cache.yml @@ -0,0 +1,51 @@ +permissions: + contents: read +name: Cache + +on: + push: + branches: + - main + - pre-release-testing-branch + - changeset-release/main + - v-next + paths: + - ".github/workflows/cache.yml" + - "**/pnpm-lock.yaml" + pull_request: + paths: + - ".github/workflows/cache.yml" + - "**/pnpm-lock.yaml" + workflow_dispatch: + +concurrency: + group: ${{github.workflow}}-${{github.ref}} + cancel-in-progress: true + +defaults: + run: + shell: bash + +jobs: + cache: + name: Cache + runs-on: ${{ matrix.runner }} + strategy: + fail-fast: false + matrix: + runner: ["ubuntu-latest", "macos-latest", "windows-latest"] + steps: + - uses: actions/checkout@v4 + - id: env + uses: ./.github/actions/setup-env + with: + cache-save: true + - name: Install + if: steps.env.outputs.cache-hit != 'true' + run: | + for lockfile in $(find "$(pwd)" -name pnpm-lock.yaml); do + pushd "$(dirname "$lockfile")" + pnpm install --frozen-lockfile --prefer-offline + popd + done + diff --git a/.github/workflows/check-changeset-added.yml b/.github/workflows/check-changeset-added.yml index fd489d68919..143e1adb390 100644 --- a/.github/workflows/check-changeset-added.yml +++ b/.github/workflows/check-changeset-added.yml @@ -18,8 +18,10 @@ jobs: check-if-changeset: name: Check that PR has a changeset runs-on: ubuntu-latest + # don't run this check in the changesets PR + if: github.head_ref != 'changeset-release/main' steps: - - uses: actions/github-script@v6 + - uses: actions/github-script@v7 with: script: | const pullNumber = context.issue.number; diff --git a/.github/workflows/check-docs-site.yml b/.github/workflows/check-docs-site.yml index c2145f9e7cf..381d895fb04 100644 --- a/.github/workflows/check-docs-site.yml +++ b/.github/workflows/check-docs-site.yml @@ -3,7 +3,8 @@ name: Check Docs Site on: push: branches: - - "fr/**" + - "**" + workflow_dispatch: concurrency: group: ${{github.workflow}}-${{github.ref}} @@ -15,17 +16,18 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 + - uses: pnpm/action-setup@v2 + with: + version: 8 - uses: actions/setup-node@v2 with: node-version: 16 - cache: yarn + cache: "pnpm" - name: Install - run: yarn --frozen-lockfile + run: pnpm install --frozen-lockfile --prefer-offline - name: Install Docs - run: cd docs && yarn + run: cd docs && pnpm install --frozen-lockfile --prefer-offline - name: lint - run: cd docs && yarn lint + run: cd docs && pnpm lint - name: Build - run: cd docs && yarn build - - name: Storybook - run: cd docs && yarn build-storybook + run: cd docs && pnpm build diff --git a/.github/workflows/close-stale-issues.yml b/.github/workflows/close-stale-issues.yml new file mode 100644 index 00000000000..b08eddf9a8b --- /dev/null +++ b/.github/workflows/close-stale-issues.yml @@ -0,0 +1,24 @@ +name: Close Stale Issues + +on: + schedule: + - cron: "0 0 * * *" # Runs daily at midnight UTC + workflow_dispatch: + +permissions: + contents: read + issues: write + +jobs: + stale: + runs-on: ubuntu-latest + steps: + - name: Close stale issues + uses: actions/stale@v9 + with: + repo-token: ${{ secrets.GITHUB_TOKEN }} + stale-issue-message: "This issue has been automatically closed due to inactivity. If you still need help, please reopen the issue and provide the requested information." + days-before-stale: 7 + days-before-close: 7 + only-labels: "status:needs-more-info" + exempt-issue-labels: "status:do-not-close" diff --git a/.github/workflows/comment-on-linter-error.yml b/.github/workflows/comment-on-linter-error.yml index 5b281a58b96..2ff3646c54e 100644 --- a/.github/workflows/comment-on-linter-error.yml +++ b/.github/workflows/comment-on-linter-error.yml @@ -20,24 +20,27 @@ jobs: uses: actions/checkout@v2 with: ref: "refs/pull/${{ github.event.number }}/merge" + - uses: pnpm/action-setup@v2 + with: + version: 8 - uses: actions/setup-node@v2 with: - node-version: 14 - cache: yarn + node-version: 16 + cache: "pnpm" - name: Install - run: yarn --frozen-lockfile + run: pnpm install --frozen-lockfile --prefer-offline - name: Build - run: yarn build + run: pnpm build - name: lint - run: yarn lint + run: pnpm lint - name: Check dependency versions run: node scripts/check-dependencies.js - name: Install website working-directory: docs/ - run: yarn + run: pnpm install --frozen-lockfile --prefer-offline - name: Lint website working-directory: docs/ - run: yarn lint + run: pnpm lint - uses: actions/github-script@v6 name: Comment on failure if: ${{ failure() }} @@ -47,5 +50,5 @@ jobs: issue_number: context.issue.number, owner: context.repo.owner, repo: context.repo.repo, - body: "Thanks for submitting this PR!\n\nUnfortunately, it has some linter errors, so we can't merge it yet. Can you please fix them?\n\nRunning yarn `lint:fix` in the root of the repository may fix them automatically." + body: "Thanks for submitting this PR!\n\nUnfortunately, it has some linter errors, so we can't merge it yet. Can you please fix them?\n\nRunning pnpm lint:fix in the root of the repository may fix them automatically." }) diff --git a/.github/workflows/compile-with-typescript-v4.yml b/.github/workflows/compile-with-typescript-v4.yml new file mode 100644 index 00000000000..3afea6b273f --- /dev/null +++ b/.github/workflows/compile-with-typescript-v4.yml @@ -0,0 +1,32 @@ +name: Compile with typescript v4 + +on: + push: + branches: main + pull_request: + branches: + - "**" + workflow_dispatch: + +jobs: + compile_with_typescript_v4: + name: Compile with typescript v4 + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: pnpm/action-setup@v2 + with: + version: 8 + - uses: actions/setup-node@v2 + with: + node-version: 16 + cache: "pnpm" + - name: Remove packages that can't be compiled with TypeScript v4 + run: rm -fr packages/hardhat-viem packages/hardhat-toolbox-viem packages/hardhat-web3-v4 + - name: Remove packages that can't be compiled with TypeScript v4 from the build script + run: sed -i 's/packages\/\(hardhat-viem\|hardhat-toolbox-viem\|hardhat-web3-v4\) *//g' package.json + - name: Install typescript v4 in all packages + run: | + sed -i 's/"typescript": "~5.0.0"/"typescript": "^4.0.0"/' package.json packages/*/package.json && pnpm install --no-frozen-lockfile + - name: Build + run: pnpm build diff --git a/.github/workflows/e2e-tests.yml b/.github/workflows/e2e-tests.yml new file mode 100644 index 00000000000..af5213b0a72 --- /dev/null +++ b/.github/workflows/e2e-tests.yml @@ -0,0 +1,34 @@ +name: E2E tests + +on: + push: + branches: + - "**" + +jobs: + run-e2e: + strategy: + matrix: + os: [ubuntu-latest, macos-latest, windows-latest] + name: Run E2E tests on ${{ matrix.os }} + runs-on: ${{ matrix.os }} + steps: + - uses: actions/checkout@v2 + - uses: pnpm/action-setup@v2 + with: + version: 8 + - uses: actions/setup-node@v2 + with: + node-version: 18 + - name: Run fixture-projects script + run: | + cd e2e + chmod +x run-fixture-projects.sh + ./run-fixture-projects.sh + shell: bash + - name: Run test-project-initialization script + run: | + cd e2e + chmod +x test-project-initialization.sh + ./test-project-initialization.sh + shell: bash diff --git a/.github/workflows/hardhat-chai-matchers-ci.yml b/.github/workflows/hardhat-chai-matchers-ci.yml index 35e720e80a5..e665e8c1e36 100644 --- a/.github/workflows/hardhat-chai-matchers-ci.yml +++ b/.github/workflows/hardhat-chai-matchers-ci.yml @@ -14,6 +14,7 @@ on: - "packages/hardhat-chai-matchers/**" - "packages/hardhat-common/**" - "config/**" + workflow_dispatch: defaults: run: @@ -25,60 +26,69 @@ concurrency: jobs: test_on_windows: - name: Test hardhat-chai-matchers on Windows with Node 14 + name: Test hardhat-chai-matchers on Windows with Node 16 runs-on: windows-latest steps: - uses: actions/checkout@v2 + - uses: pnpm/action-setup@v2 + with: + version: 8 - uses: actions/setup-node@v2 with: - node-version: 14 - cache: yarn + node-version: 16 + cache: "pnpm" - name: Install - run: yarn --frozen-lockfile + run: pnpm install --frozen-lockfile --prefer-offline - name: Build - run: yarn build + run: pnpm build - name: Run tests env: FORCE_COLOR: 3 - run: yarn test:ci + run: pnpm test:ci test_on_macos: - name: Test hardhat-chai-matchers on MacOS with Node 14 + name: Test hardhat-chai-matchers on MacOS with Node 16 runs-on: macos-latest # disable until actions/virtual-environments#4896 is fixed if: ${{ false }} steps: - uses: actions/checkout@v2 + - uses: pnpm/action-setup@v2 + with: + version: 8 - uses: actions/setup-node@v2 with: - node-version: 14 - cache: yarn + node-version: 16 + cache: "pnpm" - name: Install - run: yarn --frozen-lockfile + run: pnpm install --frozen-lockfile --prefer-offline - name: Build - run: yarn build + run: pnpm build - name: Run tests env: FORCE_COLOR: 3 - run: yarn test:ci + run: pnpm test:ci test_on_linux: name: Test hardhat-chai-matchers on Ubuntu with Node ${{ matrix.node }} runs-on: ubuntu-latest strategy: matrix: - node: [14, 16, 18] + node: [16, 18, 20] steps: - uses: actions/checkout@v2 + - uses: pnpm/action-setup@v2 + with: + version: 8 - uses: actions/setup-node@v2 with: node-version: ${{ matrix.node }} - cache: yarn + cache: "pnpm" - name: Install - run: yarn --frozen-lockfile + run: pnpm install --frozen-lockfile --prefer-offline - name: Build - run: yarn build + run: pnpm build - name: Run tests env: FORCE_COLOR: 3 - run: yarn test:ci + run: pnpm test:ci diff --git a/.github/workflows/hardhat-ci.yml b/.github/workflows/hardhat-ci.yml new file mode 100644 index 00000000000..1a181203ff0 --- /dev/null +++ b/.github/workflows/hardhat-ci.yml @@ -0,0 +1,114 @@ +name: CI +permissions: + contents: read + +on: + push: + branches: master + main + dev + paths: + - ".github/workflows/hardhat-ci.yml" + - "packages/**" + - "config/**" + - "pnpm-lock.yaml" + pull_request: + paths: + - ".github/workflows/hardhat-ci.yml" + - "packages/**" + - "config/**" + - "pnpm-lock.yaml" + workflow_dispatch: + +concurrency: + group: ${{github.workflow}}-${{github.ref}} + cancel-in-progress: true + +jobs: + list-packages: + name: List packages + runs-on: ubuntu-latest + outputs: + packages: ${{ steps.filter.outputs.changes }} + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version: 18 + - run: yq -p yaml -o json pnpm-lock.yaml | tee pnpm-lock.json + - id: generate + env: + PACKAGE_IGNORE: | + [ + ".", + "v-next/", + "packages/common", + "packages/eslint-plugin-hardhat-internal-rules", + "packages/eslint-plugin-slow-imports", + "packages/hardhat-core" + ] + COMMON_FILTERS: | + [ + ".github/workflows/hardhat-ci.yml", + "config/**", + "packages/common/**", + "pnpm-lock.yaml" + ] + run: | + echo "filters<> $GITHUB_OUTPUT + node scripts/generate-filters.js | + yq -Po yaml 'with_entries(.key |= sub("^packages/", ""))' | + tee -a $GITHUB_OUTPUT + echo "EOF" >> $GITHUB_OUTPUT + - id: filter + uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2 + with: + filters: ${{ steps.generate.outputs.filters }} + + ci: + needs: list-packages + + if: needs.list-packages.outputs.packages != '[]' + + strategy: + fail-fast: false + matrix: + package: ${{ fromJson(needs.list-packages.outputs.packages) }} + os: [ubuntu-latest, macos-latest, windows-latest] + node: [18, 20, 22] + exclude: + - package: hardhat-vyper + os: windows-latest + - package: hardhat-vyper + os: macos-latest + - os: windows-latest + node: 20 + - os: macos-latest + node: 20 + - os: windows-latest + node: 22 + - os: macos-latest + node: 22 + + name: "[${{ matrix.package }}] ci on ${{ matrix.os }} (Node ${{ matrix.node }})" + runs-on: ${{ matrix.os }} + defaults: + run: + working-directory: packages/${{ matrix.package }} + + steps: + - uses: actions/checkout@v4 + - name: Install pnpm + uses: pnpm/action-setup@v3 + with: + version: 9 + - uses: actions/setup-node@v4 + with: + node-version: ${{ matrix.node }} + cache: "pnpm" + - name: Install dependencies + run: pnpm install --frozen-lockfile --prefer-offline + - name: Build + run: pnpm build + - name: Run tests + run: pnpm run ${{ matrix.package == 'hardhat-chai-matchers' && 'test:ci' || 'test' }} diff --git a/.github/workflows/hardhat-core-ci.yml b/.github/workflows/hardhat-core-ci.yml index 75a5c3ef26d..5e158a2edfc 100644 --- a/.github/workflows/hardhat-core-ci.yml +++ b/.github/workflows/hardhat-core-ci.yml @@ -14,6 +14,7 @@ on: - "packages/hardhat-core/**" - "packages/hardhat-common/**" - "config/**" + workflow_dispatch: defaults: run: @@ -25,63 +26,99 @@ concurrency: jobs: test_on_windows: - name: Test hardhat-core on Windows with Node 14 + name: Test hardhat-core on Windows with Node 16 runs-on: windows-latest steps: - uses: actions/checkout@v2 + - uses: pnpm/action-setup@v2 + with: + version: 8 - uses: actions/setup-node@v2 with: - node-version: 14 - cache: yarn + node-version: 16 + cache: "pnpm" - name: Install - run: yarn --frozen-lockfile + run: pnpm install --frozen-lockfile --prefer-offline - name: Build - run: yarn build + run: pnpm build - name: Run tests env: DO_NOT_SET_THIS_ENV_VAR____IS_HARDHAT_CI: true FORCE_COLOR: 3 - run: yarn test:except-tracing + run: pnpm test:except-tracing test_on_macos: - name: Test hardhat-core on MacOS with Node 14 + name: Test hardhat-core on MacOS with Node 16 runs-on: macos-latest # disable until actions/virtual-environments#4896 is fixed if: ${{ false }} steps: - uses: actions/checkout@v2 + - uses: pnpm/action-setup@v2 + with: + version: 8 - uses: actions/setup-node@v2 with: - node-version: 14 - cache: yarn + node-version: 16 + cache: "pnpm" - name: Install - run: yarn --frozen-lockfile + run: pnpm install --frozen-lockfile --prefer-offline - name: Build - run: yarn build + run: pnpm build - name: Run tests env: DO_NOT_SET_THIS_ENV_VAR____IS_HARDHAT_CI: true FORCE_COLOR: 3 - run: yarn test:except-tracing + run: pnpm test:except-tracing test_on_linux: name: Test hardhat-core on Ubuntu with Node ${{ matrix.node }} runs-on: ubuntu-latest strategy: matrix: - node: [14, 16, 18] + node: [16, 18, 20] steps: - uses: actions/checkout@v2 + - uses: pnpm/action-setup@v2 + with: + version: 8 + - uses: actions/setup-node@v2 + with: + node-version: ${{ matrix.node }} + cache: "pnpm" + - name: Install + run: pnpm install --frozen-lockfile --prefer-offline + - name: Build + run: pnpm build + - name: Run tests + env: + DO_NOT_SET_THIS_ENV_VAR____IS_HARDHAT_CI: true + FORCE_COLOR: 3 + run: pnpm test:except-tracing + + test_types_node: + name: Test different versions of @types/node + runs-on: ubuntu-latest + strategy: + matrix: + node: [16, 18, 20] + steps: + - uses: actions/checkout@v2 + - uses: pnpm/action-setup@v2 + with: + version: 8 - uses: actions/setup-node@v2 with: node-version: ${{ matrix.node }} - cache: yarn + cache: "pnpm" - name: Install - run: yarn --frozen-lockfile + run: pnpm install --frozen-lockfile --prefer-offline + - name: Install @types/node + run: pnpm add --save-dev @types/node@${{ matrix.node }} - name: Build - run: yarn build + run: pnpm build - name: Run tests env: DO_NOT_SET_THIS_ENV_VAR____IS_HARDHAT_CI: true FORCE_COLOR: 3 - run: yarn test:except-tracing + run: pnpm test:except-tracing diff --git a/.github/workflows/hardhat-ethers-ci.yml b/.github/workflows/hardhat-ethers-ci.yml index 457743ec244..54b65f55469 100644 --- a/.github/workflows/hardhat-ethers-ci.yml +++ b/.github/workflows/hardhat-ethers-ci.yml @@ -16,6 +16,7 @@ on: - "packages/hardhat-core/**" - "packages/hardhat-common/**" - "config/**" + workflow_dispatch: defaults: run: @@ -27,54 +28,63 @@ concurrency: jobs: test_on_windows: - name: Test hardhat-ethers on Windows with Node 14 + name: Test hardhat-ethers on Windows with Node 16 runs-on: windows-latest steps: - uses: actions/checkout@v2 + - uses: pnpm/action-setup@v2 + with: + version: 8 - uses: actions/setup-node@v2 with: - node-version: 14 - cache: yarn + node-version: 16 + cache: "pnpm" - name: Install - run: yarn --frozen-lockfile + run: pnpm install --frozen-lockfile --prefer-offline - name: Build - run: yarn build + run: pnpm build - name: Run tests - run: yarn test + run: pnpm test test_on_macos: - name: Test hardhat-ethers on MacOS with Node 14 + name: Test hardhat-ethers on MacOS with Node 16 runs-on: macos-latest # disable until actions/virtual-environments#4896 is fixed if: ${{ false }} steps: - uses: actions/checkout@v2 + - uses: pnpm/action-setup@v2 + with: + version: 8 - uses: actions/setup-node@v2 with: - node-version: 14 - cache: yarn + node-version: 16 + cache: "pnpm" - name: Install - run: yarn --frozen-lockfile + run: pnpm install --frozen-lockfile --prefer-offline - name: Build - run: yarn build + run: pnpm build - name: Run tests - run: yarn test + run: pnpm test test_on_linux: name: Test hardhat-ethers on Ubuntu with Node ${{ matrix.node }} runs-on: ubuntu-latest strategy: matrix: - node: [14, 16, 18] + node: [16, 18, 20] steps: - uses: actions/checkout@v2 + - uses: pnpm/action-setup@v2 + with: + version: 8 - uses: actions/setup-node@v2 with: node-version: ${{ matrix.node }} - cache: yarn + cache: "pnpm" - name: Install - run: yarn --frozen-lockfile + run: pnpm install --frozen-lockfile --prefer-offline - name: Build - run: yarn build + run: pnpm build - name: Run tests - run: yarn test + run: pnpm test diff --git a/.github/workflows/hardhat-foundry-ci.yml b/.github/workflows/hardhat-foundry-ci.yml index f52e14fc2b3..6ad5f4cafe4 100644 --- a/.github/workflows/hardhat-foundry-ci.yml +++ b/.github/workflows/hardhat-foundry-ci.yml @@ -14,6 +14,7 @@ on: - "packages/hardhat-foundry/**" - "packages/hardhat-common/**" - "config/**" + workflow_dispatch: defaults: run: @@ -25,60 +26,69 @@ concurrency: jobs: test_on_windows: - name: Test hardhat-foundry on Windows with Node 14 + name: Test hardhat-foundry on Windows with Node 16 runs-on: windows-latest steps: - uses: actions/checkout@v2 + - uses: pnpm/action-setup@v2 + with: + version: 8 - uses: actions/setup-node@v2 with: - node-version: 14 - cache: yarn + node-version: 16 + cache: "pnpm" - name: Install - run: yarn --frozen-lockfile + run: pnpm install --frozen-lockfile --prefer-offline - name: Build - run: yarn build + run: pnpm build - name: Run tests env: FORCE_COLOR: 3 - run: yarn test + run: pnpm test test_on_macos: - name: Test hardhat-foundry on MacOS with Node 14 + name: Test hardhat-foundry on MacOS with Node 16 runs-on: macos-latest # disable until actions/virtual-environments#4896 is fixed if: ${{ false }} steps: - uses: actions/checkout@v2 + - uses: pnpm/action-setup@v2 + with: + version: 8 - uses: actions/setup-node@v2 with: - node-version: 14 - cache: yarn + node-version: 16 + cache: "pnpm" - name: Install - run: yarn --frozen-lockfile + run: pnpm install --frozen-lockfile --prefer-offline - name: Build - run: yarn build + run: pnpm build - name: Run tests env: FORCE_COLOR: 3 - run: yarn test + run: pnpm test test_on_linux: name: Test hardhat-foundry on Ubuntu with Node ${{ matrix.node }} runs-on: ubuntu-latest strategy: matrix: - node: [14, 16, 18] + node: [16, 18, 20] steps: - uses: actions/checkout@v2 + - uses: pnpm/action-setup@v2 + with: + version: 8 - uses: actions/setup-node@v2 with: node-version: ${{ matrix.node }} - cache: yarn + cache: "pnpm" - name: Install - run: yarn --frozen-lockfile + run: pnpm install --frozen-lockfile --prefer-offline - name: Build - run: yarn build + run: pnpm build - name: Run tests env: FORCE_COLOR: 3 - run: yarn test + run: pnpm test diff --git a/.github/workflows/hardhat-ledger-ci.yml b/.github/workflows/hardhat-ledger-ci.yml new file mode 100644 index 00000000000..61993a81e78 --- /dev/null +++ b/.github/workflows/hardhat-ledger-ci.yml @@ -0,0 +1,91 @@ +name: hardhat-ledger CI + +on: + push: + branches: + - main + paths: + - "packages/hardhat-ledger/**" + - "packages/hardhat-core/**" + - "packages/hardhat-common/**" + - "config/**" + pull_request: + branches: + - "**" + paths: + - "packages/hardhat-ledger/**" + - "packages/hardhat-core/**" + - "packages/hardhat-common/**" + - "config/**" + workflow_dispatch: + +defaults: + run: + working-directory: packages/hardhat-ledger + +concurrency: + group: ${{github.workflow}}-${{github.ref}} + cancel-in-progress: true + +jobs: + test_on_windows: + name: Test hardhat-ledger on Windows with Node 16 + runs-on: windows-latest + steps: + - uses: actions/checkout@v2 + - uses: pnpm/action-setup@v2 + with: + version: 8 + - uses: actions/setup-node@v2 + with: + node-version: 16 + cache: "pnpm" + - name: Install + run: pnpm install --frozen-lockfile --prefer-offline + - name: Build + run: pnpm build + - name: Run tests + run: pnpm test + + test_on_macos: + name: Test hardhat-ledger on MacOS with Node 16 + runs-on: macos-latest + # disable until actions/virtual-environments#4896 is fixed + if: ${{ false }} + steps: + - uses: actions/checkout@v2 + - uses: pnpm/action-setup@v2 + with: + version: 8 + - uses: actions/setup-node@v2 + with: + node-version: 16 + cache: "pnpm" + - name: Install + run: pnpm install --frozen-lockfile --prefer-offline + - name: Build + run: pnpm build + - name: Run tests + run: pnpm test + + test_on_linux: + name: Test hardhat-ledger on Ubuntu with Node ${{ matrix.node }} + runs-on: ubuntu-latest + strategy: + matrix: + node: [16, 18, 20] + steps: + - uses: actions/checkout@v2 + - uses: pnpm/action-setup@v2 + with: + version: 8 + - uses: actions/setup-node@v2 + with: + node-version: ${{ matrix.node }} + cache: "pnpm" + - name: Install + run: pnpm install --frozen-lockfile --prefer-offline + - name: Build + run: pnpm build + - name: Run tests + run: pnpm test diff --git a/.github/workflows/hardhat-network-forking-ci.yml b/.github/workflows/hardhat-network-forking-ci.yml index 6b6b96064b2..f3db6c4824c 100644 --- a/.github/workflows/hardhat-network-forking-ci.yml +++ b/.github/workflows/hardhat-network-forking-ci.yml @@ -14,6 +14,7 @@ on: - "packages/hardhat-core/**" - "packages/hardhat-common/**" - "config/**" + workflow_dispatch: defaults: run: @@ -37,18 +38,21 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 + - uses: pnpm/action-setup@v2 + with: + version: 8 - uses: actions/setup-node@v2 with: - node-version: 14 - cache: yarn + node-version: 16 + cache: "pnpm" - name: Install - run: yarn --frozen-lockfile + run: pnpm install --frozen-lockfile --prefer-offline - name: Cache network requests uses: actions/cache@v2 with: path: | packages/hardhat-core/test/internal/hardhat-network/provider/.hardhat_node_test_cache - key: hardhat-network-forking-tests-${{ hashFiles('yarn.lock') }}-${{ hashFiles('packages/hardhat-core/test/internal/hardhat-network/provider/node.ts') }} + key: hardhat-network-forking-tests-${{ hashFiles('pnpm-lock.yaml') }}-${{ hashFiles('packages/hardhat-core/test/internal/hardhat-network/provider/node.ts') }} - name: Run tests env: INFURA_URL: ${{ secrets.INFURA_URL }} @@ -56,5 +60,5 @@ jobs: DO_NOT_SET_THIS_ENV_VAR____IS_HARDHAT_CI: true FORCE_COLOR: 3 run: | - yarn build - yarn test:forking + pnpm build + pnpm test:forking diff --git a/.github/workflows/hardhat-network-helpers-ci.yml b/.github/workflows/hardhat-network-helpers-ci.yml index c2bc454b935..5858a8aff5c 100644 --- a/.github/workflows/hardhat-network-helpers-ci.yml +++ b/.github/workflows/hardhat-network-helpers-ci.yml @@ -14,6 +14,7 @@ on: - "packages/hardhat-network-helpers/**" - "packages/hardhat-common/**" - "config/**" + workflow_dispatch: defaults: run: @@ -25,60 +26,69 @@ concurrency: jobs: test_on_windows: - name: Test hardhat-network-helpers on Windows with Node 14 + name: Test hardhat-network-helpers on Windows with Node 16 runs-on: windows-latest steps: - uses: actions/checkout@v2 + - uses: pnpm/action-setup@v2 + with: + version: 8 - uses: actions/setup-node@v2 with: - node-version: 14 - cache: yarn + node-version: 16 + cache: "pnpm" - name: Install - run: yarn --frozen-lockfile + run: pnpm install --frozen-lockfile --prefer-offline - name: Build - run: yarn build + run: pnpm build - name: Run tests env: FORCE_COLOR: 3 - run: yarn test + run: pnpm test test_on_macos: - name: Test hardhat-network-helpers on MacOS with Node 14 + name: Test hardhat-network-helpers on MacOS with Node 16 runs-on: macos-latest # disable until actions/virtual-environments#4896 is fixed if: ${{ false }} steps: - uses: actions/checkout@v2 + - uses: pnpm/action-setup@v2 + with: + version: 8 - uses: actions/setup-node@v2 with: - node-version: 14 - cache: yarn + node-version: 16 + cache: "pnpm" - name: Install - run: yarn --frozen-lockfile + run: pnpm install --frozen-lockfile --prefer-offline - name: Build - run: yarn build + run: pnpm build - name: Run tests env: FORCE_COLOR: 3 - run: yarn test + run: pnpm test test_on_linux: name: Test hardhat-network-helpers on Ubuntu with Node ${{ matrix.node }} runs-on: ubuntu-latest strategy: matrix: - node: [14, 16, 18] + node: [16, 18, 20] steps: - uses: actions/checkout@v2 + - uses: pnpm/action-setup@v2 + with: + version: 8 - uses: actions/setup-node@v2 with: node-version: ${{ matrix.node }} - cache: yarn + cache: "pnpm" - name: Install - run: yarn --frozen-lockfile + run: pnpm install --frozen-lockfile --prefer-offline - name: Build - run: yarn build + run: pnpm build - name: Run tests env: FORCE_COLOR: 3 - run: yarn test + run: pnpm test diff --git a/.github/workflows/hardhat-network-tracing-all-solc-versions.yml b/.github/workflows/hardhat-network-tracing-all-solc-versions.yml index 0704096987d..12e6c691fa5 100644 --- a/.github/workflows/hardhat-network-tracing-all-solc-versions.yml +++ b/.github/workflows/hardhat-network-tracing-all-solc-versions.yml @@ -19,27 +19,30 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - node: [14, 16, 18] + node: [16, 18, 20] steps: - uses: actions/checkout@v2 + - uses: pnpm/action-setup@v2 + with: + version: 8 - uses: actions/setup-node@v2 with: node-version: ${{ matrix.node }} - cache: yarn + cache: "pnpm" - name: Install - run: yarn --frozen-lockfile + run: pnpm install --frozen-lockfile --prefer-offline - name: Build - run: yarn build + run: pnpm build - name: Cache artifacts uses: actions/cache@v2 with: path: | packages/hardhat-core/test/internal/hardhat-network/stack-traces/test-files/artifacts - key: hardhat-network-stack-traces-tests-${{ hashFiles('yarn.lock') }}-${{ hashFiles('packages/hardhat-core/test/internal/hardhat-network/stack-traces/test-files/**/*.sol') }}-${{ hashFiles('packages/hardhat-core/test/internal/hardhat-network/stack-traces/test-files/**/test.json') }}-${{ hashFiles('packages/hardhat-core/test/internal/hardhat-network/stack-traces/**/*.ts') }} + key: hardhat-network-stack-traces-tests-${{ hashFiles('pnpm-lock.yaml') }}-${{ hashFiles('packages/hardhat-core/test/internal/hardhat-network/stack-traces/test-files/**/*.sol') }}-${{ hashFiles('packages/hardhat-core/test/internal/hardhat-network/stack-traces/test-files/**/test.json') }}-${{ hashFiles('packages/hardhat-core/test/internal/hardhat-network/stack-traces/**/*.ts') }} - name: Run tests env: DO_NOT_SET_THIS_ENV_VAR____IS_HARDHAT_CI: true FORCE_COLOR: 3 NODE_OPTIONS: "--max-old-space-size=4096" HARDHAT_TESTS_ALL_SOLC_VERSIONS: true - run: yarn test:tracing + run: pnpm test:tracing diff --git a/.github/workflows/hardhat-network-tracing-ci.yml b/.github/workflows/hardhat-network-tracing-ci.yml index c5c8f07963e..b19d99f635f 100644 --- a/.github/workflows/hardhat-network-tracing-ci.yml +++ b/.github/workflows/hardhat-network-tracing-ci.yml @@ -30,17 +30,20 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - node: [14, 16, 18] + node: [16, 18, 20] steps: - uses: actions/checkout@v2 + - uses: pnpm/action-setup@v2 + with: + version: 8 - uses: actions/setup-node@v2 with: node-version: ${{ matrix.node }} - cache: yarn + cache: "pnpm" - name: Install - run: yarn --frozen-lockfile + run: pnpm install --frozen-lockfile --prefer-offline - name: Build - run: yarn build + run: pnpm build - name: Cache artifacts uses: actions/cache@v2 with: @@ -52,4 +55,4 @@ jobs: DO_NOT_SET_THIS_ENV_VAR____IS_HARDHAT_CI: true FORCE_COLOR: 3 NODE_OPTIONS: "--max-old-space-size=4096" - run: yarn test:tracing + run: pnpm test:tracing diff --git a/.github/workflows/hardhat-shorthand-ci.yml b/.github/workflows/hardhat-shorthand-ci.yml index f07472ab0a2..e51e4a06e67 100644 --- a/.github/workflows/hardhat-shorthand-ci.yml +++ b/.github/workflows/hardhat-shorthand-ci.yml @@ -16,6 +16,7 @@ on: - "packages/hardhat-core/**" - "packages/hardhat-common/**" - "config/**" + workflow_dispatch: defaults: run: @@ -27,54 +28,63 @@ concurrency: jobs: test_on_windows: - name: Test hardhat-shorthand on Windows with Node 14 + name: Test hardhat-shorthand on Windows with Node 16 runs-on: windows-latest steps: - uses: actions/checkout@v2 + - uses: pnpm/action-setup@v2 + with: + version: 8 - uses: actions/setup-node@v2 with: - node-version: 14 - cache: yarn + node-version: 16 + cache: "pnpm" - name: Install - run: yarn --frozen-lockfile + run: pnpm install --frozen-lockfile --prefer-offline - name: Build - run: yarn build + run: pnpm build - name: Run tests - run: yarn test + run: pnpm test test_on_macos: - name: Test hardhat-shorthand on MacOS with Node 14 + name: Test hardhat-shorthand on MacOS with Node 16 runs-on: macos-latest # disable until actions/virtual-environments#4896 is fixed if: ${{ false }} steps: - uses: actions/checkout@v2 + - uses: pnpm/action-setup@v2 + with: + version: 8 - uses: actions/setup-node@v2 with: - node-version: 14 - cache: yarn + node-version: 16 + cache: "pnpm" - name: Install - run: yarn --frozen-lockfile + run: pnpm install --frozen-lockfile --prefer-offline - name: Build - run: yarn build + run: pnpm build - name: Run tests - run: yarn test + run: pnpm test test_on_linux: name: Test hardhat-shorthand on Ubuntu with Node ${{ matrix.node }} runs-on: ubuntu-latest strategy: matrix: - node: [14, 16, 18] + node: [16, 18, 20] steps: - uses: actions/checkout@v2 + - uses: pnpm/action-setup@v2 + with: + version: 8 - uses: actions/setup-node@v2 with: node-version: ${{ matrix.node }} - cache: yarn + cache: "pnpm" - name: Install - run: yarn --frozen-lockfile + run: pnpm install --frozen-lockfile --prefer-offline - name: Build - run: yarn build + run: pnpm build - name: Run tests - run: yarn test + run: pnpm test diff --git a/.github/workflows/hardhat-solhint-ci.yml b/.github/workflows/hardhat-solhint-ci.yml index b548aae14e3..12f378e5160 100644 --- a/.github/workflows/hardhat-solhint-ci.yml +++ b/.github/workflows/hardhat-solhint-ci.yml @@ -16,6 +16,7 @@ on: - "packages/hardhat-core/**" - "packages/hardhat-common/**" - "config/**" + workflow_dispatch: defaults: run: @@ -27,54 +28,63 @@ concurrency: jobs: test_on_windows: - name: Test hardhat-solhint on Windows with Node 14 + name: Test hardhat-solhint on Windows with Node 16 runs-on: windows-latest steps: - uses: actions/checkout@v2 + - uses: pnpm/action-setup@v2 + with: + version: 8 - uses: actions/setup-node@v2 with: - node-version: 14 - cache: yarn + node-version: 16 + cache: "pnpm" - name: Install - run: yarn --frozen-lockfile + run: pnpm install --frozen-lockfile --prefer-offline - name: Build - run: yarn build + run: pnpm build - name: Run tests - run: yarn test + run: pnpm test test_on_macos: - name: Test hardhat-solhint on MacOS with Node 14 + name: Test hardhat-solhint on MacOS with Node 16 runs-on: macos-latest # disable until actions/virtual-environments#4896 is fixed if: ${{ false }} steps: - uses: actions/checkout@v2 + - uses: pnpm/action-setup@v2 + with: + version: 8 - uses: actions/setup-node@v2 with: - node-version: 14 - cache: yarn + node-version: 16 + cache: "pnpm" - name: Install - run: yarn --frozen-lockfile + run: pnpm install --frozen-lockfile --prefer-offline - name: Build - run: yarn build + run: pnpm build - name: Run tests - run: yarn test + run: pnpm test test_on_linux: name: Test hardhat-solhint on Ubuntu with Node ${{ matrix.node }} runs-on: ubuntu-latest strategy: matrix: - node: [14, 16, 18] + node: [16, 18, 20] steps: - uses: actions/checkout@v2 + - uses: pnpm/action-setup@v2 + with: + version: 8 - uses: actions/setup-node@v2 with: node-version: ${{ matrix.node }} - cache: yarn + cache: "pnpm" - name: Install - run: yarn --frozen-lockfile + run: pnpm install --frozen-lockfile --prefer-offline - name: Build - run: yarn build + run: pnpm build - name: Run tests - run: yarn test + run: pnpm test diff --git a/.github/workflows/hardhat-solpp-ci.yml b/.github/workflows/hardhat-solpp-ci.yml index ac5f5457005..1ab78b14742 100644 --- a/.github/workflows/hardhat-solpp-ci.yml +++ b/.github/workflows/hardhat-solpp-ci.yml @@ -16,6 +16,7 @@ on: - "packages/hardhat-core/**" - "packages/hardhat-common/**" - "config/**" + workflow_dispatch: defaults: run: @@ -27,38 +28,44 @@ concurrency: jobs: test_on_macos: - name: Test hardhat-solpp on MacOS with Node 14 + name: Test hardhat-solpp on MacOS with Node 16 runs-on: macos-latest # disable until actions/virtual-environments#4896 is fixed if: ${{ false }} steps: - uses: actions/checkout@v2 + - uses: pnpm/action-setup@v2 + with: + version: 8 - uses: actions/setup-node@v2 with: - node-version: 14 - cache: yarn + node-version: 16 + cache: "pnpm" - name: Install - run: yarn --frozen-lockfile + run: pnpm install --frozen-lockfile --prefer-offline - name: Build - run: yarn build + run: pnpm build - name: Run tests - run: yarn test + run: pnpm test test_on_linux: name: Test hardhat-solpp on Ubuntu with Node ${{ matrix.node }} runs-on: ubuntu-latest strategy: matrix: - node: [14, 16, 18] + node: [16, 18, 20] steps: - uses: actions/checkout@v2 + - uses: pnpm/action-setup@v2 + with: + version: 8 - uses: actions/setup-node@v2 with: node-version: ${{ matrix.node }} - cache: yarn + cache: "pnpm" - name: Install - run: yarn --frozen-lockfile + run: pnpm install --frozen-lockfile --prefer-offline - name: Build - run: yarn build + run: pnpm build - name: Run tests - run: yarn test + run: pnpm test diff --git a/.github/workflows/hardhat-toolbox-ci.yml b/.github/workflows/hardhat-toolbox-ci.yml index d10cddefc0d..bd872899a68 100644 --- a/.github/workflows/hardhat-toolbox-ci.yml +++ b/.github/workflows/hardhat-toolbox-ci.yml @@ -9,7 +9,7 @@ on: - "packages/hardhat-chai-matchers/**" - "packages/hardhat-network-helpers/**" - "packages/hardhat-ethers/**" - - "packages/hardhat-etherscan/**" + - "packages/hardhat-verify/**" - "packages/hardhat-common/**" - "config/**" pull_request: @@ -21,9 +21,10 @@ on: - "packages/hardhat-chai-matchers/**" - "packages/hardhat-network-helpers/**" - "packages/hardhat-ethers/**" - - "packages/hardhat-etherscan/**" + - "packages/hardhat-verify/**" - "packages/hardhat-common/**" - "config/**" + workflow_dispatch: defaults: run: @@ -35,54 +36,63 @@ concurrency: jobs: test_on_windows: - name: Test hardhat-toolbox on Windows with Node 14 + name: Test hardhat-toolbox on Windows with Node 16 runs-on: windows-latest steps: - uses: actions/checkout@v2 + - uses: pnpm/action-setup@v2 + with: + version: 8 - uses: actions/setup-node@v2 with: - node-version: 14 - cache: yarn + node-version: 16 + cache: "pnpm" - name: Install - run: yarn --frozen-lockfile + run: pnpm install --frozen-lockfile --prefer-offline - name: Build - run: yarn build + run: pnpm build - name: Run tests - run: yarn test + run: pnpm test test_on_macos: - name: Test hardhat-toolbox on MacOS with Node 14 + name: Test hardhat-toolbox on MacOS with Node 16 runs-on: macos-latest # disable until actions/virtual-environments#4896 is fixed if: ${{ false }} steps: - uses: actions/checkout@v2 + - uses: pnpm/action-setup@v2 + with: + version: 8 - uses: actions/setup-node@v2 with: - node-version: 14 - cache: yarn + node-version: 16 + cache: "pnpm" - name: Install - run: yarn --frozen-lockfile + run: pnpm install --frozen-lockfile --prefer-offline - name: Build - run: yarn build + run: pnpm build - name: Run tests - run: yarn test + run: pnpm test test_on_linux: name: Test hardhat-toolbox on Ubuntu with Node ${{ matrix.node }} runs-on: ubuntu-latest strategy: matrix: - node: [14, 16, 18] + node: [16, 18, 20] steps: - uses: actions/checkout@v2 + - uses: pnpm/action-setup@v2 + with: + version: 8 - uses: actions/setup-node@v2 with: node-version: ${{ matrix.node }} - cache: yarn + cache: "pnpm" - name: Install - run: yarn --frozen-lockfile + run: pnpm install --frozen-lockfile --prefer-offline - name: Build - run: yarn build + run: pnpm build - name: Run tests - run: yarn test + run: pnpm test diff --git a/.github/workflows/hardhat-truffle4-ci.yml b/.github/workflows/hardhat-truffle4-ci.yml index 46b7d5d0035..6eec45120dc 100644 --- a/.github/workflows/hardhat-truffle4-ci.yml +++ b/.github/workflows/hardhat-truffle4-ci.yml @@ -18,6 +18,7 @@ on: - "packages/hardhat-core/**" - "packages/hardhat-common/**" - "config/**" + workflow_dispatch: defaults: run: @@ -29,54 +30,63 @@ concurrency: jobs: test_on_windows: - name: Test hardhat-truffle4 on Windows with Node 14 + name: Test hardhat-truffle4 on Windows with Node 16 runs-on: windows-latest steps: - uses: actions/checkout@v2 + - uses: pnpm/action-setup@v2 + with: + version: 8 - uses: actions/setup-node@v2 with: - node-version: 14 - cache: yarn + node-version: 16 + cache: "pnpm" - name: Install - run: yarn --frozen-lockfile + run: pnpm install --frozen-lockfile --prefer-offline - name: Build - run: yarn build + run: pnpm build - name: Run tests - run: yarn test + run: pnpm test test_on_macos: - name: Test hardhat-truffle4 on MacOS with Node 14 + name: Test hardhat-truffle4 on MacOS with Node 16 runs-on: macos-latest # disable until actions/virtual-environments#4896 is fixed if: ${{ false }} steps: - uses: actions/checkout@v2 + - uses: pnpm/action-setup@v2 + with: + version: 8 - uses: actions/setup-node@v2 with: - node-version: 14 - cache: yarn + node-version: 16 + cache: "pnpm" - name: Install - run: yarn --frozen-lockfile + run: pnpm install --frozen-lockfile --prefer-offline - name: Build - run: yarn build + run: pnpm build - name: Run tests - run: yarn test + run: pnpm test test_on_linux: name: Test hardhat-truffle4 on Ubuntu with Node ${{ matrix.node }} runs-on: ubuntu-latest strategy: matrix: - node: [14, 16, 18] + node: [16, 18, 20] steps: - uses: actions/checkout@v2 + - uses: pnpm/action-setup@v2 + with: + version: 8 - uses: actions/setup-node@v2 with: node-version: ${{ matrix.node }} - cache: yarn + cache: "pnpm" - name: Install - run: yarn --frozen-lockfile + run: pnpm install --frozen-lockfile --prefer-offline - name: Build - run: yarn build + run: pnpm build - name: Run tests - run: yarn test + run: pnpm test diff --git a/.github/workflows/hardhat-truffle5-ci.yml b/.github/workflows/hardhat-truffle5-ci.yml index 70e873cc04e..aba51e8afec 100644 --- a/.github/workflows/hardhat-truffle5-ci.yml +++ b/.github/workflows/hardhat-truffle5-ci.yml @@ -18,6 +18,7 @@ on: - "packages/hardhat-core/**" - "packages/hardhat-common/**" - "config/**" + workflow_dispatch: defaults: run: @@ -29,54 +30,63 @@ concurrency: jobs: test_on_windows: - name: Test hardhat-truffle5 on Windows with Node 14 + name: Test hardhat-truffle5 on Windows with Node 16 runs-on: windows-latest steps: - uses: actions/checkout@v2 + - uses: pnpm/action-setup@v2 + with: + version: 8 - uses: actions/setup-node@v2 with: - node-version: 14 - cache: yarn + node-version: 16 + cache: "pnpm" - name: Install - run: yarn --frozen-lockfile + run: pnpm install --frozen-lockfile --prefer-offline - name: Build - run: yarn build + run: pnpm build - name: Run tests - run: yarn test + run: pnpm test test_on_macos: - name: Test hardhat-truffle5 on MacOS with Node 14 + name: Test hardhat-truffle5 on MacOS with Node 16 runs-on: macos-latest # disable until actions/virtual-environments#4896 is fixed if: ${{ false }} steps: - uses: actions/checkout@v2 + - uses: pnpm/action-setup@v2 + with: + version: 8 - uses: actions/setup-node@v2 with: - node-version: 14 - cache: yarn + node-version: 16 + cache: "pnpm" - name: Install - run: yarn --frozen-lockfile + run: pnpm install --frozen-lockfile --prefer-offline - name: Build - run: yarn build + run: pnpm build - name: Run tests - run: yarn test + run: pnpm test test_on_linux: name: Test hardhat-truffle5 on Ubuntu with Node ${{ matrix.node }} runs-on: ubuntu-latest strategy: matrix: - node: [14, 16, 18] + node: [16, 18, 20] steps: - uses: actions/checkout@v2 + - uses: pnpm/action-setup@v2 + with: + version: 8 - uses: actions/setup-node@v2 with: node-version: ${{ matrix.node }} - cache: yarn + cache: "pnpm" - name: Install - run: yarn --frozen-lockfile + run: pnpm install --frozen-lockfile --prefer-offline - name: Build - run: yarn build + run: pnpm build - name: Run tests - run: yarn test + run: pnpm test diff --git a/.github/workflows/hardhat-verify-ci.yml b/.github/workflows/hardhat-verify-ci.yml index a16b39cdf1a..5a5399fe32e 100644 --- a/.github/workflows/hardhat-verify-ci.yml +++ b/.github/workflows/hardhat-verify-ci.yml @@ -16,6 +16,7 @@ on: - "packages/hardhat-core/**" - "packages/hardhat-common/**" - "config/**" + workflow_dispatch: defaults: run: @@ -27,54 +28,63 @@ concurrency: jobs: test_on_windows: - name: Test hardhat-verify on Windows with Node 14 + name: Test hardhat-verify on Windows with Node 16 runs-on: windows-latest steps: - uses: actions/checkout@v2 + - uses: pnpm/action-setup@v2 + with: + version: 8 - uses: actions/setup-node@v2 with: - node-version: 14 - cache: yarn + node-version: 16 + cache: "pnpm" - name: Install - run: yarn --frozen-lockfile + run: pnpm install --frozen-lockfile --prefer-offline - name: Build - run: yarn build + run: pnpm build - name: Run tests - run: yarn test + run: pnpm test test_on_macos: - name: Test hardhat-verify on MacOS with Node 14 + name: Test hardhat-verify on MacOS with Node 16 runs-on: macos-latest # disable until actions/virtual-environments#4896 is fixed if: ${{ false }} steps: - uses: actions/checkout@v2 + - uses: pnpm/action-setup@v2 + with: + version: 8 - uses: actions/setup-node@v2 with: - node-version: 14 - cache: yarn + node-version: 16 + cache: "pnpm" - name: Install - run: yarn --frozen-lockfile + run: pnpm install --frozen-lockfile --prefer-offline - name: Build - run: yarn build + run: pnpm build - name: Run tests - run: yarn test + run: pnpm test test_on_linux: name: Test hardhat-verify on Ubuntu with Node ${{ matrix.node }} runs-on: ubuntu-latest strategy: matrix: - node: [14, 16, 18] + node: [16, 18, 20] steps: - uses: actions/checkout@v2 + - uses: pnpm/action-setup@v2 + with: + version: 8 - uses: actions/setup-node@v2 with: node-version: ${{ matrix.node }} - cache: yarn + cache: "pnpm" - name: Install - run: yarn --frozen-lockfile + run: pnpm install --frozen-lockfile --prefer-offline - name: Build - run: yarn build + run: pnpm build - name: Run tests - run: yarn test + run: pnpm test diff --git a/.github/workflows/hardhat-viem-ci.yml b/.github/workflows/hardhat-viem-ci.yml new file mode 100644 index 00000000000..2999fe603e5 --- /dev/null +++ b/.github/workflows/hardhat-viem-ci.yml @@ -0,0 +1,90 @@ +name: hardhat-viem CI + +on: + push: + branches: main + paths: + - "packages/hardhat-viem/**" + - "packages/hardhat-core/**" + - "packages/hardhat-common/**" + - "config/**" + pull_request: + branches: + - "**" + paths: + - "packages/hardhat-viem/**" + - "packages/hardhat-core/**" + - "packages/hardhat-common/**" + - "config/**" + workflow_dispatch: + +defaults: + run: + working-directory: packages/hardhat-viem + +concurrency: + group: ${{github.workflow}}-${{github.ref}} + cancel-in-progress: true + +jobs: + test_on_windows: + name: Test hardhat-viem on Windows with Node 16 + runs-on: windows-latest + steps: + - uses: actions/checkout@v2 + - uses: pnpm/action-setup@v2 + with: + version: 8 + - uses: actions/setup-node@v2 + with: + node-version: 16 + cache: "pnpm" + - name: Install + run: pnpm install --frozen-lockfile --prefer-offline + - name: Build + run: pnpm build + - name: Run tests + run: pnpm test + + test_on_macos: + name: Test hardhat-viem on MacOS with Node 16 + runs-on: macos-latest + # disable until actions/virtual-environments#4896 is fixed + if: ${{ false }} + steps: + - uses: actions/checkout@v2 + - uses: pnpm/action-setup@v2 + with: + version: 8 + - uses: actions/setup-node@v2 + with: + node-version: 16 + cache: "pnpm" + - name: Install + run: pnpm install --frozen-lockfile --prefer-offline + - name: Build + run: pnpm build + - name: Run tests + run: pnpm test + + test_on_linux: + name: Test hardhat-viem on Ubuntu with Node ${{ matrix.node }} + runs-on: ubuntu-latest + strategy: + matrix: + node: [16, 18, 20] + steps: + - uses: actions/checkout@v2 + - uses: pnpm/action-setup@v2 + with: + version: 8 + - uses: actions/setup-node@v2 + with: + node-version: ${{ matrix.node }} + cache: "pnpm" + - name: Install + run: pnpm install --frozen-lockfile --prefer-offline + - name: Build + run: pnpm build + - name: Run tests + run: pnpm test diff --git a/.github/workflows/hardhat-vyper-ci.yml b/.github/workflows/hardhat-vyper-ci.yml index 528e027713e..1d21a1c2fd0 100644 --- a/.github/workflows/hardhat-vyper-ci.yml +++ b/.github/workflows/hardhat-vyper-ci.yml @@ -16,6 +16,7 @@ on: - "packages/hardhat-core/**" - "packages/hardhat-common/**" - "config/**" + workflow_dispatch: defaults: run: @@ -31,16 +32,19 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - node: [14, 16, 18] + node: [16, 18, 20] steps: - uses: actions/checkout@v2 + - uses: pnpm/action-setup@v2 + with: + version: 8 - uses: actions/setup-node@v2 with: node-version: ${{ matrix.node }} - cache: yarn + cache: "pnpm" - name: Install - run: yarn --frozen-lockfile + run: pnpm install --frozen-lockfile --prefer-offline - name: Build - run: yarn build + run: pnpm build - name: Run tests - run: yarn test + run: pnpm test diff --git a/.github/workflows/hardhat-web3-ci.yml b/.github/workflows/hardhat-web3-ci.yml index 33a8ead2691..238672e47c3 100644 --- a/.github/workflows/hardhat-web3-ci.yml +++ b/.github/workflows/hardhat-web3-ci.yml @@ -16,6 +16,7 @@ on: - "packages/hardhat-core/**" - "packages/hardhat-common/**" - "config/**" + workflow_dispatch: defaults: run: @@ -27,54 +28,63 @@ concurrency: jobs: test_on_windows: - name: Test hardhat-web3 on Windows with Node 14 + name: Test hardhat-web3 on Windows with Node 16 runs-on: windows-latest steps: - uses: actions/checkout@v2 + - uses: pnpm/action-setup@v2 + with: + version: 8 - uses: actions/setup-node@v2 with: - node-version: 14 - cache: yarn + node-version: 16 + cache: "pnpm" - name: Install - run: yarn --frozen-lockfile + run: pnpm install --frozen-lockfile --prefer-offline - name: Build - run: yarn build + run: pnpm build - name: Run tests - run: yarn test + run: pnpm test test_on_macos: - name: Test hardhat-web3 on MacOS with Node 14 + name: Test hardhat-web3 on MacOS with Node 16 runs-on: macos-latest # disable until actions/virtual-environments#4896 is fixed if: ${{ false }} steps: - uses: actions/checkout@v2 + - uses: pnpm/action-setup@v2 + with: + version: 8 - uses: actions/setup-node@v2 with: - node-version: 14 - cache: yarn + node-version: 16 + cache: "pnpm" - name: Install - run: yarn --frozen-lockfile + run: pnpm install --frozen-lockfile --prefer-offline - name: Build - run: yarn build + run: pnpm build - name: Run tests - run: yarn test + run: pnpm test test_on_linux: name: Test hardhat-web3 on Ubuntu with Node ${{ matrix.node }} runs-on: ubuntu-latest strategy: matrix: - node: [14, 16, 18] + node: [16, 18, 20] steps: - uses: actions/checkout@v2 + - uses: pnpm/action-setup@v2 + with: + version: 8 - uses: actions/setup-node@v2 with: node-version: ${{ matrix.node }} - cache: yarn + cache: "pnpm" - name: Install - run: yarn --frozen-lockfile + run: pnpm install --frozen-lockfile --prefer-offline - name: Build - run: yarn build + run: pnpm build - name: Run tests - run: yarn test + run: pnpm test diff --git a/.github/workflows/hardhat-web3-legacy-ci.yml b/.github/workflows/hardhat-web3-legacy-ci.yml index 221110aa34f..fd5d4ce3364 100644 --- a/.github/workflows/hardhat-web3-legacy-ci.yml +++ b/.github/workflows/hardhat-web3-legacy-ci.yml @@ -16,6 +16,7 @@ on: - "packages/hardhat-core/**" - "packages/hardhat-common/**" - "config/**" + workflow_dispatch: defaults: run: @@ -27,54 +28,63 @@ concurrency: jobs: test_on_windows: - name: Test hardhat-web3-legacy on Windows with Node 14 + name: Test hardhat-web3-legacy on Windows with Node 16 runs-on: windows-latest steps: - uses: actions/checkout@v2 + - uses: pnpm/action-setup@v2 + with: + version: 8 - uses: actions/setup-node@v2 with: - node-version: 14 - cache: yarn + node-version: 16 + cache: "pnpm" - name: Install - run: yarn --frozen-lockfile + run: pnpm install --frozen-lockfile --prefer-offline - name: Build - run: yarn build + run: pnpm build - name: Run tests - run: yarn test + run: pnpm test test_on_macos: - name: Test hardhat-web3-legacy on MacOS with Node 14 + name: Test hardhat-web3-legacy on MacOS with Node 16 runs-on: macos-latest # disable until actions/virtual-environments#4896 is fixed if: ${{ false }} steps: - uses: actions/checkout@v2 + - uses: pnpm/action-setup@v2 + with: + version: 8 - uses: actions/setup-node@v2 with: - node-version: 14 - cache: yarn + node-version: 16 + cache: "pnpm" - name: Install - run: yarn --frozen-lockfile + run: pnpm install --frozen-lockfile --prefer-offline - name: Build - run: yarn build + run: pnpm build - name: Run tests - run: yarn test + run: pnpm test test_on_linux: name: Test hardhat-web3-legacy on Ubuntu with Node ${{ matrix.node }} runs-on: ubuntu-latest strategy: matrix: - node: [14, 16, 18] + node: [16, 18, 20] steps: - uses: actions/checkout@v2 + - uses: pnpm/action-setup@v2 + with: + version: 8 - uses: actions/setup-node@v2 with: node-version: ${{ matrix.node }} - cache: yarn + cache: "pnpm" - name: Install - run: yarn --frozen-lockfile + run: pnpm install --frozen-lockfile --prefer-offline - name: Build - run: yarn build + run: pnpm build - name: Run tests - run: yarn test + run: pnpm test diff --git a/.github/workflows/hardhat-web3-v4-ci.yml b/.github/workflows/hardhat-web3-v4-ci.yml new file mode 100644 index 00000000000..71985c8d0d6 --- /dev/null +++ b/.github/workflows/hardhat-web3-v4-ci.yml @@ -0,0 +1,90 @@ +name: hardhat-web3-v4 CI + +on: + push: + branches: [$default-branch] + paths: + - "packages/hardhat-web3-v4/**" + - "packages/hardhat-core/**" + - "packages/hardhat-common/**" + - "config/**" + pull_request: + branches: + - "**" + paths: + - "packages/hardhat-web3-v4/**" + - "packages/hardhat-core/**" + - "packages/hardhat-common/**" + - "config/**" + workflow_dispatch: + +defaults: + run: + working-directory: packages/hardhat-web3-v4 + +concurrency: + group: ${{github.workflow}}-${{github.ref}} + cancel-in-progress: true + +jobs: + test_on_windows: + name: Test hardhat-web3-v4 on Windows with Node 16 + runs-on: windows-latest + steps: + - uses: actions/checkout@v2 + - uses: pnpm/action-setup@v2 + with: + version: 8 + - uses: actions/setup-node@v2 + with: + node-version: 16 + cache: pnpm + - name: Install + run: pnpm install --frozen-lockfile --prefer-offline + - name: Build + run: pnpm build + - name: Run tests + run: pnpm test + + test_on_macos: + name: Test hardhat-web3-v4 on MacOS with Node 16 + runs-on: macos-latest + # disable until actions/virtual-environments#4896 is fixed + if: ${{ false }} + steps: + - uses: actions/checkout@v2 + - uses: pnpm/action-setup@v2 + with: + version: 8 + - uses: actions/setup-node@v2 + with: + node-version: 16 + cache: pnpm + - name: Install + run: pnpm install --frozen-lockfile --prefer-offline + - name: Build + run: pnpm build + - name: Run tests + run: pnpm test + + test_on_linux: + name: Test hardhat-web3-v4 on Ubuntu with Node ${{ matrix.node }} + runs-on: ubuntu-latest + strategy: + matrix: + node: [16, 18, 20] + steps: + - uses: actions/checkout@v2 + - uses: pnpm/action-setup@v2 + with: + version: 8 + - uses: actions/setup-node@v2 + with: + node-version: ${{ matrix.node }} + cache: pnpm + - name: Install + run: pnpm install --frozen-lockfile --prefer-offline + - name: Build + run: pnpm build + - name: Run tests + run: pnpm test diff --git a/.github/workflows/jekyll-gh-pages.yml b/.github/workflows/jekyll-gh-pages.yml new file mode 100644 index 00000000000..85c7b2f31cf --- /dev/null +++ b/.github/workflows/jekyll-gh-pages.yml @@ -0,0 +1,51 @@ +# Sample workflow for building and deploying a Jekyll site to GitHub Pages +name: Deploy Jekyll with GitHub Pages dependencies preinstalled + +on: + # Runs on pushes targeting the default branch + push: + branches: ["v2-6603"] + + # Allows you to run this workflow manually from the Actions tab + workflow_dispatch: + +# Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages +permissions: + contents: read + pages: write + id-token: write + +# Allow only one concurrent deployment, skipping runs queued between the run in-progress and latest queued. +# However, do NOT cancel in-progress runs as we want to allow these production deployments to complete. +concurrency: + group: "pages" + cancel-in-progress: false + +jobs: + # Build job + build: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + - name: Setup Pages + uses: actions/configure-pages@v5 + - name: Build with Jekyll + uses: actions/jekyll-build-pages@v1 + with: + source: ./ + destination: ./_site + - name: Upload artifact + uses: actions/upload-pages-artifact@v3 + + # Deployment job + deploy: + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + runs-on: ubuntu-latest + needs: build + steps: + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@v4 diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 2c37c9bb8a0..6e1c7fd0b1d 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -6,6 +6,7 @@ on: pull_request: branches: - "**" + workflow_dispatch: concurrency: group: ${{github.workflow}}-${{github.ref}} @@ -17,24 +18,27 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 + - uses: pnpm/action-setup@v2 + with: + version: 8 - uses: actions/setup-node@v2 with: - node-version: 14 - cache: yarn + node-version: 16 + cache: "pnpm" cache-dependency-path: | - yarn.lock - docs/yarn.lock + pnpm-lock.yaml + docs/pnpm-lock.yaml - name: Install - run: yarn --frozen-lockfile + run: pnpm install --frozen-lockfile --prefer-offline - name: Build - run: yarn build + run: pnpm build - name: lint - run: yarn lint + run: pnpm lint - name: Check dependency versions run: node scripts/check-dependencies.js - name: Install website working-directory: docs/ - run: yarn + run: pnpm install --frozen-lockfile --prefer-offline - name: Lint website working-directory: docs/ - run: yarn lint + run: pnpm lint diff --git a/.github/workflows/lock.yml b/.github/workflows/lock.yml index 113315dfc24..1b90eae4398 100644 --- a/.github/workflows/lock.yml +++ b/.github/workflows/lock.yml @@ -16,7 +16,8 @@ jobs: action: runs-on: ubuntu-latest steps: - - uses: dessant/lock-threads@e460dfeb36e731f3aeb214be6b0c9a9d9a67eda6 + - uses: dessant/lock-threads@1bf7ec25051fe7c00bdd17e6a7cf3d7bfb7dc771 # v5.0.1 with: issue-inactive-days: "90" pr-inactive-days: "90" + process-only: "issues, prs" diff --git a/.github/workflows/pre-release.yml b/.github/workflows/pre-release.yml index eead7348966..9fe0be39ba0 100644 --- a/.github/workflows/pre-release.yml +++ b/.github/workflows/pre-release.yml @@ -2,7 +2,9 @@ name: Pre-release tests on: push: - branches: [pre-release-testing-branch] + branches: + - pre-release-testing-branch + - changeset-release/main workflow_dispatch: concurrency: @@ -15,16 +17,19 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 + - uses: pnpm/action-setup@v2 + with: + version: 8 - uses: actions/setup-node@v2 with: - node-version: 14 - cache: yarn + node-version: 16 + cache: "pnpm" - name: Install - run: yarn --frozen-lockfile + run: pnpm install --frozen-lockfile --prefer-offline - name: Build - run: yarn build + run: pnpm build - name: lint - run: yarn lint + run: pnpm lint - name: Cache artifacts uses: actions/cache@v2 with: @@ -36,7 +41,7 @@ jobs: DO_NOT_SET_THIS_ENV_VAR____IS_HARDHAT_CI: true FORCE_COLOR: 3 NODE_OPTIONS: "--max-old-space-size=4096" - run: yarn test + run: pnpm test - name: Check dependency versions run: node scripts/check-dependencies.js test_fork: @@ -47,18 +52,21 @@ jobs: working-directory: packages/hardhat-core steps: - uses: actions/checkout@v2 + - uses: pnpm/action-setup@v2 + with: + version: 8 - uses: actions/setup-node@v2 with: - node-version: 14 - cache: yarn + node-version: 16 + cache: "pnpm" - name: Install - run: yarn --frozen-lockfile + run: pnpm install --frozen-lockfile --prefer-offline - name: Cache network requests uses: actions/cache@v2 with: path: | packages/hardhat-core/test/internal/hardhat-network/provider/.hardhat_node_test_cache - key: hardhat-network-forking-tests-${{ hashFiles('yarn.lock') }}-${{ hashFiles('packages/hardhat-core/test/internal/hardhat-network/provider/node.ts') }} + key: hardhat-network-forking-tests-${{ hashFiles('pnpm-lock.yaml') }}-${{ hashFiles('packages/hardhat-core/test/internal/hardhat-network/provider/node.ts') }} - name: Run tests env: INFURA_URL: ${{ secrets.INFURA_URL }} @@ -67,5 +75,5 @@ jobs: FORCE_COLOR: 3 NODE_OPTIONS: "--max-old-space-size=4096" run: | - yarn build - yarn test:forking + pnpm build + pnpm test:forking diff --git a/.github/workflows/regression-tests.yml b/.github/workflows/regression-tests.yml new file mode 100644 index 00000000000..8d6d7f30859 --- /dev/null +++ b/.github/workflows/regression-tests.yml @@ -0,0 +1,486 @@ +name: Regression Tests + +on: + # TODO: Add a workflow_call trigger to allow running this workflow from EDR + workflow_dispatch: + inputs: + hardhat-ref: + required: true + type: string + default: "v-next" + edr-ref: + required: false + type: string + default: "" + repositories: + required: false + type: string + default: '["Elytro-eth/soul-wallet-contract", "foundry-rs/forge-std", "kalidao/keep", "mds1/multicall", "pancakeswap/infinity-core", "PaulRBerg/prb-math", "PaulRBerg/prb-proxy", "PaulRBerg/prb-test", "pcaversaccio/createx", "ProjectOpenSea/seaport", "sablier-labs/lockup", "sablier-labs/v2-periphery", "transmissions11/solmate", "Uniswap/UniswapX", "Vectorized/solady"]' + runners: + required: false + type: string + default: '["ubuntu-latest"]' + commands: + required: false + type: string + default: '["hardhat compile", "hardhat test solidity"]' + +defaults: + run: + shell: bash + +jobs: + build-edr: + name: Build EDR + if: inputs.edr-ref + runs-on: ${{ matrix.runner }} + permissions: + contents: read + strategy: + fail-fast: false + matrix: + runner: ${{ fromJSON(inputs.runners) }} + defaults: + run: + shell: bash + working-directory: crates/edr_napi + steps: + - uses: actions/checkout@v4 + with: + repository: NomicFoundation/edr + ref: ${{ inputs.edr-ref }} + - id: target + env: + RUNNER: ${{ matrix.runner }} + run: | + if [[ "$RUNNER" == "ubuntu-latest" ]]; then + echo "target=x86_64-unknown-linux-gnu" >> $GITHUB_OUTPUT + elif [[ "$RUNNER" == "macos-latest" ]]; then + echo "target=aarch64-apple-darwin" >> $GITHUB_OUTPUT + elif [[ "$RUNNER" == "windows-latest" ]]; then + echo "target=x86_64-pc-windows-msvc" >> $GITHUB_OUTPUT + else + exit 1 + fi + - uses: ./.github/actions/setup-node + - name: Install Rust toolchain + uses: dtolnay/rust-toolchain@stable + with: + toolchain: stable + - name: Add Rust cross-compilation target + run: rustup target add ${{ steps.target.outputs.target }} + - name: Install dependencies + run: pnpm install --frozen-lockfile --prefer-offline + - name: Build + run: pnpm build --target ${{ steps.target.outputs.target }} + - name: Remove symbols + if: runner.os != 'MacOS' + run: strip *.node + - name: Remove symbols (macOS) + if: runner.os == 'MacOS' + run: strip -x *.node + - name: Upload artifact + uses: actions/upload-artifact@v4 + with: + name: edr-${{ matrix.runner }} + path: crates/edr_napi/edr.*.node + if-no-files-found: error + + publish-edr: + name: Publish EDR + needs: [build-edr] + runs-on: ubuntu-latest + permissions: + contents: read + packages: write + defaults: + run: + shell: bash + working-directory: crates/edr_napi + steps: + - uses: actions/checkout@v4 + with: + repository: NomicFoundation/edr + ref: ${{ inputs.edr-ref }} + - uses: ./.github/actions/setup-node + - name: Install dependencies + run: pnpm install --frozen-lockfile --prefer-offline + - name: Download all artifacts + uses: actions/download-artifact@v4 + with: + path: crates/edr_napi/artifacts + - name: Install sponge + run: | + sudo apt-get update + sudo apt-get install -y moreutils + - name: Move artifacts + run: pnpm artifacts + - name: Install artifacts + run: | + for artifact in npm/*/*.node; do + pnpm install --save "./$(dirname $artifact)" + done + - name: Modify package.json + env: + JSON: | + { + "bundleDependencies": true + } + run: jq --argjson json "$JSON" '. + $json' package.json > package.json.tmp && mv package.json.tmp package.json + - name: Create the package + run: pnpm pack --config.node-linker=hoisted + - name: Upload the package + uses: actions/upload-artifact@v4 + with: + name: edr + path: crates/edr_napi/*.tgz + if-no-files-found: error + + build-and-publish-hardhat: + name: Build and publish Hardhat + needs: [publish-edr] + if: (!cancelled() && inputs.hardhat-ref != 'next' && !startsWith(inputs.hardhat-ref, '3') && inputs.edr-ref == '' || needs.publish-edr.result == 'success') + runs-on: ubuntu-latest + permissions: + contents: read + packages: write + defaults: + run: + shell: bash + working-directory: v-next/hardhat + steps: + - uses: actions/checkout@v4 + with: + repository: NomicFoundation/hardhat + ref: ${{ inputs.hardhat-ref }} + - uses: ./.github/actions/setup-env + - name: Install dependencies + run: | + pnpm install --frozen-lockfile --prefer-offline + - name: Download EDR + if: inputs.edr-ref != '' + uses: actions/download-artifact@v4 + with: + name: edr + path: v-next/hardhat + - name: Install EDR + if: inputs.edr-ref != '' + run: pnpm install ./*.tgz + - name: Build + run: pnpm build + - name: Modify package.json + env: + JSON: | + { + "bundleDependencies": true + } + run: jq --argjson json "$JSON" '. + $json' package.json > package.json.tmp && mv package.json.tmp package.json + - name: Modify top-level package.json + env: + JSON: | + { + "pnpm": { + "supportedArchitectures": { + "os": ["win32", "darwin", "linux"], + "cpu": ["x64", "arm64"] + } + } + } + run: jq --argjson json "$JSON" '. + $json' package.json > package.json.tmp && mv package.json.tmp package.json + working-directory: ${{ github.workspace }} + - name: Deploy + run: | + pnpm deploy --config.node-linker=hoisted --filter=hardhat --prod bundle.tmp + rsync -a --copy-links bundle.tmp/ bundle + rm -rf **/bundle.tmp + working-directory: ${{ github.workspace }} + - name: Pack + run: npm pack + working-directory: bundle + - uses: actions/upload-artifact@v4 + with: + name: hardhat + path: bundle/hardhat-*.tgz + if-no-files-found: error + + test: + name: Run the test command + needs: [build-and-publish-hardhat] + if: (!cancelled() && (inputs.hardhat-ref == 'next' || startsWith(inputs.hardhat-ref, '3')) || needs.build-and-publish-hardhat.result == 'success') + runs-on: ${{ matrix.runner }} + permissions: + contents: read + strategy: + fail-fast: false + matrix: + repository: ${{ fromJSON(inputs.repositories) }} + runner: ${{ fromJSON(inputs.runners) }} + command: ${{ fromJSON(inputs.commands) }} + steps: + - uses: actions/checkout@v4 + with: + path: ${{ github.repository }} + - if: runner.os == 'Windows' + run: choco install yq + - id: workflow + run: | + echo "config<> $GITHUB_OUTPUT + yq -o json . .github/config/regression-tests.yml >> $GITHUB_OUTPUT + echo "EOF" >> $GITHUB_OUTPUT + working-directory: ${{ github.repository }} + - id: config + env: + REPOSITORY: ${{ matrix.repository }} + RUNNER: ${{ matrix.runner }} + COMMAND: ${{ matrix.command }} + CONFIG: ${{ toJSON(fromJSON(steps.workflow.outputs.config)) }} + uses: actions/github-script@v7 + with: + script: | + const fs = require('fs'); + const config = JSON.parse(process.env.CONFIG); + const repositoryConfig = config.repositories[process.env.REPOSITORY]; + const runnerConfig = config.runners[process.env.RUNNER]; + const commandConfig = config.commands[process.env.COMMAND]; + if (!repositoryConfig) { + core.setFailed(`Unsupported repository: ${process.env.REPOSITORY}`); + } + if (!runnerConfig) { + core.setFailed(`Unsupported runner: ${process.env.RUNNER}`); + } + if (!commandConfig) { + core.setFailed(`Unsupported command: ${process.env.COMMAND}`); + } + core.setOutput('repository', JSON.stringify(repositoryConfig)); + core.setOutput('runner', JSON.stringify(runnerConfig)); + core.setOutput('command', JSON.stringify(commandConfig)); + console.log({ + repository: repositoryConfig, + runner: runnerConfig, + command: commandConfig, + }); + - name: Setup Node + uses: actions/setup-node@v4 + with: + node-version: 22 + - name: Download Hardhat + if: (startsWith(matrix.command, 'hardhat') && inputs.hardhat-ref != 'next' && !startsWith(inputs.hardhat-ref, '3')) + uses: actions/download-artifact@v4 + with: + name: hardhat + - name: Fix Hardhat on Windows + if: (startsWith(matrix.command, 'hardhat') && inputs.hardhat-ref != 'next' && !startsWith(inputs.hardhat-ref, '3')) && matrix.runner == 'windows-latest' + run: | + npm init -y + npm install esbuild + rm package.json package-lock.json + tar -xzf hardhat-*.tgz + rm -rf package/node_modules/esbuild package/node_modules/@esbuild + mv node_modules/esbuild package/node_modules + mv node_modules/@esbuild package/node_modules + tar -czf hardhat-*.tgz package + rm -rf package + - name: Install Hardhat from source + if: (startsWith(matrix.command, 'hardhat') && inputs.hardhat-ref != 'next' && !startsWith(inputs.hardhat-ref, '3')) + run: | + npm install -g hardhat-*.tgz + rm hardhat-*.tgz + - name: Install Hardhat + if: (startsWith(matrix.command, 'hardhat') && (inputs.hardhat-ref == 'next' || startsWith(inputs.hardhat-ref, '3'))) + run: | + npm install -g hardhat@${{ inputs.hardhat-ref }} + hardhat --version + - name: Install Forge + if: startsWith(matrix.command, 'forge') + uses: foundry-rs/foundry-toolchain@de808b1eea699e761c404bda44ba8f21aba30b2c + with: + version: ${{ fromJSON(steps.config.outputs.repository).forge-version }} + cache: false + - name: Checkout the repository + uses: actions/checkout@v4 + with: + submodules: recursive + repository: ${{ matrix.repository }} + ref: ${{ fromJSON(steps.config.outputs.repository).ref }} + - name: Update the .gitignore + if: fromJSON(steps.config.outputs.repository).ignore != '' + env: + IGNORE: ${{ fromJSON(steps.config.outputs.repository).ignore }} + run: | + echo "$IGNORE" >> .gitignore + git rm --cached -r $(git ls-files -i -c --exclude-from=.gitignore) + git clean -fdX + - name: Configure Hardhat + if: startsWith(matrix.command, 'hardhat') + env: + CONFIG: ${{ fromJSON(steps.config.outputs.repository).hardhat-config }} + run: | + rm hardhat.config.* || true + echo "$CONFIG" > hardhat.config.js + - name: Initialize the package + if: startsWith(matrix.command, 'hardhat') + run: | + npm init -y + npm pkg set type="module" + - name: Install dependencies (npm) + if: hashFiles('package-lock.json') != '' + run: npm ci + - name: Install dependencies (pnpm) + if: hashFiles('pnpm-lock.yaml') != '' + run: | + npm install -g pnpm + pnpm install --frozen-lockfile --prefer-offline || pnpm install + - name: Install dependencies (yarn) + if: hashFiles('yarn.lock') != '' + run: | + npm install -g yarn + yarn install --immutable + - name: Install dependencies (bun) + if: hashFiles('bun.lockb') != '' + run: | + npm install -g bun + bun install --frozen-lockfile + - name: Run ${{ matrix.command }} + id: run + env: + DEBUG: ${{ runner.debug && '*' || '' }} + ENV_SOURCE: ${{ fromJSON(steps.config.outputs.repository).env }} + run: | + source <(echo "$ENV_SOURCE") + set +e + before=$(date +%s) + ${{ matrix.command }} 2>&1 | tee -a run.output + status=${PIPESTATUS[0]} + after=$(date +%s) + set -e + echo '{"status": '"$status"', "time": '"$((after - before))"'}' > run.result + - name: Run the command post-hook + uses: actions/github-script@v7 + env: + PATTERN: ${{ fromJSON(steps.config.outputs.command).pattern }} + TEMPLATE: ${{ fromJSON(steps.config.outputs.command).template }} + with: + script: | + const fs = require('fs'); + const path = require('path'); + const output = fs.readFileSync('run.output').toString(); + const matches = output.matchAll(new RegExp(process.env.PATTERN, 'g')); + const sums = []; + for (const groups of matches) { + for (let i = 1; i < groups.length; i++) { + while (sums.length < i) { + sums.push(0); + } + sums[i - 1] += parseInt(groups[i]); + } + } + let details = process.env.TEMPLATE; + for (let i = 0; i < sums.length; i++) { + details = details.replaceAll(`\${${i}}`, sums[i]); + } + fs.writeFileSync('run.details', details); + - id: upload + env: + REPOSITORY: ${{ matrix.repository }} + CONTEXT: | + { + "repository": "${{ matrix.repository }}", + "runner": "${{ matrix.runner }}", + "command": "${{ matrix.command }}" + } + run: | + echo "repository=${REPOSITORY//\//_}" | tee -a $GITHUB_OUTPUT + echo "$CONTEXT" > run.context + - name: Upload the result + uses: actions/upload-artifact@v4 + with: + name: repository-${{ steps.upload.outputs.repository }};command-${{ matrix.command }};runner-${{ matrix.runner }} + path: | + run.context + run.output + run.result + run.details + + summarize: + name: Summarize the test results + if: (!cancelled()) + needs: [test] + runs-on: ubuntu-latest + permissions: + contents: read + actions: read + steps: + - name: Download the results + uses: actions/download-artifact@v4 + with: + pattern: "repository-*;command-*;runner-*" + - name: Summarize the results + id: summary + env: + HARDHAT_REF: ${{ inputs.hardhat-ref }} + EDR_REF: ${{ inputs.edr-ref }} + uses: actions/github-script@v7 + with: + script: | + const fs = require('fs'); + const path = require('path'); + const artifacts = fs.readdirSync(process.env.GITHUB_WORKSPACE); + const results = []; + for (const artifact of artifacts) { + const context = JSON.parse(fs.readFileSync(path.join(artifact, 'run.context')).toString()); + const result = JSON.parse(fs.readFileSync(path.join(artifact, 'run.result')).toString()); + const details = fs.readFileSync(path.join(artifact, 'run.details')).toString(); + results.push({ + repository: context.repository, + command: context.command, + runner: context.runner, + result: result.status, + time: result.time, + details, + }); + } + console.log(results); + const header = ['Repository 📦', 'Command 👾', 'Runner 💨', 'Result 🧪', 'Wall-clock Time ⏰', 'Details 🔎'].map(data => ({data, header: true})); + const rows = results.map(({repository, command, runner, result, time, details}) => ([ + repository, + (() => { + if (command.startsWith('hardhat')) { + return `👷 ${command}`; + } else if (command.startsWith('forge')) { + return `⚙️ ${command}`; + } else { + return command; + } + })(), + (() => { + switch (runner) { + case 'ubuntu-latest': + return '🐧 Ubuntu'; + case 'macos-latest': + return '🍎 macOS'; + case 'windows-latest': + return '🪟 Windows'; + } + })(), + (() => { + switch (result) { + case 0: + return '✅ Passed'; + case 1: + return '❌ Failed'; + default: + return `⚠️ Unknown (${result})`; + } + })(), + `${time} s`, + details, + ])); + console.log(header); + console.log(rows); + await core.summary + .addHeading('Test Results') + .addTable([ + header, + ...rows, + ]) + .write() diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 6d196e0990d..ceb94c31446 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -16,14 +16,19 @@ jobs: # This makes Actions fetch all Git history so that Changesets can generate changelogs with the correct commits fetch-depth: 0 - - name: Setup Node.js 14.x + - name: Setup pnpm + uses: pnpm/action-setup@v2 + with: + version: 8 + + - name: Setup Node.js 16.x uses: actions/setup-node@v2 with: - node-version: 14.x - cache: "yarn" + node-version: 16.x + cache: "pnpm" - name: Install Dependencies - run: yarn + run: pnpm install --frozen-lockfile --prefer-offline - name: Create Release Pull Request uses: changesets/action@v1 diff --git a/.github/workflows/test-recent-mainnet-block.yml b/.github/workflows/test-recent-mainnet-block.yml index 2d22215aea5..d5aa432a81d 100644 --- a/.github/workflows/test-recent-mainnet-block.yml +++ b/.github/workflows/test-recent-mainnet-block.yml @@ -14,18 +14,22 @@ jobs: name: Test recent mainnet block runs-on: ubuntu-latest steps: + - uses: actions/checkout@v2 + - uses: pnpm/action-setup@v2 + with: + version: 8 - uses: actions/setup-node@v2 with: - node-version: 14 - - uses: actions/checkout@v2 + node-version: 16 + cache: "pnpm" - name: Install - run: yarn --frozen-lockfile + run: pnpm install --frozen-lockfile --prefer-offline - name: Build - run: yarn build + run: pnpm build - name: Run test env: - INFURA_URL: ${{ secrets.INFURA_URL }} - run: yarn ts-node scripts/test-recent-mainnet-block.ts + ALCHEMY_URL: ${{ secrets.ALCHEMY_URL }} + run: pnpm ts-node scripts/test-recent-mainnet-block.ts - name: Notify failures if: failure() uses: slackapi/slack-github-action@v1.18.0 diff --git a/.github/workflows/test-slow-imports-rule.yml b/.github/workflows/test-slow-imports-rule.yml new file mode 100644 index 00000000000..44999926e36 --- /dev/null +++ b/.github/workflows/test-slow-imports-rule.yml @@ -0,0 +1,43 @@ +# This workflow checks that our slow-imports rule works correctly. +# This is done by intentionally breaking the rule, running the linter, and checking +# that we got a non-zero exit code. It's not a completely fault-proof strategy, +# but it's an useful smoke test. +name: Slow imports rule check + +on: + schedule: + - cron: "0 0 * * *" + workflow_dispatch: + push: + paths: + - ".github/workflows/test-slow-imports-rule.yml" + +defaults: + run: + working-directory: packages/hardhat-core + +jobs: + test-slow-imports-rule: + name: Check that the slow-imports rule works correctly + runs-on: "ubuntu-latest" + steps: + - uses: actions/checkout@v2 + - uses: pnpm/action-setup@v2 + with: + version: 8 + - uses: actions/setup-node@v2 + with: + node-version: 16 + cache: "pnpm" + - name: Install + run: pnpm install --frozen-lockfile --prefer-offline + - name: Add slow import + run: echo 'import "lodash";' >> src/internal/core/config/config-resolution.ts + - name: Build + run: pnpm build + - name: Run eslint + id: run-linter + run: pnpm eslint + continue-on-error: true + - name: Check linter status code + run: test ${{ steps.run-linter.outcome }} != success diff --git a/.gitignore b/.gitignore index 8cd8dd38725..40d4c5f2bb5 100644 --- a/.gitignore +++ b/.gitignore @@ -16,10 +16,6 @@ workspace.code-workspace # Logs logs *.log -npm-debug.log* -yarn-debug.log* -yarn-error.log* -lerna-debug.log* # Diagnostic reports (https://nodejs.org/api/report.html) report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json @@ -58,21 +54,15 @@ jspm_packages/ # TypeScript v1 declaration files typings/ -# Optional npm cache directory -.npm - # Optional eslint cache .eslintcache # Optional REPL history .node_repl_history -# Output of 'npm pack' +# Output of 'pnpm pack' *.tgz -# Yarn Integrity file -.yarn-integrity - # parcel-bundler cache (https://parceljs.org/) .cache @@ -99,8 +89,7 @@ docs/.env.example # Generated by Cargo # will have compiled files and executables -debug/ -target/ +/target/ # Remove Cargo.lock from gitignore if creating an executable, leave it for libraries # More information here https://doc.rust-lang.org/cargo/guide/cargo-toml-vs-cargo-lock.html @@ -114,3 +103,4 @@ Cargo.lock # VSCode settings .vscode/ +*.code-workspace diff --git a/.hintrc b/.hintrc new file mode 100644 index 00000000000..aa8de6b4ec9 --- /dev/null +++ b/.hintrc @@ -0,0 +1,5 @@ +{ + "extends": [ + "development" + ] +} \ No newline at end of file diff --git a/.npmrc b/.npmrc new file mode 100644 index 00000000000..6c59086d862 --- /dev/null +++ b/.npmrc @@ -0,0 +1 @@ +enable-pre-post-scripts=true diff --git a/.nvmrc b/.nvmrc new file mode 100644 index 00000000000..b6a7d89c68e --- /dev/null +++ b/.nvmrc @@ -0,0 +1 @@ +16 diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 00000000000..9005ebe57b8 --- /dev/null +++ b/.prettierignore @@ -0,0 +1 @@ +docs/.next diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 85b90bca8ce..e27b7da2fa5 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -12,17 +12,17 @@ We use a [GitHub project](https://github.com/orgs/NomicFoundation/projects/4/vie ## Project structure -This repository is a monorepo handled with [Yarn v1](https://classic.yarnpkg.com/lang/en/) and [Yarn workspaces](https://classic.yarnpkg.com/en/docs/workspaces/). +This repository is a monorepo handled with [pnpm](https://pnpm.io/) and [pnpm workspaces](https://pnpm.io/workspaces). There's a folder for each subproject in `packages/`. All of them are plugins, except for `/packages/hardhat-core` which is the main project (i.e. the one that's published as [hardhat](https://npmjs.com/package/hardhat) in npm). ## Installing -To install the project's dependencies, run `yarn` in the root directory of the repository. +To install the project's dependencies, run `pnpm i` in the root directory of the repository. ## Building the projects -Plugins require hardhat to be built or tested. Our recommendation is to run `yarn watch` from the root folder. This will keep everything compiled, and these problems will be avoided. +Plugins require hardhat to be built or tested. Our recommendation is to run `pnpm watch` from the root folder. This will keep everything compiled, and these problems will be avoided. ## Testing @@ -30,11 +30,11 @@ All tests are written using [mocha](https://mochajs.org) and [chai](https://www. ### Per-package -You can run a package's tests by executing `yarn test` inside its folder. +You can run a package's tests by executing `pnpm test` inside its folder. ### Entire project -You can run all the tests at once by running `yarn test` from the root folder. +You can run all the tests at once by running `pnpm test` from the root folder. ## Code formatting @@ -42,7 +42,7 @@ We use [Prettier](https://prettier.io/) to format all the code without any speci We also have [eslint](https://eslint.org/) installed in all the projects. It checks that you have run Prettier and forbids some dangerous patterns. -The linter is always run in the CI, so make sure it passes before pushing code. You can use `yarn lint` and `yarn lint:fix` inside the packages' folders. +The linter is always run in the CI, so make sure it passes before pushing code. You can use `pnpm lint` and `pnpm lint:fix` inside the packages' folders. ## Branching @@ -95,23 +95,17 @@ This is a list of the modules that always get loaded during startup: ## Developing locally -All these tips assume you are running `yarn watch` from the root directory. +All these tips assume you are running `pnpm watch` from the root directory. ### Linking -You can [link](https://classic.yarnpkg.com/en/docs/cli/link/) any package to test it locally. While the rest of the commands we run use `yarn`, we recommend you use `npm` for linking, since `yarn link` won't create the `hardhat` executable. For example, if you are working on `hardhat`, you can follow these steps: +You can [link](https://docs.npmjs.com/cli/v9/commands/npm-link/) any package to test it locally. While the rest of the commands we run use `pnpm`, we recommend you use `npm` for linking. For example, if you are working on `hardhat`, you can follow these steps: 1. Go to `packages/hardhat-core` and run `npm link` 2. Go to some hardhat project and run `npm link hardhat` Now any change you make in the code will be reflected in that project. -If you prefer to use `yarn link`, you need to work around the lack of an executable in `node_modules/.bin/hardhat`. We recommend having an alias like this: - -```bash -alias lhh='node --preserve-symlinks $(node -e "console.log(require.resolve(\"hardhat/internal/cli/cli.js\"))")' -``` - ### Yalc If for any reason linking doesn't work for you, you can use [`yalc`](https://github.com/whitecolor/yalc): @@ -121,12 +115,12 @@ If for any reason linking doesn't work for you, you can use [`yalc`](https://git Unlike linking, if you make a change in the code, you'll need to repeat the process. -### yarn pack +### pnpm pack -An even more realistic way of using your local changes in a project is to use [`yarn pack`](https://classic.yarnpkg.com/en/docs/cli/pack/): +An even more realistic way of using your local changes in a project is to use [`pnpm pack`](https://pnpm.io/cli/pack): -1. Go to `packages/hardhat-core` and run `yarn pack`. This will create a `nomiclabs-hardhat-x.y.z.tgz` file in that directory. -2. Go to some hardhat project and run `yarn add /path/to/hardhat/packages/hardhat/nomiclabs-hardhat-x.y.z.tgz`. +1. Go to `packages/hardhat-core` and run `pnpm pack`. This will create a `nomiclabs-hardhat-x.y.z.tgz` file in that directory. +2. Go to some hardhat project and run `npm install /path/to/hardhat/packages/hardhat/nomiclabs-hardhat-x.y.z.tgz`. Unlike linking, if you make a change in the code, you'll need to repeat the process. diff --git a/FUNDING.json b/FUNDING.json new file mode 100644 index 00000000000..f6fef1dd593 --- /dev/null +++ b/FUNDING.json @@ -0,0 +1,10 @@ +{ + "drips": { + "ethereum": { + "ownedBy": "0xbF38a8Dac2AB41e72532c71fcF7Bd703432f3713" + } + }, + "opRetro": { + "projectId": "0x670a2982f6d7786b58a8399bcabc23246365b21e533a97945e055791fc235e64" + } +} diff --git a/README.md b/README.md deleted file mode 120000 index a25545822b3..00000000000 --- a/README.md +++ /dev/null @@ -1 +0,0 @@ -packages/hardhat-core/README.md \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 00000000000..a25545822b3 --- /dev/null +++ b/README.md @@ -0,0 +1 @@ +packages/hardhat-core/README.md \ No newline at end of file diff --git a/banner-config.json b/banner-config.json new file mode 100644 index 00000000000..9d584acbbae --- /dev/null +++ b/banner-config.json @@ -0,0 +1,6 @@ +{ + "enabled": false, + "formattedMessages": [], + "minSecondsBetweenDisplays": 0, + "minSecondsBetweenRequests": 0 +} diff --git a/config/eslint/constants.js b/config/eslint/constants.js new file mode 100644 index 00000000000..ae18c712a29 --- /dev/null +++ b/config/eslint/constants.js @@ -0,0 +1,23 @@ +module.exports.slowImportsCommonIgnoredModules = [ + "chalk", + "debug", + "find-up", + "fs-extra", + "semver", + "source-map-support/register", + "@nomicfoundation/hardhat-ethers", + "hardhat/common", + "hardhat/common/bigInt", + "hardhat/config", + "hardhat/plugins", + "hardhat/types", + "hardhat/types/artifacts", + "hardhat/types/config", + "hardhat/types/runtime", + "hardhat/builtin-tasks/task-names", + "hardhat/internal/core/errors", + "hardhat/internal/core/providers/util", + "hardhat/internal/util/fs-utils", + "hardhat/utils/contract-names", + "hardhat/utils/source-names", +]; diff --git a/config/eslint/eslintrc.js b/config/eslint/eslintrc.js index 0d563e59819..645c6784988 100644 --- a/config/eslint/eslintrc.js +++ b/config/eslint/eslintrc.js @@ -4,13 +4,17 @@ module.exports = { es6: true, node: true, }, - extends: ["plugin:prettier/recommended"], + extends: [ + "plugin:prettier/recommended", + "plugin:@nomicfoundation/slow-imports/recommended", + ], parser: "@typescript-eslint/parser", plugins: [ - "@nomiclabs/eslint-plugin-hardhat-internal-rules", - "eslint-plugin-import", + "@nomicfoundation/hardhat-internal-rules", + "import", "no-only-tests", "@typescript-eslint", + "@nomicfoundation/slow-imports", ], rules: { "@typescript-eslint/adjacent-overload-signatures": "error", @@ -79,6 +83,12 @@ module.exports = { format: ["camelCase", "UPPER_CASE"], leadingUnderscore: "allow", }, + { + selector: ["classProperty"], + modifiers: ["private"], + format: ["camelCase", "UPPER_CASE"], + leadingUnderscore: "require", + }, { selector: "enumMember", format: ["UPPER_CASE"], @@ -191,7 +201,7 @@ module.exports = { "no-cond-assign": "error", "no-debugger": "error", "no-duplicate-case": "error", - "no-duplicate-imports": "error", + "@typescript-eslint/no-duplicate-imports": "error", "no-eval": "error", "no-extra-bind": "error", "no-new-func": "error", diff --git a/config/typescript/tsconfig.json b/config/typescript/tsconfig.json index fbbc0efe2cb..52c240b20e4 100644 --- a/config/typescript/tsconfig.json +++ b/config/typescript/tsconfig.json @@ -1,6 +1,6 @@ { "compilerOptions": { - "target": "ES2020", + "target": "ES2021", "module": "commonjs", "declaration": true, "declarationMap": true, diff --git a/crates/rethnet_evm_napi/.gitignore b/crates/rethnet_evm_napi/.gitignore deleted file mode 100644 index 2e30f56130f..00000000000 --- a/crates/rethnet_evm_napi/.gitignore +++ /dev/null @@ -1,112 +0,0 @@ -# node modules -/node_modules - -# vuepress -/docs/.vuepress/dist/ - -# Tests compilation output -/build-test/ - -# Code coverage artifacts -/coverage -/.nyc_output - -# TSC prod output. This has to be in sync with the to directories in ./src, and with npm script clean - -/*.js -/*.js.map -/*.d.ts -/*.d.ts.map -/*.node -/builtin-tasks -/common -/internal -/types -/utils - -test/internal/hardhat-network/provider/.hardhat_node_test_cache/ -!.eslintrc.js - -# Below is Github's node gitignore template, -# ignoring the node_modules part, as it'd ignore every node_modules, and we have some for testing - -# Logs -logs -*.log -npm-debug.log* -yarn-debug.log* -yarn-error.log* -lerna-debug.log* - -# Diagnostic reports (https://nodejs.org/api/report.html) -report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json - -# Runtime data -pids -*.pid -*.seed -*.pid.lock - -# Directory for instrumented libs generated by jscoverage/JSCover -lib-cov - -# Coverage directory used by tools like istanbul -coverage - -# nyc test coverage -.nyc_output - -# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) -.grunt - -# Bower dependency directory (https://bower.io/) -bower_components - -# node-waf configuration -.lock-wscript - -# Compiled binary addons (https://nodejs.org/api/addons.html) -build/Release - -# Dependency directories -#node_modules/ -jspm_packages/ - -# TypeScript v1 declaration files -typings/ - -# Optional npm cache directory -.npm - -# Optional eslint cache -.eslintcache - -# Optional REPL history -.node_repl_history - -# Output of 'npm pack' -*.tgz - -# Yarn Integrity file -.yarn-integrity - -# parcel-bundler cache (https://parceljs.org/) -.cache - -# next.js build output -.next - -# nuxt.js build output -.nuxt - -# vuepress build output -.vuepress/dist - -# Serverless directories -.serverless/ - -# FuseBox cache -.fusebox/ - -# DynamoDB Local files -.dynamodb/ diff --git a/docs/.babelrc b/docs/.babelrc deleted file mode 100644 index 2a7aa6993b2..00000000000 --- a/docs/.babelrc +++ /dev/null @@ -1,3 +0,0 @@ -{ - "presets": ["next/babel", "linaria/babel"] -} diff --git a/docs/.env.example b/docs/.env.example deleted file mode 100644 index bf0bb398a68..00000000000 --- a/docs/.env.example +++ /dev/null @@ -1,4 +0,0 @@ -NEXT_PUBLIC_ALGOLIA_APP_ID = -NEXT_PUBLIC_ALGOLIA_API_KEY = -NEXT_PUBLIC_ALGOLIA_INDEX_NAME = -NEXT_PUBLIC_MEASUREMENT_ID = diff --git a/docs/.eslintrc.js b/docs/.eslintrc.js index f3cbe10dcae..e628645ec85 100644 --- a/docs/.eslintrc.js +++ b/docs/.eslintrc.js @@ -4,7 +4,6 @@ module.exports = { project: "./tsconfig.json", }, extends: [ - `${__dirname}/../config/eslint/eslintrc.js`, "airbnb", "airbnb-typescript", "next/core-web-vitals", diff --git a/docs/.gitignore b/docs/.gitignore index 6dac9b8c3cc..3750a66d8fc 100644 --- a/docs/.gitignore +++ b/docs/.gitignore @@ -29,9 +29,6 @@ src/content/hardhat-runner/docs/errors/index.md *.pem # debug -npm-debug.log* -yarn-debug.log* -yarn-error.log* .pnpm-debug.log* # local env files diff --git a/docs/.npmrc b/docs/.npmrc new file mode 100644 index 00000000000..ae90f705144 --- /dev/null +++ b/docs/.npmrc @@ -0,0 +1 @@ +ignore-workspace-root-check=true diff --git a/docs/.prettierignore b/docs/.prettierignore deleted file mode 100644 index 07e6e472cc7..00000000000 --- a/docs/.prettierignore +++ /dev/null @@ -1 +0,0 @@ -/node_modules diff --git a/docs/.storybook/common-decorators.js b/docs/.storybook/common-decorators.js deleted file mode 100644 index 92def8ae8ab..00000000000 --- a/docs/.storybook/common-decorators.js +++ /dev/null @@ -1,7 +0,0 @@ -import React from "react"; - -export const mdWrapper = (Story) => ( -
- -
-); diff --git a/docs/.storybook/main.js b/docs/.storybook/main.js deleted file mode 100644 index 1fd63db5b60..00000000000 --- a/docs/.storybook/main.js +++ /dev/null @@ -1,26 +0,0 @@ -const nextConfig = require("../next.config.js"); - -module.exports = { - stories: ["../src/components/**/*.stories.tsx"], - addons: [ - "@react-theming/storybook-addon", - // "@storybook/addon-links", - // "@storybook/addon-essentials", - // "@storybook/addon-interactions", - ], - staticDirs: ["../public"], - framework: "@storybook/react", - webpackFinal: async (baseConfig) => { - return nextConfig.linariaConfig.webpack(baseConfig, {}); - }, - typescript: { - check: false, - checkOptions: {}, - reactDocgen: "react-docgen-typescript", - reactDocgenTypescriptOptions: { - shouldExtractLiteralValuesFromEnum: true, - propFilter: (prop) => - prop.parent ? !/node_modules/.test(prop.parent.fileName) : true, - }, - }, -}; diff --git a/docs/.storybook/preview.js b/docs/.storybook/preview.js deleted file mode 100644 index d836787ff7e..00000000000 --- a/docs/.storybook/preview.js +++ /dev/null @@ -1,86 +0,0 @@ -import React from "react"; -import { withThemes } from "@react-theming/storybook-addon"; -import * as NextImage from "next/image"; - -import "../src/styles/globals.css"; - -import { - ThemeProvider, - media, - tmSelectors, - breakpoints, - lightPalette, - darkPalette, - hcDarkPalette, - ThemeContext, - theming, - ThemesEnum, -} from "../src/themes"; - -export const parameters = { - actions: { argTypesRegex: "^on[A-Z].*" }, - controls: { - matchers: { - color: /(background|color)$/i, - date: /Date$/, - }, - }, -}; - -const OriginalNextImage = NextImage.default; - -Object.defineProperty(NextImage, "default", { - configurable: true, - value: (props) => , -}); - -const providerFn = ({ theme, children }) => { - const appTheme = { - light: { - colors: theme, - }, - dark: { - colors: darkPalette, - }, - hcDark: { - colors: hcDarkPalette, - }, - media, - breakpoints, - tmSelectors, - }; - - const themesTypesMap = { - Light: ThemesEnum.LIGHT, - Dark: ThemesEnum.DARK, - "Dark HC": ThemesEnum.HC_DARK, - }; - - return ( - null }} - > - {children} - - ); -}; - -export const onThemeSwitch = (context) => { - const { theme } = context; - const background = theme.neutral0 || null; - const parameters = { - backgrounds: { - default: background, - }, - }; - return { - parameters, - }; -}; - -const themingDecorator = withThemes( - null, - [lightPalette, darkPalette, hcDarkPalette], - { providerFn, onThemeSwitch } -); -export const decorators = [themingDecorator]; diff --git a/docs/README.md b/docs/README.md index b5c9b1f93b1..36e2835f747 100644 --- a/docs/README.md +++ b/docs/README.md @@ -30,7 +30,7 @@ Website content is located in `*.md` files within `src/content` folder. It's wri To tune pages, behavior and appearance also use optional `*.yaml` files with additional configurations. -To preview content locally, launch the app with `yarn dev` and open http://127.0.0.1:3000 in your browser. See details in [Development](#development) section. +To preview content locally, launch the app with `pnpm dev` and open http://127.0.0.1:3000 in your browser. See details in [Development](#development) section. ### Layouts @@ -134,13 +134,13 @@ First, install dependencies: ```sh cd docs -yarn +pnpm install ``` Then, run the development server: ```bash -yarn dev +pnpm dev ``` Open [http://127.0.0.1:3000](http://127.0.0.1:3000) with your browser to see the result. @@ -167,7 +167,7 @@ When developing the application you might need these main folders ## Storybook -You can use Storybook to develop components in isolation. Launch it via `yarn storybook` and open http://127.0.0.1:6006/ You will see a list of components in the left-side sidebar. When you edit component's code and save it, the Storybook is auto-updating it. +You can use Storybook to develop components in isolation. Launch it via `pnpm storybook` and open http://127.0.0.1:6006/ You will see a list of components in the left-side sidebar. When you edit component's code and save it, the Storybook is auto-updating it. Each component can be exposed with different states (stories) independently by passing props you need. You can find component stories settings in `Component.stories.ts` files. diff --git a/docs/next-env.d.ts b/docs/next-env.d.ts deleted file mode 100644 index 4f11a03dc6c..00000000000 --- a/docs/next-env.d.ts +++ /dev/null @@ -1,5 +0,0 @@ -/// -/// - -// NOTE: This file should not be edited -// see https://nextjs.org/docs/basic-features/typescript for more information. diff --git a/docs/next-sitemap.js b/docs/next-sitemap.js deleted file mode 100644 index c622aff27a2..00000000000 --- a/docs/next-sitemap.js +++ /dev/null @@ -1,6 +0,0 @@ -/** @type {import('next-sitemap').IConfig} */ - -module.exports = { - siteUrl: "https://hardhat.org", - generateRobotsTxt: true, -}; diff --git a/docs/next.config.js b/docs/next.config.js index a99e253e557..1db8f38aa3a 100644 --- a/docs/next.config.js +++ b/docs/next.config.js @@ -11,6 +11,13 @@ const withBundleAnalyzer = require("@next/bundle-analyzer")({ const linariaConfig = withLinaria({ async redirects() { return [ + // We moved the privacy policy to /static to make the next rule + // simpler, so we need to redirect it before it, instead of in a customRedirect + { + source: "/privacy-policy", + destination: "/static/privacy-policy.html", + permanent: false, + }, { /** * NOTE: this removes '.html' extensions from URLs @@ -19,10 +26,9 @@ const linariaConfig = withLinaria({ * * We need this to keep the links of the previous version workable. * - * The only exception is the privacy-policy.html file, which we host in - * public/ + * We host some static html files in /static/ though. */ - source: "/:slug((?!privacy-policy).*).html", + source: "/:slug((?!static\\/).*).html", destination: "/:slug*", permanent: true, }, diff --git a/docs/package.json b/docs/package.json index b051b4e0a66..b6437b1ce5b 100644 --- a/docs/package.json +++ b/docs/package.json @@ -10,9 +10,7 @@ "postbuild": "next-sitemap", "build:test": "ANALYZE=true next build", "start": "next start", - "lint": "eslint src -f unix", - "storybook": "start-storybook -p 6006 --ci", - "build-storybook": "build-storybook" + "lint": "eslint src -f unix" }, "dependencies": { "@callstack/react-theme-provider": "^3.0.7", @@ -21,7 +19,7 @@ "gray-matter": "^4.0.3", "hastscript": "^7.0.2", "linaria": "^2.3.1", - "next": "12.1.0", + "next": "12.3.4", "next-linaria": "^0.11.0", "next-mdx-remote": "^4.0.2", "react": "17.0.2", @@ -33,7 +31,7 @@ "remark-prism": "^1.3.6", "remark-unwrap-images": "^3.0.1", "ts-node": "^10.8.0", - "undici": "^5.19.1", + "undici": "^5.26.2", "unist-util-visit": "^4.1.0" }, "devDependencies": { @@ -47,12 +45,14 @@ "@storybook/addon-links": "^6.4.19", "@storybook/react": "^6.4.19", "@storybook/testing-library": "^0.0.9", + "@types/glob": "^8.1.0", + "@types/js-yaml": "^4.0.9", "@types/mdx-js__react": "^1.5.5", "@types/node": "17.0.21", "@types/react": "17.0.39", "@types/remark-prism": "^1.3.3", - "@typescript-eslint/eslint-plugin": "^5.16.0", - "@typescript-eslint/parser": "^5.16.0", + "@typescript-eslint/eslint-plugin": "5.61.0", + "@typescript-eslint/parser": "5.61.0", "babel-eslint": "^10.1.0", "babel-loader": "^8.2.3", "eslint": "8.10.0", diff --git a/docs/pnpm-lock.yaml b/docs/pnpm-lock.yaml new file mode 100644 index 00000000000..fb655bfe7d4 --- /dev/null +++ b/docs/pnpm-lock.yaml @@ -0,0 +1,14021 @@ +lockfileVersion: '6.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + '@callstack/react-theme-provider': + specifier: ^3.0.7 + version: 3.0.7(react@17.0.2) + '@docsearch/react': + specifier: '3' + version: 3.0.0(@algolia/client-search@4.13.0)(@types/react@17.0.39)(react-dom@17.0.2)(react@17.0.2) + glob: + specifier: ^8.0.1 + version: 8.0.1 + gray-matter: + specifier: ^4.0.3 + version: 4.0.3 + hastscript: + specifier: ^7.0.2 + version: 7.0.2 + linaria: + specifier: ^2.3.1 + version: 2.3.1(@babel/core@7.17.5) + next: + specifier: 12.3.4 + version: 12.3.4(@babel/core@7.17.5)(react-dom@17.0.2)(react@17.0.2) + next-linaria: + specifier: ^0.11.0 + version: 0.11.0(linaria@2.3.1) + next-mdx-remote: + specifier: ^4.0.2 + version: 4.0.2(react-dom@17.0.2)(react@17.0.2) + react: + specifier: 17.0.2 + version: 17.0.2 + react-dom: + specifier: 17.0.2 + version: 17.0.2(react@17.0.2) + react-responsive-carousel: + specifier: ^3.2.23 + version: 3.2.23 + rehype-prism: + specifier: ^2.1.2 + version: 2.1.2(unified@10.1.2) + remark-directive: + specifier: ^2.0.1 + version: 2.0.1 + remark-gfm: + specifier: ^3.0.1 + version: 3.0.1 + remark-prism: + specifier: ^1.3.6 + version: 1.3.6 + remark-unwrap-images: + specifier: ^3.0.1 + version: 3.0.1 + ts-node: + specifier: ^10.8.0 + version: 10.8.0(@types/node@17.0.21)(typescript@4.5.5) + undici: + specifier: ^5.26.2 + version: 5.26.2 + unist-util-visit: + specifier: ^4.1.0 + version: 4.1.0 + devDependencies: + '@babel/core': + specifier: ^7.17.5 + version: 7.17.5 + '@babel/preset-env': + specifier: ^7.16.11 + version: 7.16.11(@babel/core@7.17.5) + '@next/bundle-analyzer': + specifier: ^12.1.5 + version: 12.1.5 + '@react-theming/storybook-addon': + specifier: ^1.1.5 + version: 1.1.5(@storybook/addons@6.4.19)(@storybook/react@6.4.19)(@storybook/theming@6.4.19)(react-dom@17.0.2)(react@17.0.2) + '@storybook/addon-actions': + specifier: ^6.4.19 + version: 6.4.19(@types/react@17.0.39)(react-dom@17.0.2)(react@17.0.2) + '@storybook/addon-essentials': + specifier: ^6.4.19 + version: 6.4.19(@babel/core@7.17.5)(@storybook/react@6.4.19)(@types/react@17.0.39)(babel-loader@8.2.3)(eslint@8.10.0)(react-dom@17.0.2)(react@17.0.2)(typescript@4.5.5)(webpack@4.46.0) + '@storybook/addon-interactions': + specifier: ^6.4.19 + version: 6.4.19(@types/react@17.0.39)(eslint@8.10.0)(react-dom@17.0.2)(react@17.0.2)(typescript@4.5.5) + '@storybook/addon-links': + specifier: ^6.4.19 + version: 6.4.19(react-dom@17.0.2)(react@17.0.2) + '@storybook/react': + specifier: ^6.4.19 + version: 6.4.19(@babel/core@7.17.5)(@types/react@17.0.39)(eslint@8.10.0)(react-dom@17.0.2)(react@17.0.2)(typescript@4.5.5) + '@storybook/testing-library': + specifier: ^0.0.9 + version: 0.0.9(react-dom@17.0.2)(react@17.0.2) + '@types/glob': + specifier: ^8.1.0 + version: 8.1.0 + '@types/js-yaml': + specifier: ^4.0.9 + version: 4.0.9 + '@types/mdx-js__react': + specifier: ^1.5.5 + version: 1.5.5 + '@types/node': + specifier: 17.0.21 + version: 17.0.21 + '@types/react': + specifier: 17.0.39 + version: 17.0.39 + '@types/remark-prism': + specifier: ^1.3.3 + version: 1.3.3 + '@typescript-eslint/eslint-plugin': + specifier: 5.61.0 + version: 5.61.0(@typescript-eslint/parser@5.61.0)(eslint@8.10.0)(typescript@4.5.5) + '@typescript-eslint/parser': + specifier: 5.61.0 + version: 5.61.0(eslint@8.10.0)(typescript@4.5.5) + babel-eslint: + specifier: ^10.1.0 + version: 10.1.0(eslint@8.10.0) + babel-loader: + specifier: ^8.2.3 + version: 8.2.3(@babel/core@7.17.5)(webpack@4.46.0) + eslint: + specifier: 8.10.0 + version: 8.10.0 + eslint-config-airbnb: + specifier: ^19.0.4 + version: 19.0.4(eslint-plugin-import@2.25.4)(eslint-plugin-jsx-a11y@6.5.1)(eslint-plugin-react-hooks@4.3.0)(eslint-plugin-react@7.29.2)(eslint@8.10.0) + eslint-config-airbnb-typescript: + specifier: ^16.1.4 + version: 16.1.4(@typescript-eslint/eslint-plugin@5.61.0)(@typescript-eslint/parser@5.61.0)(eslint-plugin-import@2.25.4)(eslint@8.10.0) + eslint-config-next: + specifier: 12.1.0 + version: 12.1.0(eslint@8.10.0)(next@12.3.4)(typescript@4.5.5) + eslint-config-prettier: + specifier: ^8.5.0 + version: 8.5.0(eslint@8.10.0) + eslint-plugin-prettier: + specifier: ^4.0.0 + version: 4.0.0(eslint-config-prettier@8.5.0)(eslint@8.10.0)(prettier@2.4.1) + eslint-plugin-react-hooks: + specifier: ^4.3.0 + version: 4.3.0(eslint@8.10.0) + eslint-plugin-storybook: + specifier: ^0.5.7 + version: 0.5.7(eslint@8.10.0)(typescript@4.5.5) + js-yaml: + specifier: ^4.1.0 + version: 4.1.0 + next-compose-plugins: + specifier: ^2.2.1 + version: 2.2.1 + next-remote-watch: + specifier: ^1.0.0 + version: 1.0.0 + next-sitemap: + specifier: ^2.5.20 + version: 2.5.20(next@12.3.4) + prettier: + specifier: 2.4.1 + version: 2.4.1 + typescript: + specifier: 4.5.5 + version: 4.5.5 + +packages: + + /@algolia/autocomplete-core@1.5.2: + resolution: {integrity: sha512-DY0bhyczFSS1b/CqJlTE/nQRtnTAHl6IemIkBy0nEWnhDzRDdtdx4p5Uuk3vwAFxwEEgi1WqKwgSSMx6DpNL4A==} + dependencies: + '@algolia/autocomplete-shared': 1.5.2 + dev: false + + /@algolia/autocomplete-preset-algolia@1.5.2(@algolia/client-search@4.13.0)(algoliasearch@4.13.0): + resolution: {integrity: sha512-3MRYnYQFJyovANzSX2CToS6/5cfVjbLLqFsZTKcvF3abhQzxbqwwaMBlJtt620uBUOeMzhdfasKhCc40+RHiZw==} + peerDependencies: + '@algolia/client-search': ^4.9.1 + algoliasearch: ^4.9.1 + dependencies: + '@algolia/autocomplete-shared': 1.5.2 + '@algolia/client-search': 4.13.0 + algoliasearch: 4.13.0 + dev: false + + /@algolia/autocomplete-shared@1.5.2: + resolution: {integrity: sha512-ylQAYv5H0YKMfHgVWX0j0NmL8XBcAeeeVQUmppnnMtzDbDnca6CzhKj3Q8eF9cHCgcdTDdb5K+3aKyGWA0obug==} + dev: false + + /@algolia/cache-browser-local-storage@4.13.0: + resolution: {integrity: sha512-nj1vHRZauTqP/bluwkRIgEADEimqojJgoTRCel5f6q8WCa9Y8QeI4bpDQP28FoeKnDRYa3J5CauDlN466jqRhg==} + dependencies: + '@algolia/cache-common': 4.13.0 + dev: false + + /@algolia/cache-common@4.13.0: + resolution: {integrity: sha512-f9mdZjskCui/dA/fA/5a+6hZ7xnHaaZI5tM/Rw9X8rRB39SUlF/+o3P47onZ33n/AwkpSbi5QOyhs16wHd55kA==} + dev: false + + /@algolia/cache-in-memory@4.13.0: + resolution: {integrity: sha512-hHdc+ahPiMM92CQMljmObE75laYzNFYLrNOu0Q3/eyvubZZRtY2SUsEEgyUEyzXruNdzrkcDxFYa7YpWBJYHAg==} + dependencies: + '@algolia/cache-common': 4.13.0 + dev: false + + /@algolia/client-account@4.13.0: + resolution: {integrity: sha512-FzFqFt9b0g/LKszBDoEsW+dVBuUe1K3scp2Yf7q6pgHWM1WqyqUlARwVpLxqyc+LoyJkTxQftOKjyFUqddnPKA==} + dependencies: + '@algolia/client-common': 4.13.0 + '@algolia/client-search': 4.13.0 + '@algolia/transporter': 4.13.0 + dev: false + + /@algolia/client-analytics@4.13.0: + resolution: {integrity: sha512-klmnoq2FIiiMHImkzOm+cGxqRLLu9CMHqFhbgSy9wtXZrqb8BBUIUE2VyBe7azzv1wKcxZV2RUyNOMpFqmnRZA==} + dependencies: + '@algolia/client-common': 4.13.0 + '@algolia/client-search': 4.13.0 + '@algolia/requester-common': 4.13.0 + '@algolia/transporter': 4.13.0 + dev: false + + /@algolia/client-common@4.13.0: + resolution: {integrity: sha512-GoXfTp0kVcbgfSXOjfrxx+slSipMqGO9WnNWgeMmru5Ra09MDjrcdunsiiuzF0wua6INbIpBQFTC2Mi5lUNqGA==} + dependencies: + '@algolia/requester-common': 4.13.0 + '@algolia/transporter': 4.13.0 + dev: false + + /@algolia/client-personalization@4.13.0: + resolution: {integrity: sha512-KneLz2WaehJmNfdr5yt2HQETpLaCYagRdWwIwkTqRVFCv4DxRQ2ChPVW9jeTj4YfAAhfzE6F8hn7wkQ/Jfj6ZA==} + dependencies: + '@algolia/client-common': 4.13.0 + '@algolia/requester-common': 4.13.0 + '@algolia/transporter': 4.13.0 + dev: false + + /@algolia/client-search@4.13.0: + resolution: {integrity: sha512-blgCKYbZh1NgJWzeGf+caKE32mo3j54NprOf0LZVCubQb3Kx37tk1Hc8SDs9bCAE8hUvf3cazMPIg7wscSxspA==} + dependencies: + '@algolia/client-common': 4.13.0 + '@algolia/requester-common': 4.13.0 + '@algolia/transporter': 4.13.0 + dev: false + + /@algolia/logger-common@4.13.0: + resolution: {integrity: sha512-8yqXk7rMtmQJ9wZiHOt/6d4/JDEg5VCk83gJ39I+X/pwUPzIsbKy9QiK4uJ3aJELKyoIiDT1hpYVt+5ia+94IA==} + dev: false + + /@algolia/logger-console@4.13.0: + resolution: {integrity: sha512-YepRg7w2/87L0vSXRfMND6VJ5d6699sFJBRWzZPOlek2p5fLxxK7O0VncYuc/IbVHEgeApvgXx0WgCEa38GVuQ==} + dependencies: + '@algolia/logger-common': 4.13.0 + dev: false + + /@algolia/requester-browser-xhr@4.13.0: + resolution: {integrity: sha512-Dj+bnoWR5MotrnjblzGKZ2kCdQi2cK/VzPURPnE616NU/il7Ypy6U6DLGZ/ZYz+tnwPa0yypNf21uqt84fOgrg==} + dependencies: + '@algolia/requester-common': 4.13.0 + dev: false + + /@algolia/requester-common@4.13.0: + resolution: {integrity: sha512-BRTDj53ecK+gn7ugukDWOOcBRul59C4NblCHqj4Zm5msd5UnHFjd/sGX+RLOEoFMhetILAnmg6wMrRrQVac9vw==} + dev: false + + /@algolia/requester-node-http@4.13.0: + resolution: {integrity: sha512-9b+3O4QFU4azLhGMrZAr/uZPydvzOR4aEZfSL8ZrpLZ7fbbqTO0S/5EVko+QIgglRAtVwxvf8UJ1wzTD2jvKxQ==} + dependencies: + '@algolia/requester-common': 4.13.0 + dev: false + + /@algolia/transporter@4.13.0: + resolution: {integrity: sha512-8tSQYE+ykQENAdeZdofvtkOr5uJ9VcQSWgRhQ9h01AehtBIPAczk/b2CLrMsw5yQZziLs5cZ3pJ3478yI+urhA==} + dependencies: + '@algolia/cache-common': 4.13.0 + '@algolia/logger-common': 4.13.0 + '@algolia/requester-common': 4.13.0 + dev: false + + /@ampproject/remapping@2.1.2: + resolution: {integrity: sha512-hoyByceqwKirw7w3Z7gnIIZC3Wx3J484Y3L/cMpXFbr7d9ZQj2mODrirNzcJa+SM3UlpWXYvKV4RlRpFXlWgXg==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/trace-mapping': 0.3.19 + + /@babel/code-frame@7.22.13: + resolution: {integrity: sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/highlight': 7.22.20 + chalk: 2.4.2 + + /@babel/compat-data@7.17.0: + resolution: {integrity: sha512-392byTlpGWXMv4FbyWw3sAZ/FrW/DrwqLGXpy0mbyNe9Taqv1mg9yON5/o0cnr8XYCkFTZbC1eV+c+LAROgrng==} + engines: {node: '>=6.9.0'} + + /@babel/core@7.12.9: + resolution: {integrity: sha512-gTXYh3M5wb7FRXQy+FErKFAv90BnlOuNn1QkCK2lREoPAjrQCO49+HVSrFoe5uakFAF5eenS75KbO2vQiLrTMQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.22.13 + '@babel/generator': 7.23.0 + '@babel/helper-module-transforms': 7.17.6 + '@babel/helpers': 7.17.2 + '@babel/parser': 7.23.0 + '@babel/template': 7.22.15 + '@babel/traverse': 7.23.2 + '@babel/types': 7.23.0 + convert-source-map: 1.8.0 + debug: 4.3.4 + gensync: 1.0.0-beta.2 + json5: 2.2.0 + lodash: 4.17.21 + resolve: 1.22.0 + semver: 5.7.2 + source-map: 0.5.7 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/core@7.17.5: + resolution: {integrity: sha512-/BBMw4EvjmyquN5O+t5eh0+YqB3XXJkYD2cjKpYtWOfFy4lQ4UozNSmxAcWT8r2XtZs0ewG+zrfsqeR15i1ajA==} + engines: {node: '>=6.9.0'} + dependencies: + '@ampproject/remapping': 2.1.2 + '@babel/code-frame': 7.22.13 + '@babel/generator': 7.23.0 + '@babel/helper-compilation-targets': 7.16.7(@babel/core@7.17.5) + '@babel/helper-module-transforms': 7.17.6 + '@babel/helpers': 7.17.2 + '@babel/parser': 7.23.0 + '@babel/template': 7.22.15 + '@babel/traverse': 7.23.2 + '@babel/types': 7.23.0 + convert-source-map: 1.8.0 + debug: 4.3.4 + gensync: 1.0.0-beta.2 + json5: 2.2.0 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + /@babel/generator@7.23.0: + resolution: {integrity: sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.0 + '@jridgewell/gen-mapping': 0.3.3 + '@jridgewell/trace-mapping': 0.3.19 + jsesc: 2.5.2 + + /@babel/helper-annotate-as-pure@7.16.7: + resolution: {integrity: sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.0 + dev: true + + /@babel/helper-builder-binary-assignment-operator-visitor@7.16.7: + resolution: {integrity: sha512-C6FdbRaxYjwVu/geKW4ZeQ0Q31AftgRcdSnZ5/jsH6BzCJbtvXvhpfkbkThYSuutZA7nCXpPR6AD9zd1dprMkA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-explode-assignable-expression': 7.16.7 + '@babel/types': 7.23.0 + dev: true + + /@babel/helper-compilation-targets@7.16.7(@babel/core@7.17.5): + resolution: {integrity: sha512-mGojBwIWcwGD6rfqgRXVlVYmPAv7eOpIemUG3dGnDdCY4Pae70ROij3XmfrH6Fa1h1aiDylpglbZyktfzyo/hA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/compat-data': 7.17.0 + '@babel/core': 7.17.5 + '@babel/helper-validator-option': 7.16.7 + browserslist: 4.19.3 + semver: 6.3.1 + + /@babel/helper-create-class-features-plugin@7.17.6(@babel/core@7.17.5): + resolution: {integrity: sha512-SogLLSxXm2OkBbSsHZMM4tUi8fUzjs63AT/d0YQIzr6GSd8Hxsbk2KYDX0k0DweAzGMj/YWeiCsorIdtdcW8Eg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.17.5 + '@babel/helper-annotate-as-pure': 7.16.7 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-member-expression-to-functions': 7.16.7 + '@babel/helper-optimise-call-expression': 7.16.7 + '@babel/helper-replace-supers': 7.16.7 + '@babel/helper-split-export-declaration': 7.22.6 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/helper-create-regexp-features-plugin@7.17.0(@babel/core@7.17.5): + resolution: {integrity: sha512-awO2So99wG6KnlE+TPs6rn83gCz5WlEePJDTnLEqbchMVrBeAujURVphRdigsk094VhvZehFoNOihSlcBjwsXA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.17.5 + '@babel/helper-annotate-as-pure': 7.16.7 + regexpu-core: 5.0.1 + dev: true + + /@babel/helper-define-polyfill-provider@0.1.5(@babel/core@7.17.5): + resolution: {integrity: sha512-nXuzCSwlJ/WKr8qxzW816gwyT6VZgiJG17zR40fou70yfAcqjoNyTLl/DQ+FExw5Hx5KNqshmN8Ldl/r2N7cTg==} + peerDependencies: + '@babel/core': ^7.4.0-0 + dependencies: + '@babel/core': 7.17.5 + '@babel/helper-compilation-targets': 7.16.7(@babel/core@7.17.5) + '@babel/helper-module-imports': 7.16.7 + '@babel/helper-plugin-utils': 7.16.7 + '@babel/traverse': 7.23.2 + debug: 4.3.4 + lodash.debounce: 4.0.8 + resolve: 1.22.0 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/helper-define-polyfill-provider@0.3.1(@babel/core@7.17.5): + resolution: {integrity: sha512-J9hGMpJQmtWmj46B3kBHmL38UhJGhYX7eqkcq+2gsstyYt341HmPeWspihX43yVRA0mS+8GGk2Gckc7bY/HCmA==} + peerDependencies: + '@babel/core': ^7.4.0-0 + dependencies: + '@babel/core': 7.17.5 + '@babel/helper-compilation-targets': 7.16.7(@babel/core@7.17.5) + '@babel/helper-module-imports': 7.16.7 + '@babel/helper-plugin-utils': 7.16.7 + '@babel/traverse': 7.23.2 + debug: 4.3.4 + lodash.debounce: 4.0.8 + resolve: 1.22.0 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + /@babel/helper-environment-visitor@7.22.20: + resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==} + engines: {node: '>=6.9.0'} + + /@babel/helper-explode-assignable-expression@7.16.7: + resolution: {integrity: sha512-KyUenhWMC8VrxzkGP0Jizjo4/Zx+1nNZhgocs+gLzyZyB8SHidhoq9KK/8Ato4anhwsivfkBLftky7gvzbZMtQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.0 + dev: true + + /@babel/helper-function-name@7.23.0: + resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.22.15 + '@babel/types': 7.23.0 + + /@babel/helper-hoist-variables@7.22.5: + resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.0 + + /@babel/helper-member-expression-to-functions@7.16.7: + resolution: {integrity: sha512-VtJ/65tYiU/6AbMTDwyoXGPKHgTsfRarivm+YbB5uAzKUyuPjgZSgAFeG87FCigc7KNHu2Pegh1XIT3lXjvz3Q==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.0 + dev: true + + /@babel/helper-module-imports@7.16.7: + resolution: {integrity: sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.0 + + /@babel/helper-module-transforms@7.17.6: + resolution: {integrity: sha512-2ULmRdqoOMpdvkbT8jONrZML/XALfzxlb052bldftkicAUy8AxSCkD5trDPQcwHNmolcl7wP6ehNqMlyUw6AaA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-module-imports': 7.16.7 + '@babel/helper-simple-access': 7.16.7 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/helper-validator-identifier': 7.22.20 + '@babel/template': 7.22.15 + '@babel/traverse': 7.23.2 + '@babel/types': 7.23.0 + transitivePeerDependencies: + - supports-color + + /@babel/helper-optimise-call-expression@7.16.7: + resolution: {integrity: sha512-EtgBhg7rd/JcnpZFXpBy0ze1YRfdm7BnBX4uKMBd3ixa3RGAE002JZB66FJyNH7g0F38U05pXmA5P8cBh7z+1w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.0 + dev: true + + /@babel/helper-plugin-utils@7.10.4: + resolution: {integrity: sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==} + dev: true + + /@babel/helper-plugin-utils@7.16.7: + resolution: {integrity: sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==} + engines: {node: '>=6.9.0'} + + /@babel/helper-remap-async-to-generator@7.16.8: + resolution: {integrity: sha512-fm0gH7Flb8H51LqJHy3HJ3wnE1+qtYR2A99K06ahwrawLdOFsCEWjZOrYricXJHoPSudNKxrMBUPEIPxiIIvBw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-annotate-as-pure': 7.16.7 + '@babel/helper-wrap-function': 7.16.8 + '@babel/types': 7.23.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/helper-replace-supers@7.16.7: + resolution: {integrity: sha512-y9vsWilTNaVnVh6xiJfABzsNpgDPKev9HnAgz6Gb1p6UUwf9NepdlsV7VXGCftJM+jqD5f7JIEubcpLjZj5dBw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-member-expression-to-functions': 7.16.7 + '@babel/helper-optimise-call-expression': 7.16.7 + '@babel/traverse': 7.23.2 + '@babel/types': 7.23.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/helper-simple-access@7.16.7: + resolution: {integrity: sha512-ZIzHVyoeLMvXMN/vok/a4LWRy8G2v205mNP0XOuf9XRLyX5/u9CnVulUtDgUTama3lT+bf/UqucuZjqiGuTS1g==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.0 + + /@babel/helper-skip-transparent-expression-wrappers@7.16.0: + resolution: {integrity: sha512-+il1gTy0oHwUsBQZyJvukbB4vPMdcYBrFHa0Uc4AizLxbq6BOYC51Rv4tWocX9BLBDLZ4kc6qUFpQ6HRgL+3zw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.0 + dev: true + + /@babel/helper-split-export-declaration@7.22.6: + resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.0 + + /@babel/helper-string-parser@7.22.5: + resolution: {integrity: sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==} + engines: {node: '>=6.9.0'} + + /@babel/helper-validator-identifier@7.22.20: + resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} + engines: {node: '>=6.9.0'} + + /@babel/helper-validator-option@7.16.7: + resolution: {integrity: sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==} + engines: {node: '>=6.9.0'} + + /@babel/helper-wrap-function@7.16.8: + resolution: {integrity: sha512-8RpyRVIAW1RcDDGTA+GpPAwV22wXCfKOoM9bet6TLkGIFTkRQSkH1nMQ5Yet4MpoXe1ZwHPVtNasc2w0uZMqnw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-function-name': 7.23.0 + '@babel/template': 7.22.15 + '@babel/traverse': 7.23.2 + '@babel/types': 7.23.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/helpers@7.17.2: + resolution: {integrity: sha512-0Qu7RLR1dILozr/6M0xgj+DFPmi6Bnulgm9M8BVa9ZCWxDqlSnqt3cf8IDPB5m45sVXUZ0kuQAgUrdSFFH79fQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.22.15 + '@babel/traverse': 7.23.2 + '@babel/types': 7.23.0 + transitivePeerDependencies: + - supports-color + + /@babel/highlight@7.22.20: + resolution: {integrity: sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-validator-identifier': 7.22.20 + chalk: 2.4.2 + js-tokens: 4.0.0 + + /@babel/parser@7.23.0: + resolution: {integrity: sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + '@babel/types': 7.23.0 + + /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.16.7(@babel/core@7.17.5): + resolution: {integrity: sha512-anv/DObl7waiGEnC24O9zqL0pSuI9hljihqiDuFHC8d7/bjr/4RLGPWuc8rYOff/QPzbEPSkzG8wGG9aDuhHRg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.17.5 + '@babel/helper-plugin-utils': 7.16.7 + dev: true + + /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.16.7(@babel/core@7.17.5): + resolution: {integrity: sha512-di8vUHRdf+4aJ7ltXhaDbPoszdkh59AQtJM5soLsuHpQJdFQZOA4uGj0V2u/CZ8bJ/u8ULDL5yq6FO/bCXnKHw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.13.0 + dependencies: + '@babel/core': 7.17.5 + '@babel/helper-plugin-utils': 7.16.7 + '@babel/helper-skip-transparent-expression-wrappers': 7.16.0 + '@babel/plugin-proposal-optional-chaining': 7.16.7(@babel/core@7.17.5) + dev: true + + /@babel/plugin-proposal-async-generator-functions@7.16.8(@babel/core@7.17.5): + resolution: {integrity: sha512-71YHIvMuiuqWJQkebWJtdhQTfd4Q4mF76q2IX37uZPkG9+olBxsX+rH1vkhFto4UeJZ9dPY2s+mDvhDm1u2BGQ==} + engines: {node: '>=6.9.0'} + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-async-generator-functions instead. + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.5 + '@babel/helper-plugin-utils': 7.16.7 + '@babel/helper-remap-async-to-generator': 7.16.8 + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.17.5) + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-proposal-class-properties@7.16.7(@babel/core@7.17.5): + resolution: {integrity: sha512-IobU0Xme31ewjYOShSIqd/ZGM/r/cuOz2z0MDbNrhF5FW+ZVgi0f2lyeoj9KFPDOAqsYxmLWZte1WOwlvY9aww==} + engines: {node: '>=6.9.0'} + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-class-properties instead. + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.5 + '@babel/helper-create-class-features-plugin': 7.17.6(@babel/core@7.17.5) + '@babel/helper-plugin-utils': 7.16.7 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-proposal-class-static-block@7.17.6(@babel/core@7.17.5): + resolution: {integrity: sha512-X/tididvL2zbs7jZCeeRJ8167U/+Ac135AM6jCAx6gYXDUviZV5Ku9UDvWS2NCuWlFjIRXklYhwo6HhAC7ETnA==} + engines: {node: '>=6.9.0'} + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-class-static-block instead. + peerDependencies: + '@babel/core': ^7.12.0 + dependencies: + '@babel/core': 7.17.5 + '@babel/helper-create-class-features-plugin': 7.17.6(@babel/core@7.17.5) + '@babel/helper-plugin-utils': 7.16.7 + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.17.5) + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-proposal-decorators@7.17.2(@babel/core@7.17.5): + resolution: {integrity: sha512-WH8Z95CwTq/W8rFbMqb9p3hicpt4RX4f0K659ax2VHxgOyT6qQmUaEVEjIh4WR9Eh9NymkVn5vwsrE68fAQNUw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.5 + '@babel/helper-create-class-features-plugin': 7.17.6(@babel/core@7.17.5) + '@babel/helper-plugin-utils': 7.16.7 + '@babel/helper-replace-supers': 7.16.7 + '@babel/plugin-syntax-decorators': 7.17.0(@babel/core@7.17.5) + charcodes: 0.2.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-proposal-dynamic-import@7.16.7(@babel/core@7.17.5): + resolution: {integrity: sha512-I8SW9Ho3/8DRSdmDdH3gORdyUuYnk1m4cMxUAdu5oy4n3OfN8flDEH+d60iG7dUfi0KkYwSvoalHzzdRzpWHTg==} + engines: {node: '>=6.9.0'} + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-dynamic-import instead. + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.5 + '@babel/helper-plugin-utils': 7.16.7 + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.17.5) + dev: true + + /@babel/plugin-proposal-export-default-from@7.16.7(@babel/core@7.17.5): + resolution: {integrity: sha512-+cENpW1rgIjExn+o5c8Jw/4BuH4eGKKYvkMB8/0ZxFQ9mC0t4z09VsPIwNg6waF69QYC81zxGeAsREGuqQoKeg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.5 + '@babel/helper-plugin-utils': 7.16.7 + '@babel/plugin-syntax-export-default-from': 7.16.7(@babel/core@7.17.5) + dev: true + + /@babel/plugin-proposal-export-namespace-from@7.16.7(@babel/core@7.17.5): + resolution: {integrity: sha512-ZxdtqDXLRGBL64ocZcs7ovt71L3jhC1RGSyR996svrCi3PYqHNkb3SwPJCs8RIzD86s+WPpt2S73+EHCGO+NUA==} + engines: {node: '>=6.9.0'} + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-export-namespace-from instead. + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.5 + '@babel/helper-plugin-utils': 7.16.7 + '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.17.5) + + /@babel/plugin-proposal-json-strings@7.16.7(@babel/core@7.17.5): + resolution: {integrity: sha512-lNZ3EEggsGY78JavgbHsK9u5P3pQaW7k4axlgFLYkMd7UBsiNahCITShLjNQschPyjtO6dADrL24757IdhBrsQ==} + engines: {node: '>=6.9.0'} + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-json-strings instead. + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.5 + '@babel/helper-plugin-utils': 7.16.7 + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.17.5) + dev: true + + /@babel/plugin-proposal-logical-assignment-operators@7.16.7(@babel/core@7.17.5): + resolution: {integrity: sha512-K3XzyZJGQCr00+EtYtrDjmwX7o7PLK6U9bi1nCwkQioRFVUv6dJoxbQjtWVtP+bCPy82bONBKG8NPyQ4+i6yjg==} + engines: {node: '>=6.9.0'} + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-logical-assignment-operators instead. + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.5 + '@babel/helper-plugin-utils': 7.16.7 + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.17.5) + dev: true + + /@babel/plugin-proposal-nullish-coalescing-operator@7.16.7(@babel/core@7.17.5): + resolution: {integrity: sha512-aUOrYU3EVtjf62jQrCj63pYZ7k6vns2h/DQvHPWGmsJRYzWXZ6/AsfgpiRy6XiuIDADhJzP2Q9MwSMKauBQ+UQ==} + engines: {node: '>=6.9.0'} + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-nullish-coalescing-operator instead. + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.5 + '@babel/helper-plugin-utils': 7.16.7 + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.17.5) + dev: true + + /@babel/plugin-proposal-numeric-separator@7.16.7(@babel/core@7.17.5): + resolution: {integrity: sha512-vQgPMknOIgiuVqbokToyXbkY/OmmjAzr/0lhSIbG/KmnzXPGwW/AdhdKpi+O4X/VkWiWjnkKOBiqJrTaC98VKw==} + engines: {node: '>=6.9.0'} + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-numeric-separator instead. + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.5 + '@babel/helper-plugin-utils': 7.16.7 + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.17.5) + dev: true + + /@babel/plugin-proposal-object-rest-spread@7.12.1(@babel/core@7.12.9): + resolution: {integrity: sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA==} + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-object-rest-spread instead. + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-plugin-utils': 7.16.7 + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.12.9) + '@babel/plugin-transform-parameters': 7.16.7(@babel/core@7.12.9) + dev: true + + /@babel/plugin-proposal-object-rest-spread@7.17.3(@babel/core@7.17.5): + resolution: {integrity: sha512-yuL5iQA/TbZn+RGAfxQXfi7CNLmKi1f8zInn4IgobuCWcAb7i+zj4TYzQ9l8cEzVyJ89PDGuqxK1xZpUDISesw==} + engines: {node: '>=6.9.0'} + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-object-rest-spread instead. + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/compat-data': 7.17.0 + '@babel/core': 7.17.5 + '@babel/helper-compilation-targets': 7.16.7(@babel/core@7.17.5) + '@babel/helper-plugin-utils': 7.16.7 + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.17.5) + '@babel/plugin-transform-parameters': 7.16.7(@babel/core@7.17.5) + dev: true + + /@babel/plugin-proposal-optional-catch-binding@7.16.7(@babel/core@7.17.5): + resolution: {integrity: sha512-eMOH/L4OvWSZAE1VkHbr1vckLG1WUcHGJSLqqQwl2GaUqG6QjddvrOaTUMNYiv77H5IKPMZ9U9P7EaHwvAShfA==} + engines: {node: '>=6.9.0'} + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-optional-catch-binding instead. + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.5 + '@babel/helper-plugin-utils': 7.16.7 + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.17.5) + dev: true + + /@babel/plugin-proposal-optional-chaining@7.16.7(@babel/core@7.17.5): + resolution: {integrity: sha512-eC3xy+ZrUcBtP7x+sq62Q/HYd674pPTb/77XZMb5wbDPGWIdUbSr4Agr052+zaUPSb+gGRnjxXfKFvx5iMJ+DA==} + engines: {node: '>=6.9.0'} + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-optional-chaining instead. + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.5 + '@babel/helper-plugin-utils': 7.16.7 + '@babel/helper-skip-transparent-expression-wrappers': 7.16.0 + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.17.5) + dev: true + + /@babel/plugin-proposal-private-methods@7.16.11(@babel/core@7.17.5): + resolution: {integrity: sha512-F/2uAkPlXDr8+BHpZvo19w3hLFKge+k75XUprE6jaqKxjGkSYcK+4c+bup5PdW/7W/Rpjwql7FTVEDW+fRAQsw==} + engines: {node: '>=6.9.0'} + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-private-methods instead. + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.5 + '@babel/helper-create-class-features-plugin': 7.17.6(@babel/core@7.17.5) + '@babel/helper-plugin-utils': 7.16.7 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-proposal-private-property-in-object@7.16.7(@babel/core@7.17.5): + resolution: {integrity: sha512-rMQkjcOFbm+ufe3bTZLyOfsOUOxyvLXZJCTARhJr+8UMSoZmqTe1K1BgkFcrW37rAchWg57yI69ORxiWvUINuQ==} + engines: {node: '>=6.9.0'} + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-private-property-in-object instead. + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.5 + '@babel/helper-annotate-as-pure': 7.16.7 + '@babel/helper-create-class-features-plugin': 7.17.6(@babel/core@7.17.5) + '@babel/helper-plugin-utils': 7.16.7 + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.17.5) + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-proposal-unicode-property-regex@7.16.7(@babel/core@7.17.5): + resolution: {integrity: sha512-QRK0YI/40VLhNVGIjRNAAQkEHws0cswSdFFjpFyt943YmJIU1da9uW63Iu6NFV6CxTZW5eTDCrwZUstBWgp/Rg==} + engines: {node: '>=4'} + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-unicode-property-regex instead. + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.5 + '@babel/helper-create-regexp-features-plugin': 7.17.0(@babel/core@7.17.5) + '@babel/helper-plugin-utils': 7.16.7 + dev: true + + /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.17.5): + resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.5 + '@babel/helper-plugin-utils': 7.16.7 + dev: true + + /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.17.5): + resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.5 + '@babel/helper-plugin-utils': 7.16.7 + dev: true + + /@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.17.5): + resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.5 + '@babel/helper-plugin-utils': 7.16.7 + dev: true + + /@babel/plugin-syntax-decorators@7.17.0(@babel/core@7.17.5): + resolution: {integrity: sha512-qWe85yCXsvDEluNP0OyeQjH63DlhAR3W7K9BxxU1MvbDb48tgBG+Ao6IJJ6smPDrrVzSQZrbF6donpkFBMcs3A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.5 + '@babel/helper-plugin-utils': 7.16.7 + dev: true + + /@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.17.5): + resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.5 + '@babel/helper-plugin-utils': 7.16.7 + + /@babel/plugin-syntax-export-default-from@7.16.7(@babel/core@7.17.5): + resolution: {integrity: sha512-4C3E4NsrLOgftKaTYTULhHsuQrGv3FHrBzOMDiS7UYKIpgGBkAdawg4h+EI8zPeK9M0fiIIh72hIwsI24K7MbA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.5 + '@babel/helper-plugin-utils': 7.16.7 + dev: true + + /@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.17.5): + resolution: {integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.5 + '@babel/helper-plugin-utils': 7.16.7 + + /@babel/plugin-syntax-flow@7.16.7(@babel/core@7.17.5): + resolution: {integrity: sha512-UDo3YGQO0jH6ytzVwgSLv9i/CzMcUjbKenL67dTrAZPPv6GFAtDhe6jqnvmoKzC/7htNTohhos+onPtDMqJwaQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.5 + '@babel/helper-plugin-utils': 7.16.7 + dev: true + + /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.17.5): + resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.5 + '@babel/helper-plugin-utils': 7.16.7 + dev: true + + /@babel/plugin-syntax-jsx@7.12.1(@babel/core@7.12.9): + resolution: {integrity: sha512-1yRi7yAtB0ETgxdY9ti/p2TivUxJkTdhu/ZbF9MshVGqOx1TdB3b7xCXs49Fupgg50N45KcAsRP/ZqWjs9SRjg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-plugin-utils': 7.16.7 + dev: true + + /@babel/plugin-syntax-jsx@7.16.7(@babel/core@7.17.5): + resolution: {integrity: sha512-Esxmk7YjA8QysKeT3VhTXvF6y77f/a91SIs4pWb4H2eWGQkCKFgQaG6hdoEVZtGsrAcb2K5BW66XsOErD4WU3Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.5 + '@babel/helper-plugin-utils': 7.16.7 + dev: true + + /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.17.5): + resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.5 + '@babel/helper-plugin-utils': 7.16.7 + dev: true + + /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.17.5): + resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.5 + '@babel/helper-plugin-utils': 7.16.7 + dev: true + + /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.17.5): + resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.5 + '@babel/helper-plugin-utils': 7.16.7 + dev: true + + /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.12.9): + resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-plugin-utils': 7.16.7 + dev: true + + /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.17.5): + resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.5 + '@babel/helper-plugin-utils': 7.16.7 + dev: true + + /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.17.5): + resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.5 + '@babel/helper-plugin-utils': 7.16.7 + dev: true + + /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.17.5): + resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.5 + '@babel/helper-plugin-utils': 7.16.7 + dev: true + + /@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.17.5): + resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.5 + '@babel/helper-plugin-utils': 7.16.7 + dev: true + + /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.17.5): + resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.5 + '@babel/helper-plugin-utils': 7.16.7 + dev: true + + /@babel/plugin-syntax-typescript@7.16.7(@babel/core@7.17.5): + resolution: {integrity: sha512-YhUIJHHGkqPgEcMYkPCKTyGUdoGKWtopIycQyjJH8OjvRgOYsXsaKehLVPScKJWAULPxMa4N1vCe6szREFlZ7A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.5 + '@babel/helper-plugin-utils': 7.16.7 + dev: true + + /@babel/plugin-transform-arrow-functions@7.16.7(@babel/core@7.17.5): + resolution: {integrity: sha512-9ffkFFMbvzTvv+7dTp/66xvZAWASuPD5Tl9LK3Z9vhOmANo6j94rik+5YMBt4CwHVMWLWpMsriIc2zsa3WW3xQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.5 + '@babel/helper-plugin-utils': 7.16.7 + dev: true + + /@babel/plugin-transform-async-to-generator@7.16.8(@babel/core@7.17.5): + resolution: {integrity: sha512-MtmUmTJQHCnyJVrScNzNlofQJ3dLFuobYn3mwOTKHnSCMtbNsqvF71GQmJfFjdrXSsAA7iysFmYWw4bXZ20hOg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.5 + '@babel/helper-module-imports': 7.16.7 + '@babel/helper-plugin-utils': 7.16.7 + '@babel/helper-remap-async-to-generator': 7.16.8 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-block-scoped-functions@7.16.7(@babel/core@7.17.5): + resolution: {integrity: sha512-JUuzlzmF40Z9cXyytcbZEZKckgrQzChbQJw/5PuEHYeqzCsvebDx0K0jWnIIVcmmDOAVctCgnYs0pMcrYj2zJg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.5 + '@babel/helper-plugin-utils': 7.16.7 + dev: true + + /@babel/plugin-transform-block-scoping@7.16.7(@babel/core@7.17.5): + resolution: {integrity: sha512-ObZev2nxVAYA4bhyusELdo9hb3H+A56bxH3FZMbEImZFiEDYVHXQSJ1hQKFlDnlt8G9bBrCZ5ZpURZUrV4G5qQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.5 + '@babel/helper-plugin-utils': 7.16.7 + dev: true + + /@babel/plugin-transform-classes@7.16.7(@babel/core@7.17.5): + resolution: {integrity: sha512-WY7og38SFAGYRe64BrjKf8OrE6ulEHtr5jEYaZMwox9KebgqPi67Zqz8K53EKk1fFEJgm96r32rkKZ3qA2nCWQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.5 + '@babel/helper-annotate-as-pure': 7.16.7 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-optimise-call-expression': 7.16.7 + '@babel/helper-plugin-utils': 7.16.7 + '@babel/helper-replace-supers': 7.16.7 + '@babel/helper-split-export-declaration': 7.22.6 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-computed-properties@7.16.7(@babel/core@7.17.5): + resolution: {integrity: sha512-gN72G9bcmenVILj//sv1zLNaPyYcOzUho2lIJBMh/iakJ9ygCo/hEF9cpGb61SCMEDxbbyBoVQxrt+bWKu5KGw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.5 + '@babel/helper-plugin-utils': 7.16.7 + dev: true + + /@babel/plugin-transform-destructuring@7.17.3(@babel/core@7.17.5): + resolution: {integrity: sha512-dDFzegDYKlPqa72xIlbmSkly5MluLoaC1JswABGktyt6NTXSBcUuse/kWE/wvKFWJHPETpi158qJZFS3JmykJg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.5 + '@babel/helper-plugin-utils': 7.16.7 + dev: true + + /@babel/plugin-transform-dotall-regex@7.16.7(@babel/core@7.17.5): + resolution: {integrity: sha512-Lyttaao2SjZF6Pf4vk1dVKv8YypMpomAbygW+mU5cYP3S5cWTfCJjG8xV6CFdzGFlfWK81IjL9viiTvpb6G7gQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.5 + '@babel/helper-create-regexp-features-plugin': 7.17.0(@babel/core@7.17.5) + '@babel/helper-plugin-utils': 7.16.7 + dev: true + + /@babel/plugin-transform-duplicate-keys@7.16.7(@babel/core@7.17.5): + resolution: {integrity: sha512-03DvpbRfvWIXyK0/6QiR1KMTWeT6OcQ7tbhjrXyFS02kjuX/mu5Bvnh5SDSWHxyawit2g5aWhKwI86EE7GUnTw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.5 + '@babel/helper-plugin-utils': 7.16.7 + dev: true + + /@babel/plugin-transform-exponentiation-operator@7.16.7(@babel/core@7.17.5): + resolution: {integrity: sha512-8UYLSlyLgRixQvlYH3J2ekXFHDFLQutdy7FfFAMm3CPZ6q9wHCwnUyiXpQCe3gVVnQlHc5nsuiEVziteRNTXEA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.5 + '@babel/helper-builder-binary-assignment-operator-visitor': 7.16.7 + '@babel/helper-plugin-utils': 7.16.7 + dev: true + + /@babel/plugin-transform-flow-strip-types@7.16.7(@babel/core@7.17.5): + resolution: {integrity: sha512-mzmCq3cNsDpZZu9FADYYyfZJIOrSONmHcop2XEKPdBNMa4PDC4eEvcOvzZaCNcjKu72v0XQlA5y1g58aLRXdYg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.5 + '@babel/helper-plugin-utils': 7.16.7 + '@babel/plugin-syntax-flow': 7.16.7(@babel/core@7.17.5) + dev: true + + /@babel/plugin-transform-for-of@7.16.7(@babel/core@7.17.5): + resolution: {integrity: sha512-/QZm9W92Ptpw7sjI9Nx1mbcsWz33+l8kuMIQnDwgQBG5s3fAfQvkRjQ7NqXhtNcKOnPkdICmUHyCaWW06HCsqg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.5 + '@babel/helper-plugin-utils': 7.16.7 + dev: true + + /@babel/plugin-transform-function-name@7.16.7(@babel/core@7.17.5): + resolution: {integrity: sha512-SU/C68YVwTRxqWj5kgsbKINakGag0KTgq9f2iZEXdStoAbOzLHEBRYzImmA6yFo8YZhJVflvXmIHUO7GWHmxxA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.5 + '@babel/helper-compilation-targets': 7.16.7(@babel/core@7.17.5) + '@babel/helper-function-name': 7.23.0 + '@babel/helper-plugin-utils': 7.16.7 + dev: true + + /@babel/plugin-transform-literals@7.16.7(@babel/core@7.17.5): + resolution: {integrity: sha512-6tH8RTpTWI0s2sV6uq3e/C9wPo4PTqqZps4uF0kzQ9/xPLFQtipynvmT1g/dOfEJ+0EQsHhkQ/zyRId8J2b8zQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.5 + '@babel/helper-plugin-utils': 7.16.7 + dev: true + + /@babel/plugin-transform-member-expression-literals@7.16.7(@babel/core@7.17.5): + resolution: {integrity: sha512-mBruRMbktKQwbxaJof32LT9KLy2f3gH+27a5XSuXo6h7R3vqltl0PgZ80C8ZMKw98Bf8bqt6BEVi3svOh2PzMw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.5 + '@babel/helper-plugin-utils': 7.16.7 + dev: true + + /@babel/plugin-transform-modules-amd@7.16.7(@babel/core@7.17.5): + resolution: {integrity: sha512-KaaEtgBL7FKYwjJ/teH63oAmE3lP34N3kshz8mm4VMAw7U3PxjVwwUmxEFksbgsNUaO3wId9R2AVQYSEGRa2+g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.5 + '@babel/helper-module-transforms': 7.17.6 + '@babel/helper-plugin-utils': 7.16.7 + babel-plugin-dynamic-import-node: 2.3.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-modules-commonjs@7.16.8(@babel/core@7.17.5): + resolution: {integrity: sha512-oflKPvsLT2+uKQopesJt3ApiaIS2HW+hzHFcwRNtyDGieAeC/dIHZX8buJQ2J2X1rxGPy4eRcUijm3qcSPjYcA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.5 + '@babel/helper-module-transforms': 7.17.6 + '@babel/helper-plugin-utils': 7.16.7 + '@babel/helper-simple-access': 7.16.7 + babel-plugin-dynamic-import-node: 2.3.3 + transitivePeerDependencies: + - supports-color + + /@babel/plugin-transform-modules-systemjs@7.16.7(@babel/core@7.17.5): + resolution: {integrity: sha512-DuK5E3k+QQmnOqBR9UkusByy5WZWGRxfzV529s9nPra1GE7olmxfqO2FHobEOYSPIjPBTr4p66YDcjQnt8cBmw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.5 + '@babel/helper-hoist-variables': 7.22.5 + '@babel/helper-module-transforms': 7.17.6 + '@babel/helper-plugin-utils': 7.16.7 + '@babel/helper-validator-identifier': 7.22.20 + babel-plugin-dynamic-import-node: 2.3.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-modules-umd@7.16.7(@babel/core@7.17.5): + resolution: {integrity: sha512-EMh7uolsC8O4xhudF2F6wedbSHm1HHZ0C6aJ7K67zcDNidMzVcxWdGr+htW9n21klm+bOn+Rx4CBsAntZd3rEQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.5 + '@babel/helper-module-transforms': 7.17.6 + '@babel/helper-plugin-utils': 7.16.7 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-named-capturing-groups-regex@7.16.8(@babel/core@7.17.5): + resolution: {integrity: sha512-j3Jw+n5PvpmhRR+mrgIh04puSANCk/T/UA3m3P1MjJkhlK906+ApHhDIqBQDdOgL/r1UYpz4GNclTXxyZrYGSw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.17.5 + '@babel/helper-create-regexp-features-plugin': 7.17.0(@babel/core@7.17.5) + dev: true + + /@babel/plugin-transform-new-target@7.16.7(@babel/core@7.17.5): + resolution: {integrity: sha512-xiLDzWNMfKoGOpc6t3U+etCE2yRnn3SM09BXqWPIZOBpL2gvVrBWUKnsJx0K/ADi5F5YC5f8APFfWrz25TdlGg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.5 + '@babel/helper-plugin-utils': 7.16.7 + dev: true + + /@babel/plugin-transform-object-super@7.16.7(@babel/core@7.17.5): + resolution: {integrity: sha512-14J1feiQVWaGvRxj2WjyMuXS2jsBkgB3MdSN5HuC2G5nRspa5RK9COcs82Pwy5BuGcjb+fYaUj94mYcOj7rCvw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.5 + '@babel/helper-plugin-utils': 7.16.7 + '@babel/helper-replace-supers': 7.16.7 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-parameters@7.16.7(@babel/core@7.12.9): + resolution: {integrity: sha512-AT3MufQ7zZEhU2hwOA11axBnExW0Lszu4RL/tAlUJBuNoRak+wehQW8h6KcXOcgjY42fHtDxswuMhMjFEuv/aw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-plugin-utils': 7.16.7 + dev: true + + /@babel/plugin-transform-parameters@7.16.7(@babel/core@7.17.5): + resolution: {integrity: sha512-AT3MufQ7zZEhU2hwOA11axBnExW0Lszu4RL/tAlUJBuNoRak+wehQW8h6KcXOcgjY42fHtDxswuMhMjFEuv/aw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.5 + '@babel/helper-plugin-utils': 7.16.7 + dev: true + + /@babel/plugin-transform-property-literals@7.16.7(@babel/core@7.17.5): + resolution: {integrity: sha512-z4FGr9NMGdoIl1RqavCqGG+ZuYjfZ/hkCIeuH6Do7tXmSm0ls11nYVSJqFEUOSJbDab5wC6lRE/w6YjVcr6Hqw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.5 + '@babel/helper-plugin-utils': 7.16.7 + dev: true + + /@babel/plugin-transform-react-display-name@7.16.7(@babel/core@7.17.5): + resolution: {integrity: sha512-qgIg8BcZgd0G/Cz916D5+9kqX0c7nPZyXaP8R2tLNN5tkyIZdG5fEwBrxwplzSnjC1jvQmyMNVwUCZPcbGY7Pg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.5 + '@babel/helper-plugin-utils': 7.16.7 + dev: true + + /@babel/plugin-transform-react-jsx-development@7.16.7(@babel/core@7.17.5): + resolution: {integrity: sha512-RMvQWvpla+xy6MlBpPlrKZCMRs2AGiHOGHY3xRwl0pEeim348dDyxeH4xBsMPbIMhujeq7ihE702eM2Ew0Wo+A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.5 + '@babel/plugin-transform-react-jsx': 7.17.3(@babel/core@7.17.5) + dev: true + + /@babel/plugin-transform-react-jsx@7.17.3(@babel/core@7.17.5): + resolution: {integrity: sha512-9tjBm4O07f7mzKSIlEmPdiE6ub7kfIe6Cd+w+oQebpATfTQMAgW+YOuWxogbKVTulA+MEO7byMeIUtQ1z+z+ZQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.5 + '@babel/helper-annotate-as-pure': 7.16.7 + '@babel/helper-module-imports': 7.16.7 + '@babel/helper-plugin-utils': 7.16.7 + '@babel/plugin-syntax-jsx': 7.16.7(@babel/core@7.17.5) + '@babel/types': 7.23.0 + dev: true + + /@babel/plugin-transform-react-pure-annotations@7.16.7(@babel/core@7.17.5): + resolution: {integrity: sha512-hs71ToC97k3QWxswh2ElzMFABXHvGiJ01IB1TbYQDGeWRKWz/MPUTh5jGExdHvosYKpnJW5Pm3S4+TA3FyX+GA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.5 + '@babel/helper-annotate-as-pure': 7.16.7 + '@babel/helper-plugin-utils': 7.16.7 + dev: true + + /@babel/plugin-transform-regenerator@7.16.7(@babel/core@7.17.5): + resolution: {integrity: sha512-mF7jOgGYCkSJagJ6XCujSQg+6xC1M77/03K2oBmVJWoFGNUtnVJO4WHKJk3dnPC8HCcj4xBQP1Egm8DWh3Pb3Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.5 + regenerator-transform: 0.14.5 + dev: true + + /@babel/plugin-transform-reserved-words@7.16.7(@babel/core@7.17.5): + resolution: {integrity: sha512-KQzzDnZ9hWQBjwi5lpY5v9shmm6IVG0U9pB18zvMu2i4H90xpT4gmqwPYsn8rObiadYe2M0gmgsiOIF5A/2rtg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.5 + '@babel/helper-plugin-utils': 7.16.7 + dev: true + + /@babel/plugin-transform-runtime@7.17.0(@babel/core@7.17.5): + resolution: {integrity: sha512-fr7zPWnKXNc1xoHfrIU9mN/4XKX4VLZ45Q+oMhfsYIaHvg7mHgmhfOy/ckRWqDK7XF3QDigRpkh5DKq6+clE8A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.5 + '@babel/helper-module-imports': 7.16.7 + '@babel/helper-plugin-utils': 7.16.7 + babel-plugin-polyfill-corejs2: 0.3.1(@babel/core@7.17.5) + babel-plugin-polyfill-corejs3: 0.5.2(@babel/core@7.17.5) + babel-plugin-polyfill-regenerator: 0.3.1(@babel/core@7.17.5) + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + dev: false + + /@babel/plugin-transform-shorthand-properties@7.16.7(@babel/core@7.17.5): + resolution: {integrity: sha512-hah2+FEnoRoATdIb05IOXf+4GzXYTq75TVhIn1PewihbpyrNWUt2JbudKQOETWw6QpLe+AIUpJ5MVLYTQbeeUg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.5 + '@babel/helper-plugin-utils': 7.16.7 + dev: true + + /@babel/plugin-transform-spread@7.16.7(@babel/core@7.17.5): + resolution: {integrity: sha512-+pjJpgAngb53L0iaA5gU/1MLXJIfXcYepLgXB3esVRf4fqmj8f2cxM3/FKaHsZms08hFQJkFccEWuIpm429TXg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.5 + '@babel/helper-plugin-utils': 7.16.7 + '@babel/helper-skip-transparent-expression-wrappers': 7.16.0 + dev: true + + /@babel/plugin-transform-sticky-regex@7.16.7(@babel/core@7.17.5): + resolution: {integrity: sha512-NJa0Bd/87QV5NZZzTuZG5BPJjLYadeSZ9fO6oOUoL4iQx+9EEuw/eEM92SrsT19Yc2jgB1u1hsjqDtH02c3Drw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.5 + '@babel/helper-plugin-utils': 7.16.7 + dev: true + + /@babel/plugin-transform-template-literals@7.16.7(@babel/core@7.17.5): + resolution: {integrity: sha512-VwbkDDUeenlIjmfNeDX/V0aWrQH2QiVyJtwymVQSzItFDTpxfyJh3EVaQiS0rIN/CqbLGr0VcGmuwyTdZtdIsA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.5 + '@babel/helper-plugin-utils': 7.16.7 + + /@babel/plugin-transform-typeof-symbol@7.16.7(@babel/core@7.17.5): + resolution: {integrity: sha512-p2rOixCKRJzpg9JB4gjnG4gjWkWa89ZoYUnl9snJ1cWIcTH/hvxZqfO+WjG6T8DRBpctEol5jw1O5rA8gkCokQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.5 + '@babel/helper-plugin-utils': 7.16.7 + dev: true + + /@babel/plugin-transform-typescript@7.16.8(@babel/core@7.17.5): + resolution: {integrity: sha512-bHdQ9k7YpBDO2d0NVfkj51DpQcvwIzIusJ7mEUaMlbZq3Kt/U47j24inXZHQ5MDiYpCs+oZiwnXyKedE8+q7AQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.5 + '@babel/helper-create-class-features-plugin': 7.17.6(@babel/core@7.17.5) + '@babel/helper-plugin-utils': 7.16.7 + '@babel/plugin-syntax-typescript': 7.16.7(@babel/core@7.17.5) + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-unicode-escapes@7.16.7(@babel/core@7.17.5): + resolution: {integrity: sha512-TAV5IGahIz3yZ9/Hfv35TV2xEm+kaBDaZQCn2S/hG9/CZ0DktxJv9eKfPc7yYCvOYR4JGx1h8C+jcSOvgaaI/Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.5 + '@babel/helper-plugin-utils': 7.16.7 + dev: true + + /@babel/plugin-transform-unicode-regex@7.16.7(@babel/core@7.17.5): + resolution: {integrity: sha512-oC5tYYKw56HO75KZVLQ+R/Nl3Hro9kf8iG0hXoaHP7tjAyCpvqBiSNe6vGrZni1Z6MggmUOC6A7VP7AVmw225Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.5 + '@babel/helper-create-regexp-features-plugin': 7.17.0(@babel/core@7.17.5) + '@babel/helper-plugin-utils': 7.16.7 + dev: true + + /@babel/preset-env@7.16.11(@babel/core@7.17.5): + resolution: {integrity: sha512-qcmWG8R7ZW6WBRPZK//y+E3Cli151B20W1Rv7ln27vuPaXU/8TKms6jFdiJtF7UDTxcrb7mZd88tAeK9LjdT8g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/compat-data': 7.17.0 + '@babel/core': 7.17.5 + '@babel/helper-compilation-targets': 7.16.7(@babel/core@7.17.5) + '@babel/helper-plugin-utils': 7.16.7 + '@babel/helper-validator-option': 7.16.7 + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.16.7(@babel/core@7.17.5) + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.16.7(@babel/core@7.17.5) + '@babel/plugin-proposal-async-generator-functions': 7.16.8(@babel/core@7.17.5) + '@babel/plugin-proposal-class-properties': 7.16.7(@babel/core@7.17.5) + '@babel/plugin-proposal-class-static-block': 7.17.6(@babel/core@7.17.5) + '@babel/plugin-proposal-dynamic-import': 7.16.7(@babel/core@7.17.5) + '@babel/plugin-proposal-export-namespace-from': 7.16.7(@babel/core@7.17.5) + '@babel/plugin-proposal-json-strings': 7.16.7(@babel/core@7.17.5) + '@babel/plugin-proposal-logical-assignment-operators': 7.16.7(@babel/core@7.17.5) + '@babel/plugin-proposal-nullish-coalescing-operator': 7.16.7(@babel/core@7.17.5) + '@babel/plugin-proposal-numeric-separator': 7.16.7(@babel/core@7.17.5) + '@babel/plugin-proposal-object-rest-spread': 7.17.3(@babel/core@7.17.5) + '@babel/plugin-proposal-optional-catch-binding': 7.16.7(@babel/core@7.17.5) + '@babel/plugin-proposal-optional-chaining': 7.16.7(@babel/core@7.17.5) + '@babel/plugin-proposal-private-methods': 7.16.11(@babel/core@7.17.5) + '@babel/plugin-proposal-private-property-in-object': 7.16.7(@babel/core@7.17.5) + '@babel/plugin-proposal-unicode-property-regex': 7.16.7(@babel/core@7.17.5) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.17.5) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.17.5) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.17.5) + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.17.5) + '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.17.5) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.17.5) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.17.5) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.17.5) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.17.5) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.17.5) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.17.5) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.17.5) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.17.5) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.17.5) + '@babel/plugin-transform-arrow-functions': 7.16.7(@babel/core@7.17.5) + '@babel/plugin-transform-async-to-generator': 7.16.8(@babel/core@7.17.5) + '@babel/plugin-transform-block-scoped-functions': 7.16.7(@babel/core@7.17.5) + '@babel/plugin-transform-block-scoping': 7.16.7(@babel/core@7.17.5) + '@babel/plugin-transform-classes': 7.16.7(@babel/core@7.17.5) + '@babel/plugin-transform-computed-properties': 7.16.7(@babel/core@7.17.5) + '@babel/plugin-transform-destructuring': 7.17.3(@babel/core@7.17.5) + '@babel/plugin-transform-dotall-regex': 7.16.7(@babel/core@7.17.5) + '@babel/plugin-transform-duplicate-keys': 7.16.7(@babel/core@7.17.5) + '@babel/plugin-transform-exponentiation-operator': 7.16.7(@babel/core@7.17.5) + '@babel/plugin-transform-for-of': 7.16.7(@babel/core@7.17.5) + '@babel/plugin-transform-function-name': 7.16.7(@babel/core@7.17.5) + '@babel/plugin-transform-literals': 7.16.7(@babel/core@7.17.5) + '@babel/plugin-transform-member-expression-literals': 7.16.7(@babel/core@7.17.5) + '@babel/plugin-transform-modules-amd': 7.16.7(@babel/core@7.17.5) + '@babel/plugin-transform-modules-commonjs': 7.16.8(@babel/core@7.17.5) + '@babel/plugin-transform-modules-systemjs': 7.16.7(@babel/core@7.17.5) + '@babel/plugin-transform-modules-umd': 7.16.7(@babel/core@7.17.5) + '@babel/plugin-transform-named-capturing-groups-regex': 7.16.8(@babel/core@7.17.5) + '@babel/plugin-transform-new-target': 7.16.7(@babel/core@7.17.5) + '@babel/plugin-transform-object-super': 7.16.7(@babel/core@7.17.5) + '@babel/plugin-transform-parameters': 7.16.7(@babel/core@7.17.5) + '@babel/plugin-transform-property-literals': 7.16.7(@babel/core@7.17.5) + '@babel/plugin-transform-regenerator': 7.16.7(@babel/core@7.17.5) + '@babel/plugin-transform-reserved-words': 7.16.7(@babel/core@7.17.5) + '@babel/plugin-transform-shorthand-properties': 7.16.7(@babel/core@7.17.5) + '@babel/plugin-transform-spread': 7.16.7(@babel/core@7.17.5) + '@babel/plugin-transform-sticky-regex': 7.16.7(@babel/core@7.17.5) + '@babel/plugin-transform-template-literals': 7.16.7(@babel/core@7.17.5) + '@babel/plugin-transform-typeof-symbol': 7.16.7(@babel/core@7.17.5) + '@babel/plugin-transform-unicode-escapes': 7.16.7(@babel/core@7.17.5) + '@babel/plugin-transform-unicode-regex': 7.16.7(@babel/core@7.17.5) + '@babel/preset-modules': 0.1.5(@babel/core@7.17.5) + '@babel/types': 7.23.0 + babel-plugin-polyfill-corejs2: 0.3.1(@babel/core@7.17.5) + babel-plugin-polyfill-corejs3: 0.5.2(@babel/core@7.17.5) + babel-plugin-polyfill-regenerator: 0.3.1(@babel/core@7.17.5) + core-js-compat: 3.21.1 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/preset-flow@7.16.7(@babel/core@7.17.5): + resolution: {integrity: sha512-6ceP7IyZdUYQ3wUVqyRSQXztd1YmFHWI4Xv11MIqAlE4WqxBSd/FZ61V9k+TS5Gd4mkHOtQtPp9ymRpxH4y1Ug==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.5 + '@babel/helper-plugin-utils': 7.16.7 + '@babel/helper-validator-option': 7.16.7 + '@babel/plugin-transform-flow-strip-types': 7.16.7(@babel/core@7.17.5) + dev: true + + /@babel/preset-modules@0.1.5(@babel/core@7.17.5): + resolution: {integrity: sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.5 + '@babel/helper-plugin-utils': 7.16.7 + '@babel/plugin-proposal-unicode-property-regex': 7.16.7(@babel/core@7.17.5) + '@babel/plugin-transform-dotall-regex': 7.16.7(@babel/core@7.17.5) + '@babel/types': 7.23.0 + esutils: 2.0.3 + dev: true + + /@babel/preset-react@7.16.7(@babel/core@7.17.5): + resolution: {integrity: sha512-fWpyI8UM/HE6DfPBzD8LnhQ/OcH8AgTaqcqP2nGOXEUV+VKBR5JRN9hCk9ai+zQQ57vtm9oWeXguBCPNUjytgA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.5 + '@babel/helper-plugin-utils': 7.16.7 + '@babel/helper-validator-option': 7.16.7 + '@babel/plugin-transform-react-display-name': 7.16.7(@babel/core@7.17.5) + '@babel/plugin-transform-react-jsx': 7.17.3(@babel/core@7.17.5) + '@babel/plugin-transform-react-jsx-development': 7.16.7(@babel/core@7.17.5) + '@babel/plugin-transform-react-pure-annotations': 7.16.7(@babel/core@7.17.5) + dev: true + + /@babel/preset-typescript@7.16.7(@babel/core@7.17.5): + resolution: {integrity: sha512-WbVEmgXdIyvzB77AQjGBEyYPZx+8tTsO50XtfozQrkW8QB2rLJpH2lgx0TRw5EJrBxOZQ+wCcyPVQvS8tjEHpQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.5 + '@babel/helper-plugin-utils': 7.16.7 + '@babel/helper-validator-option': 7.16.7 + '@babel/plugin-transform-typescript': 7.16.8(@babel/core@7.17.5) + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/register@7.17.0(@babel/core@7.17.5): + resolution: {integrity: sha512-UNZsMAZ7uKoGHo1HlEXfteEOYssf64n/PNLHGqOKq/bgYcu/4LrQWAHJwSCb3BRZK8Hi5gkJdRcwrGTO2wtRCg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.5 + clone-deep: 4.0.1 + find-cache-dir: 2.1.0 + make-dir: 2.1.0 + pirates: 4.0.5 + source-map-support: 0.5.21 + dev: true + + /@babel/runtime-corejs3@7.17.2: + resolution: {integrity: sha512-NcKtr2epxfIrNM4VOmPKO46TvDMCBhgi2CrSHaEarrz+Plk2K5r9QemmOFTGpZaoKnWoGH5MO+CzeRsih/Fcgg==} + engines: {node: '>=6.9.0'} + dependencies: + core-js-pure: 3.21.1 + regenerator-runtime: 0.13.9 + dev: true + + /@babel/runtime@7.17.2: + resolution: {integrity: sha512-hzeyJyMA1YGdJTuWU0e/j4wKXrU4OMFvY2MSlaI9B7VQb0r5cxTE3EAIS2Q7Tn2RIcDkRvTA/v2JsAEhxe99uw==} + engines: {node: '>=6.9.0'} + dependencies: + regenerator-runtime: 0.13.9 + dev: true + + /@babel/template@7.22.15: + resolution: {integrity: sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.22.13 + '@babel/parser': 7.23.0 + '@babel/types': 7.23.0 + + /@babel/traverse@7.23.2: + resolution: {integrity: sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.22.13 + '@babel/generator': 7.23.0 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-hoist-variables': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/parser': 7.23.0 + '@babel/types': 7.23.0 + debug: 4.3.4 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + + /@babel/types@7.23.0: + resolution: {integrity: sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-string-parser': 7.22.5 + '@babel/helper-validator-identifier': 7.22.20 + to-fast-properties: 2.0.0 + + /@base2/pretty-print-object@1.0.1: + resolution: {integrity: sha512-4iri8i1AqYHJE2DstZYkyEprg6Pq6sKx3xn5FpySk9sNhH7qN2LLlHJCfDTZRILNwQNPD7mATWM0TBui7uC1pA==} + dev: true + + /@bcoe/v8-coverage@0.2.3: + resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} + dev: true + + /@callstack/react-theme-provider@3.0.7(react@17.0.2): + resolution: {integrity: sha512-Ab6rbD2w4u9W3yf7LQQ8evx9m8fZNsoWxt+MFm3AyZnyKQNCJf4K7ip9tHHZgSs+HTdoj38lEqPehvFOVQKvAg==} + peerDependencies: + react: '>=16.3.0' + dependencies: + deepmerge: 3.3.0 + hoist-non-react-statics: 3.3.2 + react: 17.0.2 + dev: false + + /@cnakazawa/watch@1.0.4: + resolution: {integrity: sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ==} + engines: {node: '>=0.1.95'} + hasBin: true + dependencies: + exec-sh: 0.3.6 + minimist: 1.2.7 + dev: true + + /@corex/deepmerge@2.6.148: + resolution: {integrity: sha512-6QMz0/2h5C3ua51iAnXMPWFbb1QOU1UvSM4bKBw5mzdT+WtLgjbETBBIQZ+Sh9WvEcGwlAt/DEdRpIC3XlDBMA==} + dev: true + + /@cspotcode/source-map-support@0.8.1: + resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} + engines: {node: '>=12'} + dependencies: + '@jridgewell/trace-mapping': 0.3.9 + dev: false + + /@discoveryjs/json-ext@0.5.6: + resolution: {integrity: sha512-ws57AidsDvREKrZKYffXddNkyaF14iHNHm8VQnZH6t99E8gczjNN0GpvcGny0imC80yQ0tHz1xVUKk/KFQSUyA==} + engines: {node: '>=10.0.0'} + dev: true + + /@docsearch/css@3.0.0: + resolution: {integrity: sha512-1kkV7tkAsiuEd0shunYRByKJe3xQDG2q7wYg24SOw1nV9/2lwEd4WrUYRJC/ukGTl2/kHeFxsaUvtiOy0y6fFA==} + dev: false + + /@docsearch/react@3.0.0(@algolia/client-search@4.13.0)(@types/react@17.0.39)(react-dom@17.0.2)(react@17.0.2): + resolution: {integrity: sha512-yhMacqS6TVQYoBh/o603zszIb5Bl8MIXuOc6Vy617I74pirisDzzcNh0NEaYQt50fVVR3khUbeEhUEWEWipESg==} + peerDependencies: + '@types/react': '>= 16.8.0 < 18.0.0' + react: '>= 16.8.0 < 18.0.0' + react-dom: '>= 16.8.0 < 18.0.0' + dependencies: + '@algolia/autocomplete-core': 1.5.2 + '@algolia/autocomplete-preset-algolia': 1.5.2(@algolia/client-search@4.13.0)(algoliasearch@4.13.0) + '@docsearch/css': 3.0.0 + '@types/react': 17.0.39 + algoliasearch: 4.13.0 + react: 17.0.2 + react-dom: 17.0.2(react@17.0.2) + transitivePeerDependencies: + - '@algolia/client-search' + dev: false + + /@emotion/cache@10.0.29: + resolution: {integrity: sha512-fU2VtSVlHiF27empSbxi1O2JFdNWZO+2NFHfwO0pxgTep6Xa3uGb+3pVKfLww2l/IBGLNEZl5Xf/++A4wAYDYQ==} + dependencies: + '@emotion/sheet': 0.9.4 + '@emotion/stylis': 0.8.5 + '@emotion/utils': 0.11.3 + '@emotion/weak-memoize': 0.2.5 + dev: true + + /@emotion/core@10.3.1(react@17.0.2): + resolution: {integrity: sha512-447aUEjPIm0MnE6QYIaFz9VQOHSXf4Iu6EWOIqq11EAPqinkSZmfymPTmlOE3QjLv846lH4JVZBUOtwGbuQoww==} + peerDependencies: + react: '>=16.3.0' + dependencies: + '@babel/runtime': 7.17.2 + '@emotion/cache': 10.0.29 + '@emotion/css': 10.0.27 + '@emotion/serialize': 0.11.16 + '@emotion/sheet': 0.9.4 + '@emotion/utils': 0.11.3 + react: 17.0.2 + dev: true + + /@emotion/css@10.0.27: + resolution: {integrity: sha512-6wZjsvYeBhyZQYNrGoR5yPMYbMBNEnanDrqmsqS1mzDm1cOTu12shvl2j4QHNS36UaTE0USIJawCH9C8oW34Zw==} + dependencies: + '@emotion/serialize': 0.11.16 + '@emotion/utils': 0.11.3 + babel-plugin-emotion: 10.2.2 + dev: true + + /@emotion/hash@0.8.0: + resolution: {integrity: sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==} + dev: true + + /@emotion/is-prop-valid@0.8.8: + resolution: {integrity: sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA==} + dependencies: + '@emotion/memoize': 0.7.4 + + /@emotion/memoize@0.7.4: + resolution: {integrity: sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==} + + /@emotion/serialize@0.11.16: + resolution: {integrity: sha512-G3J4o8by0VRrO+PFeSc3js2myYNOXVJ3Ya+RGVxnshRYgsvErfAOglKAiy1Eo1vhzxqtUvjCyS5gtewzkmvSSg==} + dependencies: + '@emotion/hash': 0.8.0 + '@emotion/memoize': 0.7.4 + '@emotion/unitless': 0.7.5 + '@emotion/utils': 0.11.3 + csstype: 2.6.19 + dev: true + + /@emotion/sheet@0.9.4: + resolution: {integrity: sha512-zM9PFmgVSqBw4zL101Q0HrBVTGmpAxFZH/pYx/cjJT5advXguvcgjHFTCaIO3enL/xr89vK2bh0Mfyj9aa0ANA==} + dev: true + + /@emotion/styled-base@10.3.0(@emotion/core@10.3.1)(react@17.0.2): + resolution: {integrity: sha512-PBRqsVKR7QRNkmfH78hTSSwHWcwDpecH9W6heujWAcyp2wdz/64PP73s7fWS1dIPm8/Exc8JAzYS8dEWXjv60w==} + peerDependencies: + '@emotion/core': ^10.0.28 + react: '>=16.3.0' + dependencies: + '@babel/runtime': 7.17.2 + '@emotion/core': 10.3.1(react@17.0.2) + '@emotion/is-prop-valid': 0.8.8 + '@emotion/serialize': 0.11.16 + '@emotion/utils': 0.11.3 + react: 17.0.2 + dev: true + + /@emotion/styled@10.3.0(@emotion/core@10.3.1)(react@17.0.2): + resolution: {integrity: sha512-GgcUpXBBEU5ido+/p/mCT2/Xx+Oqmp9JzQRuC+a4lYM4i4LBBn/dWvc0rQ19N9ObA8/T4NWMrPNe79kMBDJqoQ==} + peerDependencies: + '@emotion/core': ^10.0.27 + react: '>=16.3.0' + dependencies: + '@emotion/core': 10.3.1(react@17.0.2) + '@emotion/styled-base': 10.3.0(@emotion/core@10.3.1)(react@17.0.2) + babel-plugin-emotion: 10.2.2 + react: 17.0.2 + dev: true + + /@emotion/stylis@0.8.5: + resolution: {integrity: sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ==} + dev: true + + /@emotion/unitless@0.7.5: + resolution: {integrity: sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==} + dev: true + + /@emotion/utils@0.11.3: + resolution: {integrity: sha512-0o4l6pZC+hI88+bzuaX/6BgOvQVhbt2PfmxauVaYOGgbsAw14wdKyvMCZXnsnsHys94iadcF+RG/wZyx6+ZZBw==} + dev: true + + /@emotion/weak-memoize@0.2.5: + resolution: {integrity: sha512-6U71C2Wp7r5XtFtQzYrW5iKFT67OixrSxjI4MptCHzdSVlgabczzqLe0ZSgnub/5Kp4hSbpDB1tMytZY9pwxxA==} + dev: true + + /@eslint-community/eslint-utils@4.4.0(eslint@8.10.0): + resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + dependencies: + eslint: 8.10.0 + eslint-visitor-keys: 3.3.0 + dev: true + + /@eslint-community/regexpp@4.5.1: + resolution: {integrity: sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + dev: true + + /@eslint/eslintrc@1.2.0: + resolution: {integrity: sha512-igm9SjJHNEJRiUnecP/1R5T3wKLEJ7pL6e2P+GUSfCd0dGjPYYZve08uzw8L2J8foVHFz+NGu12JxRcU2gGo6w==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + ajv: 6.12.6 + debug: 4.3.4 + espree: 9.3.1 + globals: 13.12.1 + ignore: 4.0.6 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@fastify/busboy@2.0.0: + resolution: {integrity: sha512-JUFJad5lv7jxj926GPgymrWQxxjPYuJNiNjNMzqT+HiuP6Vl3dk5xzG+8sTX96np0ZAluvaMzPsjhHZ5rNuNQQ==} + engines: {node: '>=14'} + dev: false + + /@gar/promisify@1.1.3: + resolution: {integrity: sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==} + dev: true + + /@humanwhocodes/config-array@0.9.5: + resolution: {integrity: sha512-ObyMyWxZiCu/yTisA7uzx81s40xR2fD5Cg/2Kq7G02ajkNubJf6BopgDTmDyc3U7sXpNKM8cYOw7s7Tyr+DnCw==} + engines: {node: '>=10.10.0'} + dependencies: + '@humanwhocodes/object-schema': 1.2.1 + debug: 4.3.4 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@humanwhocodes/object-schema@1.2.1: + resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} + dev: true + + /@icons/material@0.2.4(react@17.0.2): + resolution: {integrity: sha512-QPcGmICAPbGLGb6F/yNf/KzKqvFx8z5qx3D1yFqVAjoFmXK35EgyW+cJ57Te3CNsmzblwtzakLGFqHPqrfb4Tw==} + peerDependencies: + react: '*' + dependencies: + react: 17.0.2 + dev: true + + /@istanbuljs/load-nyc-config@1.1.0: + resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} + engines: {node: '>=8'} + dependencies: + camelcase: 5.3.1 + find-up: 4.1.0 + get-package-type: 0.1.0 + js-yaml: 3.14.1 + resolve-from: 5.0.0 + dev: true + + /@istanbuljs/schema@0.1.3: + resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} + engines: {node: '>=8'} + dev: true + + /@jest/transform@26.6.2: + resolution: {integrity: sha512-E9JjhUgNzvuQ+vVAL21vlyfy12gP0GhazGgJC4h6qUt1jSdUXGWJ1wfu/X7Sd8etSgxV4ovT1pb9v5D6QW4XgA==} + engines: {node: '>= 10.14.2'} + dependencies: + '@babel/core': 7.17.5 + '@jest/types': 26.6.2 + babel-plugin-istanbul: 6.1.1 + chalk: 4.1.2 + convert-source-map: 1.8.0 + fast-json-stable-stringify: 2.1.0 + graceful-fs: 4.2.9 + jest-haste-map: 26.6.2 + jest-regex-util: 26.0.0 + jest-util: 26.6.2 + micromatch: 4.0.4 + pirates: 4.0.5 + slash: 3.0.0 + source-map: 0.6.1 + write-file-atomic: 3.0.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@jest/types@26.6.2: + resolution: {integrity: sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==} + engines: {node: '>= 10.14.2'} + dependencies: + '@types/istanbul-lib-coverage': 2.0.4 + '@types/istanbul-reports': 3.0.1 + '@types/node': 17.0.21 + '@types/yargs': 15.0.14 + chalk: 4.1.2 + dev: true + + /@jest/types@27.5.1: + resolution: {integrity: sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@types/istanbul-lib-coverage': 2.0.4 + '@types/istanbul-reports': 3.0.1 + '@types/node': 17.0.21 + '@types/yargs': 16.0.4 + chalk: 4.1.2 + dev: true + + /@jridgewell/gen-mapping@0.3.3: + resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/set-array': 1.1.2 + '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/trace-mapping': 0.3.19 + + /@jridgewell/resolve-uri@3.1.1: + resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} + engines: {node: '>=6.0.0'} + + /@jridgewell/set-array@1.1.2: + resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} + engines: {node: '>=6.0.0'} + + /@jridgewell/sourcemap-codec@1.4.15: + resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + + /@jridgewell/trace-mapping@0.3.19: + resolution: {integrity: sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==} + dependencies: + '@jridgewell/resolve-uri': 3.1.1 + '@jridgewell/sourcemap-codec': 1.4.15 + + /@jridgewell/trace-mapping@0.3.9: + resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} + dependencies: + '@jridgewell/resolve-uri': 3.1.1 + '@jridgewell/sourcemap-codec': 1.4.15 + dev: false + + /@mdx-js/loader@1.6.22(react@17.0.2): + resolution: {integrity: sha512-9CjGwy595NaxAYp0hF9B/A0lH6C8Rms97e2JS9d3jVUtILn6pT5i5IV965ra3lIWc7Rs1GG1tBdVF7dCowYe6Q==} + dependencies: + '@mdx-js/mdx': 1.6.22 + '@mdx-js/react': 1.6.22(react@17.0.2) + loader-utils: 2.0.0 + transitivePeerDependencies: + - react + - supports-color + dev: true + + /@mdx-js/mdx@1.6.22: + resolution: {integrity: sha512-AMxuLxPz2j5/6TpF/XSdKpQP1NlG0z11dFOlq+2IP/lSgl11GY8ji6S/rgsViN/L0BDvHvUMruRb7ub+24LUYA==} + dependencies: + '@babel/core': 7.12.9 + '@babel/plugin-syntax-jsx': 7.12.1(@babel/core@7.12.9) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.12.9) + '@mdx-js/util': 1.6.22 + babel-plugin-apply-mdx-type-prop: 1.6.22(@babel/core@7.12.9) + babel-plugin-extract-import-names: 1.6.22 + camelcase-css: 2.0.1 + detab: 2.0.4 + hast-util-raw: 6.0.1 + lodash.uniq: 4.5.0 + mdast-util-to-hast: 10.0.1 + remark-footnotes: 2.0.0 + remark-mdx: 1.6.22 + remark-parse: 8.0.3 + remark-squeeze-paragraphs: 4.0.0 + style-to-object: 0.3.0 + unified: 9.2.0 + unist-builder: 2.0.3 + unist-util-visit: 2.0.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@mdx-js/mdx@2.1.0: + resolution: {integrity: sha512-AuZGNLSGrytOd7a81E2SsWAOYg/eV5I51BlUPc11PPmPwhpovu7mwfyQ8PH1jxhdH0Is6aRtXHERuDxon0TluQ==} + dependencies: + '@types/estree-jsx': 0.0.1 + '@types/mdx': 2.0.1 + astring: 1.8.1 + estree-util-build-jsx: 2.0.0 + estree-util-is-identifier-name: 2.0.0 + estree-walker: 3.0.1 + hast-util-to-estree: 2.0.2 + markdown-extensions: 1.1.1 + periscopic: 3.0.4 + remark-mdx: 2.1.0 + remark-parse: 10.0.1 + remark-rehype: 10.1.0 + unified: 10.1.2 + unist-util-position-from-estree: 1.1.1 + unist-util-stringify-position: 3.0.2 + unist-util-visit: 4.1.0 + vfile: 5.3.2 + transitivePeerDependencies: + - supports-color + dev: false + + /@mdx-js/react@1.6.22(react@17.0.2): + resolution: {integrity: sha512-TDoPum4SHdfPiGSAaRBw7ECyI8VaHpK8GJugbJIJuqyh6kzw9ZLJZW3HGL3NNrJGxcAixUvqROm+YuQOo5eXtg==} + peerDependencies: + react: ^16.13.1 || ^17.0.0 + dependencies: + react: 17.0.2 + dev: true + + /@mdx-js/react@2.1.1(react@17.0.2): + resolution: {integrity: sha512-7zlZDf5xmWH8I0kFE4DG91COOkxjaW9DX5f1HWztZpFcVua2gJgMYfIkFaDpO/DH/tWi6Mz+OheW4194r15igg==} + peerDependencies: + react: '>=16' + dependencies: + '@types/mdx': 2.0.1 + '@types/react': 18.0.5 + react: 17.0.2 + dev: false + + /@mdx-js/util@1.6.22: + resolution: {integrity: sha512-H1rQc1ZOHANWBvPcW+JpGwr+juXSxM8Q8YCkm3GhZd8REu1fHR3z99CErO1p9pkcfcxZnMdIZdIsXkOHY0NilA==} + dev: true + + /@mrmlnc/readdir-enhanced@2.2.1: + resolution: {integrity: sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==} + engines: {node: '>=4'} + dependencies: + call-me-maybe: 1.0.1 + glob-to-regexp: 0.3.0 + dev: true + + /@next/bundle-analyzer@12.1.5: + resolution: {integrity: sha512-A9MkhWCPvSp1vl0Ox7IjJ/qpugDC5YAb40btGGIPPXHQtkal107Sf8dbay4fqw4Hekee5gdS0WUMfe1BaSur7w==} + dependencies: + webpack-bundle-analyzer: 4.3.0 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + dev: true + + /@next/env@12.3.4: + resolution: {integrity: sha512-H/69Lc5Q02dq3o+dxxy5O/oNxFsZpdL6WREtOOtOM1B/weonIwDXkekr1KV5DPVPr12IHFPrMrcJQ6bgPMfn7A==} + + /@next/eslint-plugin-next@12.1.0: + resolution: {integrity: sha512-WFiyvSM2G5cQmh32t/SiQuJ+I2O+FHVlK/RFw5b1565O2kEM/36EXncjt88Pa+X5oSc+1SS+tWxowWJd1lqI+g==} + dependencies: + glob: 7.1.7 + dev: true + + /@next/swc-android-arm-eabi@12.3.4: + resolution: {integrity: sha512-cM42Cw6V4Bz/2+j/xIzO8nK/Q3Ly+VSlZJTa1vHzsocJRYz8KT6MrreXaci2++SIZCF1rVRCDgAg5PpqRibdIA==} + engines: {node: '>= 10'} + cpu: [arm] + os: [android] + requiresBuild: true + optional: true + + /@next/swc-android-arm64@12.3.4: + resolution: {integrity: sha512-5jf0dTBjL+rabWjGj3eghpLUxCukRhBcEJgwLedewEA/LJk2HyqCvGIwj5rH+iwmq1llCWbOky2dO3pVljrapg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [android] + requiresBuild: true + optional: true + + /@next/swc-darwin-arm64@12.3.4: + resolution: {integrity: sha512-DqsSTd3FRjQUR6ao0E1e2OlOcrF5br+uegcEGPVonKYJpcr0MJrtYmPxd4v5T6UCJZ+XzydF7eQo5wdGvSZAyA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + optional: true + + /@next/swc-darwin-x64@12.3.4: + resolution: {integrity: sha512-PPF7tbWD4k0dJ2EcUSnOsaOJ5rhT3rlEt/3LhZUGiYNL8KvoqczFrETlUx0cUYaXe11dRA3F80Hpt727QIwByQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + requiresBuild: true + optional: true + + /@next/swc-freebsd-x64@12.3.4: + resolution: {integrity: sha512-KM9JXRXi/U2PUM928z7l4tnfQ9u8bTco/jb939pdFUHqc28V43Ohd31MmZD1QzEK4aFlMRaIBQOWQZh4D/E5lQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + optional: true + + /@next/swc-linux-arm-gnueabihf@12.3.4: + resolution: {integrity: sha512-3zqD3pO+z5CZyxtKDTnOJ2XgFFRUBciOox6EWkoZvJfc9zcidNAQxuwonUeNts6Xbm8Wtm5YGIRC0x+12YH7kw==} + engines: {node: '>= 10'} + cpu: [arm] + os: [linux] + requiresBuild: true + optional: true + + /@next/swc-linux-arm64-gnu@12.3.4: + resolution: {integrity: sha512-kiX0vgJGMZVv+oo1QuObaYulXNvdH/IINmvdZnVzMO/jic/B8EEIGlZ8Bgvw8LCjH3zNVPO3mGrdMvnEEPEhKA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + optional: true + + /@next/swc-linux-arm64-musl@12.3.4: + resolution: {integrity: sha512-EETZPa1juczrKLWk5okoW2hv7D7WvonU+Cf2CgsSoxgsYbUCZ1voOpL4JZTOb6IbKMDo6ja+SbY0vzXZBUMvkQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + optional: true + + /@next/swc-linux-x64-gnu@12.3.4: + resolution: {integrity: sha512-4csPbRbfZbuWOk3ATyWcvVFdD9/Rsdq5YHKvRuEni68OCLkfy4f+4I9OBpyK1SKJ00Cih16NJbHE+k+ljPPpag==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + requiresBuild: true + optional: true + + /@next/swc-linux-x64-musl@12.3.4: + resolution: {integrity: sha512-YeBmI+63Ro75SUiL/QXEVXQ19T++58aI/IINOyhpsRL1LKdyfK/35iilraZEFz9bLQrwy1LYAR5lK200A9Gjbg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + requiresBuild: true + optional: true + + /@next/swc-win32-arm64-msvc@12.3.4: + resolution: {integrity: sha512-Sd0qFUJv8Tj0PukAYbCCDbmXcMkbIuhnTeHm9m4ZGjCf6kt7E/RMs55Pd3R5ePjOkN7dJEuxYBehawTR/aPDSQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + requiresBuild: true + optional: true + + /@next/swc-win32-ia32-msvc@12.3.4: + resolution: {integrity: sha512-rt/vv/vg/ZGGkrkKcuJ0LyliRdbskQU+91bje+PgoYmxTZf/tYs6IfbmgudBJk6gH3QnjHWbkphDdRQrseRefQ==} + engines: {node: '>= 10'} + cpu: [ia32] + os: [win32] + requiresBuild: true + optional: true + + /@next/swc-win32-x64-msvc@12.3.4: + resolution: {integrity: sha512-DQ20JEfTBZAgF8QCjYfJhv2/279M6onxFjdG/+5B0Cyj00/EdBxiWb2eGGFgQhrBbNv/lsvzFbbi0Ptf8Vw/bg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + requiresBuild: true + optional: true + + /@nodelib/fs.scandir@2.1.5: + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + dev: true + + /@nodelib/fs.stat@1.1.3: + resolution: {integrity: sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==} + engines: {node: '>= 6'} + dev: true + + /@nodelib/fs.stat@2.0.5: + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + dev: true + + /@nodelib/fs.walk@1.2.8: + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.13.0 + dev: true + + /@npmcli/fs@1.1.1: + resolution: {integrity: sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==} + dependencies: + '@gar/promisify': 1.1.3 + semver: 7.5.4 + dev: true + + /@npmcli/move-file@1.1.2: + resolution: {integrity: sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==} + engines: {node: '>=10'} + deprecated: This functionality has been moved to @npmcli/fs + dependencies: + mkdirp: 1.0.4 + rimraf: 3.0.2 + dev: true + + /@pmmmwh/react-refresh-webpack-plugin@0.5.4(react-refresh@0.11.0)(webpack@4.46.0): + resolution: {integrity: sha512-zZbZeHQDnoTlt2AF+diQT0wsSXpvWiaIOZwBRdltNFhG1+I3ozyaw7U/nBiUwyJ0D+zwdXp0E3bWOl38Ag2BMw==} + engines: {node: '>= 10.13'} + peerDependencies: + '@types/webpack': 4.x || 5.x + react-refresh: '>=0.10.0 <1.0.0' + sockjs-client: ^1.4.0 + type-fest: '>=0.17.0 <3.0.0' + webpack: '>=4.43.0 <6.0.0' + webpack-dev-server: 3.x || 4.x + webpack-hot-middleware: 2.x + webpack-plugin-serve: 0.x || 1.x + peerDependenciesMeta: + '@types/webpack': + optional: true + sockjs-client: + optional: true + type-fest: + optional: true + webpack-dev-server: + optional: true + webpack-hot-middleware: + optional: true + webpack-plugin-serve: + optional: true + dependencies: + ansi-html-community: 0.0.8 + common-path-prefix: 3.0.0 + core-js-pure: 3.21.1 + error-stack-parser: 2.0.7 + find-up: 5.0.0 + html-entities: 2.3.2 + loader-utils: 2.0.2 + react-refresh: 0.11.0 + schema-utils: 3.1.1 + source-map: 0.7.3 + webpack: 4.46.0 + dev: true + + /@polka/url@1.0.0-next.21: + resolution: {integrity: sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g==} + dev: true + + /@popperjs/core@2.11.2: + resolution: {integrity: sha512-92FRmppjjqz29VMJ2dn+xdyXZBrMlE42AV6Kq6BwjWV7CNUW1hs2FtxSNLQE+gJhaZ6AAmYuO9y8dshhcBl7vA==} + dev: true + + /@reach/component-component@0.1.3(prop-types@15.8.1)(react-dom@17.0.2)(react@17.0.2): + resolution: {integrity: sha512-a1USH7L3bEfDdPN4iNZGvMEFuBfkdG+QNybeyDv8RloVFgZYRoM+KGXyy2KOfEnTUM8QWDRSROwaL3+ts5Angg==} + peerDependencies: + prop-types: ^15.6.2 + react: ^16.4.0 + react-dom: ^16.4.0 + dependencies: + prop-types: 15.8.1 + react: 17.0.2 + react-dom: 17.0.2(react@17.0.2) + dev: true + + /@reach/observe-rect@1.2.0: + resolution: {integrity: sha512-Ba7HmkFgfQxZqqaeIWWkNK0rEhpxVQHIoVyW1YDSkGsGIXzcaW4deC8B0pZrNSSyLTdIk7y+5olKt5+g0GmFIQ==} + dev: true + + /@reach/rect@0.2.1(prop-types@15.8.1)(react-dom@17.0.2)(react@17.0.2): + resolution: {integrity: sha512-aZ9RsNHDMQ3zETonikqu9/85iXxj+LPqZ9Gr9UAncj3AufYmGeWG3XG6b37B+7ORH+mkhVpLU2ZlIWxmOe9Cqg==} + peerDependencies: + prop-types: ^15.6.2 + react: ^16.8.0 + react-dom: ^16.8.0 + dependencies: + '@reach/component-component': 0.1.3(prop-types@15.8.1)(react-dom@17.0.2)(react@17.0.2) + '@reach/observe-rect': 1.2.0 + prop-types: 15.8.1 + react: 17.0.2 + react-dom: 17.0.2(react@17.0.2) + dev: true + + /@react-theming/flatten@0.1.1: + resolution: {integrity: sha512-cieWCbO4xTgl8/LAUTEgiafEiFIcheARteyxXddnUHm/+7POCmRvSE/woHGXlVH7dFBlCbI4y/e5ikMzwBA3CA==} + dependencies: + color: 3.2.1 + color-convert: 2.0.1 + color-parse: 1.4.2 + color-rgba: 2.4.0 + color-string: 1.9.0 + color-stringify: 1.2.1 + flat: 5.0.2 + is-color-stop: 1.1.0 + rgb-hex: 3.0.0 + dev: true + + /@react-theming/storybook-addon@1.1.5(@storybook/addons@6.4.19)(@storybook/react@6.4.19)(@storybook/theming@6.4.19)(react-dom@17.0.2)(react@17.0.2): + resolution: {integrity: sha512-m4LM4j/dDzwMdvdHvsdiM64Qb6pI7DdALHHMoCCe0u4OFlAxtHk67FlwMkEGfsoV3zZWHYhz8hP7rcSrPUMbVw==} + peerDependencies: + '@storybook/react': ^5.0.0 || ^6.0.0 + '@storybook/theming': ^5.0.0 || ^6.0.0 + react: ^16.8.6 || ^17.0.0 + dependencies: + '@react-theming/flatten': 0.1.1 + '@react-theming/theme-name': 1.0.3 + '@react-theming/theme-swatch': 1.0.0(react@17.0.2) + '@storybook/addon-devkit': 1.4.2(@storybook/addons@6.4.19)(@storybook/react@6.4.19)(react-dom@17.0.2)(react@17.0.2) + '@storybook/react': 6.4.19(@babel/core@7.17.5)(@types/react@17.0.39)(eslint@8.10.0)(react-dom@17.0.2)(react@17.0.2)(typescript@4.5.5) + '@storybook/theming': 6.4.19(react-dom@17.0.2)(react@17.0.2) + '@usulpro/react-json-view': 2.0.1(react-dom@17.0.2)(react@17.0.2) + react: 17.0.2 + react-color: 2.19.3(react@17.0.2) + transitivePeerDependencies: + - '@storybook/addons' + - encoding + - react-dom + dev: true + + /@react-theming/theme-name@1.0.3: + resolution: {integrity: sha512-5tYnKIG3wUJ3GTX50ldeU+nxLTEU8WXEGsHk8mWeG9XGC4VxKIp2gSqS6B/opCGmfuIFm459Dtru8PSuEXiJJg==} + dependencies: + color-name-list: 4.15.0 + nearest-color: 0.4.4 + dev: true + + /@react-theming/theme-swatch@1.0.0(react@17.0.2): + resolution: {integrity: sha512-tOzDTUbFB5uQLMVHJ4fXWYZ4i7JIKjyrS7SlHDoscRZqM69lmT+s9fSZoD1/InTdX0M7Jh8thXF0SzeoxnD1/Q==} + peerDependencies: + react: ^16.8.6 || ^17.0.0 + dependencies: + react: 17.0.2 + dev: true + + /@rushstack/eslint-patch@1.1.0: + resolution: {integrity: sha512-JLo+Y592QzIE+q7Dl2pMUtt4q8SKYI5jDrZxrozEQxnGVOyYE+GWK9eLkwTaeN9DDctlaRAQ3TBmzZ1qdLE30A==} + dev: true + + /@storybook/addon-actions@6.4.19(@types/react@17.0.39)(react-dom@17.0.2)(react@17.0.2): + resolution: {integrity: sha512-GpSvP8xV8GfNkmtGJjfCgaOx6mbjtyTK0aT9FqX9pU0s+KVMmoCTrBh43b7dWrwxxas01yleBK9VpYggzhi/Fw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 + react-dom: ^16.8.0 || ^17.0.0 + peerDependenciesMeta: + react: + optional: true + react-dom: + optional: true + dependencies: + '@storybook/addons': 6.4.19(react-dom@17.0.2)(react@17.0.2) + '@storybook/api': 6.4.19(react-dom@17.0.2)(react@17.0.2) + '@storybook/components': 6.4.19(@types/react@17.0.39)(react-dom@17.0.2)(react@17.0.2) + '@storybook/core-events': 6.4.19 + '@storybook/csf': 0.0.2--canary.87bc651.0 + '@storybook/theming': 6.4.19(react-dom@17.0.2)(react@17.0.2) + core-js: 3.21.1 + fast-deep-equal: 3.1.3 + global: 4.4.0 + lodash: 4.17.21 + polished: 4.1.4 + prop-types: 15.8.1 + react: 17.0.2 + react-dom: 17.0.2(react@17.0.2) + react-inspector: 5.1.1(react@17.0.2) + regenerator-runtime: 0.13.9 + telejson: 5.3.3 + ts-dedent: 2.2.0 + util-deprecate: 1.0.2 + uuid-browser: 3.1.0 + transitivePeerDependencies: + - '@types/react' + dev: true + + /@storybook/addon-backgrounds@6.4.19(@types/react@17.0.39)(react-dom@17.0.2)(react@17.0.2): + resolution: {integrity: sha512-yn8MTE7lctO48Rdw+DmmA1wKdf5eyAbA/vrug5ske/U2WPgGc65sApzwT8BItZfuyAMjuT5RnCWwd7o6hGRgGQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 + react-dom: ^16.8.0 || ^17.0.0 + peerDependenciesMeta: + react: + optional: true + react-dom: + optional: true + dependencies: + '@storybook/addons': 6.4.19(react-dom@17.0.2)(react@17.0.2) + '@storybook/api': 6.4.19(react-dom@17.0.2)(react@17.0.2) + '@storybook/client-logger': 6.4.19 + '@storybook/components': 6.4.19(@types/react@17.0.39)(react-dom@17.0.2)(react@17.0.2) + '@storybook/core-events': 6.4.19 + '@storybook/csf': 0.0.2--canary.87bc651.0 + '@storybook/theming': 6.4.19(react-dom@17.0.2)(react@17.0.2) + core-js: 3.21.1 + global: 4.4.0 + memoizerific: 1.11.3 + react: 17.0.2 + react-dom: 17.0.2(react@17.0.2) + regenerator-runtime: 0.13.9 + ts-dedent: 2.2.0 + util-deprecate: 1.0.2 + transitivePeerDependencies: + - '@types/react' + dev: true + + /@storybook/addon-controls@6.4.19(@types/react@17.0.39)(eslint@8.10.0)(react-dom@17.0.2)(react@17.0.2)(typescript@4.5.5): + resolution: {integrity: sha512-JHi5z9i6NsgQLfG5WOeQE1AyOrM+QJLrjT+uOYx40bq+OC1yWHH7qHiphPP8kjJJhCZlaQk1qqXYkkQXgaeHSw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 + react-dom: ^16.8.0 || ^17.0.0 + peerDependenciesMeta: + react: + optional: true + react-dom: + optional: true + dependencies: + '@storybook/addons': 6.4.19(react-dom@17.0.2)(react@17.0.2) + '@storybook/api': 6.4.19(react-dom@17.0.2)(react@17.0.2) + '@storybook/client-logger': 6.4.19 + '@storybook/components': 6.4.19(@types/react@17.0.39)(react-dom@17.0.2)(react@17.0.2) + '@storybook/core-common': 6.4.19(eslint@8.10.0)(react-dom@17.0.2)(react@17.0.2)(typescript@4.5.5) + '@storybook/csf': 0.0.2--canary.87bc651.0 + '@storybook/node-logger': 6.4.19 + '@storybook/store': 6.4.19(react-dom@17.0.2)(react@17.0.2) + '@storybook/theming': 6.4.19(react-dom@17.0.2)(react@17.0.2) + core-js: 3.21.1 + lodash: 4.17.21 + react: 17.0.2 + react-dom: 17.0.2(react@17.0.2) + ts-dedent: 2.2.0 + transitivePeerDependencies: + - '@types/react' + - eslint + - supports-color + - typescript + - vue-template-compiler + - webpack-cli + - webpack-command + dev: true + + /@storybook/addon-devkit@1.4.2(@storybook/addons@6.4.19)(@storybook/react@6.4.19)(react-dom@17.0.2)(react@17.0.2): + resolution: {integrity: sha512-ggy34eCzmiKOwgV7xYNjlPClGpmtnYODPJv0vkCKiDyPeVLHocq2UZ7ZkOhQ5GO7TM7aLeeC1JBS00tZId9oLA==} + peerDependencies: + '@storybook/addons': '*' + '@storybook/react': '*' + react: '*' + react-dom: '*' + dependencies: + '@reach/rect': 0.2.1(prop-types@15.8.1)(react-dom@17.0.2)(react@17.0.2) + '@storybook/addons': 6.4.19(react-dom@17.0.2)(react@17.0.2) + '@storybook/core-events': 6.4.19 + '@storybook/react': 6.4.19(@babel/core@7.17.5)(@types/react@17.0.39)(eslint@8.10.0)(react-dom@17.0.2)(react@17.0.2)(typescript@4.5.5) + '@storybook/theming': 6.4.19(react-dom@17.0.2)(react@17.0.2) + deep-equal: 2.0.5 + prop-types: 15.8.1 + react: 17.0.2 + react-dom: 17.0.2(react@17.0.2) + dev: true + + /@storybook/addon-docs@6.4.19(@storybook/react@6.4.19)(@types/react@17.0.39)(eslint@8.10.0)(react-dom@17.0.2)(react@17.0.2)(typescript@4.5.5)(webpack@4.46.0): + resolution: {integrity: sha512-OEPyx/5ZXmZOPqIAWoPjlIP8Q/YfNjAmBosA8tmA8t5KCSiq/vpLcAvQhxqK6n0wk/B8Xp67Z8RpLfXjU8R3tw==} + peerDependencies: + '@storybook/angular': 6.4.19 + '@storybook/html': 6.4.19 + '@storybook/react': 6.4.19 + '@storybook/vue': 6.4.19 + '@storybook/vue3': 6.4.19 + '@storybook/web-components': 6.4.19 + lit: ^2.0.0 + lit-html: ^1.4.1 || ^2.0.0 + react: ^16.8.0 || ^17.0.0 + react-dom: ^16.8.0 || ^17.0.0 + svelte: ^3.31.2 + sveltedoc-parser: ^4.1.0 + vue: ^2.6.10 || ^3.0.0 + webpack: '*' + peerDependenciesMeta: + '@storybook/angular': + optional: true + '@storybook/html': + optional: true + '@storybook/react': + optional: true + '@storybook/vue': + optional: true + '@storybook/vue3': + optional: true + '@storybook/web-components': + optional: true + lit: + optional: true + lit-html: + optional: true + react: + optional: true + react-dom: + optional: true + svelte: + optional: true + sveltedoc-parser: + optional: true + vue: + optional: true + webpack: + optional: true + dependencies: + '@babel/core': 7.17.5 + '@babel/generator': 7.23.0 + '@babel/parser': 7.23.0 + '@babel/plugin-transform-react-jsx': 7.17.3(@babel/core@7.17.5) + '@babel/preset-env': 7.16.11(@babel/core@7.17.5) + '@jest/transform': 26.6.2 + '@mdx-js/loader': 1.6.22(react@17.0.2) + '@mdx-js/mdx': 1.6.22 + '@mdx-js/react': 1.6.22(react@17.0.2) + '@storybook/addons': 6.4.19(react-dom@17.0.2)(react@17.0.2) + '@storybook/api': 6.4.19(react-dom@17.0.2)(react@17.0.2) + '@storybook/builder-webpack4': 6.4.19(@types/react@17.0.39)(eslint@8.10.0)(react-dom@17.0.2)(react@17.0.2)(typescript@4.5.5) + '@storybook/client-logger': 6.4.19 + '@storybook/components': 6.4.19(@types/react@17.0.39)(react-dom@17.0.2)(react@17.0.2) + '@storybook/core': 6.4.19(@types/react@17.0.39)(eslint@8.10.0)(react-dom@17.0.2)(react@17.0.2)(typescript@4.5.5)(webpack@4.46.0) + '@storybook/core-events': 6.4.19 + '@storybook/csf': 0.0.2--canary.87bc651.0 + '@storybook/csf-tools': 6.4.19 + '@storybook/node-logger': 6.4.19 + '@storybook/postinstall': 6.4.19 + '@storybook/preview-web': 6.4.19(react-dom@17.0.2)(react@17.0.2) + '@storybook/react': 6.4.19(@babel/core@7.17.5)(@types/react@17.0.39)(eslint@8.10.0)(react-dom@17.0.2)(react@17.0.2)(typescript@4.5.5) + '@storybook/source-loader': 6.4.19(react-dom@17.0.2)(react@17.0.2) + '@storybook/store': 6.4.19(react-dom@17.0.2)(react@17.0.2) + '@storybook/theming': 6.4.19(react-dom@17.0.2)(react@17.0.2) + acorn: 7.4.1 + acorn-jsx: 5.3.2(acorn@7.4.1) + acorn-walk: 7.2.0 + core-js: 3.21.1 + doctrine: 3.0.0 + escodegen: 2.0.0 + fast-deep-equal: 3.1.3 + global: 4.4.0 + html-tags: 3.1.0 + js-string-escape: 1.0.1 + loader-utils: 2.0.2 + lodash: 4.17.21 + nanoid: 3.3.1 + p-limit: 3.1.0 + prettier: 2.3.0 + prop-types: 15.8.1 + react: 17.0.2 + react-dom: 17.0.2(react@17.0.2) + react-element-to-jsx-string: 14.3.4(react-dom@17.0.2)(react@17.0.2) + regenerator-runtime: 0.13.9 + remark-external-links: 8.0.0 + remark-slug: 6.1.0 + ts-dedent: 2.2.0 + util-deprecate: 1.0.2 + webpack: 4.46.0 + transitivePeerDependencies: + - '@storybook/builder-webpack5' + - '@storybook/manager-webpack5' + - '@types/react' + - bluebird + - bufferutil + - encoding + - eslint + - supports-color + - typescript + - utf-8-validate + - vue-template-compiler + - webpack-cli + - webpack-command + dev: true + + /@storybook/addon-essentials@6.4.19(@babel/core@7.17.5)(@storybook/react@6.4.19)(@types/react@17.0.39)(babel-loader@8.2.3)(eslint@8.10.0)(react-dom@17.0.2)(react@17.0.2)(typescript@4.5.5)(webpack@4.46.0): + resolution: {integrity: sha512-vbV8sjepMVEuwhTDBHjO3E6vXluG7RiEeozV1QVuS9lGhjQdvUPdZ9rDNUcP6WHhTdEkS/ffTMaGIy1v8oZd7g==} + peerDependencies: + '@babel/core': ^7.9.6 + '@storybook/vue': 6.4.19 + '@storybook/web-components': 6.4.19 + babel-loader: ^8.0.0 + lit-html: ^1.4.1 || ^2.0.0-rc.3 + react: ^16.8.0 || ^17.0.0 + react-dom: ^16.8.0 || ^17.0.0 + webpack: '*' + peerDependenciesMeta: + '@storybook/vue': + optional: true + '@storybook/web-components': + optional: true + lit-html: + optional: true + react: + optional: true + react-dom: + optional: true + webpack: + optional: true + dependencies: + '@babel/core': 7.17.5 + '@storybook/addon-actions': 6.4.19(@types/react@17.0.39)(react-dom@17.0.2)(react@17.0.2) + '@storybook/addon-backgrounds': 6.4.19(@types/react@17.0.39)(react-dom@17.0.2)(react@17.0.2) + '@storybook/addon-controls': 6.4.19(@types/react@17.0.39)(eslint@8.10.0)(react-dom@17.0.2)(react@17.0.2)(typescript@4.5.5) + '@storybook/addon-docs': 6.4.19(@storybook/react@6.4.19)(@types/react@17.0.39)(eslint@8.10.0)(react-dom@17.0.2)(react@17.0.2)(typescript@4.5.5)(webpack@4.46.0) + '@storybook/addon-measure': 6.4.19(@types/react@17.0.39)(react-dom@17.0.2)(react@17.0.2) + '@storybook/addon-outline': 6.4.19(@types/react@17.0.39)(react-dom@17.0.2)(react@17.0.2) + '@storybook/addon-toolbars': 6.4.19(@types/react@17.0.39)(react-dom@17.0.2)(react@17.0.2) + '@storybook/addon-viewport': 6.4.19(@types/react@17.0.39)(react-dom@17.0.2)(react@17.0.2) + '@storybook/addons': 6.4.19(react-dom@17.0.2)(react@17.0.2) + '@storybook/api': 6.4.19(react-dom@17.0.2)(react@17.0.2) + '@storybook/node-logger': 6.4.19 + babel-loader: 8.2.3(@babel/core@7.17.5)(webpack@4.46.0) + core-js: 3.21.1 + react: 17.0.2 + react-dom: 17.0.2(react@17.0.2) + regenerator-runtime: 0.13.9 + ts-dedent: 2.2.0 + webpack: 4.46.0 + transitivePeerDependencies: + - '@storybook/angular' + - '@storybook/builder-webpack5' + - '@storybook/html' + - '@storybook/manager-webpack5' + - '@storybook/react' + - '@storybook/vue3' + - '@types/react' + - bluebird + - bufferutil + - encoding + - eslint + - lit + - supports-color + - svelte + - sveltedoc-parser + - typescript + - utf-8-validate + - vue + - vue-template-compiler + - webpack-cli + - webpack-command + dev: true + + /@storybook/addon-interactions@6.4.19(@types/react@17.0.39)(eslint@8.10.0)(react-dom@17.0.2)(react@17.0.2)(typescript@4.5.5): + resolution: {integrity: sha512-oKXxRkKL2deUI7nOLm9UvihtPaTQ2p8Y5gL2CQvJgHhTpKmUxW+e26GYNlcFUOjsx2ifXyzqNEscsZUP83BCUw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 + react-dom: ^16.8.0 || ^17.0.0 + peerDependenciesMeta: + react: + optional: true + react-dom: + optional: true + dependencies: + '@storybook/addons': 6.4.19(react-dom@17.0.2)(react@17.0.2) + '@storybook/api': 6.4.19(react-dom@17.0.2)(react@17.0.2) + '@storybook/components': 6.4.19(@types/react@17.0.39)(react-dom@17.0.2)(react@17.0.2) + '@storybook/core-common': 6.4.19(eslint@8.10.0)(react-dom@17.0.2)(react@17.0.2)(typescript@4.5.5) + '@storybook/core-events': 6.4.19 + '@storybook/csf': 0.0.2--canary.87bc651.0 + '@storybook/instrumenter': 6.4.19(react-dom@17.0.2)(react@17.0.2) + '@storybook/theming': 6.4.19(react-dom@17.0.2)(react@17.0.2) + global: 4.4.0 + jest-mock: 27.5.1 + polished: 4.1.4 + react: 17.0.2 + react-dom: 17.0.2(react@17.0.2) + ts-dedent: 2.2.0 + transitivePeerDependencies: + - '@types/react' + - eslint + - supports-color + - typescript + - vue-template-compiler + - webpack-cli + - webpack-command + dev: true + + /@storybook/addon-links@6.4.19(react-dom@17.0.2)(react@17.0.2): + resolution: {integrity: sha512-ebFHYlGDQkHSmI5QEJb1NxGNToVOLgjKkxXUe+JXX7AfHvrWiXVrN/57aOtBPZzj4h2jRPRTZgwR5glhPIlfEQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 + react-dom: ^16.8.0 || ^17.0.0 + peerDependenciesMeta: + react: + optional: true + react-dom: + optional: true + dependencies: + '@storybook/addons': 6.4.19(react-dom@17.0.2)(react@17.0.2) + '@storybook/client-logger': 6.4.19 + '@storybook/core-events': 6.4.19 + '@storybook/csf': 0.0.2--canary.87bc651.0 + '@storybook/router': 6.4.19(react-dom@17.0.2)(react@17.0.2) + '@types/qs': 6.9.7 + core-js: 3.21.1 + global: 4.4.0 + prop-types: 15.8.1 + qs: 6.10.3 + react: 17.0.2 + react-dom: 17.0.2(react@17.0.2) + regenerator-runtime: 0.13.9 + ts-dedent: 2.2.0 + dev: true + + /@storybook/addon-measure@6.4.19(@types/react@17.0.39)(react-dom@17.0.2)(react@17.0.2): + resolution: {integrity: sha512-PXeU0AlpnGEvnzBQ6snkzmlIpwE0ci8LdFtL1Vz1V1Xk5fbuETWYuEkPuk1oZ7L9igB9cfT32SyJlE5MC1iaGg==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 + react-dom: ^16.8.0 || ^17.0.0 + peerDependenciesMeta: + react: + optional: true + react-dom: + optional: true + dependencies: + '@storybook/addons': 6.4.19(react-dom@17.0.2)(react@17.0.2) + '@storybook/api': 6.4.19(react-dom@17.0.2)(react@17.0.2) + '@storybook/client-logger': 6.4.19 + '@storybook/components': 6.4.19(@types/react@17.0.39)(react-dom@17.0.2)(react@17.0.2) + '@storybook/core-events': 6.4.19 + '@storybook/csf': 0.0.2--canary.87bc651.0 + core-js: 3.21.1 + global: 4.4.0 + react: 17.0.2 + react-dom: 17.0.2(react@17.0.2) + transitivePeerDependencies: + - '@types/react' + dev: true + + /@storybook/addon-outline@6.4.19(@types/react@17.0.39)(react-dom@17.0.2)(react@17.0.2): + resolution: {integrity: sha512-7ZDXo8qrms6dx0KRP9PInXIie82h5g9XCNrGOUdfZkQPvgofJVj0kNv6p+WOiGiaVfKPC5KMgIofqzBTFV+k6Q==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 + react-dom: ^16.8.0 || ^17.0.0 + peerDependenciesMeta: + react: + optional: true + react-dom: + optional: true + dependencies: + '@storybook/addons': 6.4.19(react-dom@17.0.2)(react@17.0.2) + '@storybook/api': 6.4.19(react-dom@17.0.2)(react@17.0.2) + '@storybook/client-logger': 6.4.19 + '@storybook/components': 6.4.19(@types/react@17.0.39)(react-dom@17.0.2)(react@17.0.2) + '@storybook/core-events': 6.4.19 + '@storybook/csf': 0.0.2--canary.87bc651.0 + core-js: 3.21.1 + global: 4.4.0 + react: 17.0.2 + react-dom: 17.0.2(react@17.0.2) + regenerator-runtime: 0.13.9 + ts-dedent: 2.2.0 + transitivePeerDependencies: + - '@types/react' + dev: true + + /@storybook/addon-toolbars@6.4.19(@types/react@17.0.39)(react-dom@17.0.2)(react@17.0.2): + resolution: {integrity: sha512-2UtuX9yB1rD/CAZv1etnOnunfPTvsEKEg/J2HYMKE1lhenWC5muIUXvDXCXvwDC65WviPJ56nFNKaKK1Zz7JDg==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 + react-dom: ^16.8.0 || ^17.0.0 + peerDependenciesMeta: + react: + optional: true + react-dom: + optional: true + dependencies: + '@storybook/addons': 6.4.19(react-dom@17.0.2)(react@17.0.2) + '@storybook/api': 6.4.19(react-dom@17.0.2)(react@17.0.2) + '@storybook/components': 6.4.19(@types/react@17.0.39)(react-dom@17.0.2)(react@17.0.2) + '@storybook/theming': 6.4.19(react-dom@17.0.2)(react@17.0.2) + core-js: 3.21.1 + react: 17.0.2 + react-dom: 17.0.2(react@17.0.2) + regenerator-runtime: 0.13.9 + transitivePeerDependencies: + - '@types/react' + dev: true + + /@storybook/addon-viewport@6.4.19(@types/react@17.0.39)(react-dom@17.0.2)(react@17.0.2): + resolution: {integrity: sha512-T1hdImxbLj8suQSTbp6HSA1LLHOlqaNK5jjnqzEOoAxY0O8LNPXMJ2jKIeT2fPQ0v+tWGU3tbwf+3xFq0parVQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 + react-dom: ^16.8.0 || ^17.0.0 + peerDependenciesMeta: + react: + optional: true + react-dom: + optional: true + dependencies: + '@storybook/addons': 6.4.19(react-dom@17.0.2)(react@17.0.2) + '@storybook/api': 6.4.19(react-dom@17.0.2)(react@17.0.2) + '@storybook/client-logger': 6.4.19 + '@storybook/components': 6.4.19(@types/react@17.0.39)(react-dom@17.0.2)(react@17.0.2) + '@storybook/core-events': 6.4.19 + '@storybook/theming': 6.4.19(react-dom@17.0.2)(react@17.0.2) + core-js: 3.21.1 + global: 4.4.0 + memoizerific: 1.11.3 + prop-types: 15.8.1 + react: 17.0.2 + react-dom: 17.0.2(react@17.0.2) + regenerator-runtime: 0.13.9 + transitivePeerDependencies: + - '@types/react' + dev: true + + /@storybook/addons@6.4.19(react-dom@17.0.2)(react@17.0.2): + resolution: {integrity: sha512-QNyRYhpqmHV8oJxxTBdkRlLSbDFhpBvfvMfIrIT1UXb/eemdBZTaCGVvXZ9UixoEEI7f8VwAQ44IvkU5B1509w==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 + react-dom: ^16.8.0 || ^17.0.0 + dependencies: + '@storybook/api': 6.4.19(react-dom@17.0.2)(react@17.0.2) + '@storybook/channels': 6.4.19 + '@storybook/client-logger': 6.4.19 + '@storybook/core-events': 6.4.19 + '@storybook/csf': 0.0.2--canary.87bc651.0 + '@storybook/router': 6.4.19(react-dom@17.0.2)(react@17.0.2) + '@storybook/theming': 6.4.19(react-dom@17.0.2)(react@17.0.2) + '@types/webpack-env': 1.16.3 + core-js: 3.21.1 + global: 4.4.0 + react: 17.0.2 + react-dom: 17.0.2(react@17.0.2) + regenerator-runtime: 0.13.9 + dev: true + + /@storybook/api@6.4.19(react-dom@17.0.2)(react@17.0.2): + resolution: {integrity: sha512-aDvea+NpQCBjpNp9YidO1Pr7fzzCp15FSdkG+2ihGQfv5raxrN+IIJnGUXecpe71nvlYiB+29UXBVK7AL0j51Q==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 + react-dom: ^16.8.0 || ^17.0.0 + dependencies: + '@storybook/channels': 6.4.19 + '@storybook/client-logger': 6.4.19 + '@storybook/core-events': 6.4.19 + '@storybook/csf': 0.0.2--canary.87bc651.0 + '@storybook/router': 6.4.19(react-dom@17.0.2)(react@17.0.2) + '@storybook/semver': 7.3.2 + '@storybook/theming': 6.4.19(react-dom@17.0.2)(react@17.0.2) + core-js: 3.21.1 + fast-deep-equal: 3.1.3 + global: 4.4.0 + lodash: 4.17.21 + memoizerific: 1.11.3 + react: 17.0.2 + react-dom: 17.0.2(react@17.0.2) + regenerator-runtime: 0.13.9 + store2: 2.13.1 + telejson: 5.3.3 + ts-dedent: 2.2.0 + util-deprecate: 1.0.2 + dev: true + + /@storybook/builder-webpack4@6.4.19(@types/react@17.0.39)(eslint@8.10.0)(react-dom@17.0.2)(react@17.0.2)(typescript@4.5.5): + resolution: {integrity: sha512-wxA6SMH11duc9D53aeVVBwrVRemFIoxHp/dOugkkg6ZZFAb4ZmWzf/ENc3vQIZdZpfNRi7IZIZEOfoHc994cmw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 + react-dom: ^16.8.0 || ^17.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@babel/core': 7.17.5 + '@babel/plugin-proposal-class-properties': 7.16.7(@babel/core@7.17.5) + '@babel/plugin-proposal-decorators': 7.17.2(@babel/core@7.17.5) + '@babel/plugin-proposal-export-default-from': 7.16.7(@babel/core@7.17.5) + '@babel/plugin-proposal-nullish-coalescing-operator': 7.16.7(@babel/core@7.17.5) + '@babel/plugin-proposal-object-rest-spread': 7.17.3(@babel/core@7.17.5) + '@babel/plugin-proposal-optional-chaining': 7.16.7(@babel/core@7.17.5) + '@babel/plugin-proposal-private-methods': 7.16.11(@babel/core@7.17.5) + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.17.5) + '@babel/plugin-transform-arrow-functions': 7.16.7(@babel/core@7.17.5) + '@babel/plugin-transform-block-scoping': 7.16.7(@babel/core@7.17.5) + '@babel/plugin-transform-classes': 7.16.7(@babel/core@7.17.5) + '@babel/plugin-transform-destructuring': 7.17.3(@babel/core@7.17.5) + '@babel/plugin-transform-for-of': 7.16.7(@babel/core@7.17.5) + '@babel/plugin-transform-parameters': 7.16.7(@babel/core@7.17.5) + '@babel/plugin-transform-shorthand-properties': 7.16.7(@babel/core@7.17.5) + '@babel/plugin-transform-spread': 7.16.7(@babel/core@7.17.5) + '@babel/plugin-transform-template-literals': 7.16.7(@babel/core@7.17.5) + '@babel/preset-env': 7.16.11(@babel/core@7.17.5) + '@babel/preset-react': 7.16.7(@babel/core@7.17.5) + '@babel/preset-typescript': 7.16.7(@babel/core@7.17.5) + '@storybook/addons': 6.4.19(react-dom@17.0.2)(react@17.0.2) + '@storybook/api': 6.4.19(react-dom@17.0.2)(react@17.0.2) + '@storybook/channel-postmessage': 6.4.19 + '@storybook/channels': 6.4.19 + '@storybook/client-api': 6.4.19(react-dom@17.0.2)(react@17.0.2) + '@storybook/client-logger': 6.4.19 + '@storybook/components': 6.4.19(@types/react@17.0.39)(react-dom@17.0.2)(react@17.0.2) + '@storybook/core-common': 6.4.19(eslint@8.10.0)(react-dom@17.0.2)(react@17.0.2)(typescript@4.5.5) + '@storybook/core-events': 6.4.19 + '@storybook/node-logger': 6.4.19 + '@storybook/preview-web': 6.4.19(react-dom@17.0.2)(react@17.0.2) + '@storybook/router': 6.4.19(react-dom@17.0.2)(react@17.0.2) + '@storybook/semver': 7.3.2 + '@storybook/store': 6.4.19(react-dom@17.0.2)(react@17.0.2) + '@storybook/theming': 6.4.19(react-dom@17.0.2)(react@17.0.2) + '@storybook/ui': 6.4.19(@types/react@17.0.39)(react-dom@17.0.2)(react@17.0.2) + '@types/node': 14.18.12 + '@types/webpack': 4.41.32 + autoprefixer: 9.8.8 + babel-loader: 8.2.3(@babel/core@7.17.5)(webpack@4.46.0) + babel-plugin-macros: 2.8.0 + babel-plugin-polyfill-corejs3: 0.1.7(@babel/core@7.17.5) + case-sensitive-paths-webpack-plugin: 2.4.0 + core-js: 3.21.1 + css-loader: 3.6.0(webpack@4.46.0) + file-loader: 6.2.0(webpack@4.46.0) + find-up: 5.0.0 + fork-ts-checker-webpack-plugin: 4.1.6(eslint@8.10.0)(typescript@4.5.5)(webpack@4.46.0) + glob: 7.2.0 + glob-promise: 3.4.0(glob@7.2.0) + global: 4.4.0 + html-webpack-plugin: 4.5.2(webpack@4.46.0) + pnp-webpack-plugin: 1.6.4(typescript@4.5.5) + postcss: 7.0.39 + postcss-flexbugs-fixes: 4.2.1 + postcss-loader: 4.3.0(postcss@7.0.39)(webpack@4.46.0) + raw-loader: 4.0.2(webpack@4.46.0) + react: 17.0.2 + react-dom: 17.0.2(react@17.0.2) + stable: 0.1.8 + style-loader: 1.3.0(webpack@4.46.0) + terser-webpack-plugin: 4.2.3(webpack@4.46.0) + ts-dedent: 2.2.0 + typescript: 4.5.5 + url-loader: 4.1.1(file-loader@6.2.0)(webpack@4.46.0) + util-deprecate: 1.0.2 + webpack: 4.46.0 + webpack-dev-middleware: 3.7.3(webpack@4.46.0) + webpack-filter-warnings-plugin: 1.2.1(webpack@4.46.0) + webpack-hot-middleware: 2.25.1 + webpack-virtual-modules: 0.2.2 + transitivePeerDependencies: + - '@types/react' + - bluebird + - eslint + - supports-color + - vue-template-compiler + - webpack-cli + - webpack-command + dev: true + + /@storybook/channel-postmessage@6.4.19: + resolution: {integrity: sha512-E5h/itFzQ/6M08LR4kqlgqqmeO3tmavI+nUAlZrkCrotpJFNMHE2i0PQHg0TkFJrRDpYcrwD+AjUW4IwdqrisQ==} + dependencies: + '@storybook/channels': 6.4.19 + '@storybook/client-logger': 6.4.19 + '@storybook/core-events': 6.4.19 + core-js: 3.21.1 + global: 4.4.0 + qs: 6.10.3 + telejson: 5.3.3 + dev: true + + /@storybook/channel-websocket@6.4.19: + resolution: {integrity: sha512-cXKwQjIXttfdUyZlcHORelUmJ5nUKswsnCA/qy7IRWpZjD8yQJcNk1dYC+tTHDVqFgdRT89pL0hRRB1rlaaR8Q==} + dependencies: + '@storybook/channels': 6.4.19 + '@storybook/client-logger': 6.4.19 + core-js: 3.21.1 + global: 4.4.0 + telejson: 5.3.3 + dev: true + + /@storybook/channels@6.4.19: + resolution: {integrity: sha512-EwyoncFvTfmIlfsy8jTfayCxo2XchPkZk/9txipugWSmc057HdklMKPLOHWP0z5hLH0IbVIKXzdNISABm36jwQ==} + dependencies: + core-js: 3.21.1 + ts-dedent: 2.2.0 + util-deprecate: 1.0.2 + dev: true + + /@storybook/client-api@6.4.19(react-dom@17.0.2)(react@17.0.2): + resolution: {integrity: sha512-OCrT5Um3FDvZnimQKwWtwsaI+5agPwq2i8YiqlofrI/NPMKp0I7DEkCGwE5IRD1Q8BIKqHcMo5tTmfYi0AxyOg==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 + react-dom: ^16.8.0 || ^17.0.0 + dependencies: + '@storybook/addons': 6.4.19(react-dom@17.0.2)(react@17.0.2) + '@storybook/channel-postmessage': 6.4.19 + '@storybook/channels': 6.4.19 + '@storybook/client-logger': 6.4.19 + '@storybook/core-events': 6.4.19 + '@storybook/csf': 0.0.2--canary.87bc651.0 + '@storybook/store': 6.4.19(react-dom@17.0.2)(react@17.0.2) + '@types/qs': 6.9.7 + '@types/webpack-env': 1.16.3 + core-js: 3.21.1 + fast-deep-equal: 3.1.3 + global: 4.4.0 + lodash: 4.17.21 + memoizerific: 1.11.3 + qs: 6.10.3 + react: 17.0.2 + react-dom: 17.0.2(react@17.0.2) + regenerator-runtime: 0.13.9 + store2: 2.13.1 + synchronous-promise: 2.0.15 + ts-dedent: 2.2.0 + util-deprecate: 1.0.2 + dev: true + + /@storybook/client-logger@6.4.19: + resolution: {integrity: sha512-zmg/2wyc9W3uZrvxaW4BfHcr40J0v7AGslqYXk9H+ERLVwIvrR4NhxQFaS6uITjBENyRDxwzfU3Va634WcmdDQ==} + dependencies: + core-js: 3.21.1 + global: 4.4.0 + dev: true + + /@storybook/components@6.4.19(@types/react@17.0.39)(react-dom@17.0.2)(react@17.0.2): + resolution: {integrity: sha512-q/0V37YAJA7CNc+wSiiefeM9+3XVk8ixBNylY36QCGJgIeGQ5/79vPyUe6K4lLmsQwpmZsIq1s1Ad5+VbboeOA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 + react-dom: ^16.8.0 || ^17.0.0 + dependencies: + '@popperjs/core': 2.11.2 + '@storybook/client-logger': 6.4.19 + '@storybook/csf': 0.0.2--canary.87bc651.0 + '@storybook/theming': 6.4.19(react-dom@17.0.2)(react@17.0.2) + '@types/color-convert': 2.0.0 + '@types/overlayscrollbars': 1.12.1 + '@types/react-syntax-highlighter': 11.0.5 + color-convert: 2.0.1 + core-js: 3.21.1 + fast-deep-equal: 3.1.3 + global: 4.4.0 + lodash: 4.17.21 + markdown-to-jsx: 7.1.6(react@17.0.2) + memoizerific: 1.11.3 + overlayscrollbars: 1.13.1 + polished: 4.1.4 + prop-types: 15.8.1 + react: 17.0.2 + react-colorful: 5.5.1(react-dom@17.0.2)(react@17.0.2) + react-dom: 17.0.2(react@17.0.2) + react-popper-tooltip: 3.1.1(react-dom@17.0.2)(react@17.0.2) + react-syntax-highlighter: 13.5.3(react@17.0.2) + react-textarea-autosize: 8.3.3(@types/react@17.0.39)(react@17.0.2) + regenerator-runtime: 0.13.9 + ts-dedent: 2.2.0 + util-deprecate: 1.0.2 + transitivePeerDependencies: + - '@types/react' + dev: true + + /@storybook/core-client@6.4.19(@types/react@17.0.39)(react-dom@17.0.2)(react@17.0.2)(typescript@4.5.5)(webpack@4.46.0): + resolution: {integrity: sha512-rQHRZjhArPleE7/S8ZUolgzwY+hC0smSKX/3PQxO2GcebDjnJj6+iSV3h+aSMHMmTdoCQvjYw9aBpT8scuRe+A==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 + react-dom: ^16.8.0 || ^17.0.0 + typescript: '*' + webpack: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@storybook/addons': 6.4.19(react-dom@17.0.2)(react@17.0.2) + '@storybook/channel-postmessage': 6.4.19 + '@storybook/channel-websocket': 6.4.19 + '@storybook/client-api': 6.4.19(react-dom@17.0.2)(react@17.0.2) + '@storybook/client-logger': 6.4.19 + '@storybook/core-events': 6.4.19 + '@storybook/csf': 0.0.2--canary.87bc651.0 + '@storybook/preview-web': 6.4.19(react-dom@17.0.2)(react@17.0.2) + '@storybook/store': 6.4.19(react-dom@17.0.2)(react@17.0.2) + '@storybook/ui': 6.4.19(@types/react@17.0.39)(react-dom@17.0.2)(react@17.0.2) + airbnb-js-shims: 2.2.1 + ansi-to-html: 0.6.15 + core-js: 3.21.1 + global: 4.4.0 + lodash: 4.17.21 + qs: 6.10.3 + react: 17.0.2 + react-dom: 17.0.2(react@17.0.2) + regenerator-runtime: 0.13.9 + ts-dedent: 2.2.0 + typescript: 4.5.5 + unfetch: 4.2.0 + util-deprecate: 1.0.2 + webpack: 4.46.0 + transitivePeerDependencies: + - '@types/react' + dev: true + + /@storybook/core-common@6.4.19(eslint@8.10.0)(react-dom@17.0.2)(react@17.0.2)(typescript@4.5.5): + resolution: {integrity: sha512-X1pJJkO48DFxl6iyEemIKqRkJ7j9/cBh3BRBUr+xZHXBvnD0GKDXIocwh0PjSxSC6XSu3UCQnqtKi3PbjRl8Dg==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 + react-dom: ^16.8.0 || ^17.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@babel/core': 7.17.5 + '@babel/plugin-proposal-class-properties': 7.16.7(@babel/core@7.17.5) + '@babel/plugin-proposal-decorators': 7.17.2(@babel/core@7.17.5) + '@babel/plugin-proposal-export-default-from': 7.16.7(@babel/core@7.17.5) + '@babel/plugin-proposal-nullish-coalescing-operator': 7.16.7(@babel/core@7.17.5) + '@babel/plugin-proposal-object-rest-spread': 7.17.3(@babel/core@7.17.5) + '@babel/plugin-proposal-optional-chaining': 7.16.7(@babel/core@7.17.5) + '@babel/plugin-proposal-private-methods': 7.16.11(@babel/core@7.17.5) + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.17.5) + '@babel/plugin-transform-arrow-functions': 7.16.7(@babel/core@7.17.5) + '@babel/plugin-transform-block-scoping': 7.16.7(@babel/core@7.17.5) + '@babel/plugin-transform-classes': 7.16.7(@babel/core@7.17.5) + '@babel/plugin-transform-destructuring': 7.17.3(@babel/core@7.17.5) + '@babel/plugin-transform-for-of': 7.16.7(@babel/core@7.17.5) + '@babel/plugin-transform-parameters': 7.16.7(@babel/core@7.17.5) + '@babel/plugin-transform-shorthand-properties': 7.16.7(@babel/core@7.17.5) + '@babel/plugin-transform-spread': 7.16.7(@babel/core@7.17.5) + '@babel/preset-env': 7.16.11(@babel/core@7.17.5) + '@babel/preset-react': 7.16.7(@babel/core@7.17.5) + '@babel/preset-typescript': 7.16.7(@babel/core@7.17.5) + '@babel/register': 7.17.0(@babel/core@7.17.5) + '@storybook/node-logger': 6.4.19 + '@storybook/semver': 7.3.2 + '@types/node': 14.18.12 + '@types/pretty-hrtime': 1.0.1 + babel-loader: 8.2.3(@babel/core@7.17.5)(webpack@4.46.0) + babel-plugin-macros: 3.1.0 + babel-plugin-polyfill-corejs3: 0.1.7(@babel/core@7.17.5) + chalk: 4.1.2 + core-js: 3.21.1 + express: 4.17.3 + file-system-cache: 1.0.5 + find-up: 5.0.0 + fork-ts-checker-webpack-plugin: 6.5.0(eslint@8.10.0)(typescript@4.5.5)(webpack@4.46.0) + fs-extra: 9.1.0 + glob: 7.2.0 + handlebars: 4.7.7 + interpret: 2.2.0 + json5: 2.2.0 + lazy-universal-dotenv: 3.0.1 + picomatch: 2.3.1 + pkg-dir: 5.0.0 + pretty-hrtime: 1.0.3 + react: 17.0.2 + react-dom: 17.0.2(react@17.0.2) + resolve-from: 5.0.0 + slash: 3.0.0 + telejson: 5.3.3 + ts-dedent: 2.2.0 + typescript: 4.5.5 + util-deprecate: 1.0.2 + webpack: 4.46.0 + transitivePeerDependencies: + - eslint + - supports-color + - vue-template-compiler + - webpack-cli + - webpack-command + dev: true + + /@storybook/core-events@6.4.19: + resolution: {integrity: sha512-KICzUw6XVQUJzFSCXfvhfHAuyhn4Q5J4IZEfuZkcGJS4ODkrO6tmpdYE5Cfr+so95Nfp0ErWiLUuodBsW9/rtA==} + dependencies: + core-js: 3.21.1 + dev: true + + /@storybook/core-server@6.4.19(@types/react@17.0.39)(eslint@8.10.0)(react-dom@17.0.2)(react@17.0.2)(typescript@4.5.5): + resolution: {integrity: sha512-bKsUB9f7hl5ya2JXxpIrErmbDQjoH39FVbzYZWjMo4t/b7+Xyi6vYadwyWcqlpUQmis09ZaSMv8L/Tw0TuwLAA==} + peerDependencies: + '@storybook/builder-webpack5': 6.4.19 + '@storybook/manager-webpack5': 6.4.19 + react: ^16.8.0 || ^17.0.0 + react-dom: ^16.8.0 || ^17.0.0 + typescript: '*' + peerDependenciesMeta: + '@storybook/builder-webpack5': + optional: true + '@storybook/manager-webpack5': + optional: true + typescript: + optional: true + dependencies: + '@discoveryjs/json-ext': 0.5.6 + '@storybook/builder-webpack4': 6.4.19(@types/react@17.0.39)(eslint@8.10.0)(react-dom@17.0.2)(react@17.0.2)(typescript@4.5.5) + '@storybook/core-client': 6.4.19(@types/react@17.0.39)(react-dom@17.0.2)(react@17.0.2)(typescript@4.5.5)(webpack@4.46.0) + '@storybook/core-common': 6.4.19(eslint@8.10.0)(react-dom@17.0.2)(react@17.0.2)(typescript@4.5.5) + '@storybook/core-events': 6.4.19 + '@storybook/csf': 0.0.2--canary.87bc651.0 + '@storybook/csf-tools': 6.4.19 + '@storybook/manager-webpack4': 6.4.19(@types/react@17.0.39)(eslint@8.10.0)(react-dom@17.0.2)(react@17.0.2)(typescript@4.5.5) + '@storybook/node-logger': 6.4.19 + '@storybook/semver': 7.3.2 + '@storybook/store': 6.4.19(react-dom@17.0.2)(react@17.0.2) + '@types/node': 14.18.12 + '@types/node-fetch': 2.6.1 + '@types/pretty-hrtime': 1.0.1 + '@types/webpack': 4.41.32 + better-opn: 2.1.1 + boxen: 5.1.2 + chalk: 4.1.2 + cli-table3: 0.6.1 + commander: 6.2.1 + compression: 1.7.4 + core-js: 3.21.1 + cpy: 8.1.2 + detect-port: 1.3.0 + express: 4.17.3 + file-system-cache: 1.0.5 + fs-extra: 9.1.0 + globby: 11.1.0 + ip: 1.1.5 + lodash: 4.17.21 + node-fetch: 2.6.7 + pretty-hrtime: 1.0.3 + prompts: 2.4.2 + react: 17.0.2 + react-dom: 17.0.2(react@17.0.2) + regenerator-runtime: 0.13.9 + serve-favicon: 2.5.0 + slash: 3.0.0 + telejson: 5.3.3 + ts-dedent: 2.2.0 + typescript: 4.5.5 + util-deprecate: 1.0.2 + watchpack: 2.3.1 + webpack: 4.46.0 + ws: 8.5.0 + transitivePeerDependencies: + - '@types/react' + - bluebird + - bufferutil + - encoding + - eslint + - supports-color + - utf-8-validate + - vue-template-compiler + - webpack-cli + - webpack-command + dev: true + + /@storybook/core@6.4.19(@types/react@17.0.39)(eslint@8.10.0)(react-dom@17.0.2)(react@17.0.2)(typescript@4.5.5)(webpack@4.46.0): + resolution: {integrity: sha512-55LOQ/h/kf1jMhjN85t/pIEdIwWEG9yV7bdwv3niVvmoypCxyyjn9/QNK0RKYAeDSUtdm6FVoJ6k5CpxWz2d8w==} + peerDependencies: + '@storybook/builder-webpack5': 6.4.19 + react: ^16.8.0 || ^17.0.0 + react-dom: ^16.8.0 || ^17.0.0 + typescript: '*' + webpack: '*' + peerDependenciesMeta: + '@storybook/builder-webpack5': + optional: true + typescript: + optional: true + dependencies: + '@storybook/core-client': 6.4.19(@types/react@17.0.39)(react-dom@17.0.2)(react@17.0.2)(typescript@4.5.5)(webpack@4.46.0) + '@storybook/core-server': 6.4.19(@types/react@17.0.39)(eslint@8.10.0)(react-dom@17.0.2)(react@17.0.2)(typescript@4.5.5) + react: 17.0.2 + react-dom: 17.0.2(react@17.0.2) + typescript: 4.5.5 + webpack: 4.46.0 + transitivePeerDependencies: + - '@storybook/manager-webpack5' + - '@types/react' + - bluebird + - bufferutil + - encoding + - eslint + - supports-color + - utf-8-validate + - vue-template-compiler + - webpack-cli + - webpack-command + dev: true + + /@storybook/csf-tools@6.4.19: + resolution: {integrity: sha512-gf/zRhGoAVsFwSyV2tc+jeJfZQkxF6QsaZgbUSe24/IUvGFCT/PS/jZq1qy7dECAwrTOfykgu8juyBtj6WhWyw==} + dependencies: + '@babel/core': 7.17.5 + '@babel/generator': 7.23.0 + '@babel/parser': 7.23.0 + '@babel/plugin-transform-react-jsx': 7.17.3(@babel/core@7.17.5) + '@babel/preset-env': 7.16.11(@babel/core@7.17.5) + '@babel/traverse': 7.23.2 + '@babel/types': 7.23.0 + '@mdx-js/mdx': 1.6.22 + '@storybook/csf': 0.0.2--canary.87bc651.0 + core-js: 3.21.1 + fs-extra: 9.1.0 + global: 4.4.0 + js-string-escape: 1.0.1 + lodash: 4.17.21 + prettier: 2.3.0 + regenerator-runtime: 0.13.9 + ts-dedent: 2.2.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@storybook/csf@0.0.1: + resolution: {integrity: sha512-USTLkZze5gkel8MYCujSRBVIrUQ3YPBrLOx7GNk/0wttvVtlzWXAq9eLbQ4p/NicGxP+3T7KPEMVV//g+yubpw==} + dependencies: + lodash: 4.17.21 + dev: true + + /@storybook/csf@0.0.2--canary.87bc651.0: + resolution: {integrity: sha512-ajk1Uxa+rBpFQHKrCcTmJyQBXZ5slfwHVEaKlkuFaW77it8RgbPJp/ccna3sgoi8oZ7FkkOyvv1Ve4SmwFqRqw==} + dependencies: + lodash: 4.17.21 + dev: true + + /@storybook/instrumenter@6.4.19(react-dom@17.0.2)(react@17.0.2): + resolution: {integrity: sha512-KwOJUW7tItZw1CLffUbaSfEzH1p1HdGmJs1Q42uWGJSbXbVHZ7i7bJWYb3Lf90+yHTlqQjTr1PKAymwDwHseTA==} + dependencies: + '@storybook/addons': 6.4.19(react-dom@17.0.2)(react@17.0.2) + '@storybook/client-logger': 6.4.19 + '@storybook/core-events': 6.4.19 + global: 4.4.0 + transitivePeerDependencies: + - react + - react-dom + dev: true + + /@storybook/manager-webpack4@6.4.19(@types/react@17.0.39)(eslint@8.10.0)(react-dom@17.0.2)(react@17.0.2)(typescript@4.5.5): + resolution: {integrity: sha512-R8ugZjTYqXvlc6gDOcw909L65sIleOmIJLZR+N6/H85MivGXHu39jOwONqB7tVACufRty4FNecn8tEiQL2SAKA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 + react-dom: ^16.8.0 || ^17.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@babel/core': 7.17.5 + '@babel/plugin-transform-template-literals': 7.16.7(@babel/core@7.17.5) + '@babel/preset-react': 7.16.7(@babel/core@7.17.5) + '@storybook/addons': 6.4.19(react-dom@17.0.2)(react@17.0.2) + '@storybook/core-client': 6.4.19(@types/react@17.0.39)(react-dom@17.0.2)(react@17.0.2)(typescript@4.5.5)(webpack@4.46.0) + '@storybook/core-common': 6.4.19(eslint@8.10.0)(react-dom@17.0.2)(react@17.0.2)(typescript@4.5.5) + '@storybook/node-logger': 6.4.19 + '@storybook/theming': 6.4.19(react-dom@17.0.2)(react@17.0.2) + '@storybook/ui': 6.4.19(@types/react@17.0.39)(react-dom@17.0.2)(react@17.0.2) + '@types/node': 14.18.12 + '@types/webpack': 4.41.32 + babel-loader: 8.2.3(@babel/core@7.17.5)(webpack@4.46.0) + case-sensitive-paths-webpack-plugin: 2.4.0 + chalk: 4.1.2 + core-js: 3.21.1 + css-loader: 3.6.0(webpack@4.46.0) + express: 4.17.3 + file-loader: 6.2.0(webpack@4.46.0) + file-system-cache: 1.0.5 + find-up: 5.0.0 + fs-extra: 9.1.0 + html-webpack-plugin: 4.5.2(webpack@4.46.0) + node-fetch: 2.6.7 + pnp-webpack-plugin: 1.6.4(typescript@4.5.5) + react: 17.0.2 + react-dom: 17.0.2(react@17.0.2) + read-pkg-up: 7.0.1 + regenerator-runtime: 0.13.9 + resolve-from: 5.0.0 + style-loader: 1.3.0(webpack@4.46.0) + telejson: 5.3.3 + terser-webpack-plugin: 4.2.3(webpack@4.46.0) + ts-dedent: 2.2.0 + typescript: 4.5.5 + url-loader: 4.1.1(file-loader@6.2.0)(webpack@4.46.0) + util-deprecate: 1.0.2 + webpack: 4.46.0 + webpack-dev-middleware: 3.7.3(webpack@4.46.0) + webpack-virtual-modules: 0.2.2 + transitivePeerDependencies: + - '@types/react' + - bluebird + - encoding + - eslint + - supports-color + - vue-template-compiler + - webpack-cli + - webpack-command + dev: true + + /@storybook/node-logger@6.4.19: + resolution: {integrity: sha512-hO2Aar3PgPnPtNq2fVgiuGlqo3EEVR6TKVBXMq7foL3tN2k4BQFKLDHbm5qZQQntyYKurKsRUGKPJFPuI1ov/w==} + dependencies: + '@types/npmlog': 4.1.4 + chalk: 4.1.2 + core-js: 3.21.1 + npmlog: 5.0.1 + pretty-hrtime: 1.0.3 + dev: true + + /@storybook/postinstall@6.4.19: + resolution: {integrity: sha512-/0tHHxyIV82zt1rw4BW70GmrQbDVu9IJPAxOqFzGjC1fNojwJ53mK6FfUsOzbhG5mWk5p0Ip5+zr74moP119AA==} + dependencies: + core-js: 3.21.1 + dev: true + + /@storybook/preview-web@6.4.19(react-dom@17.0.2)(react@17.0.2): + resolution: {integrity: sha512-jqltoBv5j7lvnxEfV9w8dLX9ASWGuvgz97yg8Yo5FqkftEwrHJenyvMGcTgDJKJPorF+wiz/9aIqnmd3LCAcZQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 + react-dom: ^16.8.0 || ^17.0.0 + dependencies: + '@storybook/addons': 6.4.19(react-dom@17.0.2)(react@17.0.2) + '@storybook/channel-postmessage': 6.4.19 + '@storybook/client-logger': 6.4.19 + '@storybook/core-events': 6.4.19 + '@storybook/csf': 0.0.2--canary.87bc651.0 + '@storybook/store': 6.4.19(react-dom@17.0.2)(react@17.0.2) + ansi-to-html: 0.6.15 + core-js: 3.21.1 + global: 4.4.0 + lodash: 4.17.21 + qs: 6.10.3 + react: 17.0.2 + react-dom: 17.0.2(react@17.0.2) + regenerator-runtime: 0.13.9 + synchronous-promise: 2.0.15 + ts-dedent: 2.2.0 + unfetch: 4.2.0 + util-deprecate: 1.0.2 + dev: true + + /@storybook/react-docgen-typescript-plugin@1.0.2-canary.253f8c1.0(typescript@4.5.5)(webpack@4.46.0): + resolution: {integrity: sha512-mmoRG/rNzAiTbh+vGP8d57dfcR2aP+5/Ll03KKFyfy5FqWFm/Gh7u27ikx1I3LmVMI8n6jh5SdWMkMKon7/tDw==} + peerDependencies: + typescript: '>= 3.x' + webpack: '>= 4' + dependencies: + debug: 4.3.4 + endent: 2.1.0 + find-cache-dir: 3.3.2 + flat-cache: 3.0.4 + micromatch: 4.0.4 + react-docgen-typescript: 2.2.2(typescript@4.5.5) + tslib: 2.3.1 + typescript: 4.5.5 + webpack: 4.46.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@storybook/react@6.4.19(@babel/core@7.17.5)(@types/react@17.0.39)(eslint@8.10.0)(react-dom@17.0.2)(react@17.0.2)(typescript@4.5.5): + resolution: {integrity: sha512-5b3i8jkVrjQGmcxxxXwCduHPIh+cluWkfeweKeQOe+lW4BR8fuUICo3AMLrYPAtB/UcaJyYkIYmTvF2mkfepFA==} + engines: {node: '>=10.13.0'} + hasBin: true + peerDependencies: + '@babel/core': ^7.11.5 + react: ^16.8.0 || ^17.0.0 + react-dom: ^16.8.0 || ^17.0.0 + typescript: '*' + peerDependenciesMeta: + '@babel/core': + optional: true + typescript: + optional: true + dependencies: + '@babel/core': 7.17.5 + '@babel/preset-flow': 7.16.7(@babel/core@7.17.5) + '@babel/preset-react': 7.16.7(@babel/core@7.17.5) + '@pmmmwh/react-refresh-webpack-plugin': 0.5.4(react-refresh@0.11.0)(webpack@4.46.0) + '@storybook/addons': 6.4.19(react-dom@17.0.2)(react@17.0.2) + '@storybook/core': 6.4.19(@types/react@17.0.39)(eslint@8.10.0)(react-dom@17.0.2)(react@17.0.2)(typescript@4.5.5)(webpack@4.46.0) + '@storybook/core-common': 6.4.19(eslint@8.10.0)(react-dom@17.0.2)(react@17.0.2)(typescript@4.5.5) + '@storybook/csf': 0.0.2--canary.87bc651.0 + '@storybook/node-logger': 6.4.19 + '@storybook/react-docgen-typescript-plugin': 1.0.2-canary.253f8c1.0(typescript@4.5.5)(webpack@4.46.0) + '@storybook/semver': 7.3.2 + '@storybook/store': 6.4.19(react-dom@17.0.2)(react@17.0.2) + '@types/webpack-env': 1.16.3 + babel-plugin-add-react-displayname: 0.0.5 + babel-plugin-named-asset-import: 0.3.8(@babel/core@7.17.5) + babel-plugin-react-docgen: 4.2.1 + core-js: 3.21.1 + global: 4.4.0 + lodash: 4.17.21 + prop-types: 15.8.1 + react: 17.0.2 + react-dom: 17.0.2(react@17.0.2) + react-refresh: 0.11.0 + read-pkg-up: 7.0.1 + regenerator-runtime: 0.13.9 + ts-dedent: 2.2.0 + typescript: 4.5.5 + webpack: 4.46.0 + transitivePeerDependencies: + - '@storybook/builder-webpack5' + - '@storybook/manager-webpack5' + - '@types/react' + - '@types/webpack' + - bluebird + - bufferutil + - encoding + - eslint + - sockjs-client + - supports-color + - type-fest + - utf-8-validate + - vue-template-compiler + - webpack-cli + - webpack-command + - webpack-dev-server + - webpack-hot-middleware + - webpack-plugin-serve + dev: true + + /@storybook/router@6.4.19(react-dom@17.0.2)(react@17.0.2): + resolution: {integrity: sha512-KWWwIzuyeEIWVezkCihwY2A76Il9tUNg0I410g9qT7NrEsKyqXGRYOijWub7c1GGyNjLqz0jtrrehtixMcJkuA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 + react-dom: ^16.8.0 || ^17.0.0 + dependencies: + '@storybook/client-logger': 6.4.19 + core-js: 3.21.1 + fast-deep-equal: 3.1.3 + global: 4.4.0 + history: 5.0.0 + lodash: 4.17.21 + memoizerific: 1.11.3 + qs: 6.10.3 + react: 17.0.2 + react-dom: 17.0.2(react@17.0.2) + react-router: 6.2.2(react@17.0.2) + react-router-dom: 6.2.2(react-dom@17.0.2)(react@17.0.2) + ts-dedent: 2.2.0 + dev: true + + /@storybook/semver@7.3.2: + resolution: {integrity: sha512-SWeszlsiPsMI0Ps0jVNtH64cI5c0UF3f7KgjVKJoNP30crQ6wUSddY2hsdeczZXEKVJGEn50Q60flcGsQGIcrg==} + engines: {node: '>=10'} + hasBin: true + dependencies: + core-js: 3.21.1 + find-up: 4.1.0 + dev: true + + /@storybook/source-loader@6.4.19(react-dom@17.0.2)(react@17.0.2): + resolution: {integrity: sha512-XqTsqddRglvfW7mhyjwoqd/B8L6samcBehhO0OEbsFp6FPWa9eXuObCxtRYIcjcSIe+ksbW3D/54ppEs1L/g1Q==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 + react-dom: ^16.8.0 || ^17.0.0 + dependencies: + '@storybook/addons': 6.4.19(react-dom@17.0.2)(react@17.0.2) + '@storybook/client-logger': 6.4.19 + '@storybook/csf': 0.0.2--canary.87bc651.0 + core-js: 3.21.1 + estraverse: 5.3.0 + global: 4.4.0 + loader-utils: 2.0.2 + lodash: 4.17.21 + prettier: 2.3.0 + react: 17.0.2 + react-dom: 17.0.2(react@17.0.2) + regenerator-runtime: 0.13.9 + dev: true + + /@storybook/store@6.4.19(react-dom@17.0.2)(react@17.0.2): + resolution: {integrity: sha512-N9/ZjemRHGfT3InPIbqQqc6snkcfnf3Qh9oOr0smbfaVGJol//KOX65kzzobtzFcid0WxtTDZ3HmgFVH+GvuhQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 + react-dom: ^16.8.0 || ^17.0.0 + dependencies: + '@storybook/addons': 6.4.19(react-dom@17.0.2)(react@17.0.2) + '@storybook/client-logger': 6.4.19 + '@storybook/core-events': 6.4.19 + '@storybook/csf': 0.0.2--canary.87bc651.0 + core-js: 3.21.1 + fast-deep-equal: 3.1.3 + global: 4.4.0 + lodash: 4.17.21 + memoizerific: 1.11.3 + react: 17.0.2 + react-dom: 17.0.2(react@17.0.2) + regenerator-runtime: 0.13.9 + slash: 3.0.0 + stable: 0.1.8 + synchronous-promise: 2.0.15 + ts-dedent: 2.2.0 + util-deprecate: 1.0.2 + dev: true + + /@storybook/testing-library@0.0.9(react-dom@17.0.2)(react@17.0.2): + resolution: {integrity: sha512-X4/Tk7RryB0tZ/9NLUHYTBXW01zRpf6+IhdhqsVl6WOWRyUaIv3zEhr43gQyZhBe4ZZyt5d90FJC9qWmY1oFKg==} + dependencies: + '@storybook/client-logger': 6.4.19 + '@storybook/instrumenter': 6.4.19(react-dom@17.0.2)(react@17.0.2) + '@testing-library/dom': 8.11.3 + '@testing-library/user-event': 13.5.0(@testing-library/dom@8.11.3) + ts-dedent: 2.2.0 + transitivePeerDependencies: + - react + - react-dom + dev: true + + /@storybook/theming@6.4.19(react-dom@17.0.2)(react@17.0.2): + resolution: {integrity: sha512-V4pWmTvAxmbHR6B3jA4hPkaxZPyExHvCToy7b76DpUTpuHihijNDMAn85KhOQYIeL9q14zP/aiz899tOHsOidg==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 + react-dom: ^16.8.0 || ^17.0.0 + dependencies: + '@emotion/core': 10.3.1(react@17.0.2) + '@emotion/is-prop-valid': 0.8.8 + '@emotion/styled': 10.3.0(@emotion/core@10.3.1)(react@17.0.2) + '@storybook/client-logger': 6.4.19 + core-js: 3.21.1 + deep-object-diff: 1.1.9 + emotion-theming: 10.3.0(@emotion/core@10.3.1)(react@17.0.2) + global: 4.4.0 + memoizerific: 1.11.3 + polished: 4.1.4 + react: 17.0.2 + react-dom: 17.0.2(react@17.0.2) + resolve-from: 5.0.0 + ts-dedent: 2.2.0 + dev: true + + /@storybook/ui@6.4.19(@types/react@17.0.39)(react-dom@17.0.2)(react@17.0.2): + resolution: {integrity: sha512-gFwdn5LA2U6oQ4bfUFLyHZnNasGQ01YVdwjbi+l6yjmnckBNtZfJoVTZ1rzGUbxSE9rK48InJRU+latTsr7xAg==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 + react-dom: ^16.8.0 || ^17.0.0 + dependencies: + '@emotion/core': 10.3.1(react@17.0.2) + '@storybook/addons': 6.4.19(react-dom@17.0.2)(react@17.0.2) + '@storybook/api': 6.4.19(react-dom@17.0.2)(react@17.0.2) + '@storybook/channels': 6.4.19 + '@storybook/client-logger': 6.4.19 + '@storybook/components': 6.4.19(@types/react@17.0.39)(react-dom@17.0.2)(react@17.0.2) + '@storybook/core-events': 6.4.19 + '@storybook/router': 6.4.19(react-dom@17.0.2)(react@17.0.2) + '@storybook/semver': 7.3.2 + '@storybook/theming': 6.4.19(react-dom@17.0.2)(react@17.0.2) + copy-to-clipboard: 3.3.1 + core-js: 3.21.1 + core-js-pure: 3.21.1 + downshift: 6.1.7(react@17.0.2) + emotion-theming: 10.3.0(@emotion/core@10.3.1)(react@17.0.2) + fuse.js: 3.6.1 + global: 4.4.0 + lodash: 4.17.21 + markdown-to-jsx: 7.1.6(react@17.0.2) + memoizerific: 1.11.3 + polished: 4.1.4 + qs: 6.10.3 + react: 17.0.2 + react-dom: 17.0.2(react@17.0.2) + react-draggable: 4.4.4(react-dom@17.0.2)(react@17.0.2) + react-helmet-async: 1.2.3(react-dom@17.0.2)(react@17.0.2) + react-sizeme: 3.0.2 + regenerator-runtime: 0.13.9 + resolve-from: 5.0.0 + store2: 2.13.1 + transitivePeerDependencies: + - '@types/react' + dev: true + + /@swc/helpers@0.4.11: + resolution: {integrity: sha512-rEUrBSGIoSFuYxwBYtlUFMlE2CwGhmW+w9355/5oduSw8e5h2+Tj4UrAGNNgP9915++wj5vkQo0UuOBqOAq4nw==} + dependencies: + tslib: 2.6.2 + + /@testing-library/dom@8.11.3: + resolution: {integrity: sha512-9LId28I+lx70wUiZjLvi1DB/WT2zGOxUh46glrSNMaWVx849kKAluezVzZrXJfTKKoQTmEOutLes/bHg4Bj3aA==} + engines: {node: '>=12'} + dependencies: + '@babel/code-frame': 7.22.13 + '@babel/runtime': 7.17.2 + '@types/aria-query': 4.2.2 + aria-query: 5.0.0 + chalk: 4.1.2 + dom-accessibility-api: 0.5.13 + lz-string: 1.4.4 + pretty-format: 27.5.1 + dev: true + + /@testing-library/user-event@13.5.0(@testing-library/dom@8.11.3): + resolution: {integrity: sha512-5Kwtbo3Y/NowpkbRuSepbyMFkZmHgD+vPzYB/RJ4oxt5Gj/avFFBYjhw27cqSVPVw/3a67NK1PbiIr9k4Gwmdg==} + engines: {node: '>=10', npm: '>=6'} + peerDependencies: + '@testing-library/dom': '>=7.21.4' + dependencies: + '@babel/runtime': 7.17.2 + '@testing-library/dom': 8.11.3 + dev: true + + /@tootallnate/once@1.1.2: + resolution: {integrity: sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==} + engines: {node: '>= 6'} + dev: false + + /@tsconfig/node10@1.0.8: + resolution: {integrity: sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg==} + dev: false + + /@tsconfig/node12@1.0.9: + resolution: {integrity: sha512-/yBMcem+fbvhSREH+s14YJi18sp7J9jpuhYByADT2rypfajMZZN4WQ6zBGgBKp53NKmqI36wFYDb3yaMPurITw==} + dev: false + + /@tsconfig/node14@1.0.1: + resolution: {integrity: sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg==} + dev: false + + /@tsconfig/node16@1.0.2: + resolution: {integrity: sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA==} + dev: false + + /@types/acorn@4.0.6: + resolution: {integrity: sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ==} + dependencies: + '@types/estree': 0.0.51 + dev: false + + /@types/aria-query@4.2.2: + resolution: {integrity: sha512-HnYpAE1Y6kRyKM/XkEuiRQhTHvkzMBurTHnpFLYLBGPIylZNPs9jJcuOOYWxPLJCSEtmZT0Y8rHDokKN7rRTig==} + dev: true + + /@types/color-convert@2.0.0: + resolution: {integrity: sha512-m7GG7IKKGuJUXvkZ1qqG3ChccdIM/qBBo913z+Xft0nKCX4hAU/IxKwZBU4cpRZ7GS5kV4vOblUkILtSShCPXQ==} + dependencies: + '@types/color-name': 1.1.1 + dev: true + + /@types/color-name@1.1.1: + resolution: {integrity: sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==} + dev: true + + /@types/debug@4.1.7: + resolution: {integrity: sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg==} + dependencies: + '@types/ms': 0.7.31 + dev: false + + /@types/estree-jsx@0.0.1: + resolution: {integrity: sha512-gcLAYiMfQklDCPjQegGn0TBAn9it05ISEsEhlKQUddIk7o2XDokOcTN7HBO8tznM0D9dGezvHEfRZBfZf6me0A==} + dependencies: + '@types/estree': 0.0.51 + dev: false + + /@types/estree@0.0.46: + resolution: {integrity: sha512-laIjwTQaD+5DukBZaygQ79K1Z0jb1bPEMRrkXSLjtCcZm+abyp5YbrqpSLzD42FwWW6gK/aS4NYpJ804nG2brg==} + dev: false + + /@types/estree@0.0.50: + resolution: {integrity: sha512-C6N5s2ZFtuZRj54k2/zyRhNDjJwwcViAM3Nbm8zjBpbqAdZ00mr0CFxvSKeO8Y/e03WVFLpQMdHYVfUd6SB+Hw==} + dev: false + + /@types/estree@0.0.51: + resolution: {integrity: sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==} + dev: false + + /@types/glob@7.2.0: + resolution: {integrity: sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==} + dependencies: + '@types/minimatch': 3.0.5 + '@types/node': 17.0.21 + dev: true + + /@types/glob@8.1.0: + resolution: {integrity: sha512-IO+MJPVhoqz+28h1qLAcBEH2+xHMK6MTyHJc7MTnnYb6wsoLR29POVGJ7LycmVXIqyy/4/2ShP5sUwTXuOwb/w==} + dependencies: + '@types/minimatch': 5.1.2 + '@types/node': 17.0.21 + dev: true + + /@types/graceful-fs@4.1.5: + resolution: {integrity: sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==} + dependencies: + '@types/node': 17.0.21 + dev: true + + /@types/hast@2.3.4: + resolution: {integrity: sha512-wLEm0QvaoawEDoTRwzTXp4b4jpwiJDvR5KMnFnVodm3scufTlBOWRD6N1OBf9TZMhjlNsSfcO5V+7AF4+Vy+9g==} + dependencies: + '@types/unist': 2.0.6 + + /@types/html-minifier-terser@5.1.2: + resolution: {integrity: sha512-h4lTMgMJctJybDp8CQrxTUiiYmedihHWkjnF/8Pxseu2S6Nlfcy8kwboQ8yejh456rP2yWoEVm1sS/FVsfM48w==} + dev: true + + /@types/is-function@1.0.1: + resolution: {integrity: sha512-A79HEEiwXTFtfY+Bcbo58M2GRYzCr9itHWzbzHVFNEYCcoU/MMGwYYf721gBrnhpj1s6RGVVha/IgNFnR0Iw/Q==} + dev: true + + /@types/istanbul-lib-coverage@2.0.4: + resolution: {integrity: sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==} + dev: true + + /@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: + resolution: {integrity: sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==} + dependencies: + '@types/istanbul-lib-report': 3.0.0 + dev: true + + /@types/js-yaml@4.0.9: + resolution: {integrity: sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==} + + /@types/json-schema@7.0.9: + resolution: {integrity: sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==} + dev: true + + /@types/json5@0.0.29: + resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} + dev: true + + /@types/mdast@3.0.10: + resolution: {integrity: sha512-W864tg/Osz1+9f4lrGTZpCSO5/z4608eUp19tbozkq2HJK6i3z1kT0H9tlADXuYIb1YYOBByU4Jsqkk75q48qA==} + dependencies: + '@types/unist': 2.0.6 + + /@types/mdurl@1.0.2: + resolution: {integrity: sha512-eC4U9MlIcu2q0KQmXszyn5Akca/0jrQmwDRgpAMJai7qBWq4amIQhZyNau4VYGtCeALvW1/NtjzJJ567aZxfKA==} + dev: false + + /@types/mdx-js__react@1.5.5: + resolution: {integrity: sha512-k8pnaP6JXVlQh18HgL5X6sYFNC/qZnzO7R2+HsmwrwUd+JnnsU0d9lyyT0RQrHg1anxDU36S98TI/fsGtmYqqg==} + dependencies: + '@types/react': 18.0.5 + dev: true + + /@types/mdx@2.0.1: + resolution: {integrity: sha512-JPEv4iAl0I+o7g8yVWDwk30es8mfVrjkvh5UeVR2sYPpZCK44vrAPsbJpIS+rJAUxLgaSAMKTEH5Vn5qd9XsrQ==} + dev: false + + /@types/minimatch@3.0.5: + resolution: {integrity: sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==} + dev: true + + /@types/minimatch@5.1.2: + resolution: {integrity: sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==} + dev: true + + /@types/ms@0.7.31: + resolution: {integrity: sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==} + dev: false + + /@types/node-fetch@2.6.1: + resolution: {integrity: sha512-oMqjURCaxoSIsHSr1E47QHzbmzNR5rK8McHuNb11BOM9cHcIK3Avy0s/b2JlXHoQGTYS3NsvWzV1M0iK7l0wbA==} + dependencies: + '@types/node': 17.0.21 + form-data: 3.0.1 + dev: true + + /@types/node@14.18.12: + resolution: {integrity: sha512-q4jlIR71hUpWTnGhXWcakgkZeHa3CCjcQcnuzU8M891BAWA2jHiziiWEPEkdS5pFsz7H9HJiy8BrK7tBRNrY7A==} + dev: true + + /@types/node@17.0.21: + resolution: {integrity: sha512-DBZCJbhII3r90XbQxI8Y9IjjiiOGlZ0Hr32omXIZvwwZ7p4DMMXGrKXVyPfuoBOri9XNtL0UK69jYIBIsRX3QQ==} + + /@types/node@17.0.34: + resolution: {integrity: sha512-XImEz7XwTvDBtzlTnm8YvMqGW/ErMWBsKZ+hMTvnDIjGCKxwK5Xpc+c/oQjOauwq8M4OS11hEkpjX8rrI/eEgA==} + dev: false + + /@types/normalize-package-data@2.4.1: + resolution: {integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==} + dev: true + + /@types/npmlog@4.1.4: + resolution: {integrity: sha512-WKG4gTr8przEZBiJ5r3s8ZIAoMXNbOgQ+j/d5O4X3x6kZJRLNvyUJuUK/KoG3+8BaOHPhp2m7WC6JKKeovDSzQ==} + dev: true + + /@types/overlayscrollbars@1.12.1: + resolution: {integrity: sha512-V25YHbSoKQN35UasHf0EKD9U2vcmexRSp78qa8UglxFH8H3D+adEa9zGZwrqpH4TdvqeMrgMqVqsLB4woAryrQ==} + dev: true + + /@types/parse-json@4.0.0: + resolution: {integrity: sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==} + dev: true + + /@types/parse5@5.0.3: + resolution: {integrity: sha512-kUNnecmtkunAoQ3CnjmMkzNU/gtxG8guhi+Fk2U/kOpIKjIMKnXGp4IJCgQJrXSgMsWYimYG4TGjz/UzbGEBTw==} + + /@types/pretty-hrtime@1.0.1: + resolution: {integrity: sha512-VjID5MJb1eGKthz2qUerWT8+R4b9N+CHvGCzg9fn4kWZgaF9AhdYikQio3R7wV8YY1NsQKPaCwKz1Yff+aHNUQ==} + dev: true + + /@types/prismjs@1.26.0: + resolution: {integrity: sha512-ZTaqn/qSqUuAq1YwvOFQfVW1AR/oQJlLSZVustdjwI+GZ8kr0MSHBj0tsXPW1EqHubx50gtBEjbPGsdZwQwCjQ==} + dev: false + + /@types/prop-types@15.7.4: + resolution: {integrity: sha512-rZ5drC/jWjrArrS8BR6SIr4cWpW09RNTYt9AMZo3Jwwif+iacXAqgVjm0B0Bv/S1jhDXKHqRVNCbACkJ89RAnQ==} + + /@types/qs@6.9.7: + resolution: {integrity: sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==} + dev: true + + /@types/react-syntax-highlighter@11.0.5: + resolution: {integrity: sha512-VIOi9i2Oj5XsmWWoB72p3KlZoEbdRAcechJa8Ztebw7bDl2YmR+odxIqhtJGp1q2EozHs02US+gzxJ9nuf56qg==} + dependencies: + '@types/react': 18.0.5 + dev: true + + /@types/react@17.0.39: + resolution: {integrity: sha512-UVavlfAxDd/AgAacMa60Azl7ygyQNRwC/DsHZmKgNvPmRR5p70AJ5Q9EAmL2NWOJmeV+vVUI4IAP7GZrN8h8Ug==} + dependencies: + '@types/prop-types': 15.7.4 + '@types/scheduler': 0.16.2 + csstype: 3.0.10 + + /@types/react@18.0.5: + resolution: {integrity: sha512-UPxNGInDCIKlfqBrm8LDXYWNfLHwIdisWcsH5GpMyGjhEDLFgTtlRBaoWuCua9HcyuE0rMkmAeZ3FXV1pYLIYQ==} + dependencies: + '@types/prop-types': 15.7.4 + '@types/scheduler': 0.16.2 + csstype: 3.0.10 + + /@types/remark-prism@1.3.3: + resolution: {integrity: sha512-SWe7SENZm0CQaxFhU21LZswtYwivUkNx2+sWgm8XWUSc0DK5c7DSEU7YHqiDg4ytuf1HYdEvMCck3B6M8Zu/Vw==} + dependencies: + remark: 12.0.1 + unified: 9.2.2 + dev: true + + /@types/scheduler@0.16.2: + resolution: {integrity: sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==} + + /@types/semver@7.5.0: + resolution: {integrity: sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==} + dev: true + + /@types/source-list-map@0.1.2: + resolution: {integrity: sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA==} + dev: true + + /@types/tapable@1.0.8: + resolution: {integrity: sha512-ipixuVrh2OdNmauvtT51o3d8z12p6LtFW9in7U79der/kwejjdNchQC5UMn5u/KxNoM7VHHOs/l8KS8uHxhODQ==} + dev: true + + /@types/uglify-js@3.13.1: + resolution: {integrity: sha512-O3MmRAk6ZuAKa9CHgg0Pr0+lUOqoMLpc9AS4R8ano2auvsg7IE8syF3Xh/NPr26TWklxYcqoEEFdzLLs1fV9PQ==} + dependencies: + source-map: 0.6.1 + dev: true + + /@types/unist@2.0.6: + resolution: {integrity: sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==} + + /@types/webpack-env@1.16.3: + resolution: {integrity: sha512-9gtOPPkfyNoEqCQgx4qJKkuNm/x0R2hKR7fdl7zvTJyHnIisuE/LfvXOsYWL0o3qq6uiBnKZNNNzi3l0y/X+xw==} + dev: true + + /@types/webpack-sources@3.2.0: + resolution: {integrity: sha512-Ft7YH3lEVRQ6ls8k4Ff1oB4jN6oy/XmU6tQISKdhfh+1mR+viZFphS6WL0IrtDOzvefmJg5a0s7ZQoRXwqTEFg==} + dependencies: + '@types/node': 17.0.21 + '@types/source-list-map': 0.1.2 + source-map: 0.7.3 + dev: true + + /@types/webpack@4.41.32: + resolution: {integrity: sha512-cb+0ioil/7oz5//7tZUSwbrSAN/NWHrQylz5cW8G0dWTcF/g+/dSdMlKVZspBYuMAN1+WnwHrkxiRrLcwd0Heg==} + dependencies: + '@types/node': 17.0.21 + '@types/tapable': 1.0.8 + '@types/uglify-js': 3.13.1 + '@types/webpack-sources': 3.2.0 + anymatch: 3.1.2 + source-map: 0.6.1 + dev: true + + /@types/yargs-parser@21.0.0: + resolution: {integrity: sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==} + dev: true + + /@types/yargs@15.0.14: + resolution: {integrity: sha512-yEJzHoxf6SyQGhBhIYGXQDSCkJjB6HohDShto7m8vaKg9Yp0Yn8+71J9eakh2bnPg6BfsH9PRMhiRTZnd4eXGQ==} + dependencies: + '@types/yargs-parser': 21.0.0 + dev: true + + /@types/yargs@16.0.4: + resolution: {integrity: sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw==} + dependencies: + '@types/yargs-parser': 21.0.0 + dev: true + + /@typescript-eslint/eslint-plugin@5.61.0(@typescript-eslint/parser@5.61.0)(eslint@8.10.0)(typescript@4.5.5): + resolution: {integrity: sha512-A5l/eUAug103qtkwccSCxn8ZRwT+7RXWkFECdA4Cvl1dOlDUgTpAOfSEElZn2uSUxhdDpnCdetrf0jvU4qrL+g==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + '@typescript-eslint/parser': ^5.0.0 + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@eslint-community/regexpp': 4.5.1 + '@typescript-eslint/parser': 5.61.0(eslint@8.10.0)(typescript@4.5.5) + '@typescript-eslint/scope-manager': 5.61.0 + '@typescript-eslint/type-utils': 5.61.0(eslint@8.10.0)(typescript@4.5.5) + '@typescript-eslint/utils': 5.61.0(eslint@8.10.0)(typescript@4.5.5) + debug: 4.3.4 + eslint: 8.10.0 + graphemer: 1.4.0 + ignore: 5.2.0 + natural-compare-lite: 1.4.0 + semver: 7.5.4 + tsutils: 3.21.0(typescript@4.5.5) + typescript: 4.5.5 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/experimental-utils@5.13.0(eslint@8.10.0)(typescript@4.5.5): + resolution: {integrity: sha512-A0btJxjB9gH6yJsARONe5xd0ykgj1+0fO1TRWoUBn2hT3haWiZeh4f1FILKW0z/9OBchT5zCOz3hiJfRK/vumA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + '@typescript-eslint/utils': 5.13.0(eslint@8.10.0)(typescript@4.5.5) + eslint: 8.10.0 + transitivePeerDependencies: + - supports-color + - typescript + dev: true + + /@typescript-eslint/parser@5.61.0(eslint@8.10.0)(typescript@4.5.5): + resolution: {integrity: sha512-yGr4Sgyh8uO6fSi9hw3jAFXNBHbCtKKFMdX2IkT3ZqpKmtAq3lHS4ixB/COFuAIJpwl9/AqF7j72ZDWYKmIfvg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/scope-manager': 5.61.0 + '@typescript-eslint/types': 5.61.0 + '@typescript-eslint/typescript-estree': 5.61.0(typescript@4.5.5) + debug: 4.3.4 + eslint: 8.10.0 + typescript: 4.5.5 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/scope-manager@5.13.0: + resolution: {integrity: sha512-T4N8UvKYDSfVYdmJq7g2IPJYCRzwtp74KyDZytkR4OL3NRupvswvmJQJ4CX5tDSurW2cvCc1Ia1qM7d0jpa7IA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + '@typescript-eslint/types': 5.13.0 + '@typescript-eslint/visitor-keys': 5.13.0 + dev: true + + /@typescript-eslint/scope-manager@5.61.0: + resolution: {integrity: sha512-W8VoMjoSg7f7nqAROEmTt6LoBpn81AegP7uKhhW5KzYlehs8VV0ZW0fIDVbcZRcaP3aPSW+JZFua+ysQN+m/Nw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + '@typescript-eslint/types': 5.61.0 + '@typescript-eslint/visitor-keys': 5.61.0 + dev: true + + /@typescript-eslint/type-utils@5.61.0(eslint@8.10.0)(typescript@4.5.5): + resolution: {integrity: sha512-kk8u//r+oVK2Aj3ph/26XdH0pbAkC2RiSjUYhKD+PExemG4XSjpGFeyZ/QM8lBOa7O8aGOU+/yEbMJgQv/DnCg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: '*' + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/typescript-estree': 5.61.0(typescript@4.5.5) + '@typescript-eslint/utils': 5.61.0(eslint@8.10.0)(typescript@4.5.5) + debug: 4.3.4 + eslint: 8.10.0 + tsutils: 3.21.0(typescript@4.5.5) + typescript: 4.5.5 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/types@5.13.0: + resolution: {integrity: sha512-LmE/KO6DUy0nFY/OoQU0XelnmDt+V8lPQhh8MOVa7Y5k2gGRd6U9Kp3wAjhB4OHg57tUO0nOnwYQhRRyEAyOyg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + + /@typescript-eslint/types@5.61.0: + resolution: {integrity: sha512-ldyueo58KjngXpzloHUog/h9REmHl59G1b3a5Sng1GfBo14BkS3ZbMEb3693gnP1k//97lh7bKsp6/V/0v1veQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + + /@typescript-eslint/typescript-estree@5.13.0(typescript@4.5.5): + resolution: {integrity: sha512-Q9cQow0DeLjnp5DuEDjLZ6JIkwGx3oYZe+BfcNuw/POhtpcxMTy18Icl6BJqTSd+3ftsrfuVb7mNHRZf7xiaNA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/types': 5.13.0 + '@typescript-eslint/visitor-keys': 5.13.0 + debug: 4.3.4 + globby: 11.1.0 + is-glob: 4.0.3 + semver: 7.5.4 + tsutils: 3.21.0(typescript@4.5.5) + typescript: 4.5.5 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/typescript-estree@5.61.0(typescript@4.5.5): + resolution: {integrity: sha512-Fud90PxONnnLZ36oR5ClJBLTLfU4pIWBmnvGwTbEa2cXIqj70AEDEmOmpkFComjBZ/037ueKrOdHuYmSFVD7Rw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/types': 5.61.0 + '@typescript-eslint/visitor-keys': 5.61.0 + debug: 4.3.4 + globby: 11.1.0 + is-glob: 4.0.3 + semver: 7.5.4 + tsutils: 3.21.0(typescript@4.5.5) + typescript: 4.5.5 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/utils@5.13.0(eslint@8.10.0)(typescript@4.5.5): + resolution: {integrity: sha512-+9oHlPWYNl6AwwoEt5TQryEHwiKRVjz7Vk6kaBeD3/kwHE5YqTGHtm/JZY8Bo9ITOeKutFaXnBlMgSATMJALUQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + '@types/json-schema': 7.0.9 + '@typescript-eslint/scope-manager': 5.13.0 + '@typescript-eslint/types': 5.13.0 + '@typescript-eslint/typescript-estree': 5.13.0(typescript@4.5.5) + eslint: 8.10.0 + eslint-scope: 5.1.1 + eslint-utils: 3.0.0(eslint@8.10.0) + transitivePeerDependencies: + - supports-color + - typescript + dev: true + + /@typescript-eslint/utils@5.61.0(eslint@8.10.0)(typescript@4.5.5): + resolution: {integrity: sha512-mV6O+6VgQmVE6+xzlA91xifndPW9ElFW8vbSF0xCT/czPXVhwDewKila1jOyRwa9AE19zKnrr7Cg5S3pJVrTWQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.10.0) + '@types/json-schema': 7.0.9 + '@types/semver': 7.5.0 + '@typescript-eslint/scope-manager': 5.61.0 + '@typescript-eslint/types': 5.61.0 + '@typescript-eslint/typescript-estree': 5.61.0(typescript@4.5.5) + eslint: 8.10.0 + eslint-scope: 5.1.1 + semver: 7.5.4 + transitivePeerDependencies: + - supports-color + - typescript + dev: true + + /@typescript-eslint/visitor-keys@5.13.0: + resolution: {integrity: sha512-HLKEAS/qA1V7d9EzcpLFykTePmOQqOFim8oCvhY3pZgQ8Hi38hYpHd9e5GN6nQBFQNecNhws5wkS9Y5XIO0s/g==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + '@typescript-eslint/types': 5.13.0 + eslint-visitor-keys: 3.3.0 + dev: true + + /@typescript-eslint/visitor-keys@5.61.0: + resolution: {integrity: sha512-50XQ5VdbWrX06mQXhy93WywSFZZGsv3EOjq+lqp6WC2t+j3mb6A9xYVdrRxafvK88vg9k9u+CT4l6D8PEatjKg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + '@typescript-eslint/types': 5.61.0 + eslint-visitor-keys: 3.3.0 + dev: true + + /@usulpro/react-json-view@2.0.1(react-dom@17.0.2)(react@17.0.2): + resolution: {integrity: sha512-X8Ik4JmZF2Cu7vZTJQwHIbDqNaJEUEGZmdAPxKe4Ed+Xa3dyVTAeA9ea/nTNCzKRTZBIxvJFXvibpglpJ136BA==} + peerDependencies: + react: ^16.0.0 || ^15.5.4 + react-dom: ^16.0.0 || ^15.5.4 + dependencies: + color-string: 1.9.0 + flux: 4.0.3(react@17.0.2) + react: 17.0.2 + react-base16-styling: 0.6.0 + react-dom: 17.0.2(react@17.0.2) + react-lifecycles-compat: 3.0.4 + react-textarea-autosize: 6.1.0(react@17.0.2) + transitivePeerDependencies: + - encoding + dev: true + + /@webassemblyjs/ast@1.9.0: + resolution: {integrity: sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==} + dependencies: + '@webassemblyjs/helper-module-context': 1.9.0 + '@webassemblyjs/helper-wasm-bytecode': 1.9.0 + '@webassemblyjs/wast-parser': 1.9.0 + dev: true + + /@webassemblyjs/floating-point-hex-parser@1.9.0: + resolution: {integrity: sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==} + dev: true + + /@webassemblyjs/helper-api-error@1.9.0: + resolution: {integrity: sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==} + dev: true + + /@webassemblyjs/helper-buffer@1.9.0: + resolution: {integrity: sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==} + dev: true + + /@webassemblyjs/helper-code-frame@1.9.0: + resolution: {integrity: sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==} + dependencies: + '@webassemblyjs/wast-printer': 1.9.0 + dev: true + + /@webassemblyjs/helper-fsm@1.9.0: + resolution: {integrity: sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==} + dev: true + + /@webassemblyjs/helper-module-context@1.9.0: + resolution: {integrity: sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==} + dependencies: + '@webassemblyjs/ast': 1.9.0 + dev: true + + /@webassemblyjs/helper-wasm-bytecode@1.9.0: + resolution: {integrity: sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==} + dev: true + + /@webassemblyjs/helper-wasm-section@1.9.0: + resolution: {integrity: sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==} + dependencies: + '@webassemblyjs/ast': 1.9.0 + '@webassemblyjs/helper-buffer': 1.9.0 + '@webassemblyjs/helper-wasm-bytecode': 1.9.0 + '@webassemblyjs/wasm-gen': 1.9.0 + dev: true + + /@webassemblyjs/ieee754@1.9.0: + resolution: {integrity: sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==} + dependencies: + '@xtuc/ieee754': 1.2.0 + dev: true + + /@webassemblyjs/leb128@1.9.0: + resolution: {integrity: sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==} + dependencies: + '@xtuc/long': 4.2.2 + dev: true + + /@webassemblyjs/utf8@1.9.0: + resolution: {integrity: sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==} + dev: true + + /@webassemblyjs/wasm-edit@1.9.0: + resolution: {integrity: sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==} + dependencies: + '@webassemblyjs/ast': 1.9.0 + '@webassemblyjs/helper-buffer': 1.9.0 + '@webassemblyjs/helper-wasm-bytecode': 1.9.0 + '@webassemblyjs/helper-wasm-section': 1.9.0 + '@webassemblyjs/wasm-gen': 1.9.0 + '@webassemblyjs/wasm-opt': 1.9.0 + '@webassemblyjs/wasm-parser': 1.9.0 + '@webassemblyjs/wast-printer': 1.9.0 + dev: true + + /@webassemblyjs/wasm-gen@1.9.0: + resolution: {integrity: sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==} + dependencies: + '@webassemblyjs/ast': 1.9.0 + '@webassemblyjs/helper-wasm-bytecode': 1.9.0 + '@webassemblyjs/ieee754': 1.9.0 + '@webassemblyjs/leb128': 1.9.0 + '@webassemblyjs/utf8': 1.9.0 + dev: true + + /@webassemblyjs/wasm-opt@1.9.0: + resolution: {integrity: sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==} + dependencies: + '@webassemblyjs/ast': 1.9.0 + '@webassemblyjs/helper-buffer': 1.9.0 + '@webassemblyjs/wasm-gen': 1.9.0 + '@webassemblyjs/wasm-parser': 1.9.0 + dev: true + + /@webassemblyjs/wasm-parser@1.9.0: + resolution: {integrity: sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==} + dependencies: + '@webassemblyjs/ast': 1.9.0 + '@webassemblyjs/helper-api-error': 1.9.0 + '@webassemblyjs/helper-wasm-bytecode': 1.9.0 + '@webassemblyjs/ieee754': 1.9.0 + '@webassemblyjs/leb128': 1.9.0 + '@webassemblyjs/utf8': 1.9.0 + dev: true + + /@webassemblyjs/wast-parser@1.9.0: + resolution: {integrity: sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw==} + dependencies: + '@webassemblyjs/ast': 1.9.0 + '@webassemblyjs/floating-point-hex-parser': 1.9.0 + '@webassemblyjs/helper-api-error': 1.9.0 + '@webassemblyjs/helper-code-frame': 1.9.0 + '@webassemblyjs/helper-fsm': 1.9.0 + '@xtuc/long': 4.2.2 + dev: true + + /@webassemblyjs/wast-printer@1.9.0: + resolution: {integrity: sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==} + dependencies: + '@webassemblyjs/ast': 1.9.0 + '@webassemblyjs/wast-parser': 1.9.0 + '@xtuc/long': 4.2.2 + dev: true + + /@xtuc/ieee754@1.2.0: + resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} + dev: true + + /@xtuc/long@4.2.2: + resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} + dev: true + + /abab@2.0.6: + resolution: {integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==} + dev: false + + /accepts@1.3.8: + resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} + engines: {node: '>= 0.6'} + dependencies: + mime-types: 2.1.34 + negotiator: 0.6.3 + dev: true + + /acorn-globals@6.0.0: + resolution: {integrity: sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==} + dependencies: + acorn: 7.4.1 + acorn-walk: 7.2.0 + dev: false + + /acorn-jsx@5.3.2(acorn@7.4.1): + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + acorn: 7.4.1 + dev: true + + /acorn-jsx@5.3.2(acorn@8.7.1): + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + acorn: 8.7.1 + + /acorn-walk@7.2.0: + resolution: {integrity: sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==} + engines: {node: '>=0.4.0'} + + /acorn-walk@8.2.0: + resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} + engines: {node: '>=0.4.0'} + + /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: + resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==} + engines: {node: '>=0.4.0'} + hasBin: true + + /acorn@8.7.1: + resolution: {integrity: sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==} + engines: {node: '>=0.4.0'} + hasBin: true + + /address@1.1.2: + resolution: {integrity: sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA==} + engines: {node: '>= 0.12.0'} + dev: true + + /agent-base@6.0.2: + resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} + engines: {node: '>= 6.0.0'} + dependencies: + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + dev: false + + /aggregate-error@3.1.0: + resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} + engines: {node: '>=8'} + dependencies: + clean-stack: 2.2.0 + indent-string: 4.0.0 + dev: true + + /airbnb-js-shims@2.2.1: + resolution: {integrity: sha512-wJNXPH66U2xjgo1Zwyjf9EydvJ2Si94+vSdk6EERcBfB2VZkeltpqIats0cqIZMLCXP3zcyaUKGYQeIBT6XjsQ==} + dependencies: + array-includes: 3.1.4 + array.prototype.flat: 1.2.5 + array.prototype.flatmap: 1.2.5 + es5-shim: 4.6.5 + es6-shim: 0.35.6 + function.prototype.name: 1.1.5 + globalthis: 1.0.2 + object.entries: 1.1.5 + object.fromentries: 2.0.5 + object.getownpropertydescriptors: 2.1.3 + object.values: 1.1.5 + promise.allsettled: 1.0.5 + promise.prototype.finally: 3.1.3 + string.prototype.matchall: 4.0.6 + string.prototype.padend: 3.1.3 + string.prototype.padstart: 3.1.3 + symbol.prototype.description: 1.0.5 + dev: true + + /ajv-errors@1.0.1(ajv@6.12.6): + resolution: {integrity: sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==} + peerDependencies: + ajv: '>=5.0.0' + dependencies: + ajv: 6.12.6 + dev: true + + /ajv-keywords@3.5.2(ajv@6.12.6): + resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} + peerDependencies: + ajv: ^6.9.1 + dependencies: + ajv: 6.12.6 + dev: true + + /ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + dev: true + + /algoliasearch@4.13.0: + resolution: {integrity: sha512-oHv4faI1Vl2s+YC0YquwkK/TsaJs79g2JFg5FDm2rKN12VItPTAeQ7hyJMHarOPPYuCnNC5kixbtcqvb21wchw==} + dependencies: + '@algolia/cache-browser-local-storage': 4.13.0 + '@algolia/cache-common': 4.13.0 + '@algolia/cache-in-memory': 4.13.0 + '@algolia/client-account': 4.13.0 + '@algolia/client-analytics': 4.13.0 + '@algolia/client-common': 4.13.0 + '@algolia/client-personalization': 4.13.0 + '@algolia/client-search': 4.13.0 + '@algolia/logger-common': 4.13.0 + '@algolia/logger-console': 4.13.0 + '@algolia/requester-browser-xhr': 4.13.0 + '@algolia/requester-common': 4.13.0 + '@algolia/requester-node-http': 4.13.0 + '@algolia/transporter': 4.13.0 + dev: false + + /ansi-align@3.0.1: + resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} + dependencies: + string-width: 4.2.3 + dev: true + + /ansi-colors@3.2.4: + resolution: {integrity: sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==} + engines: {node: '>=6'} + dev: true + + /ansi-html-community@0.0.8: + resolution: {integrity: sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==} + engines: {'0': node >= 0.8.0} + hasBin: true + dev: true + + /ansi-regex@2.1.1: + resolution: {integrity: sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==} + engines: {node: '>=0.10.0'} + dev: true + + /ansi-regex@4.1.0: + resolution: {integrity: sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==} + engines: {node: '>=6'} + dev: false + + /ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + dev: true + + /ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + dependencies: + color-convert: 1.9.3 + + /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: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} + dev: true + + /ansi-to-html@0.6.15: + resolution: {integrity: sha512-28ijx2aHJGdzbs+O5SNQF65r6rrKYnkuwTYm8lZlChuoJ9P1vVzIpWO20sQTqTPDXYp6NFwk326vApTtLVFXpQ==} + engines: {node: '>=8.0.0'} + hasBin: true + dependencies: + entities: 2.2.0 + dev: true + + /anymatch@2.0.0: + resolution: {integrity: sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==} + dependencies: + micromatch: 3.1.10 + normalize-path: 2.1.1 + transitivePeerDependencies: + - supports-color + dev: true + + /anymatch@3.1.2: + resolution: {integrity: sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==} + engines: {node: '>= 8'} + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + dev: true + + /app-root-dir@1.0.2: + resolution: {integrity: sha512-jlpIfsOoNoafl92Sz//64uQHGSyMrD2vYG5d8o2a4qGvyNCvXur7bzIsWtAC/6flI2RYAp3kv8rsfBtaLm7w0g==} + dev: true + + /aproba@1.2.0: + resolution: {integrity: sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==} + dev: true + + /aproba@2.0.0: + resolution: {integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==} + dev: true + + /are-we-there-yet@2.0.0: + resolution: {integrity: sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==} + engines: {node: '>=10'} + dependencies: + delegates: 1.0.0 + readable-stream: 3.6.2 + dev: true + + /arg@4.1.3: + resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} + dev: false + + /argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + dependencies: + sprintf-js: 1.0.3 + + /argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + /aria-query@4.2.2: + resolution: {integrity: sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA==} + engines: {node: '>=6.0'} + dependencies: + '@babel/runtime': 7.17.2 + '@babel/runtime-corejs3': 7.17.2 + dev: true + + /aria-query@5.0.0: + resolution: {integrity: sha512-V+SM7AbUwJ+EBnB8+DXs0hPZHO0W6pqBcc0dW90OwtVG02PswOu/teuARoLQjdDOH+t9pJgGnW5/Qmouf3gPJg==} + engines: {node: '>=6.0'} + dev: true + + /arr-diff@4.0.0: + resolution: {integrity: sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==} + engines: {node: '>=0.10.0'} + dev: true + + /arr-flatten@1.1.0: + resolution: {integrity: sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==} + engines: {node: '>=0.10.0'} + dev: true + + /arr-union@3.1.0: + resolution: {integrity: sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==} + engines: {node: '>=0.10.0'} + dev: true + + /array-flatten@1.1.1: + resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} + dev: true + + /array-includes@3.1.4: + resolution: {integrity: sha512-ZTNSQkmWumEbiHO2GF4GmWxYVTiQyJy2XOTa15sdQSrvKn7l+180egQMqlrMOUMCyLMD7pmyQe4mMDUT6Behrw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.1.3 + es-abstract: 1.19.1 + get-intrinsic: 1.1.1 + is-string: 1.0.7 + dev: true + + /array-union@1.0.2: + resolution: {integrity: sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==} + engines: {node: '>=0.10.0'} + dependencies: + array-uniq: 1.0.3 + dev: true + + /array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + dev: true + + /array-uniq@1.0.3: + resolution: {integrity: sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==} + engines: {node: '>=0.10.0'} + dev: true + + /array-unique@0.3.2: + resolution: {integrity: sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==} + engines: {node: '>=0.10.0'} + dev: true + + /array.prototype.flat@1.2.5: + resolution: {integrity: sha512-KaYU+S+ndVqyUnignHftkwc58o3uVU1jzczILJ1tN2YaIZpFIKBiP/x/j97E5MVPsaCloPbqWLB/8qCTVvT2qg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.1.3 + es-abstract: 1.19.1 + dev: true + + /array.prototype.flatmap@1.2.5: + resolution: {integrity: sha512-08u6rVyi1Lj7oqWbS9nUxliETrtIROT4XGTA4D/LWGten6E3ocm7cy9SIrmNHOL5XVbVuckUp3X6Xyg8/zpvHA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.1.3 + es-abstract: 1.19.1 + dev: true + + /array.prototype.map@1.0.4: + resolution: {integrity: sha512-Qds9QnX7A0qISY7JT5WuJO0NJPE9CMlC6JzHQfhpqAAQQzufVRoeH7EzUY5GcPTx72voG8LV/5eo+b8Qi8hmhA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.1.3 + es-abstract: 1.19.1 + es-array-method-boxes-properly: 1.0.0 + is-string: 1.0.7 + dev: true + + /arrify@2.0.1: + resolution: {integrity: sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==} + engines: {node: '>=8'} + dev: true + + /asap@2.0.6: + resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} + dev: true + + /asn1.js@5.4.1: + resolution: {integrity: sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==} + dependencies: + bn.js: 4.12.0 + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + safer-buffer: 2.1.2 + dev: true + + /assert@1.5.0: + resolution: {integrity: sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==} + dependencies: + object-assign: 4.1.1 + util: 0.10.3 + dev: true + + /assign-symbols@1.0.0: + resolution: {integrity: sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==} + engines: {node: '>=0.10.0'} + dev: true + + /ast-types-flow@0.0.7: + resolution: {integrity: sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==} + dev: true + + /ast-types@0.14.2: + resolution: {integrity: sha512-O0yuUDnZeQDL+ncNGlJ78BiO4jnYI3bvMsD5prT0/nsgijG/LpNBIr63gTjVTNsiGkgQhiyCShTgxt8oXOrklA==} + engines: {node: '>=4'} + dependencies: + tslib: 2.3.1 + dev: true + + /astring@1.8.1: + resolution: {integrity: sha512-Aj3mbwVzj7Vve4I/v2JYOPFkCGM2YS7OqQTNSxmUR+LECRpokuPgAYghePgr6SALDo5bD5DlfbSaYjOzGJZOLQ==} + hasBin: true + dev: false + + /async-each@1.0.3: + resolution: {integrity: sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==} + requiresBuild: true + dev: true + optional: true + + /asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + + /at-least-node@1.0.0: + resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} + engines: {node: '>= 4.0.0'} + dev: true + + /atob@2.1.2: + resolution: {integrity: sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==} + engines: {node: '>= 4.5.0'} + hasBin: true + dev: true + + /autoprefixer@9.8.8: + resolution: {integrity: sha512-eM9d/swFopRt5gdJ7jrpCwgvEMIayITpojhkkSMRsFHYuH5bkSQ4p/9qTEHtmNudUZh22Tehu7I6CxAW0IXTKA==} + hasBin: true + dependencies: + browserslist: 4.19.3 + caniuse-lite: 1.0.30001312 + normalize-range: 0.1.2 + num2fraction: 1.2.2 + picocolors: 0.2.1 + postcss: 7.0.39 + postcss-value-parser: 4.2.0 + dev: true + + /available-typed-arrays@1.0.5: + resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==} + engines: {node: '>= 0.4'} + dev: true + + /axe-core@4.4.1: + resolution: {integrity: sha512-gd1kmb21kwNuWr6BQz8fv6GNECPBnUasepcoLbekws23NVBLODdsClRZ+bQ8+9Uomf3Sm3+Vwn0oYG9NvwnJCw==} + engines: {node: '>=4'} + dev: true + + /axobject-query@2.2.0: + resolution: {integrity: sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA==} + dev: true + + /babel-eslint@10.1.0(eslint@8.10.0): + resolution: {integrity: sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg==} + engines: {node: '>=6'} + deprecated: babel-eslint is now @babel/eslint-parser. This package will no longer receive updates. + peerDependencies: + eslint: '>= 4.12.1' + dependencies: + '@babel/code-frame': 7.22.13 + '@babel/parser': 7.23.0 + '@babel/traverse': 7.23.2 + '@babel/types': 7.23.0 + eslint: 8.10.0 + eslint-visitor-keys: 1.3.0 + resolve: 1.22.0 + transitivePeerDependencies: + - supports-color + dev: true + + /babel-loader@8.2.3(@babel/core@7.17.5)(webpack@4.46.0): + resolution: {integrity: sha512-n4Zeta8NC3QAsuyiizu0GkmRcQ6clkV9WFUnUf1iXP//IeSKbWjofW3UHyZVwlOB4y039YQKefawyTn64Zwbuw==} + engines: {node: '>= 8.9'} + peerDependencies: + '@babel/core': ^7.0.0 + webpack: '>=2' + dependencies: + '@babel/core': 7.17.5 + find-cache-dir: 3.3.2 + loader-utils: 1.4.2 + make-dir: 3.1.0 + schema-utils: 2.7.1 + webpack: 4.46.0 + dev: true + + /babel-plugin-add-react-displayname@0.0.5: + resolution: {integrity: sha512-LY3+Y0XVDYcShHHorshrDbt4KFWL4bSeniCtl4SYZbask+Syngk1uMPCeN9+nSiZo6zX5s0RTq/J9Pnaaf/KHw==} + dev: true + + /babel-plugin-apply-mdx-type-prop@1.6.22(@babel/core@7.12.9): + resolution: {integrity: sha512-VefL+8o+F/DfK24lPZMtJctrCVOfgbqLAGZSkxwhazQv4VxPg3Za/i40fu22KR2m8eEda+IfSOlPLUSIiLcnCQ==} + peerDependencies: + '@babel/core': ^7.11.6 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-plugin-utils': 7.10.4 + '@mdx-js/util': 1.6.22 + dev: true + + /babel-plugin-dynamic-import-node@2.3.3: + resolution: {integrity: sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==} + dependencies: + object.assign: 4.1.2 + + /babel-plugin-emotion@10.2.2: + resolution: {integrity: sha512-SMSkGoqTbTyUTDeuVuPIWifPdUGkTk1Kf9BWRiXIOIcuyMfsdp2EjeiiFvOzX8NOBvEh/ypKYvUh2rkgAJMCLA==} + dependencies: + '@babel/helper-module-imports': 7.16.7 + '@emotion/hash': 0.8.0 + '@emotion/memoize': 0.7.4 + '@emotion/serialize': 0.11.16 + babel-plugin-macros: 2.8.0 + babel-plugin-syntax-jsx: 6.18.0 + convert-source-map: 1.8.0 + escape-string-regexp: 1.0.5 + find-root: 1.1.0 + source-map: 0.5.7 + dev: true + + /babel-plugin-extract-import-names@1.6.22: + resolution: {integrity: sha512-yJ9BsJaISua7d8zNT7oRG1ZLBJCIdZ4PZqmH8qa9N5AK01ifk3fnkc98AXhtzE7UkfCsEumvoQWgoYLhOnJ7jQ==} + dependencies: + '@babel/helper-plugin-utils': 7.10.4 + dev: true + + /babel-plugin-istanbul@6.1.1: + resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} + engines: {node: '>=8'} + dependencies: + '@babel/helper-plugin-utils': 7.16.7 + '@istanbuljs/load-nyc-config': 1.1.0 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-instrument: 5.1.0 + test-exclude: 6.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /babel-plugin-macros@2.8.0: + resolution: {integrity: sha512-SEP5kJpfGYqYKpBrj5XU3ahw5p5GOHJ0U5ssOSQ/WBVdwkD2Dzlce95exQTs3jOVWPPKLBN2rlEWkCK7dSmLvg==} + dependencies: + '@babel/runtime': 7.17.2 + cosmiconfig: 6.0.0 + resolve: 1.22.0 + dev: true + + /babel-plugin-macros@3.1.0: + resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==} + engines: {node: '>=10', npm: '>=6'} + dependencies: + '@babel/runtime': 7.17.2 + cosmiconfig: 7.0.1 + resolve: 1.22.0 + dev: true + + /babel-plugin-named-asset-import@0.3.8(@babel/core@7.17.5): + resolution: {integrity: sha512-WXiAc++qo7XcJ1ZnTYGtLxmBCVbddAml3CEXgWaBzNzLNoxtQ8AiGEFDMOhot9XjTCQbvP5E77Fj9Gk924f00Q==} + peerDependencies: + '@babel/core': ^7.1.0 + dependencies: + '@babel/core': 7.17.5 + dev: true + + /babel-plugin-polyfill-corejs2@0.3.1(@babel/core@7.17.5): + resolution: {integrity: sha512-v7/T6EQcNfVLfcN2X8Lulb7DjprieyLWJK/zOWH5DUYcAgex9sP3h25Q+DLsX9TloXe3y1O8l2q2Jv9q8UVB9w==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/compat-data': 7.17.0 + '@babel/core': 7.17.5 + '@babel/helper-define-polyfill-provider': 0.3.1(@babel/core@7.17.5) + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + /babel-plugin-polyfill-corejs3@0.1.7(@babel/core@7.17.5): + resolution: {integrity: sha512-u+gbS9bbPhZWEeyy1oR/YaaSpod/KDT07arZHb80aTpl8H5ZBq+uN1nN9/xtX7jQyfLdPfoqI4Rue/MQSWJquw==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.5 + '@babel/helper-define-polyfill-provider': 0.1.5(@babel/core@7.17.5) + core-js-compat: 3.21.1 + transitivePeerDependencies: + - supports-color + dev: true + + /babel-plugin-polyfill-corejs3@0.5.2(@babel/core@7.17.5): + resolution: {integrity: sha512-G3uJih0XWiID451fpeFaYGVuxHEjzKTHtc9uGFEjR6hHrvNzeS/PX+LLLcetJcytsB5m4j+K3o/EpXJNb/5IEQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.5 + '@babel/helper-define-polyfill-provider': 0.3.1(@babel/core@7.17.5) + core-js-compat: 3.21.1 + transitivePeerDependencies: + - supports-color + + /babel-plugin-polyfill-regenerator@0.3.1(@babel/core@7.17.5): + resolution: {integrity: sha512-Y2B06tvgHYt1x0yz17jGkGeeMr5FeKUu+ASJ+N6nB5lQ8Dapfg42i0OVrf8PNGJ3zKL4A23snMi1IRwrqqND7A==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.5 + '@babel/helper-define-polyfill-provider': 0.3.1(@babel/core@7.17.5) + transitivePeerDependencies: + - supports-color + + /babel-plugin-react-docgen@4.2.1: + resolution: {integrity: sha512-UQ0NmGHj/HAqi5Bew8WvNfCk8wSsmdgNd8ZdMjBCICtyCJCq9LiqgqvjCYe570/Wg7AQArSq1VQ60Dd/CHN7mQ==} + dependencies: + ast-types: 0.14.2 + lodash: 4.17.21 + react-docgen: 5.4.0 + transitivePeerDependencies: + - supports-color + dev: true + + /babel-plugin-syntax-jsx@6.18.0: + resolution: {integrity: sha512-qrPaCSo9c8RHNRHIotaufGbuOBN8rtdC4QrrFFc43vyWCCz7Kl7GL1PGaXtMGQZUXrkCjNEgxDfmAuAabr/rlw==} + dev: true + + /babel-plugin-transform-react-remove-prop-types@0.4.24: + resolution: {integrity: sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA==} + dev: false + + /bail@1.0.5: + resolution: {integrity: sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==} + dev: true + + /bail@2.0.2: + resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} + dev: false + + /balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + /base16@1.0.0: + resolution: {integrity: sha512-pNdYkNPiJUnEhnfXV56+sQy8+AaPcG3POZAUnwr4EeqCUZFz4u2PePbo3e5Gj4ziYPCWGUZT9RHisvJKnwFuBQ==} + dev: true + + /base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + dev: true + + /base@0.11.2: + resolution: {integrity: sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==} + engines: {node: '>=0.10.0'} + dependencies: + cache-base: 1.0.1 + class-utils: 0.3.6 + component-emitter: 1.3.0 + define-property: 1.0.0 + isobject: 3.0.1 + mixin-deep: 1.3.2 + pascalcase: 0.1.1 + dev: true + + /batch-processor@1.0.0: + resolution: {integrity: sha512-xoLQD8gmmR32MeuBHgH0Tzd5PuSZx71ZsbhVxOCRbgktZEPe4SQy7s9Z50uPp0F/f7iw2XmkHN2xkgbMfckMDA==} + dev: true + + /better-opn@2.1.1: + resolution: {integrity: sha512-kIPXZS5qwyKiX/HcRvDYfmBQUa8XP17I0mYZZ0y4UhpYOSvtsLHDYqmomS+Mj20aDvD3knEiQ0ecQy2nhio3yA==} + engines: {node: '>8.0.0'} + dependencies: + open: 7.4.2 + dev: true + + /big.js@5.2.2: + resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==} + + /binary-extensions@1.13.1: + resolution: {integrity: sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==} + engines: {node: '>=0.10.0'} + requiresBuild: true + dev: true + optional: true + + /binary-extensions@2.2.0: + resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} + engines: {node: '>=8'} + dev: true + + /bindings@1.5.0: + resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} + requiresBuild: true + dependencies: + file-uri-to-path: 1.0.0 + dev: true + optional: true + + /bluebird@3.7.2: + resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==} + dev: true + + /bn.js@4.12.0: + resolution: {integrity: sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==} + dev: true + + /bn.js@5.2.1: + resolution: {integrity: sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==} + dev: true + + /body-parser@1.19.2: + resolution: {integrity: sha512-SAAwOxgoCKMGs9uUAUFHygfLAyaniaoun6I8mFY9pRAJL9+Kec34aU+oIjDhTycub1jozEfEwx1W1IuOYxVSFw==} + engines: {node: '>= 0.8'} + dependencies: + bytes: 3.1.2 + content-type: 1.0.4 + debug: 2.6.9 + depd: 1.1.2 + http-errors: 1.8.1 + iconv-lite: 0.4.24 + on-finished: 2.3.0 + qs: 6.9.7 + raw-body: 2.4.3 + type-is: 1.6.18 + transitivePeerDependencies: + - supports-color + dev: true + + /body-parser@1.20.0: + resolution: {integrity: sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + dependencies: + bytes: 3.1.2 + content-type: 1.0.4 + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + on-finished: 2.4.1 + qs: 6.10.3 + raw-body: 2.5.1 + type-is: 1.6.18 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /boolbase@1.0.0: + resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + + /boxen@5.1.2: + resolution: {integrity: sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==} + engines: {node: '>=10'} + dependencies: + ansi-align: 3.0.1 + camelcase: 6.3.0 + chalk: 4.1.2 + cli-boxes: 2.2.1 + string-width: 4.2.3 + type-fest: 0.20.2 + widest-line: 3.1.0 + wrap-ansi: 7.0.0 + dev: true + + /brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + /brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + dependencies: + balanced-match: 1.0.2 + dev: false + + /braces@2.3.2: + resolution: {integrity: sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==} + engines: {node: '>=0.10.0'} + dependencies: + arr-flatten: 1.1.0 + array-unique: 0.3.2 + extend-shallow: 2.0.1 + fill-range: 4.0.0 + isobject: 3.0.1 + repeat-element: 1.1.4 + snapdragon: 0.8.2 + snapdragon-node: 2.1.1 + split-string: 3.1.0 + to-regex: 3.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + /braces@3.0.2: + resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + engines: {node: '>=8'} + dependencies: + fill-range: 7.0.1 + dev: true + + /brorand@1.1.0: + resolution: {integrity: sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==} + dev: true + + /browser-process-hrtime@1.0.0: + resolution: {integrity: sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==} + dev: false + + /browserify-aes@1.2.0: + resolution: {integrity: sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==} + dependencies: + buffer-xor: 1.0.3 + cipher-base: 1.0.4 + create-hash: 1.2.0 + evp_bytestokey: 1.0.3 + inherits: 2.0.4 + safe-buffer: 5.2.1 + dev: true + + /browserify-cipher@1.0.1: + resolution: {integrity: sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==} + dependencies: + browserify-aes: 1.2.0 + browserify-des: 1.0.2 + evp_bytestokey: 1.0.3 + dev: true + + /browserify-des@1.0.2: + resolution: {integrity: sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==} + dependencies: + cipher-base: 1.0.4 + des.js: 1.0.1 + inherits: 2.0.4 + safe-buffer: 5.2.1 + dev: true + + /browserify-rsa@4.1.0: + resolution: {integrity: sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==} + dependencies: + bn.js: 5.2.1 + randombytes: 2.1.0 + dev: true + + /browserify-sign@4.2.2: + resolution: {integrity: sha512-1rudGyeYY42Dk6texmv7c4VcQ0EsvVbLwZkA+AQB7SxvXxmcD93jcHie8bzecJ+ChDlmAm2Qyu0+Ccg5uhZXCg==} + engines: {node: '>= 4'} + dependencies: + bn.js: 5.2.1 + browserify-rsa: 4.1.0 + create-hash: 1.2.0 + create-hmac: 1.1.7 + elliptic: 6.5.4 + inherits: 2.0.4 + parse-asn1: 5.1.6 + readable-stream: 3.6.2 + safe-buffer: 5.2.1 + dev: true + + /browserify-zlib@0.2.0: + resolution: {integrity: sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==} + dependencies: + pako: 1.0.11 + dev: true + + /browserslist@4.19.3: + resolution: {integrity: sha512-XK3X4xtKJ+Txj8G5c30B4gsm71s69lqXlkYui4s6EkKxuv49qjYlY6oVd+IFJ73d4YymtM3+djvvt/R/iJwwDg==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + dependencies: + caniuse-lite: 1.0.30001312 + electron-to-chromium: 1.4.74 + escalade: 3.1.1 + node-releases: 2.0.2 + picocolors: 1.0.0 + + /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: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + dev: true + + /buffer-xor@1.0.3: + resolution: {integrity: sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==} + dev: true + + /buffer@4.9.2: + resolution: {integrity: sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==} + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + isarray: 1.0.0 + dev: true + + /builtin-status-codes@3.0.0: + resolution: {integrity: sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==} + dev: true + + /bytes@3.0.0: + resolution: {integrity: sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==} + engines: {node: '>= 0.8'} + dev: true + + /bytes@3.1.2: + resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} + engines: {node: '>= 0.8'} + dev: true + + /c8@7.11.0: + resolution: {integrity: sha512-XqPyj1uvlHMr+Y1IeRndC2X5P7iJzJlEJwBpCdBbq2JocXOgJfr+JVfJkyNMGROke5LfKrhSFXGFXnwnRJAUJw==} + engines: {node: '>=10.12.0'} + hasBin: true + dependencies: + '@bcoe/v8-coverage': 0.2.3 + '@istanbuljs/schema': 0.1.3 + find-up: 5.0.0 + foreground-child: 2.0.0 + istanbul-lib-coverage: 3.2.0 + istanbul-lib-report: 3.0.0 + istanbul-reports: 3.1.4 + rimraf: 3.0.2 + test-exclude: 6.0.0 + v8-to-istanbul: 8.1.1 + yargs: 16.2.0 + yargs-parser: 20.2.9 + dev: true + + /cacache@12.0.4: + resolution: {integrity: sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==} + dependencies: + bluebird: 3.7.2 + chownr: 1.1.4 + figgy-pudding: 3.5.2 + glob: 7.2.0 + graceful-fs: 4.2.9 + infer-owner: 1.0.4 + lru-cache: 5.1.1 + mississippi: 3.0.0 + mkdirp: 0.5.5 + move-concurrently: 1.0.1 + promise-inflight: 1.0.1(bluebird@3.7.2) + rimraf: 2.7.1 + ssri: 6.0.2 + unique-filename: 1.1.1 + y18n: 4.0.3 + dev: true + + /cacache@15.3.0: + resolution: {integrity: sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==} + engines: {node: '>= 10'} + dependencies: + '@npmcli/fs': 1.1.1 + '@npmcli/move-file': 1.1.2 + chownr: 2.0.0 + fs-minipass: 2.1.0 + glob: 7.2.0 + infer-owner: 1.0.4 + lru-cache: 6.0.0 + minipass: 3.1.6 + minipass-collect: 1.0.2 + minipass-flush: 1.0.5 + minipass-pipeline: 1.2.4 + mkdirp: 1.0.4 + p-map: 4.0.0 + promise-inflight: 1.0.1(bluebird@3.7.2) + rimraf: 3.0.2 + ssri: 8.0.1 + tar: 6.1.11 + unique-filename: 1.1.1 + transitivePeerDependencies: + - bluebird + dev: true + + /cache-base@1.0.1: + resolution: {integrity: sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==} + engines: {node: '>=0.10.0'} + dependencies: + collection-visit: 1.0.0 + component-emitter: 1.3.0 + get-value: 2.0.6 + has-value: 1.0.0 + isobject: 3.0.1 + set-value: 2.0.1 + to-object-path: 0.3.0 + union-value: 1.0.1 + unset-value: 1.0.0 + dev: true + + /call-bind@1.0.2: + resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} + dependencies: + function-bind: 1.1.1 + get-intrinsic: 1.1.1 + + /call-me-maybe@1.0.1: + resolution: {integrity: sha512-wCyFsDQkKPwwF8BDwOiWNx/9K45L/hvggQiDbve+viMNMQnWhrlYIuBk09offfwCRtCO9P6XwUttufzU11WCVw==} + dev: true + + /caller-callsite@2.0.0: + resolution: {integrity: sha512-JuG3qI4QOftFsZyOn1qq87fq5grLIyk1JYd5lJmdA+fG7aQ9pA/i3JIJGcO3q0MrRcHlOt1U+ZeHW8Dq9axALQ==} + engines: {node: '>=4'} + dependencies: + callsites: 2.0.0 + dev: false + + /caller-path@2.0.0: + resolution: {integrity: sha512-MCL3sf6nCSXOwCTzvPKhN18TU7AHTvdtam8DAogxcrJ8Rjfbbg7Lgng64H9Iy+vUV6VGFClN/TyxBkAebLRR4A==} + engines: {node: '>=4'} + dependencies: + caller-callsite: 2.0.0 + dev: false + + /callsites@2.0.0: + resolution: {integrity: sha512-ksWePWBloaWPxJYQ8TL0JHvtci6G5QTKwQ95RcWAa/lzoAKuAOflGdAK92hpHXjkwb8zLxoLNUoNYZgVsaJzvQ==} + engines: {node: '>=4'} + dev: false + + /callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + dev: true + + /camel-case@4.1.2: + resolution: {integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==} + dependencies: + pascal-case: 3.1.2 + tslib: 2.3.1 + dev: true + + /camelcase-css@2.0.1: + resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} + engines: {node: '>= 6'} + dev: true + + /camelcase@5.3.1: + resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} + engines: {node: '>=6'} + + /camelcase@6.3.0: + resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} + engines: {node: '>=10'} + dev: true + + /caniuse-lite@1.0.30001312: + resolution: {integrity: sha512-Wiz1Psk2MEK0pX3rUzWaunLTZzqS2JYZFzNKqAiJGiuxIjRPLgV6+VDPOg6lQOUxmDwhTlh198JsTTi8Hzw6aQ==} + + /caniuse-lite@1.0.30001561: + resolution: {integrity: sha512-NTt0DNoKe958Q0BE0j0c1V9jbUzhBxHIEJy7asmGrpE0yG63KTV7PLHPnK2E1O9RsQrQ081I3NLuXGS6zht3cw==} + + /capture-exit@2.0.0: + resolution: {integrity: sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==} + engines: {node: 6.* || 8.* || >= 10.*} + dependencies: + rsvp: 4.8.5 + dev: true + + /case-sensitive-paths-webpack-plugin@2.4.0: + resolution: {integrity: sha512-roIFONhcxog0JSSWbvVAh3OocukmSgpqOH6YpMkCvav/ySIV3JKg4Dc8vYtQjYi/UxpNE36r/9v+VqTQqgkYmw==} + engines: {node: '>=4'} + dev: true + + /ccount@1.1.0: + resolution: {integrity: sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg==} + dev: true + + /ccount@2.0.1: + resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} + dev: false + + /chalk@2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 + + /chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + dev: true + + /character-entities-html4@1.1.4: + resolution: {integrity: sha512-HRcDxZuZqMx3/a+qrzxdBKBPUpxWEq9xw2OPZ3a/174ihfrQKVsFhqtthBInFy1zZ9GgZyFXOatNujm8M+El3g==} + dev: true + + /character-entities-html4@2.1.0: + resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} + dev: false + + /character-entities-legacy@1.1.4: + resolution: {integrity: sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==} + dev: true + + /character-entities-legacy@3.0.0: + resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} + dev: false + + /character-entities@1.2.4: + resolution: {integrity: sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==} + dev: true + + /character-entities@2.0.1: + resolution: {integrity: sha512-OzmutCf2Kmc+6DrFrrPS8/tDh2+DpnrfzdICHWhcVC9eOd0N1PXmQEE1a8iM4IziIAG+8tmTq3K+oo0ubH6RRQ==} + dev: false + + /character-reference-invalid@1.1.4: + resolution: {integrity: sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==} + dev: true + + /character-reference-invalid@2.0.1: + resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} + dev: false + + /charcodes@0.2.0: + resolution: {integrity: sha512-Y4kiDb+AM4Ecy58YkuZrrSRJBDQdQ2L+NyS1vHHFtNtUjgutcZfx3yp1dAONI/oPaPmyGfCLx5CxL+zauIMyKQ==} + engines: {node: '>=6'} + dev: true + + /chokidar@2.1.8: + resolution: {integrity: sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==} + deprecated: Chokidar 2 does not receive security updates since 2019. Upgrade to chokidar 3 with 15x fewer dependencies + requiresBuild: true + dependencies: + anymatch: 2.0.0 + async-each: 1.0.3 + braces: 2.3.2 + glob-parent: 3.1.0 + inherits: 2.0.4 + is-binary-path: 1.0.1 + is-glob: 4.0.3 + normalize-path: 3.0.0 + path-is-absolute: 1.0.1 + readdirp: 2.2.1 + upath: 1.2.0 + optionalDependencies: + fsevents: 1.2.13 + transitivePeerDependencies: + - supports-color + dev: true + optional: true + + /chokidar@3.5.3: + resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} + engines: {node: '>= 8.10.0'} + dependencies: + anymatch: 3.1.2 + braces: 3.0.2 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.2 + dev: true + + /chownr@1.1.4: + resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} + dev: true + + /chownr@2.0.0: + resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} + engines: {node: '>=10'} + dev: true + + /chrome-trace-event@1.0.3: + resolution: {integrity: sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==} + engines: {node: '>=6.0'} + dev: true + + /ci-info@2.0.0: + resolution: {integrity: sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==} + dev: true + + /cipher-base@1.0.4: + resolution: {integrity: sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==} + dependencies: + inherits: 2.0.4 + safe-buffer: 5.2.1 + dev: true + + /class-utils@0.3.6: + resolution: {integrity: sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==} + engines: {node: '>=0.10.0'} + dependencies: + arr-union: 3.1.0 + define-property: 0.2.5 + isobject: 3.0.1 + static-extend: 0.1.2 + dev: true + + /classnames@2.3.1: + resolution: {integrity: sha512-OlQdbZ7gLfGarSqxesMesDa5uz7KFbID8Kpq/SxIoNGDqY8lSYs0D+hhtBXhcdB3rcbXArFr7vlHheLk1voeNA==} + dev: false + + /clean-css@4.2.4: + resolution: {integrity: sha512-EJUDT7nDVFDvaQgAo2G/PJvxmp1o/c6iXLbswsBbUFXi1Nr+AjA2cKmfbKDMjMvzEe75g3P6JkaDDAKk96A85A==} + engines: {node: '>= 4.0'} + dependencies: + source-map: 0.6.1 + dev: true + + /clean-stack@2.2.0: + resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} + engines: {node: '>=6'} + dev: true + + /cli-boxes@2.2.1: + resolution: {integrity: sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==} + engines: {node: '>=6'} + dev: true + + /cli-table3@0.6.1: + resolution: {integrity: sha512-w0q/enDHhPLq44ovMGdQeeDLvwxwavsJX7oQGYt/LrBlYsyaxyDnp6z3QzFut/6kLLKnlcUVJLrpB7KBfgG/RA==} + engines: {node: 10.* || >= 12.*} + dependencies: + string-width: 4.2.3 + optionalDependencies: + colors: 1.4.0 + dev: true + + /cliui@5.0.0: + resolution: {integrity: sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==} + dependencies: + string-width: 3.1.0 + strip-ansi: 5.2.0 + wrap-ansi: 5.1.0 + dev: false + + /cliui@7.0.4: + resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + dev: true + + /clone-deep@4.0.1: + resolution: {integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==} + engines: {node: '>=6'} + dependencies: + is-plain-object: 2.0.4 + kind-of: 6.0.3 + shallow-clone: 3.0.1 + dev: true + + /clsx@1.1.1: + resolution: {integrity: sha512-6/bPho624p3S2pMyvP5kKBPXnI3ufHLObBFCfgx+LkeR5lg2XYy2hqZqUf45ypD8COn2bhgGJSUE+l5dhNBieA==} + engines: {node: '>=6'} + dev: true + + /collapse-white-space@1.0.6: + resolution: {integrity: sha512-jEovNnrhMuqyCcjfEJA56v0Xq8SkIoPKDyaHahwo3POf4qcSXqMYuwNcOTzp74vTsR9Tn08z4MxWqAhcekogkQ==} + dev: true + + /collection-visit@1.0.0: + resolution: {integrity: sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==} + engines: {node: '>=0.10.0'} + dependencies: + map-visit: 1.0.0 + object-visit: 1.0.1 + dev: true + + /color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + dependencies: + color-name: 1.1.3 + + /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-list@4.15.0: + resolution: {integrity: sha512-4P3pFob8w6LNnku94oIacj8suCfhOLmY+25bmfoOwqFtuhLTD4Oux+/aUBdZLcvLK3fHrBe6XrzAU2IbwoWnQA==} + engines: {node: '>=8', npm: '>=5'} + dev: true + + /color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + + /color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + dev: true + + /color-parse@1.4.2: + resolution: {integrity: sha512-RI7s49/8yqDj3fECFZjUI1Yi0z/Gq1py43oNJivAIIDSyJiOZLfYCRQEgn8HEVAj++PcRe8AnL2XF0fRJ3BTnA==} + dependencies: + color-name: 1.1.4 + dev: true + + /color-rgba@2.4.0: + resolution: {integrity: sha512-Nti4qbzr/z2LbUWySr7H9dk3Rl7gZt7ihHAxlgT4Ho90EXWkjtkL1avTleu9yeGuqrt/chxTB6GKK8nZZ6V0+Q==} + dependencies: + color-parse: 1.4.2 + color-space: 2.0.0 + dev: true + + /color-space@2.0.0: + resolution: {integrity: sha512-Bu8P/usGNuVWushjxcuaGSkhT+L2KX0cvgMGMTF0KJ7lFeqonhsntT68d6Yu3uwZzCmbF7KTB9EV67AGcUXhJw==} + dev: true + + /color-string@1.9.0: + resolution: {integrity: sha512-9Mrz2AQLefkH1UvASKj6v6hj/7eWgjnT/cVsR8CumieLoT+g900exWeNogqtweI8dxloXN9BDQTYro1oWu/5CQ==} + dependencies: + color-name: 1.1.4 + simple-swizzle: 0.2.2 + dev: true + + /color-stringify@1.2.1: + resolution: {integrity: sha512-DMEEe6iVahjHKTYCywfkLRArls2WopRc3e6ucR/HEL5eeF2v708bc5MumOn2VWblTyJrCIBpjRSzTbmNtlMcxA==} + dependencies: + color-name: 1.1.4 + dev: true + + /color-support@1.1.3: + resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==} + hasBin: true + dev: true + + /color@3.2.1: + resolution: {integrity: sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==} + dependencies: + color-convert: 1.9.3 + color-string: 1.9.0 + dev: true + + /colors@1.4.0: + resolution: {integrity: sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==} + engines: {node: '>=0.1.90'} + requiresBuild: true + dev: true + optional: true + + /combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + dependencies: + delayed-stream: 1.0.0 + + /comma-separated-tokens@1.0.8: + resolution: {integrity: sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw==} + + /comma-separated-tokens@2.0.2: + resolution: {integrity: sha512-G5yTt3KQN4Yn7Yk4ed73hlZ1evrFKXeUW3086p3PRFNp7m2vIjI6Pg+Kgb+oyzhd9F2qdcoj67+y3SdxL5XWsg==} + dev: false + + /commander@2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + dev: true + + /commander@4.1.1: + resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} + engines: {node: '>= 6'} + dev: true + + /commander@5.1.0: + resolution: {integrity: sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==} + engines: {node: '>= 6'} + dev: true + + /commander@6.2.1: + resolution: {integrity: sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==} + engines: {node: '>= 6'} + dev: true + + /common-path-prefix@3.0.0: + resolution: {integrity: sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==} + dev: true + + /commondir@1.0.1: + resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} + dev: true + + /component-emitter@1.3.0: + resolution: {integrity: sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==} + dev: true + + /compressible@2.0.18: + resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==} + engines: {node: '>= 0.6'} + dependencies: + mime-db: 1.52.0 + dev: true + + /compression@1.7.4: + resolution: {integrity: sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==} + engines: {node: '>= 0.8.0'} + dependencies: + accepts: 1.3.8 + bytes: 3.0.0 + compressible: 2.0.18 + debug: 2.6.9 + on-headers: 1.0.2 + safe-buffer: 5.1.2 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + dev: true + + /compute-scroll-into-view@1.0.17: + resolution: {integrity: sha512-j4dx+Fb0URmzbwwMUrhqWM2BEWHdFGx+qZ9qqASHRPqvTYdqvWnHg0H1hIbcyLnvgnoNAVMlwkepyqM3DaIFUg==} + dev: true + + /concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + /concat-stream@1.6.2: + resolution: {integrity: sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==} + engines: {'0': node >= 0.8} + dependencies: + buffer-from: 1.1.2 + inherits: 2.0.4 + readable-stream: 2.3.7 + typedarray: 0.0.6 + dev: true + + /confusing-browser-globals@1.0.11: + resolution: {integrity: sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==} + dev: true + + /console-browserify@1.2.0: + resolution: {integrity: sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==} + dev: true + + /console-control-strings@1.1.0: + resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} + dev: true + + /constants-browserify@1.0.0: + resolution: {integrity: sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==} + dev: true + + /content-disposition@0.5.4: + resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} + engines: {node: '>= 0.6'} + dependencies: + safe-buffer: 5.2.1 + dev: true + + /content-type@1.0.4: + resolution: {integrity: sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==} + engines: {node: '>= 0.6'} + dev: true + + /convert-source-map@1.8.0: + resolution: {integrity: sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==} + dependencies: + safe-buffer: 5.1.2 + + /cookie-signature@1.0.6: + resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} + dev: true + + /cookie@0.4.2: + resolution: {integrity: sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==} + engines: {node: '>= 0.6'} + dev: true + + /copy-concurrently@1.0.5: + resolution: {integrity: sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==} + dependencies: + aproba: 1.2.0 + fs-write-stream-atomic: 1.0.10 + iferr: 0.1.5 + mkdirp: 0.5.5 + rimraf: 2.7.1 + run-queue: 1.0.3 + dev: true + + /copy-descriptor@0.1.1: + resolution: {integrity: sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==} + engines: {node: '>=0.10.0'} + dev: true + + /copy-to-clipboard@3.3.1: + resolution: {integrity: sha512-i13qo6kIHTTpCm8/Wup+0b1mVWETvu2kIMzKoK8FpkLkFxlt0znUAHcMzox+T8sPlqtZXq3CulEjQHsYiGFJUw==} + dependencies: + toggle-selection: 1.0.6 + dev: true + + /core-js-compat@3.21.1: + resolution: {integrity: sha512-gbgX5AUvMb8gwxC7FLVWYT7Kkgu/y7+h/h1X43yJkNqhlK2fuYyQimqvKGNZFAY6CKii/GFKJ2cp/1/42TN36g==} + dependencies: + browserslist: 4.19.3 + semver: 7.0.0 + + /core-js-pure@3.21.1: + resolution: {integrity: sha512-12VZfFIu+wyVbBebyHmRTuEE/tZrB4tJToWcwAMcsp3h4+sHR+fMJWbKpYiCRWlhFBq+KNyO8rIV9rTkeVmznQ==} + deprecated: core-js-pure@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js-pure. + requiresBuild: true + dev: true + + /core-js@3.21.1: + resolution: {integrity: sha512-FRq5b/VMrWlrmCzwRrpDYNxyHP9BcAZC+xHJaqTgIE5091ZV1NTmyh0sGOg5XqpnHvR0svdy0sv1gWA1zmhxig==} + deprecated: core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js. + requiresBuild: true + dev: true + + /core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + + /cosmiconfig@5.2.1: + resolution: {integrity: sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==} + engines: {node: '>=4'} + dependencies: + import-fresh: 2.0.0 + is-directory: 0.3.1 + js-yaml: 3.14.1 + parse-json: 4.0.0 + dev: false + + /cosmiconfig@6.0.0: + resolution: {integrity: sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==} + engines: {node: '>=8'} + dependencies: + '@types/parse-json': 4.0.0 + import-fresh: 3.3.0 + parse-json: 5.2.0 + path-type: 4.0.0 + yaml: 1.10.2 + dev: true + + /cosmiconfig@7.0.1: + resolution: {integrity: sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==} + engines: {node: '>=10'} + dependencies: + '@types/parse-json': 4.0.0 + import-fresh: 3.3.0 + parse-json: 5.2.0 + path-type: 4.0.0 + yaml: 1.10.2 + dev: true + + /cp-file@7.0.0: + resolution: {integrity: sha512-0Cbj7gyvFVApzpK/uhCtQ/9kE9UnYpxMzaq5nQQC/Dh4iaj5fxp7iEFIullrYwzj8nf0qnsI1Qsx34hAeAebvw==} + engines: {node: '>=8'} + dependencies: + graceful-fs: 4.2.9 + make-dir: 3.1.0 + nested-error-stacks: 2.1.0 + p-event: 4.2.0 + dev: true + + /cpy@8.1.2: + resolution: {integrity: sha512-dmC4mUesv0OYH2kNFEidtf/skUwv4zePmGeepjyyJ0qTo5+8KhA1o99oIAwVVLzQMAeDJml74d6wPPKb6EZUTg==} + engines: {node: '>=8'} + dependencies: + arrify: 2.0.1 + cp-file: 7.0.0 + globby: 9.2.0 + has-glob: 1.0.0 + junk: 3.1.0 + nested-error-stacks: 2.1.0 + p-all: 2.1.0 + p-filter: 2.1.0 + p-map: 3.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /create-ecdh@4.0.4: + resolution: {integrity: sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==} + dependencies: + bn.js: 4.12.0 + elliptic: 6.5.4 + dev: true + + /create-hash@1.2.0: + resolution: {integrity: sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==} + dependencies: + cipher-base: 1.0.4 + inherits: 2.0.4 + md5.js: 1.3.5 + ripemd160: 2.0.2 + sha.js: 2.4.11 + dev: true + + /create-hmac@1.1.7: + resolution: {integrity: sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==} + dependencies: + cipher-base: 1.0.4 + create-hash: 1.2.0 + inherits: 2.0.4 + ripemd160: 2.0.2 + safe-buffer: 5.2.1 + sha.js: 2.4.11 + dev: true + + /create-require@1.1.1: + resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} + dev: false + + /cross-fetch@3.1.5: + resolution: {integrity: sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==} + dependencies: + node-fetch: 2.6.7 + transitivePeerDependencies: + - encoding + dev: true + + /cross-spawn@6.0.5: + resolution: {integrity: sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==} + engines: {node: '>=4.8'} + dependencies: + nice-try: 1.0.5 + path-key: 2.0.1 + semver: 5.7.2 + shebang-command: 1.2.0 + which: 1.3.1 + dev: true + + /cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + dev: true + + /crypto-browserify@3.12.0: + resolution: {integrity: sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==} + dependencies: + browserify-cipher: 1.0.1 + browserify-sign: 4.2.2 + create-ecdh: 4.0.4 + create-hash: 1.2.0 + create-hmac: 1.1.7 + diffie-hellman: 5.0.3 + inherits: 2.0.4 + pbkdf2: 3.1.2 + public-encrypt: 4.0.3 + randombytes: 2.1.0 + randomfill: 1.0.4 + dev: true + + /css-color-names@0.0.4: + resolution: {integrity: sha512-zj5D7X1U2h2zsXOAM8EyUREBnnts6H+Jm+d1M2DbiQQcUtnqgQsMrdo8JW9R80YFUmIdBZeMu5wvYM7hcgWP/Q==} + dev: true + + /css-loader@3.6.0(webpack@4.46.0): + resolution: {integrity: sha512-M5lSukoWi1If8dhQAUCvj4H8vUt3vOnwbQBH9DdTm/s4Ym2B/3dPMtYZeJmq7Q3S3Pa+I94DcZ7pc9bP14cWIQ==} + engines: {node: '>= 8.9.0'} + peerDependencies: + webpack: ^4.0.0 || ^5.0.0 + dependencies: + camelcase: 5.3.1 + cssesc: 3.0.0 + icss-utils: 4.1.1 + loader-utils: 1.4.2 + normalize-path: 3.0.0 + postcss: 7.0.39 + postcss-modules-extract-imports: 2.0.0 + postcss-modules-local-by-default: 3.0.3 + postcss-modules-scope: 2.2.0 + postcss-modules-values: 3.0.0 + postcss-value-parser: 4.2.0 + schema-utils: 2.7.1 + semver: 6.3.1 + webpack: 4.46.0 + dev: true + + /css-select@4.2.1: + resolution: {integrity: sha512-/aUslKhzkTNCQUB2qTX84lVmfia9NyjP3WpDGtj/WxhwBzWBYUV3DgUpurHTme8UTPcPlAD1DJ+b0nN/t50zDQ==} + dependencies: + boolbase: 1.0.0 + css-what: 5.1.0 + domhandler: 4.3.0 + domutils: 2.8.0 + nth-check: 2.0.1 + dev: true + + /css-selector-parser@1.4.1: + resolution: {integrity: sha512-HYPSb7y/Z7BNDCOrakL4raGO2zltZkbeXyAd6Tg9obzix6QhzxCotdBl6VT0Dv4vZfJGVz3WL/xaEI9Ly3ul0g==} + dev: false + + /css-what@5.1.0: + resolution: {integrity: sha512-arSMRWIIFY0hV8pIxZMEfmMI47Wj3R/aWpZDDxWYCPEiOMv6tfOrnpDtgxBYPEQD4V0Y/958+1TdC3iWTFcUPw==} + engines: {node: '>= 6'} + dev: true + + /cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + dev: true + + /cssom@0.3.8: + resolution: {integrity: sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==} + dev: false + + /cssom@0.4.4: + resolution: {integrity: sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==} + dev: false + + /cssstyle@2.3.0: + resolution: {integrity: sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==} + engines: {node: '>=8'} + dependencies: + cssom: 0.3.8 + dev: false + + /csstype@2.6.19: + resolution: {integrity: sha512-ZVxXaNy28/k3kJg0Fou5MiYpp88j7H9hLZp8PDC3jV0WFjfH5E9xHb56L0W59cPbKbcHXeP4qyT8PrHp8t6LcQ==} + dev: true + + /csstype@3.0.10: + resolution: {integrity: sha512-2u44ZG2OcNUO9HDp/Jl8C07x6pU/eTR3ncV91SiK3dhG9TWvRVsCoJw14Ckx5DgWkzGA3waZWO3d7pgqpUI/XA==} + + /cyclist@1.0.1: + resolution: {integrity: sha512-NJGVKPS81XejHcLhaLJS7plab0fK3slPh11mESeeDq2W4ZI5kUKK/LRRdVDvjJseojbPB7ZwjnyOybg3Igea/A==} + dev: true + + /damerau-levenshtein@1.0.8: + resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} + dev: true + + /data-urls@2.0.0: + resolution: {integrity: sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==} + engines: {node: '>=10'} + dependencies: + abab: 2.0.6 + whatwg-mimetype: 2.3.0 + whatwg-url: 8.7.0 + dev: false + + /debug@2.6.9: + resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.0.0 + dev: true + + /debug@3.2.7: + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.3 + 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 + + /decamelize@1.2.0: + resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} + engines: {node: '>=0.10.0'} + dev: false + + /decimal.js@10.3.1: + resolution: {integrity: sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ==} + dev: false + + /decode-named-character-reference@1.0.1: + resolution: {integrity: sha512-YV/0HQHreRwKb7uBopyIkLG17jG6Sv2qUchk9qSoVJ2f+flwRsPNBO0hAnjt6mTNYUT+vw9Gy2ihXg4sUWPi2w==} + dependencies: + character-entities: 2.0.1 + dev: false + + /decode-uri-component@0.2.2: + resolution: {integrity: sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==} + engines: {node: '>=0.10'} + dev: true + + /dedent@0.7.0: + resolution: {integrity: sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==} + dev: true + + /deep-equal@2.0.5: + resolution: {integrity: sha512-nPiRgmbAtm1a3JsnLCf6/SLfXcjyN5v8L1TXzdCmHrXJ4hx+gW/w1YCcn7z8gJtSiDArZCgYtbao3QqLm/N1Sw==} + dependencies: + call-bind: 1.0.2 + es-get-iterator: 1.1.2 + get-intrinsic: 1.1.1 + is-arguments: 1.1.1 + is-date-object: 1.0.5 + is-regex: 1.1.4 + isarray: 2.0.5 + object-is: 1.1.5 + object-keys: 1.1.1 + object.assign: 4.1.2 + regexp.prototype.flags: 1.4.1 + side-channel: 1.0.4 + which-boxed-primitive: 1.0.2 + which-collection: 1.0.1 + which-typed-array: 1.1.7 + dev: true + + /deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + + /deep-object-diff@1.1.9: + resolution: {integrity: sha512-Rn+RuwkmkDwCi2/oXOFS9Gsr5lJZu/yTGpK7wAaAIE75CC+LCGEZHpY6VQJa/RoJcrmaA/docWJZvYohlNkWPA==} + dev: true + + /deepmerge@3.3.0: + resolution: {integrity: sha512-GRQOafGHwMHpjPx9iCvTgpu9NojZ49q794EEL94JVEw6VaeA8XTUyBKvAkOOjBX9oJNiV6G3P+T+tihFjo2TqA==} + engines: {node: '>=0.10.0'} + dev: false + + /deepmerge@4.2.2: + resolution: {integrity: sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==} + engines: {node: '>=0.10.0'} + dev: true + + /define-properties@1.1.3: + resolution: {integrity: sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==} + engines: {node: '>= 0.4'} + dependencies: + object-keys: 1.1.1 + + /define-property@0.2.5: + resolution: {integrity: sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==} + engines: {node: '>=0.10.0'} + dependencies: + is-descriptor: 0.1.6 + dev: true + + /define-property@1.0.0: + resolution: {integrity: sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==} + engines: {node: '>=0.10.0'} + dependencies: + is-descriptor: 1.0.2 + dev: true + + /define-property@2.0.2: + resolution: {integrity: sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==} + engines: {node: '>=0.10.0'} + dependencies: + is-descriptor: 1.0.2 + isobject: 3.0.1 + dev: true + + /delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + + /delegates@1.0.0: + resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} + dev: true + + /depd@1.1.2: + resolution: {integrity: sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==} + engines: {node: '>= 0.6'} + dev: true + + /depd@2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} + dev: true + + /dequal@2.0.2: + resolution: {integrity: sha512-q9K8BlJVxK7hQYqa6XISGmBZbtQQWVXSrRrWreHC94rMt1QL/Impruc+7p2CYSYuVIUr+YCt6hjrs1kkdJRTug==} + engines: {node: '>=6'} + dev: false + + /des.js@1.0.1: + resolution: {integrity: sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==} + dependencies: + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + dev: true + + /destroy@1.0.4: + resolution: {integrity: sha512-3NdhDuEXnfun/z7x9GOElY49LoqVHoGScmOKwmxhsS8N5Y+Z8KyPPDnaSzqWgYt/ji4mqwfTS34Htrk0zPIXVg==} + dev: true + + /destroy@1.2.0: + resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + dev: true + + /detab@2.0.4: + resolution: {integrity: sha512-8zdsQA5bIkoRECvCrNKPla84lyoR7DSAyf7p0YgXzBO9PDJx8KntPUay7NS6yp+KdxdVtiE5SpHKtbp2ZQyA9g==} + dependencies: + repeat-string: 1.6.1 + dev: true + + /detect-port@1.3.0: + resolution: {integrity: sha512-E+B1gzkl2gqxt1IhUzwjrxBKRqx1UzC3WLONHinn8S3T6lwV/agVCyitiFOsGJ/eYuEUBvD71MZHy3Pv1G9doQ==} + engines: {node: '>= 4.2.1'} + hasBin: true + dependencies: + address: 1.1.2 + debug: 2.6.9 + transitivePeerDependencies: + - supports-color + dev: true + + /diff@4.0.2: + resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} + engines: {node: '>=0.3.1'} + dev: false + + /diff@5.0.0: + resolution: {integrity: sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==} + engines: {node: '>=0.3.1'} + dev: false + + /diffie-hellman@5.0.3: + resolution: {integrity: sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==} + dependencies: + bn.js: 4.12.0 + miller-rabin: 4.0.1 + randombytes: 2.1.0 + dev: true + + /dir-glob@2.2.2: + resolution: {integrity: sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==} + engines: {node: '>=4'} + dependencies: + path-type: 3.0.0 + dev: true + + /dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + dependencies: + path-type: 4.0.0 + dev: true + + /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: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} + dependencies: + esutils: 2.0.3 + dev: true + + /dom-accessibility-api@0.5.13: + resolution: {integrity: sha512-R305kwb5CcMDIpSHUnLyIAp7SrSPBx6F0VfQFB3M75xVMHhXJJIdePYgbPPh1o57vCHNu5QztokWUPsLjWzFqw==} + dev: true + + /dom-converter@0.2.0: + resolution: {integrity: sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==} + dependencies: + utila: 0.4.0 + dev: true + + /dom-serializer@1.3.2: + resolution: {integrity: sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==} + dependencies: + domelementtype: 2.2.0 + domhandler: 4.3.0 + entities: 2.2.0 + dev: true + + /dom-walk@0.1.2: + resolution: {integrity: sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==} + dev: true + + /domain-browser@1.2.0: + resolution: {integrity: sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==} + engines: {node: '>=0.4', npm: '>=1.2'} + dev: true + + /domelementtype@2.2.0: + resolution: {integrity: sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==} + dev: true + + /domexception@2.0.1: + resolution: {integrity: sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==} + engines: {node: '>=8'} + dependencies: + webidl-conversions: 5.0.0 + dev: false + + /domhandler@4.3.0: + resolution: {integrity: sha512-fC0aXNQXqKSFTr2wDNZDhsEYjCiYsDWl3D01kwt25hm1YIPyDGHvvi3rw+PLqHAl/m71MaiF7d5zvBr0p5UB2g==} + engines: {node: '>= 4'} + dependencies: + domelementtype: 2.2.0 + dev: true + + /domutils@2.8.0: + resolution: {integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==} + dependencies: + dom-serializer: 1.3.2 + domelementtype: 2.2.0 + domhandler: 4.3.0 + dev: true + + /dot-case@3.0.4: + resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} + dependencies: + no-case: 3.0.4 + tslib: 2.3.1 + dev: true + + /dotenv-expand@5.1.0: + resolution: {integrity: sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==} + dev: true + + /dotenv@8.6.0: + resolution: {integrity: sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==} + engines: {node: '>=10'} + dev: true + + /downshift@6.1.7(react@17.0.2): + resolution: {integrity: sha512-cVprZg/9Lvj/uhYRxELzlu1aezRcgPWBjTvspiGTVEU64gF5pRdSRKFVLcxqsZC637cLAGMbL40JavEfWnqgNg==} + peerDependencies: + react: '>=16.12.0' + dependencies: + '@babel/runtime': 7.17.2 + compute-scroll-into-view: 1.0.17 + prop-types: 15.8.1 + react: 17.0.2 + react-is: 17.0.2 + tslib: 2.3.1 + dev: true + + /duplexer@0.1.2: + resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} + dev: true + + /duplexify@3.7.1: + resolution: {integrity: sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==} + dependencies: + end-of-stream: 1.4.4 + inherits: 2.0.4 + readable-stream: 2.3.7 + stream-shift: 1.0.1 + dev: true + + /ee-first@1.1.1: + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + dev: true + + /electron-to-chromium@1.4.74: + resolution: {integrity: sha512-DvQ20M0I4dIH8KcAo7n7E4OEeNafZ1N8z6g6ck+ALCM0ZoV6mpjaX6ekjs31zKlqPzacU3lmjG9PZEa1mQhEpQ==} + + /element-resize-detector@1.2.4: + resolution: {integrity: sha512-Fl5Ftk6WwXE0wqCgNoseKWndjzZlDCwuPTcoVZfCP9R3EHQF8qUtr3YUPNETegRBOKqQKPW3n4kiIWngGi8tKg==} + dependencies: + batch-processor: 1.0.0 + dev: true + + /elliptic@6.5.4: + resolution: {integrity: sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==} + dependencies: + bn.js: 4.12.0 + brorand: 1.1.0 + hash.js: 1.1.7 + hmac-drbg: 1.0.1 + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + minimalistic-crypto-utils: 1.0.1 + dev: true + + /emoji-regex@7.0.3: + resolution: {integrity: sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==} + dev: false + + /emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + dev: true + + /emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + dev: true + + /emojis-list@3.0.0: + resolution: {integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==} + engines: {node: '>= 4'} + + /emotion-theming@10.3.0(@emotion/core@10.3.1)(react@17.0.2): + resolution: {integrity: sha512-mXiD2Oj7N9b6+h/dC6oLf9hwxbtKHQjoIqtodEyL8CpkN4F3V4IK/BT4D0C7zSs4BBFOu4UlPJbvvBLa88SGEA==} + peerDependencies: + '@emotion/core': ^10.0.27 + react: '>=16.3.0' + dependencies: + '@babel/runtime': 7.17.2 + '@emotion/core': 10.3.1(react@17.0.2) + '@emotion/weak-memoize': 0.2.5 + hoist-non-react-statics: 3.3.2 + react: 17.0.2 + dev: true + + /encodeurl@1.0.2: + resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} + engines: {node: '>= 0.8'} + dev: true + + /end-of-stream@1.4.4: + resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + dependencies: + once: 1.4.0 + dev: true + + /endent@2.1.0: + resolution: {integrity: sha512-r8VyPX7XL8U01Xgnb1CjZ3XV+z90cXIJ9JPE/R9SEC9vpw2P6CfsRPJmp20DppC5N7ZAMCmjYkJIa744Iyg96w==} + dependencies: + dedent: 0.7.0 + fast-json-parse: 1.0.3 + objectorarray: 1.0.5 + dev: true + + /enhanced-resolve@4.5.0: + resolution: {integrity: sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==} + engines: {node: '>=6.9.0'} + dependencies: + graceful-fs: 4.2.9 + memory-fs: 0.5.0 + tapable: 1.1.3 + + /entities@2.2.0: + resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==} + dev: true + + /errno@0.1.8: + resolution: {integrity: sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==} + hasBin: true + dependencies: + prr: 1.0.1 + + /error-ex@1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + dependencies: + is-arrayish: 0.2.1 + + /error-stack-parser@2.0.7: + resolution: {integrity: sha512-chLOW0ZGRf4s8raLrDxa5sdkvPec5YdvwbFnqJme4rk0rFajP8mPtrDL1+I+CwrQDCjswDA5sREX7jYQDQs9vA==} + dependencies: + stackframe: 1.2.1 + dev: true + + /es-abstract@1.19.1: + resolution: {integrity: sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + es-to-primitive: 1.2.1 + function-bind: 1.1.1 + get-intrinsic: 1.1.1 + get-symbol-description: 1.0.0 + has: 1.0.3 + has-symbols: 1.0.2 + internal-slot: 1.0.3 + is-callable: 1.2.4 + is-negative-zero: 2.0.2 + is-regex: 1.1.4 + is-shared-array-buffer: 1.0.1 + is-string: 1.0.7 + is-weakref: 1.0.2 + object-inspect: 1.12.0 + object-keys: 1.1.1 + object.assign: 4.1.2 + string.prototype.trimend: 1.0.4 + string.prototype.trimstart: 1.0.4 + unbox-primitive: 1.0.1 + dev: true + + /es-array-method-boxes-properly@1.0.0: + resolution: {integrity: sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==} + dev: true + + /es-get-iterator@1.1.2: + resolution: {integrity: sha512-+DTO8GYwbMCwbywjimwZMHp8AuYXOS2JZFWoi2AlPOS3ebnII9w/NLpNZtA7A0YLaVDw+O7KFCeoIV7OPvM7hQ==} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.1.1 + has-symbols: 1.0.2 + is-arguments: 1.1.1 + is-map: 2.0.2 + is-set: 2.0.2 + is-string: 1.0.7 + isarray: 2.0.5 + dev: true + + /es-to-primitive@1.2.1: + resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} + engines: {node: '>= 0.4'} + dependencies: + is-callable: 1.2.4 + is-date-object: 1.0.5 + is-symbol: 1.0.4 + dev: true + + /es5-shim@4.6.5: + resolution: {integrity: sha512-vfQ4UAai8szn0sAubCy97xnZ4sJVDD1gt/Grn736hg8D7540wemIb1YPrYZSTqlM2H69EQX1or4HU/tSwRTI3w==} + engines: {node: '>=0.4.0'} + dev: true + + /es6-shim@0.35.6: + resolution: {integrity: sha512-EmTr31wppcaIAgblChZiuN/l9Y7DPyw8Xtbg7fIVngn6zMW+IEBJDJngeKC3x6wr0V/vcA2wqeFnaw1bFJbDdA==} + dev: true + + /escalade@3.1.1: + resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} + engines: {node: '>=6'} + + /escape-html@1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + + /escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + + /escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + dev: true + + /escape-string-regexp@5.0.0: + resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} + engines: {node: '>=12'} + dev: false + + /escodegen@2.0.0: + resolution: {integrity: sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==} + engines: {node: '>=6.0'} + hasBin: true + dependencies: + esprima: 4.0.1 + estraverse: 5.3.0 + esutils: 2.0.3 + optionator: 0.8.3 + optionalDependencies: + source-map: 0.6.1 + + /eslint-config-airbnb-base@15.0.0(eslint-plugin-import@2.25.4)(eslint@8.10.0): + resolution: {integrity: sha512-xaX3z4ZZIcFLvh2oUNvcX5oEofXda7giYmuplVxoOg5A7EXJMrUyqRgR+mhDhPK8LZ4PttFOBvCYDbX3sUoUig==} + engines: {node: ^10.12.0 || >=12.0.0} + peerDependencies: + eslint: ^7.32.0 || ^8.2.0 + eslint-plugin-import: ^2.25.2 + dependencies: + confusing-browser-globals: 1.0.11 + eslint: 8.10.0 + eslint-plugin-import: 2.25.4(@typescript-eslint/parser@5.61.0)(eslint-import-resolver-typescript@2.5.0)(eslint@8.10.0) + object.assign: 4.1.2 + object.entries: 1.1.5 + semver: 6.3.1 + dev: true + + /eslint-config-airbnb-typescript@16.1.4(@typescript-eslint/eslint-plugin@5.61.0)(@typescript-eslint/parser@5.61.0)(eslint-plugin-import@2.25.4)(eslint@8.10.0): + resolution: {integrity: sha512-dfm2cEaYXh4mCYd+RyJO8+PQfd5/zp8WwrCeRznly5qD9W5tal3KTjgdInYWuEAdwWnNJxWcmQ/HFiA4bfkM1g==} + peerDependencies: + '@typescript-eslint/eslint-plugin': ^5.0.0 + '@typescript-eslint/parser': ^5.0.0 + eslint: ^7.32.0 || ^8.2.0 + eslint-plugin-import: ^2.25.3 + dependencies: + '@typescript-eslint/eslint-plugin': 5.61.0(@typescript-eslint/parser@5.61.0)(eslint@8.10.0)(typescript@4.5.5) + '@typescript-eslint/parser': 5.61.0(eslint@8.10.0)(typescript@4.5.5) + eslint: 8.10.0 + eslint-config-airbnb-base: 15.0.0(eslint-plugin-import@2.25.4)(eslint@8.10.0) + eslint-plugin-import: 2.25.4(@typescript-eslint/parser@5.61.0)(eslint-import-resolver-typescript@2.5.0)(eslint@8.10.0) + dev: true + + /eslint-config-airbnb@19.0.4(eslint-plugin-import@2.25.4)(eslint-plugin-jsx-a11y@6.5.1)(eslint-plugin-react-hooks@4.3.0)(eslint-plugin-react@7.29.2)(eslint@8.10.0): + resolution: {integrity: sha512-T75QYQVQX57jiNgpF9r1KegMICE94VYwoFQyMGhrvc+lB8YF2E/M/PYDaQe1AJcWaEgqLE+ErXV1Og/+6Vyzew==} + engines: {node: ^10.12.0 || ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^7.32.0 || ^8.2.0 + eslint-plugin-import: ^2.25.3 + eslint-plugin-jsx-a11y: ^6.5.1 + eslint-plugin-react: ^7.28.0 + eslint-plugin-react-hooks: ^4.3.0 + dependencies: + eslint: 8.10.0 + eslint-config-airbnb-base: 15.0.0(eslint-plugin-import@2.25.4)(eslint@8.10.0) + eslint-plugin-import: 2.25.4(@typescript-eslint/parser@5.61.0)(eslint-import-resolver-typescript@2.5.0)(eslint@8.10.0) + eslint-plugin-jsx-a11y: 6.5.1(eslint@8.10.0) + eslint-plugin-react: 7.29.2(eslint@8.10.0) + eslint-plugin-react-hooks: 4.3.0(eslint@8.10.0) + object.assign: 4.1.2 + object.entries: 1.1.5 + dev: true + + /eslint-config-next@12.1.0(eslint@8.10.0)(next@12.3.4)(typescript@4.5.5): + resolution: {integrity: sha512-tBhuUgoDITcdcM7xFvensi9I5WTI4dnvH4ETGRg1U8ZKpXrZsWQFdOKIDzR3RLP5HR3xXrLviaMM4c3zVoE/pA==} + peerDependencies: + eslint: ^7.23.0 || ^8.0.0 + next: '>=10.2.0' + typescript: '>=3.3.1' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@next/eslint-plugin-next': 12.1.0 + '@rushstack/eslint-patch': 1.1.0 + '@typescript-eslint/parser': 5.61.0(eslint@8.10.0)(typescript@4.5.5) + eslint: 8.10.0 + eslint-import-resolver-node: 0.3.6 + eslint-import-resolver-typescript: 2.5.0(eslint-plugin-import@2.25.4)(eslint@8.10.0) + eslint-plugin-import: 2.25.4(@typescript-eslint/parser@5.61.0)(eslint-import-resolver-typescript@2.5.0)(eslint@8.10.0) + eslint-plugin-jsx-a11y: 6.5.1(eslint@8.10.0) + eslint-plugin-react: 7.29.2(eslint@8.10.0) + eslint-plugin-react-hooks: 4.3.0(eslint@8.10.0) + next: 12.3.4(@babel/core@7.17.5)(react-dom@17.0.2)(react@17.0.2) + typescript: 4.5.5 + transitivePeerDependencies: + - eslint-import-resolver-webpack + - supports-color + dev: true + + /eslint-config-prettier@8.5.0(eslint@8.10.0): + resolution: {integrity: sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==} + hasBin: true + peerDependencies: + eslint: '>=7.0.0' + dependencies: + eslint: 8.10.0 + dev: true + + /eslint-import-resolver-node@0.3.6: + resolution: {integrity: sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==} + dependencies: + debug: 3.2.7 + resolve: 1.22.0 + transitivePeerDependencies: + - supports-color + dev: true + + /eslint-import-resolver-typescript@2.5.0(eslint-plugin-import@2.25.4)(eslint@8.10.0): + resolution: {integrity: sha512-qZ6e5CFr+I7K4VVhQu3M/9xGv9/YmwsEXrsm3nimw8vWaVHRDrQRp26BgCypTxBp3vUp4o5aVEJRiy0F2DFddQ==} + engines: {node: '>=4'} + peerDependencies: + eslint: '*' + eslint-plugin-import: '*' + dependencies: + debug: 4.3.4 + eslint: 8.10.0 + eslint-plugin-import: 2.25.4(@typescript-eslint/parser@5.61.0)(eslint-import-resolver-typescript@2.5.0)(eslint@8.10.0) + glob: 7.2.0 + is-glob: 4.0.3 + resolve: 1.22.0 + tsconfig-paths: 3.12.0 + transitivePeerDependencies: + - supports-color + dev: true + + /eslint-module-utils@2.7.3(@typescript-eslint/parser@5.61.0)(eslint-import-resolver-node@0.3.6)(eslint-import-resolver-typescript@2.5.0): + resolution: {integrity: sha512-088JEC7O3lDZM9xGe0RerkOMd0EjFl+Yvd1jPWIkMT5u3H9+HC34mWWPnqPrN13gieT9pBOO+Qt07Nb/6TresQ==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint-import-resolver-node: '*' + eslint-import-resolver-typescript: '*' + eslint-import-resolver-webpack: '*' + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + eslint-import-resolver-node: + optional: true + eslint-import-resolver-typescript: + optional: true + eslint-import-resolver-webpack: + optional: true + dependencies: + '@typescript-eslint/parser': 5.61.0(eslint@8.10.0)(typescript@4.5.5) + debug: 3.2.7 + eslint-import-resolver-node: 0.3.6 + eslint-import-resolver-typescript: 2.5.0(eslint-plugin-import@2.25.4)(eslint@8.10.0) + find-up: 2.1.0 + transitivePeerDependencies: + - supports-color + dev: true + + /eslint-plugin-import@2.25.4(@typescript-eslint/parser@5.61.0)(eslint-import-resolver-typescript@2.5.0)(eslint@8.10.0): + resolution: {integrity: sha512-/KJBASVFxpu0xg1kIBn9AUa8hQVnszpwgE7Ld0lKAlx7Ie87yzEzCgSkekt+le/YVhiaosO4Y14GDAOc41nfxA==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + dependencies: + '@typescript-eslint/parser': 5.61.0(eslint@8.10.0)(typescript@4.5.5) + array-includes: 3.1.4 + array.prototype.flat: 1.2.5 + debug: 2.6.9 + doctrine: 2.1.0 + eslint: 8.10.0 + eslint-import-resolver-node: 0.3.6 + eslint-module-utils: 2.7.3(@typescript-eslint/parser@5.61.0)(eslint-import-resolver-node@0.3.6)(eslint-import-resolver-typescript@2.5.0) + has: 1.0.3 + is-core-module: 2.8.1 + is-glob: 4.0.3 + minimatch: 3.1.2 + object.values: 1.1.5 + resolve: 1.22.0 + tsconfig-paths: 3.12.0 + transitivePeerDependencies: + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - supports-color + dev: true + + /eslint-plugin-jsx-a11y@6.5.1(eslint@8.10.0): + resolution: {integrity: sha512-sVCFKX9fllURnXT2JwLN5Qgo24Ug5NF6dxhkmxsMEUZhXRcGg+X3e1JbJ84YePQKBl5E0ZjAH5Q4rkdcGY99+g==} + engines: {node: '>=4.0'} + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 + dependencies: + '@babel/runtime': 7.17.2 + aria-query: 4.2.2 + array-includes: 3.1.4 + ast-types-flow: 0.0.7 + axe-core: 4.4.1 + axobject-query: 2.2.0 + damerau-levenshtein: 1.0.8 + emoji-regex: 9.2.2 + eslint: 8.10.0 + has: 1.0.3 + jsx-ast-utils: 3.2.1 + language-tags: 1.0.5 + minimatch: 3.1.2 + dev: true + + /eslint-plugin-prettier@4.0.0(eslint-config-prettier@8.5.0)(eslint@8.10.0)(prettier@2.4.1): + resolution: {integrity: sha512-98MqmCJ7vJodoQK359bqQWaxOE0CS8paAz/GgjaZLyex4TTk3g9HugoO89EqWCrFiOqn9EVvcoo7gZzONCWVwQ==} + engines: {node: '>=6.0.0'} + peerDependencies: + eslint: '>=7.28.0' + eslint-config-prettier: '*' + prettier: '>=2.0.0' + peerDependenciesMeta: + eslint-config-prettier: + optional: true + dependencies: + eslint: 8.10.0 + eslint-config-prettier: 8.5.0(eslint@8.10.0) + prettier: 2.4.1 + prettier-linter-helpers: 1.0.0 + dev: true + + /eslint-plugin-react-hooks@4.3.0(eslint@8.10.0): + resolution: {integrity: sha512-XslZy0LnMn+84NEG9jSGR6eGqaZB3133L8xewQo3fQagbQuGt7a63gf+P1NGKZavEYEC3UXaWEAA/AqDkuN6xA==} + engines: {node: '>=10'} + peerDependencies: + eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 + dependencies: + eslint: 8.10.0 + dev: true + + /eslint-plugin-react@7.29.2(eslint@8.10.0): + resolution: {integrity: sha512-ypEBTKOy5liFQXZWMchJ3LN0JX1uPI6n7MN7OPHKacqXAxq5gYC30TdO7wqGYQyxD1OrzpobdHC3hDmlRWDg9w==} + engines: {node: '>=4'} + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 + dependencies: + array-includes: 3.1.4 + array.prototype.flatmap: 1.2.5 + doctrine: 2.1.0 + eslint: 8.10.0 + estraverse: 5.3.0 + jsx-ast-utils: 3.2.1 + minimatch: 3.1.2 + object.entries: 1.1.5 + object.fromentries: 2.0.5 + object.hasown: 1.1.0 + object.values: 1.1.5 + prop-types: 15.8.1 + resolve: 2.0.0-next.3 + semver: 6.3.1 + string.prototype.matchall: 4.0.6 + dev: true + + /eslint-plugin-storybook@0.5.7(eslint@8.10.0)(typescript@4.5.5): + resolution: {integrity: sha512-rko/QUHa3/hrC3W5RmPrukKawCyGeVqSuwzyLZO6aV/neyOPrgkL/LED8u6NQJSaT1qZFT+7iLQ1eE8Ce7G+aA==} + engines: {node: 12.x || 14.x || >= 16} + peerDependencies: + eslint: '>=6' + dependencies: + '@storybook/csf': 0.0.1 + '@typescript-eslint/experimental-utils': 5.13.0(eslint@8.10.0)(typescript@4.5.5) + eslint: 8.10.0 + requireindex: 1.2.0 + transitivePeerDependencies: + - supports-color + - typescript + dev: true + + /eslint-scope@4.0.3: + resolution: {integrity: sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==} + engines: {node: '>=4.0.0'} + dependencies: + esrecurse: 4.3.0 + estraverse: 4.3.0 + dev: true + + /eslint-scope@5.1.1: + resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} + engines: {node: '>=8.0.0'} + dependencies: + esrecurse: 4.3.0 + estraverse: 4.3.0 + dev: true + + /eslint-scope@7.1.1: + resolution: {integrity: sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + dev: true + + /eslint-utils@3.0.0(eslint@8.10.0): + resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==} + engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0} + peerDependencies: + eslint: '>=5' + dependencies: + eslint: 8.10.0 + eslint-visitor-keys: 2.1.0 + dev: true + + /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: + resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} + engines: {node: '>=10'} + dev: true + + /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@8.10.0: + resolution: {integrity: sha512-tcI1D9lfVec+R4LE1mNDnzoJ/f71Kl/9Cv4nG47jOueCMBrCCKYXr4AUVS7go6mWYGFD4+EoN6+eXSrEbRzXVw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + hasBin: true + dependencies: + '@eslint/eslintrc': 1.2.0 + '@humanwhocodes/config-array': 0.9.5 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.3 + debug: 4.3.4 + doctrine: 3.0.0 + escape-string-regexp: 4.0.0 + eslint-scope: 7.1.1 + eslint-utils: 3.0.0(eslint@8.10.0) + eslint-visitor-keys: 3.3.0 + espree: 9.3.1 + esquery: 1.4.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 6.0.1 + functional-red-black-tree: 1.0.1 + glob-parent: 6.0.2 + globals: 13.12.1 + ignore: 5.2.0 + import-fresh: 3.3.0 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + js-yaml: 4.1.0 + json-stable-stringify-without-jsonify: 1.0.1 + levn: 0.4.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.1 + regexpp: 3.2.0 + strip-ansi: 6.0.1 + strip-json-comments: 3.1.1 + text-table: 0.2.0 + v8-compile-cache: 2.3.0 + transitivePeerDependencies: + - supports-color + dev: true + + /espree@9.3.1: + resolution: {integrity: sha512-bvdyLmJMfwkV3NCRl5ZhJf22zBFo1y8bYh3VYb+bfzqNB4Je68P2sSuXyuFquzWLebHpNd2/d5uv7yoP9ISnGQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + acorn: 8.7.1 + acorn-jsx: 5.3.2(acorn@8.7.1) + eslint-visitor-keys: 3.3.0 + dev: true + + /esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + + /esquery@1.4.0: + resolution: {integrity: sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==} + engines: {node: '>=0.10'} + dependencies: + estraverse: 5.3.0 + dev: true + + /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: + resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} + engines: {node: '>=4.0'} + dev: true + + /estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + /estree-to-babel@3.2.1: + resolution: {integrity: sha512-YNF+mZ/Wu2FU/gvmzuWtYc8rloubL7wfXCTgouFrnjGVXPA/EeYYA7pupXWrb3Iv1cTBeSSxxJIbK23l4MRNqg==} + engines: {node: '>=8.3.0'} + dependencies: + '@babel/traverse': 7.23.2 + '@babel/types': 7.23.0 + c8: 7.11.0 + transitivePeerDependencies: + - supports-color + dev: true + + /estree-util-attach-comments@2.0.0: + resolution: {integrity: sha512-kT9YVRvlt2ewPp9BazfIIgXMGsXOEpOm57bK8aa4F3eOEndMml2JAETjWaG3SZYHmC6axSNIzHGY718dYwIuVg==} + dependencies: + '@types/estree': 0.0.46 + dev: false + + /estree-util-build-jsx@2.0.0: + resolution: {integrity: sha512-d49hPGqBCJF/bF06g1Ywg7zjH1mrrUdPPrixBlKBxcX4WvMYlUUJ8BkrwlzWc8/fm6XqGgk5jilhgeZBDEGwOQ==} + dependencies: + '@types/estree-jsx': 0.0.1 + estree-util-is-identifier-name: 2.0.0 + estree-walker: 3.0.1 + dev: false + + /estree-util-is-identifier-name@2.0.0: + resolution: {integrity: sha512-aXXZFVMnBBDRP81vS4YtAYJ0hUkgEsXea7lNKWCOeaAquGb1Jm2rcONPB5fpzwgbNxulTvrWuKnp9UElUGAKeQ==} + dev: false + + /estree-util-visit@1.1.0: + resolution: {integrity: sha512-3lXJ4Us9j8TUif9cWcQy81t9p5OLasnDuuhrFiqb+XstmKC1d1LmrQWYsY49/9URcfHE64mPypDBaNK9NwWDPQ==} + dependencies: + '@types/estree-jsx': 0.0.1 + '@types/unist': 2.0.6 + dev: false + + /estree-walker@0.6.1: + resolution: {integrity: sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==} + dev: false + + /estree-walker@3.0.1: + resolution: {integrity: sha512-woY0RUD87WzMBUiZLx8NsYr23N5BKsOMZHhu2hoNRVh6NXGfoiT1KOL8G3UHlJAnEDGmfa5ubNA/AacfG+Kb0g==} + dev: false + + /esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + /etag@1.8.1: + resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} + engines: {node: '>= 0.6'} + dev: true + + /events@3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} + dev: true + + /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 + + /exec-sh@0.3.6: + resolution: {integrity: sha512-nQn+hI3yp+oD0huYhKwvYI32+JFeq+XkNcD1GAo3Y/MjxsfVGmrrzrnzjWiNY6f+pUCP440fThsFh5gZrRAU/w==} + dev: true + + /execa@1.0.0: + resolution: {integrity: sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==} + engines: {node: '>=6'} + dependencies: + cross-spawn: 6.0.5 + get-stream: 4.1.0 + is-stream: 1.1.0 + npm-run-path: 2.0.2 + p-finally: 1.0.0 + signal-exit: 3.0.7 + strip-eof: 1.0.0 + dev: true + + /expand-brackets@2.1.4: + resolution: {integrity: sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==} + engines: {node: '>=0.10.0'} + dependencies: + debug: 2.6.9 + define-property: 0.2.5 + extend-shallow: 2.0.1 + posix-character-classes: 0.1.1 + regex-not: 1.0.2 + snapdragon: 0.8.2 + to-regex: 3.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + /express@4.17.3: + resolution: {integrity: sha512-yuSQpz5I+Ch7gFrPCk4/c+dIBKlQUxtgwqzph132bsT6qhuzss6I8cLJQz7B3rFblzd6wtcI0ZbGltH/C4LjUg==} + engines: {node: '>= 0.10.0'} + dependencies: + accepts: 1.3.8 + array-flatten: 1.1.1 + body-parser: 1.19.2 + content-disposition: 0.5.4 + content-type: 1.0.4 + cookie: 0.4.2 + cookie-signature: 1.0.6 + debug: 2.6.9 + depd: 1.1.2 + encodeurl: 1.0.2 + escape-html: 1.0.3 + etag: 1.8.1 + finalhandler: 1.1.2 + fresh: 0.5.2 + merge-descriptors: 1.0.1 + methods: 1.1.2 + on-finished: 2.3.0 + parseurl: 1.3.3 + path-to-regexp: 0.1.7 + proxy-addr: 2.0.7 + qs: 6.9.7 + range-parser: 1.2.1 + safe-buffer: 5.2.1 + send: 0.17.2 + serve-static: 1.14.2 + setprototypeof: 1.2.0 + statuses: 1.5.0 + type-is: 1.6.18 + utils-merge: 1.0.1 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + dev: true + + /extend-shallow@2.0.1: + resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} + engines: {node: '>=0.10.0'} + dependencies: + is-extendable: 0.1.1 + + /extend-shallow@3.0.2: + resolution: {integrity: sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==} + engines: {node: '>=0.10.0'} + dependencies: + assign-symbols: 1.0.0 + is-extendable: 1.0.1 + dev: true + + /extend@3.0.2: + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + + /extglob@2.0.4: + resolution: {integrity: sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==} + engines: {node: '>=0.10.0'} + dependencies: + array-unique: 0.3.2 + define-property: 1.0.0 + expand-brackets: 2.1.4 + extend-shallow: 2.0.1 + fragment-cache: 0.2.1 + regex-not: 1.0.2 + snapdragon: 0.8.2 + to-regex: 3.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + /fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + dev: true + + /fast-diff@1.2.0: + resolution: {integrity: sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==} + dev: true + + /fast-glob@2.2.7: + resolution: {integrity: sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw==} + engines: {node: '>=4.0.0'} + dependencies: + '@mrmlnc/readdir-enhanced': 2.2.1 + '@nodelib/fs.stat': 1.1.3 + glob-parent: 3.1.0 + is-glob: 4.0.3 + merge2: 1.4.1 + micromatch: 3.1.10 + transitivePeerDependencies: + - supports-color + dev: true + + /fast-glob@3.2.11: + resolution: {integrity: sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==} + engines: {node: '>=8.6.0'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.4 + dev: true + + /fast-json-parse@1.0.3: + resolution: {integrity: sha512-FRWsaZRWEJ1ESVNbDWmsAlqDk96gPQezzLghafp5J4GUKjbCz3OkAHuZs5TuPEtkbVQERysLp9xv6c24fBm8Aw==} + dev: true + + /fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + dev: true + + /fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + + /fastq@1.13.0: + resolution: {integrity: sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==} + dependencies: + reusify: 1.0.4 + dev: true + + /fault@1.0.4: + resolution: {integrity: sha512-CJ0HCB5tL5fYTEA7ToAq5+kTwd++Borf1/bifxd9iT70QcXr4MRrO3Llf8Ifs70q+SJcGHFtnIE/Nw6giCtECA==} + dependencies: + format: 0.2.2 + dev: true + + /fb-watchman@2.0.1: + resolution: {integrity: sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==} + dependencies: + bser: 2.1.1 + dev: true + + /fbemitter@3.0.0: + resolution: {integrity: sha512-KWKaceCwKQU0+HPoop6gn4eOHk50bBv/VxjJtGMfwmJt3D29JpN4H4eisCtIPA+a8GVBam+ldMMpMjJUvpDyHw==} + dependencies: + fbjs: 3.0.4 + transitivePeerDependencies: + - encoding + dev: true + + /fbjs-css-vars@1.0.2: + resolution: {integrity: sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ==} + dev: true + + /fbjs@3.0.4: + resolution: {integrity: sha512-ucV0tDODnGV3JCnnkmoszb5lf4bNpzjv80K41wd4k798Etq+UYD0y0TIfalLjZoKgjive6/adkRnszwapiDgBQ==} + dependencies: + cross-fetch: 3.1.5 + fbjs-css-vars: 1.0.2 + loose-envify: 1.4.0 + object-assign: 4.1.1 + promise: 7.3.1 + setimmediate: 1.0.5 + ua-parser-js: 0.7.33 + transitivePeerDependencies: + - encoding + dev: true + + /figgy-pudding@3.5.2: + resolution: {integrity: sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==} + dev: true + + /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 + + /file-loader@6.2.0(webpack@4.46.0): + resolution: {integrity: sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==} + engines: {node: '>= 10.13.0'} + peerDependencies: + webpack: ^4.0.0 || ^5.0.0 + dependencies: + loader-utils: 2.0.2 + schema-utils: 3.1.1 + webpack: 4.46.0 + dev: true + + /file-system-cache@1.0.5: + resolution: {integrity: sha512-w9jqeQdOeVaXBCgl4c90XJ6zI8MguJgSiC5LsLdhUu6eSCzcRHPPXUF3lkKMagpzHi+6GnDkjv9BtxMmXdvptA==} + dependencies: + bluebird: 3.7.2 + fs-extra: 0.30.0 + ramda: 0.21.0 + dev: true + + /file-uri-to-path@1.0.0: + resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} + requiresBuild: true + dev: true + optional: true + + /fill-range@4.0.0: + resolution: {integrity: sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==} + engines: {node: '>=0.10.0'} + dependencies: + extend-shallow: 2.0.1 + is-number: 3.0.0 + repeat-string: 1.6.1 + to-regex-range: 2.1.1 + dev: true + + /fill-range@7.0.1: + resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + engines: {node: '>=8'} + dependencies: + to-regex-range: 5.0.1 + dev: true + + /finalhandler@1.1.2: + resolution: {integrity: sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==} + engines: {node: '>= 0.8'} + dependencies: + debug: 2.6.9 + encodeurl: 1.0.2 + escape-html: 1.0.3 + on-finished: 2.3.0 + parseurl: 1.3.3 + statuses: 1.5.0 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /find-cache-dir@2.1.0: + resolution: {integrity: sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==} + engines: {node: '>=6'} + dependencies: + commondir: 1.0.1 + make-dir: 2.1.0 + pkg-dir: 3.0.0 + dev: true + + /find-cache-dir@3.3.2: + resolution: {integrity: sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==} + engines: {node: '>=8'} + dependencies: + commondir: 1.0.1 + make-dir: 3.1.0 + pkg-dir: 4.2.0 + dev: true + + /find-root@1.1.0: + resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==} + dev: true + + /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@3.0.0: + resolution: {integrity: sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==} + engines: {node: '>=6'} + dependencies: + locate-path: 3.0.0 + + /find-up@4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + dependencies: + locate-path: 5.0.0 + path-exists: 4.0.0 + dev: true + + /find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + dev: true + + /flat-cache@3.0.4: + resolution: {integrity: sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==} + engines: {node: ^10.12.0 || >=12.0.0} + dependencies: + flatted: 3.2.5 + rimraf: 3.0.2 + dev: true + + /flat@5.0.2: + resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} + hasBin: true + dev: true + + /flatted@3.2.5: + resolution: {integrity: sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==} + dev: true + + /flush-write-stream@1.1.1: + resolution: {integrity: sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==} + dependencies: + inherits: 2.0.4 + readable-stream: 2.3.7 + dev: true + + /flux@4.0.3(react@17.0.2): + resolution: {integrity: sha512-yKAbrp7JhZhj6uiT1FTuVMlIAT1J4jqEyBpFApi1kxpGZCvacMVc/t1pMQyotqHhAgvoE3bNvAykhCo2CLjnYw==} + peerDependencies: + react: ^15.0.2 || ^16.0.0 || ^17.0.0 + dependencies: + fbemitter: 3.0.0 + fbjs: 3.0.4 + react: 17.0.2 + transitivePeerDependencies: + - encoding + dev: true + + /for-in@1.0.2: + resolution: {integrity: sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==} + engines: {node: '>=0.10.0'} + dev: true + + /foreach@2.0.5: + resolution: {integrity: sha512-ZBbtRiapkZYLsqoPyZOR+uPfto0GRMNQN1GwzZtZt7iZvPPbDDQV0JF5Hx4o/QFQ5c0vyuoZ98T8RSBbopzWtA==} + dev: true + + /foreground-child@2.0.0: + resolution: {integrity: sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==} + engines: {node: '>=8.0.0'} + dependencies: + cross-spawn: 7.0.3 + signal-exit: 3.0.7 + dev: true + + /fork-ts-checker-webpack-plugin@4.1.6(eslint@8.10.0)(typescript@4.5.5)(webpack@4.46.0): + resolution: {integrity: sha512-DUxuQaKoqfNne8iikd14SAkh5uw4+8vNifp6gmA73yYNS6ywLIWSLD/n/mBzHQRpW3J7rbATEakmiA8JvkTyZw==} + engines: {node: '>=6.11.5', yarn: '>=1.0.0'} + peerDependencies: + eslint: '>= 6' + typescript: '>= 2.7' + vue-template-compiler: '*' + webpack: '>= 4' + peerDependenciesMeta: + eslint: + optional: true + vue-template-compiler: + optional: true + dependencies: + '@babel/code-frame': 7.22.13 + chalk: 2.4.2 + eslint: 8.10.0 + micromatch: 3.1.10 + minimatch: 3.1.2 + semver: 5.7.2 + tapable: 1.1.3 + typescript: 4.5.5 + webpack: 4.46.0 + worker-rpc: 0.1.1 + transitivePeerDependencies: + - supports-color + dev: true + + /fork-ts-checker-webpack-plugin@6.5.0(eslint@8.10.0)(typescript@4.5.5)(webpack@4.46.0): + resolution: {integrity: sha512-cS178Y+xxtIjEUorcHddKS7yCMlrDPV31mt47blKKRfMd70Kxu5xruAFE2o9sDY6wVC5deuob/u/alD04YYHnw==} + engines: {node: '>=10', yarn: '>=1.0.0'} + peerDependencies: + eslint: '>= 6' + typescript: '>= 2.7' + vue-template-compiler: '*' + webpack: '>= 4' + peerDependenciesMeta: + eslint: + optional: true + vue-template-compiler: + optional: true + dependencies: + '@babel/code-frame': 7.22.13 + '@types/json-schema': 7.0.9 + chalk: 4.1.2 + chokidar: 3.5.3 + cosmiconfig: 6.0.0 + deepmerge: 4.2.2 + eslint: 8.10.0 + fs-extra: 9.1.0 + glob: 7.2.0 + memfs: 3.4.1 + minimatch: 3.1.2 + schema-utils: 2.7.0 + semver: 7.5.4 + tapable: 1.1.3 + typescript: 4.5.5 + webpack: 4.46.0 + dev: true + + /form-data@3.0.1: + resolution: {integrity: sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==} + engines: {node: '>= 6'} + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.34 + + /format@0.2.2: + resolution: {integrity: sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==} + engines: {node: '>=0.4.x'} + dev: true + + /forwarded@0.2.0: + resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} + engines: {node: '>= 0.6'} + dev: true + + /fragment-cache@0.2.1: + resolution: {integrity: sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==} + engines: {node: '>=0.10.0'} + dependencies: + map-cache: 0.2.2 + dev: true + + /fresh@0.5.2: + resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} + engines: {node: '>= 0.6'} + dev: true + + /from2@2.3.0: + resolution: {integrity: sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==} + dependencies: + inherits: 2.0.4 + readable-stream: 2.3.7 + dev: true + + /fs-extra@0.30.0: + resolution: {integrity: sha512-UvSPKyhMn6LEd/WpUaV9C9t3zATuqoqfWc3QdPhPLb58prN9tqYPlPWi8Krxi44loBoUzlobqZ3+8tGpxxSzwA==} + dependencies: + graceful-fs: 4.2.9 + jsonfile: 2.4.0 + klaw: 1.3.1 + path-is-absolute: 1.0.1 + rimraf: 2.7.1 + dev: true + + /fs-extra@9.1.0: + resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} + engines: {node: '>=10'} + dependencies: + at-least-node: 1.0.0 + graceful-fs: 4.2.9 + jsonfile: 6.1.0 + universalify: 2.0.0 + dev: true + + /fs-minipass@2.1.0: + resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} + engines: {node: '>= 8'} + dependencies: + minipass: 3.1.6 + dev: true + + /fs-monkey@1.0.3: + resolution: {integrity: sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==} + dev: true + + /fs-write-stream-atomic@1.0.10: + resolution: {integrity: sha512-gehEzmPn2nAwr39eay+x3X34Ra+M2QlVUTLhkXPjWdeO8RF9kszk116avgBJM3ZyNHgHXBNx+VmPaFC36k0PzA==} + dependencies: + graceful-fs: 4.2.9 + iferr: 0.1.5 + imurmurhash: 0.1.4 + readable-stream: 2.3.7 + dev: true + + /fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + /fsevents@1.2.13: + resolution: {integrity: sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==} + engines: {node: '>= 4.0'} + os: [darwin] + deprecated: The v1 package contains DANGEROUS / INSECURE binaries. Upgrade to safe fsevents v2 + requiresBuild: true + dependencies: + bindings: 1.5.0 + nan: 2.15.0 + dev: true + optional: true + + /fsevents@2.3.2: + resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /function-bind@1.1.1: + resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} + + /function.prototype.name@1.1.5: + resolution: {integrity: sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.1.3 + es-abstract: 1.19.1 + functions-have-names: 1.2.2 + dev: true + + /functional-red-black-tree@1.0.1: + resolution: {integrity: sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==} + dev: true + + /functions-have-names@1.2.2: + resolution: {integrity: sha512-bLgc3asbWdwPbx2mNk2S49kmJCuQeu0nfmaOgbs8WIyzzkw3r4htszdIi9Q9EMezDPTYuJx2wvjZ/EwgAthpnA==} + dev: true + + /fuse.js@3.6.1: + resolution: {integrity: sha512-hT9yh/tiinkmirKrlv4KWOjztdoZo1mx9Qh4KvWqC7isoXwdUY3PNWUxceF4/qO9R6riA2C29jdTOeQOIROjgw==} + engines: {node: '>=6'} + dev: true + + /gauge@3.0.2: + resolution: {integrity: sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==} + engines: {node: '>=10'} + dependencies: + aproba: 2.0.0 + color-support: 1.1.3 + console-control-strings: 1.1.0 + has-unicode: 2.0.1 + object-assign: 4.1.1 + signal-exit: 3.0.7 + string-width: 4.2.3 + strip-ansi: 6.0.1 + wide-align: 1.1.5 + dev: true + + /gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + + /get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + /get-intrinsic@1.1.1: + resolution: {integrity: sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==} + dependencies: + function-bind: 1.1.1 + has: 1.0.3 + has-symbols: 1.0.2 + + /get-package-type@0.1.0: + resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} + engines: {node: '>=8.0.0'} + dev: true + + /get-stream@4.1.0: + resolution: {integrity: sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==} + engines: {node: '>=6'} + dependencies: + pump: 3.0.0 + dev: true + + /get-symbol-description@1.0.0: + resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.1.1 + dev: true + + /get-value@2.0.6: + resolution: {integrity: sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==} + engines: {node: '>=0.10.0'} + dev: true + + /github-slugger@1.4.0: + resolution: {integrity: sha512-w0dzqw/nt51xMVmlaV1+JRzN+oCa1KfcgGEWhxUG16wbdA+Xnt/yoFO8Z8x/V82ZcZ0wy6ln9QDup5avbhiDhQ==} + dev: true + + /glob-parent@3.1.0: + resolution: {integrity: sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==} + dependencies: + is-glob: 3.1.0 + path-dirname: 1.0.2 + dev: true + + /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: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + dependencies: + is-glob: 4.0.3 + dev: true + + /glob-promise@3.4.0(glob@7.2.0): + resolution: {integrity: sha512-q08RJ6O+eJn+dVanerAndJwIcumgbDdYiUT7zFQl3Wm1xD6fBKtah7H8ZJChj4wP+8C+QfeVy8xautR7rdmKEw==} + engines: {node: '>=4'} + peerDependencies: + glob: '*' + dependencies: + '@types/glob': 8.1.0 + glob: 7.2.0 + dev: true + + /glob-to-regexp@0.3.0: + resolution: {integrity: sha512-Iozmtbqv0noj0uDDqoL0zNq0VBEfK2YFoMAZoxJe4cwphvLR+JskfF30QhXHOR4m3KrE6NLRYw+U9MRXvifyig==} + dev: true + + /glob-to-regexp@0.4.1: + resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} + dev: true + + /glob@7.1.7: + resolution: {integrity: sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + dev: true + + /glob@7.2.0: + resolution: {integrity: sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + + /glob@8.0.1: + resolution: {integrity: sha512-cF7FYZZ47YzmCu7dDy50xSRRfO3ErRfrXuLZcNIuyiJEco0XSrGtuilG19L5xp3NcwTx7Gn+X6Tv3fmsUPTbow==} + engines: {node: '>=12'} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 5.0.1 + once: 1.4.0 + path-is-absolute: 1.0.1 + dev: false + + /global@4.4.0: + resolution: {integrity: sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==} + dependencies: + min-document: 2.19.0 + process: 0.11.10 + dev: true + + /globals@11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} + + /globals@13.12.1: + resolution: {integrity: sha512-317dFlgY2pdJZ9rspXDks7073GpDmXdfbM3vYYp0HAMKGDh1FfWPleI2ljVNLQX5M5lXcAslTcPTrOrMEFOjyw==} + engines: {node: '>=8'} + dependencies: + type-fest: 0.20.2 + dev: true + + /globalthis@1.0.2: + resolution: {integrity: sha512-ZQnSFO1la8P7auIOQECnm0sSuoMeaSq0EEdXMBFF2QJO4uNcwbyhSgG3MruWNbFTqCLmxVwGOl7LZ9kASvHdeQ==} + engines: {node: '>= 0.4'} + dependencies: + define-properties: 1.1.3 + dev: true + + /globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.2.11 + ignore: 5.2.0 + merge2: 1.4.1 + slash: 3.0.0 + dev: true + + /globby@9.2.0: + resolution: {integrity: sha512-ollPHROa5mcxDEkwg6bPt3QbEf4pDQSNtd6JPL1YvOvAo/7/0VAm9TccUeoTmarjPw4pfUthSCqcyfNB1I3ZSg==} + engines: {node: '>=6'} + dependencies: + '@types/glob': 7.2.0 + array-union: 1.0.2 + dir-glob: 2.2.2 + fast-glob: 2.2.7 + glob: 7.2.0 + ignore: 4.0.6 + pify: 4.0.1 + slash: 2.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /graceful-fs@4.2.9: + resolution: {integrity: sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==} + + /graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + dev: true + + /gray-matter@4.0.3: + resolution: {integrity: sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==} + engines: {node: '>=6.0'} + dependencies: + js-yaml: 3.14.1 + kind-of: 6.0.3 + section-matter: 1.0.0 + strip-bom-string: 1.0.0 + dev: false + + /gzip-size@6.0.0: + resolution: {integrity: sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==} + engines: {node: '>=10'} + dependencies: + duplexer: 0.1.2 + dev: true + + /handlebars@4.7.7: + resolution: {integrity: sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==} + engines: {node: '>=0.4.7'} + hasBin: true + dependencies: + minimist: 1.2.7 + neo-async: 2.6.2 + source-map: 0.6.1 + wordwrap: 1.0.0 + optionalDependencies: + uglify-js: 3.15.2 + dev: true + + /has-bigints@1.0.1: + resolution: {integrity: sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==} + dev: true + + /has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + + /has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + dev: true + + /has-glob@1.0.0: + resolution: {integrity: sha512-D+8A457fBShSEI3tFCj65PAbT++5sKiFtdCdOam0gnfBgw9D277OERk+HM9qYJXmdVLZ/znez10SqHN0BBQ50g==} + engines: {node: '>=0.10.0'} + dependencies: + is-glob: 3.1.0 + dev: true + + /has-symbols@1.0.2: + resolution: {integrity: sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==} + engines: {node: '>= 0.4'} + + /has-tostringtag@1.0.0: + resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==} + engines: {node: '>= 0.4'} + dependencies: + has-symbols: 1.0.2 + dev: true + + /has-unicode@2.0.1: + resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==} + dev: true + + /has-value@0.3.1: + resolution: {integrity: sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==} + engines: {node: '>=0.10.0'} + dependencies: + get-value: 2.0.6 + has-values: 0.1.4 + isobject: 2.1.0 + dev: true + + /has-value@1.0.0: + resolution: {integrity: sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==} + engines: {node: '>=0.10.0'} + dependencies: + get-value: 2.0.6 + has-values: 1.0.0 + isobject: 3.0.1 + dev: true + + /has-values@0.1.4: + resolution: {integrity: sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==} + engines: {node: '>=0.10.0'} + dev: true + + /has-values@1.0.0: + resolution: {integrity: sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==} + engines: {node: '>=0.10.0'} + dependencies: + is-number: 3.0.0 + kind-of: 4.0.0 + dev: true + + /has@1.0.3: + resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} + engines: {node: '>= 0.4.0'} + dependencies: + function-bind: 1.1.1 + + /hash-base@3.1.0: + resolution: {integrity: sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==} + engines: {node: '>=4'} + dependencies: + inherits: 2.0.4 + readable-stream: 3.6.2 + safe-buffer: 5.2.1 + dev: true + + /hash.js@1.1.7: + resolution: {integrity: sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==} + dependencies: + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + dev: true + + /hast-to-hyperscript@9.0.1: + resolution: {integrity: sha512-zQgLKqF+O2F72S1aa4y2ivxzSlko3MAvxkwG8ehGmNiqd98BIN3JM1rAJPmplEyLmGLO2QZYJtIneOSZ2YbJuA==} + dependencies: + '@types/unist': 2.0.6 + comma-separated-tokens: 1.0.8 + property-information: 5.6.0 + space-separated-tokens: 1.1.5 + style-to-object: 0.3.0 + unist-util-is: 4.1.0 + web-namespaces: 1.1.4 + dev: true + + /hast-util-from-parse5@6.0.1: + resolution: {integrity: sha512-jeJUWiN5pSxW12Rh01smtVkZgZr33wBokLzKLwinYOUfSzm1Nl/c3GUGebDyOKjdsRgMvoVbV0VpAcpjF4NrJA==} + dependencies: + '@types/parse5': 5.0.3 + hastscript: 6.0.0 + property-information: 5.6.0 + vfile: 4.2.1 + vfile-location: 3.2.0 + web-namespaces: 1.1.4 + + /hast-util-parse-selector@2.2.5: + resolution: {integrity: sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ==} + + /hast-util-parse-selector@3.1.0: + resolution: {integrity: sha512-AyjlI2pTAZEOeu7GeBPZhROx0RHBnydkQIXlhnFzDi0qfXTmGUWoCYZtomHbrdrheV4VFUlPcfJ6LMF5T6sQzg==} + dependencies: + '@types/hast': 2.3.4 + dev: false + + /hast-util-raw@6.0.1: + resolution: {integrity: sha512-ZMuiYA+UF7BXBtsTBNcLBF5HzXzkyE6MLzJnL605LKE8GJylNjGc4jjxazAHUtcwT5/CEt6afRKViYB4X66dig==} + dependencies: + '@types/hast': 2.3.4 + hast-util-from-parse5: 6.0.1 + hast-util-to-parse5: 6.0.0 + html-void-elements: 1.0.5 + parse5: 6.0.1 + unist-util-position: 3.1.0 + vfile: 4.2.1 + web-namespaces: 1.1.4 + xtend: 4.0.2 + zwitch: 1.0.5 + dev: true + + /hast-util-to-estree@2.0.2: + resolution: {integrity: sha512-UQrZVeBj6A9od0lpFvqHKNSH9zvDrNoyWKbveu1a2oSCXEDUI+3bnd6BoiQLPnLrcXXn/jzJ6y9hmJTTlvf8lQ==} + dependencies: + '@types/estree-jsx': 0.0.1 + '@types/hast': 2.3.4 + '@types/unist': 2.0.6 + comma-separated-tokens: 2.0.2 + estree-util-attach-comments: 2.0.0 + estree-util-is-identifier-name: 2.0.0 + hast-util-whitespace: 2.0.0 + mdast-util-mdx-expression: 1.2.0 + mdast-util-mdxjs-esm: 1.2.0 + property-information: 6.1.1 + space-separated-tokens: 2.0.1 + style-to-object: 0.3.0 + unist-util-position: 4.0.2 + zwitch: 2.0.2 + transitivePeerDependencies: + - supports-color + dev: false + + /hast-util-to-parse5@6.0.0: + resolution: {integrity: sha512-Lu5m6Lgm/fWuz8eWnrKezHtVY83JeRGaNQ2kn9aJgqaxvVkFCZQBEhgodZUDUvoodgyROHDb3r5IxAEdl6suJQ==} + dependencies: + hast-to-hyperscript: 9.0.1 + property-information: 5.6.0 + web-namespaces: 1.1.4 + xtend: 4.0.2 + zwitch: 1.0.5 + dev: true + + /hast-util-whitespace@2.0.0: + resolution: {integrity: sha512-Pkw+xBHuV6xFeJprJe2BBEoDV+AvQySaz3pPDRUs5PNZEMQjpXJJueqrpcHIXxnWTcAGi/UOCgVShlkY6kLoqg==} + dev: false + + /hastscript@6.0.0: + resolution: {integrity: sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w==} + dependencies: + '@types/hast': 2.3.4 + comma-separated-tokens: 1.0.8 + hast-util-parse-selector: 2.2.5 + property-information: 5.6.0 + space-separated-tokens: 1.1.5 + + /hastscript@7.0.2: + resolution: {integrity: sha512-uA8ooUY4ipaBvKcMuPehTAB/YfFLSSzCwFSwT6ltJbocFUKH/GDHLN+tflq7lSRf9H86uOuxOFkh1KgIy3Gg2g==} + dependencies: + '@types/hast': 2.3.4 + comma-separated-tokens: 2.0.2 + hast-util-parse-selector: 3.1.0 + property-information: 6.1.1 + space-separated-tokens: 2.0.1 + dev: false + + /he@1.2.0: + resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} + hasBin: true + dev: true + + /hex-color-regex@1.1.0: + resolution: {integrity: sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==} + dev: true + + /highlight.js@10.7.3: + resolution: {integrity: sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==} + dev: true + + /history@5.0.0: + resolution: {integrity: sha512-3NyRMKIiFSJmIPdq7FxkNMJkQ7ZEtVblOQ38VtKaA0zZMW1Eo6Q6W8oDKEflr1kNNTItSnk4JMCO1deeSgbLLg==} + dependencies: + '@babel/runtime': 7.17.2 + dev: true + + /history@5.3.0: + resolution: {integrity: sha512-ZqaKwjjrAYUYfLG+htGaIIZ4nioX2L70ZUMIFysS3xvBsSG4x/n1V6TXV3N8ZYNuFGlDirFg32T7B6WOUPDYcQ==} + dependencies: + '@babel/runtime': 7.17.2 + dev: true + + /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 + dev: true + + /hoist-non-react-statics@3.3.2: + resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} + dependencies: + react-is: 16.13.1 + + /hosted-git-info@2.8.9: + resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} + dev: true + + /hsl-regex@1.0.0: + resolution: {integrity: sha512-M5ezZw4LzXbBKMruP+BNANf0k+19hDQMgpzBIYnya//Al+fjNct9Wf3b1WedLqdEs2hKBvxq/jh+DsHJLj0F9A==} + dev: true + + /hsla-regex@1.0.0: + resolution: {integrity: sha512-7Wn5GMLuHBjZCb2bTmnDOycho0p/7UVaAeqXZGbHrBCl6Yd/xDhQJAXe6Ga9AXJH2I5zY1dEdYw2u1UptnSBJA==} + dev: true + + /html-encoding-sniffer@2.0.1: + resolution: {integrity: sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==} + engines: {node: '>=10'} + dependencies: + whatwg-encoding: 1.0.5 + dev: false + + /html-entities@2.3.2: + resolution: {integrity: sha512-c3Ab/url5ksaT0WyleslpBEthOzWhrjQbg75y7XUsfSzi3Dgzt0l8w5e7DylRn15MTlMMD58dTfzddNS2kcAjQ==} + dev: true + + /html-escaper@2.0.2: + resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} + dev: true + + /html-minifier-terser@5.1.1: + resolution: {integrity: sha512-ZPr5MNObqnV/T9akshPKbVgyOqLmy+Bxo7juKCfTfnjNniTAMdy4hz21YQqoofMBJD2kdREaqPPdThoR78Tgxg==} + engines: {node: '>=6'} + hasBin: true + dependencies: + camel-case: 4.1.2 + clean-css: 4.2.4 + commander: 4.1.1 + he: 1.2.0 + param-case: 3.0.4 + relateurl: 0.2.7 + terser: 4.8.1 + dev: true + + /html-tags@3.1.0: + resolution: {integrity: sha512-1qYz89hW3lFDEazhjW0yVAV87lw8lVkrJocr72XmBkMKsoSVJCQx3W8BXsC7hO2qAt8BoVjYjtAcZ9perqGnNg==} + engines: {node: '>=8'} + dev: true + + /html-void-elements@1.0.5: + resolution: {integrity: sha512-uE/TxKuyNIcx44cIWnjr/rfIATDH7ZaOMmstu0CwhFG1Dunhlp4OC6/NMbhiwoq5BpW0ubi303qnEk/PZj614w==} + dev: true + + /html-webpack-plugin@4.5.2(webpack@4.46.0): + resolution: {integrity: sha512-q5oYdzjKUIPQVjOosjgvCHQOv9Ett9CYYHlgvJeXG0qQvdSojnBq4vAdQBwn1+yGveAwHCoe/rMR86ozX3+c2A==} + engines: {node: '>=6.9'} + peerDependencies: + webpack: ^4.0.0 || ^5.0.0 + dependencies: + '@types/html-minifier-terser': 5.1.2 + '@types/tapable': 1.0.8 + '@types/webpack': 4.41.32 + html-minifier-terser: 5.1.1 + loader-utils: 1.4.2 + lodash: 4.17.21 + pretty-error: 2.1.2 + tapable: 1.1.3 + util.promisify: 1.0.0 + webpack: 4.46.0 + dev: true + + /htmlparser2@6.1.0: + resolution: {integrity: sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==} + dependencies: + domelementtype: 2.2.0 + domhandler: 4.3.0 + domutils: 2.8.0 + entities: 2.2.0 + dev: true + + /http-errors@1.8.1: + resolution: {integrity: sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==} + engines: {node: '>= 0.6'} + dependencies: + depd: 1.1.2 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 1.5.0 + toidentifier: 1.0.1 + dev: true + + /http-errors@2.0.0: + resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} + engines: {node: '>= 0.8'} + dependencies: + depd: 2.0.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 2.0.1 + toidentifier: 1.0.1 + dev: true + + /http-proxy-agent@4.0.1: + resolution: {integrity: sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==} + engines: {node: '>= 6'} + dependencies: + '@tootallnate/once': 1.1.2 + agent-base: 6.0.2 + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + dev: false + + /https-browserify@1.0.0: + resolution: {integrity: sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==} + dev: true + + /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 + transitivePeerDependencies: + - supports-color + dev: false + + /iconv-lite@0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} + dependencies: + safer-buffer: 2.1.2 + + /icss-utils@4.1.1: + resolution: {integrity: sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA==} + engines: {node: '>= 6'} + dependencies: + postcss: 7.0.39 + dev: true + + /ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + dev: true + + /iferr@0.1.5: + resolution: {integrity: sha512-DUNFN5j7Tln0D+TxzloUjKB+CtVu6myn0JEFak6dG18mNt9YkQ6lzGCdafwofISZ1lLF3xRHJ98VKy9ynkcFaA==} + dev: true + + /ignore@4.0.6: + resolution: {integrity: sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==} + engines: {node: '>= 4'} + dev: true + + /ignore@5.2.0: + resolution: {integrity: sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==} + engines: {node: '>= 4'} + dev: true + + /import-fresh@2.0.0: + resolution: {integrity: sha512-eZ5H8rcgYazHbKC3PG4ClHNykCSxtAhxSSEM+2mb+7evD2CKF5V7c0dNum7AdpDh0ZdICwZY9sRSn8f+KH96sg==} + engines: {node: '>=4'} + dependencies: + caller-path: 2.0.0 + resolve-from: 3.0.0 + dev: false + + /import-fresh@3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + dev: true + + /imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + dev: true + + /indent-string@4.0.0: + resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} + engines: {node: '>=8'} + dev: true + + /infer-owner@1.0.4: + resolution: {integrity: sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==} + dev: true + + /inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + /inherits@2.0.1: + resolution: {integrity: sha512-8nWq2nLTAwd02jTqJExUYFSD/fKq6VH9Y/oG2accc/kdI0V98Bag8d5a4gi3XHz73rDWa2PvTtvcWYquKqSENA==} + dev: true + + /inherits@2.0.3: + resolution: {integrity: sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==} + dev: true + + /inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + /inline-style-parser@0.1.1: + resolution: {integrity: sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==} + + /internal-slot@1.0.3: + resolution: {integrity: sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==} + engines: {node: '>= 0.4'} + dependencies: + get-intrinsic: 1.1.1 + has: 1.0.3 + side-channel: 1.0.4 + dev: true + + /interpret@2.2.0: + resolution: {integrity: sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==} + engines: {node: '>= 0.10'} + dev: true + + /invariant@2.2.4: + resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==} + dependencies: + loose-envify: 1.4.0 + dev: true + + /ip@1.1.5: + resolution: {integrity: sha512-rBtCAQAJm8A110nbwn6YdveUnuZH3WrC36IwkRXxDnq53JvXA2NVQvB7IHyKomxK1MJ4VDNw3UtFDdXQ+AvLYA==} + dev: true + + /ipaddr.js@1.9.1: + resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} + engines: {node: '>= 0.10'} + dev: true + + /is-absolute-url@3.0.3: + resolution: {integrity: sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==} + engines: {node: '>=8'} + dev: true + + /is-accessor-descriptor@0.1.6: + resolution: {integrity: sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==} + engines: {node: '>=0.10.0'} + dependencies: + kind-of: 3.2.2 + dev: true + + /is-accessor-descriptor@1.0.0: + resolution: {integrity: sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==} + engines: {node: '>=0.10.0'} + dependencies: + kind-of: 6.0.3 + dev: true + + /is-alphabetical@1.0.4: + resolution: {integrity: sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==} + dev: true + + /is-alphabetical@2.0.1: + resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==} + dev: false + + /is-alphanumeric@1.0.0: + resolution: {integrity: sha512-ZmRL7++ZkcMOfDuWZuMJyIVLr2keE1o/DeNWh1EmgqGhUcV+9BIVsx0BcSBOHTZqzjs4+dISzr2KAeBEWGgXeA==} + engines: {node: '>=0.10.0'} + dev: true + + /is-alphanumerical@1.0.4: + resolution: {integrity: sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==} + dependencies: + is-alphabetical: 1.0.4 + is-decimal: 1.0.4 + dev: true + + /is-alphanumerical@2.0.1: + resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==} + dependencies: + is-alphabetical: 2.0.1 + is-decimal: 2.0.1 + dev: false + + /is-arguments@1.1.1: + resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + has-tostringtag: 1.0.0 + dev: true + + /is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + + /is-arrayish@0.3.2: + resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} + dev: true + + /is-bigint@1.0.4: + resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} + dependencies: + has-bigints: 1.0.1 + dev: true + + /is-binary-path@1.0.1: + resolution: {integrity: sha512-9fRVlXc0uCxEDj1nQzaWONSpbTfx0FmJfzHF7pwlI8DkWGoHBBea4Pg5Ky0ojwwxQmnSifgbKkI06Qv0Ljgj+Q==} + engines: {node: '>=0.10.0'} + requiresBuild: true + dependencies: + binary-extensions: 1.13.1 + dev: true + optional: true + + /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: + resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + has-tostringtag: 1.0.0 + dev: true + + /is-buffer@1.1.6: + resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==} + dev: true + + /is-buffer@2.0.5: + resolution: {integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==} + engines: {node: '>=4'} + + /is-callable@1.2.4: + resolution: {integrity: sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==} + engines: {node: '>= 0.4'} + dev: true + + /is-ci@2.0.0: + resolution: {integrity: sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==} + hasBin: true + dependencies: + ci-info: 2.0.0 + dev: true + + /is-color-stop@1.1.0: + resolution: {integrity: sha512-H1U8Vz0cfXNujrJzEcvvwMDW9Ra+biSYA3ThdQvAnMLJkEHQXn6bWzLkxHtVYJ+Sdbx0b6finn3jZiaVe7MAHA==} + dependencies: + css-color-names: 0.0.4 + hex-color-regex: 1.1.0 + hsl-regex: 1.0.0 + hsla-regex: 1.0.0 + rgb-regex: 1.0.1 + rgba-regex: 1.0.0 + dev: true + + /is-core-module@2.8.1: + resolution: {integrity: sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==} + dependencies: + has: 1.0.3 + + /is-data-descriptor@0.1.4: + resolution: {integrity: sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==} + engines: {node: '>=0.10.0'} + dependencies: + kind-of: 3.2.2 + dev: true + + /is-data-descriptor@1.0.0: + resolution: {integrity: sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==} + engines: {node: '>=0.10.0'} + dependencies: + kind-of: 6.0.3 + dev: true + + /is-date-object@1.0.5: + resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.0 + dev: true + + /is-decimal@1.0.4: + resolution: {integrity: sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==} + dev: true + + /is-decimal@2.0.1: + resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} + dev: false + + /is-descriptor@0.1.6: + resolution: {integrity: sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==} + engines: {node: '>=0.10.0'} + dependencies: + is-accessor-descriptor: 0.1.6 + is-data-descriptor: 0.1.4 + kind-of: 5.1.0 + dev: true + + /is-descriptor@1.0.2: + resolution: {integrity: sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==} + engines: {node: '>=0.10.0'} + dependencies: + is-accessor-descriptor: 1.0.0 + is-data-descriptor: 1.0.0 + kind-of: 6.0.3 + dev: true + + /is-directory@0.3.1: + resolution: {integrity: sha512-yVChGzahRFvbkscn2MlwGismPO12i9+znNruC5gVEntG3qu0xQMzsGg/JFbrsqDOHtHFPci+V5aP5T9I+yeKqw==} + engines: {node: '>=0.10.0'} + dev: false + + /is-docker@2.2.1: + resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} + engines: {node: '>=8'} + hasBin: true + dev: true + + /is-dom@1.1.0: + resolution: {integrity: sha512-u82f6mvhYxRPKpw8V1N0W8ce1xXwOrQtgGcxl6UCL5zBmZu3is/18K0rR7uFCnMDuAsS/3W54mGL4vsaFUQlEQ==} + dependencies: + is-object: 1.0.2 + is-window: 1.0.2 + dev: true + + /is-extendable@0.1.1: + resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} + engines: {node: '>=0.10.0'} + + /is-extendable@1.0.1: + resolution: {integrity: sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==} + engines: {node: '>=0.10.0'} + dependencies: + is-plain-object: 2.0.4 + dev: true + + /is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + dev: true + + /is-fullwidth-code-point@2.0.0: + resolution: {integrity: sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==} + engines: {node: '>=4'} + dev: false + + /is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + dev: true + + /is-function@1.0.2: + resolution: {integrity: sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==} + dev: true + + /is-glob@3.1.0: + resolution: {integrity: sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==} + engines: {node: '>=0.10.0'} + dependencies: + is-extglob: 2.1.1 + dev: true + + /is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + dependencies: + is-extglob: 2.1.1 + dev: true + + /is-hexadecimal@1.0.4: + resolution: {integrity: sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==} + dev: true + + /is-hexadecimal@2.0.1: + resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} + dev: false + + /is-map@2.0.2: + resolution: {integrity: sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==} + dev: true + + /is-negative-zero@2.0.2: + resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==} + engines: {node: '>= 0.4'} + dev: true + + /is-number-object@1.0.6: + resolution: {integrity: sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.0 + dev: true + + /is-number@3.0.0: + resolution: {integrity: sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==} + engines: {node: '>=0.10.0'} + dependencies: + kind-of: 3.2.2 + dev: true + + /is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + dev: true + + /is-object@1.0.2: + resolution: {integrity: sha512-2rRIahhZr2UWb45fIOuvZGpFtz0TyOZLf32KxBbSoUCeZR495zCKlWUKKUByk3geS2eAs7ZAABt0Y/Rx0GiQGA==} + dev: true + + /is-plain-obj@2.1.0: + resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} + engines: {node: '>=8'} + dev: true + + /is-plain-obj@4.0.0: + resolution: {integrity: sha512-NXRbBtUdBioI73y/HmOhogw/U5msYPC9DAtGkJXeFcFWSFZw0mCUsPxk/snTuJHzNKA8kLBK4rH97RMB1BfCXw==} + engines: {node: '>=12'} + dev: false + + /is-plain-object@2.0.4: + resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} + engines: {node: '>=0.10.0'} + dependencies: + isobject: 3.0.1 + dev: true + + /is-plain-object@5.0.0: + resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==} + engines: {node: '>=0.10.0'} + dev: true + + /is-potential-custom-element-name@1.0.1: + resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} + dev: false + + /is-reference@3.0.0: + resolution: {integrity: sha512-Eo1W3wUoHWoCoVM4GVl/a+K0IgiqE5aIo4kJABFyMum1ZORlPkC+UC357sSQUL5w5QCE5kCC9upl75b7+7CY/Q==} + dependencies: + '@types/estree': 0.0.51 + dev: false + + /is-regex@1.1.4: + resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + has-tostringtag: 1.0.0 + dev: true + + /is-set@2.0.2: + resolution: {integrity: sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==} + dev: true + + /is-shared-array-buffer@1.0.1: + resolution: {integrity: sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA==} + dev: true + + /is-stream@1.1.0: + resolution: {integrity: sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==} + engines: {node: '>=0.10.0'} + dev: true + + /is-string@1.0.7: + resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.0 + dev: true + + /is-symbol@1.0.4: + resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} + engines: {node: '>= 0.4'} + dependencies: + has-symbols: 1.0.2 + dev: true + + /is-typed-array@1.1.8: + resolution: {integrity: sha512-HqH41TNZq2fgtGT8WHVFVJhBVGuY3AnP3Q36K8JKXUxSxRgk/d+7NjmwG2vo2mYmXK8UYZKu0qH8bVP5gEisjA==} + engines: {node: '>= 0.4'} + dependencies: + available-typed-arrays: 1.0.5 + call-bind: 1.0.2 + es-abstract: 1.19.1 + foreach: 2.0.5 + has-tostringtag: 1.0.0 + dev: true + + /is-typedarray@1.0.0: + resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} + dev: true + + /is-weakmap@2.0.1: + resolution: {integrity: sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==} + dev: true + + /is-weakref@1.0.2: + resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} + dependencies: + call-bind: 1.0.2 + dev: true + + /is-weakset@2.0.2: + resolution: {integrity: sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.1.1 + dev: true + + /is-whitespace-character@1.0.4: + resolution: {integrity: sha512-SDweEzfIZM0SJV0EUga669UTKlmL0Pq8Lno0QDQsPnvECB3IM2aP0gdx5TrU0A01MAPfViaZiI2V1QMZLaKK5w==} + dev: true + + /is-window@1.0.2: + resolution: {integrity: sha512-uj00kdXyZb9t9RcAUAwMZAnkBUwdYGhYlt7djMXhfyhUCzwNba50tIiBKR7q0l7tdoBtFVw/3JmLY6fI3rmZmg==} + dev: true + + /is-windows@1.0.2: + resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} + engines: {node: '>=0.10.0'} + dev: true + + /is-word-character@1.0.4: + resolution: {integrity: sha512-5SMO8RVennx3nZrqtKwCGyyetPE9VDba5ugvKLaD4KopPG5kR4mQ7tNt/r7feL5yt5h3lpuBbIUmCOG2eSzXHA==} + dev: true + + /is-wsl@1.1.0: + resolution: {integrity: sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==} + engines: {node: '>=4'} + dev: true + + /is-wsl@2.2.0: + resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} + engines: {node: '>=8'} + dependencies: + is-docker: 2.2.1 + dev: true + + /isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + + /isarray@2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + dev: true + + /isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + dev: true + + /isobject@2.1.0: + resolution: {integrity: sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==} + engines: {node: '>=0.10.0'} + dependencies: + isarray: 1.0.0 + dev: true + + /isobject@3.0.1: + resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} + engines: {node: '>=0.10.0'} + dev: true + + /isobject@4.0.0: + resolution: {integrity: sha512-S/2fF5wH8SJA/kmwr6HYhK/RI/OkhD84k8ntalo0iJjZikgq1XFvR5M8NPT1x5F7fBwCG3qHfnzeP/Vh/ZxCUA==} + engines: {node: '>=0.10.0'} + dev: true + + /istanbul-lib-coverage@3.2.0: + resolution: {integrity: sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==} + engines: {node: '>=8'} + dev: true + + /istanbul-lib-instrument@5.1.0: + resolution: {integrity: sha512-czwUz525rkOFDJxfKK6mYfIs9zBKILyrZQxjz3ABhjQXhbhFsSbo1HW/BFcsDnfJYJWA6thRR5/TUY2qs5W99Q==} + engines: {node: '>=8'} + dependencies: + '@babel/core': 7.17.5 + '@babel/parser': 7.23.0 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-coverage: 3.2.0 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + dev: true + + /istanbul-lib-report@3.0.0: + resolution: {integrity: sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==} + engines: {node: '>=8'} + dependencies: + istanbul-lib-coverage: 3.2.0 + make-dir: 3.1.0 + supports-color: 7.2.0 + dev: true + + /istanbul-reports@3.1.4: + resolution: {integrity: sha512-r1/DshN4KSE7xWEknZLLLLDn5CJybV3nw01VTkp6D5jzLuELlcbudfj/eSQFvrKsJuTVCGnePO7ho82Nw9zzfw==} + engines: {node: '>=8'} + dependencies: + html-escaper: 2.0.2 + istanbul-lib-report: 3.0.0 + dev: true + + /iterate-iterator@1.0.2: + resolution: {integrity: sha512-t91HubM4ZDQ70M9wqp+pcNpu8OyJ9UAtXntT/Bcsvp5tZMnz9vRa+IunKXeI8AnfZMTv0jNuVEmGeLSMjVvfPw==} + dev: true + + /iterate-value@1.0.2: + resolution: {integrity: sha512-A6fMAio4D2ot2r/TYzr4yUWrmwNdsN5xL7+HUiyACE4DXm+q8HtPcnFTp+NnW3k4N05tZ7FVYFFb2CR13NxyHQ==} + dependencies: + es-get-iterator: 1.1.2 + iterate-iterator: 1.0.2 + dev: true + + /jest-haste-map@26.6.2: + resolution: {integrity: sha512-easWIJXIw71B2RdR8kgqpjQrbMRWQBgiBwXYEhtGUTaX+doCjBheluShdDMeR8IMfJiTqH4+zfhtg29apJf/8w==} + engines: {node: '>= 10.14.2'} + dependencies: + '@jest/types': 26.6.2 + '@types/graceful-fs': 4.1.5 + '@types/node': 17.0.21 + anymatch: 3.1.2 + fb-watchman: 2.0.1 + graceful-fs: 4.2.9 + jest-regex-util: 26.0.0 + jest-serializer: 26.6.2 + jest-util: 26.6.2 + jest-worker: 26.6.2 + micromatch: 4.0.4 + sane: 4.1.0 + walker: 1.0.8 + optionalDependencies: + fsevents: 2.3.2 + transitivePeerDependencies: + - supports-color + dev: true + + /jest-mock@27.5.1: + resolution: {integrity: sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/types': 27.5.1 + '@types/node': 17.0.21 + dev: true + + /jest-regex-util@26.0.0: + resolution: {integrity: sha512-Gv3ZIs/nA48/Zvjrl34bf+oD76JHiGDUxNOVgUjh3j890sblXryjY4rss71fPtD/njchl6PSE2hIhvyWa1eT0A==} + engines: {node: '>= 10.14.2'} + dev: true + + /jest-serializer@26.6.2: + resolution: {integrity: sha512-S5wqyz0DXnNJPd/xfIzZ5Xnp1HrJWBczg8mMfMpN78OJ5eDxXyf+Ygld9wX1DnUWbIbhM1YDY95NjR4CBXkb2g==} + engines: {node: '>= 10.14.2'} + dependencies: + '@types/node': 17.0.21 + graceful-fs: 4.2.9 + dev: true + + /jest-util@26.6.2: + resolution: {integrity: sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q==} + engines: {node: '>= 10.14.2'} + dependencies: + '@jest/types': 26.6.2 + '@types/node': 17.0.21 + chalk: 4.1.2 + graceful-fs: 4.2.9 + is-ci: 2.0.0 + micromatch: 4.0.4 + dev: true + + /jest-worker@26.6.2: + resolution: {integrity: sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==} + engines: {node: '>= 10.13.0'} + dependencies: + '@types/node': 17.0.21 + merge-stream: 2.0.0 + supports-color: 7.2.0 + dev: true + + /js-string-escape@1.0.1: + resolution: {integrity: sha512-Smw4xcfIQ5LVjAOuJCvN/zIodzA/BBSsluuoSykP+lUvScIi4U6RJLfwHet5cxFnCswUjISV8oAXaqaJDY3chg==} + engines: {node: '>= 0.8'} + dev: true + + /js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + /js-yaml@3.14.1: + resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} + hasBin: true + dependencies: + argparse: 1.0.10 + esprima: 4.0.1 + + /js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + dependencies: + argparse: 2.0.1 + + /jsdom@16.7.0: + resolution: {integrity: sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==} + engines: {node: '>=10'} + peerDependencies: + canvas: ^2.5.0 + peerDependenciesMeta: + canvas: + optional: true + dependencies: + abab: 2.0.6 + acorn: 8.7.1 + acorn-globals: 6.0.0 + cssom: 0.4.4 + cssstyle: 2.3.0 + data-urls: 2.0.0 + decimal.js: 10.3.1 + domexception: 2.0.1 + escodegen: 2.0.0 + form-data: 3.0.1 + html-encoding-sniffer: 2.0.1 + http-proxy-agent: 4.0.1 + https-proxy-agent: 5.0.1 + is-potential-custom-element-name: 1.0.1 + nwsapi: 2.2.0 + parse5: 6.0.1 + saxes: 5.0.1 + symbol-tree: 3.2.4 + tough-cookie: 4.0.0 + w3c-hr-time: 1.0.2 + w3c-xmlserializer: 2.0.0 + webidl-conversions: 6.1.0 + whatwg-encoding: 1.0.5 + whatwg-mimetype: 2.3.0 + whatwg-url: 8.7.0 + ws: 7.5.7 + xml-name-validator: 3.0.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: false + + /jsesc@0.5.0: + resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==} + hasBin: true + dev: true + + /jsesc@2.5.2: + resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} + engines: {node: '>=4'} + hasBin: true + + /json-parse-better-errors@1.0.2: + resolution: {integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==} + + /json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + dev: true + + /json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + dev: true + + /json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + dev: true + + /json5@1.0.2: + resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} + hasBin: true + dependencies: + minimist: 1.2.7 + + /json5@2.2.0: + resolution: {integrity: sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==} + engines: {node: '>=6'} + hasBin: true + dependencies: + minimist: 1.2.7 + + /jsonfile@2.4.0: + resolution: {integrity: sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw==} + optionalDependencies: + graceful-fs: 4.2.9 + dev: true + + /jsonfile@6.1.0: + resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + dependencies: + universalify: 2.0.0 + optionalDependencies: + graceful-fs: 4.2.9 + dev: true + + /jsx-ast-utils@3.2.1: + resolution: {integrity: sha512-uP5vu8xfy2F9A6LGC22KO7e2/vGTS1MhP+18f++ZNlf0Ohaxbc9nIEwHAsejlJKyzfZzU5UIhe5ItYkitcZnZA==} + engines: {node: '>=4.0'} + dependencies: + array-includes: 3.1.4 + object.assign: 4.1.2 + dev: true + + /junk@3.1.0: + resolution: {integrity: sha512-pBxcB3LFc8QVgdggvZWyeys+hnrNWg4OcZIU/1X59k5jQdLBlCsYGRQaz234SqoRLTCgMH00fY0xRJH+F9METQ==} + engines: {node: '>=8'} + dev: true + + /kind-of@3.2.2: + resolution: {integrity: sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==} + engines: {node: '>=0.10.0'} + dependencies: + is-buffer: 1.1.6 + dev: true + + /kind-of@4.0.0: + resolution: {integrity: sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==} + engines: {node: '>=0.10.0'} + dependencies: + is-buffer: 1.1.6 + dev: true + + /kind-of@5.1.0: + resolution: {integrity: sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==} + engines: {node: '>=0.10.0'} + dev: true + + /kind-of@6.0.3: + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: '>=0.10.0'} + + /klaw@1.3.1: + resolution: {integrity: sha512-TED5xi9gGQjGpNnvRWknrwAB1eL5GciPfVFOt3Vk1OJCVDQbzuSfrF3hkUQKlsgKrG1F+0t5W0m+Fje1jIt8rw==} + optionalDependencies: + graceful-fs: 4.2.9 + dev: true + + /kleur@3.0.3: + resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} + engines: {node: '>=6'} + dev: true + + /kleur@4.1.4: + resolution: {integrity: sha512-8QADVssbrFjivHWQU7KkMgptGTl6WAcSdlbBPY4uNF+mWr6DGcKrvY2w4FQJoXch7+fKMjj0dRrL75vk3k23OA==} + engines: {node: '>=6'} + dev: false + + /klona@2.0.5: + resolution: {integrity: sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ==} + engines: {node: '>= 8'} + dev: true + + /language-subtag-registry@0.3.21: + resolution: {integrity: sha512-L0IqwlIXjilBVVYKFT37X9Ih11Um5NEl9cbJIuU/SwP/zEEAbBPOnEeeuxVMf45ydWQRDQN3Nqc96OgbH1K+Pg==} + dev: true + + /language-tags@1.0.5: + resolution: {integrity: sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ==} + dependencies: + language-subtag-registry: 0.3.21 + dev: true + + /lazy-universal-dotenv@3.0.1: + resolution: {integrity: sha512-prXSYk799h3GY3iOWnC6ZigYzMPjxN2svgjJ9shk7oMadSNX3wXy0B6F32PMJv7qtMnrIbUxoEHzbutvxR2LBQ==} + engines: {node: '>=6.0.0', npm: '>=6.0.0', yarn: '>=1.0.0'} + dependencies: + '@babel/runtime': 7.17.2 + app-root-dir: 1.0.2 + core-js: 3.21.1 + dotenv: 8.6.0 + dotenv-expand: 5.1.0 + dev: true + + /levn@0.3.0: + resolution: {integrity: sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.1.2 + type-check: 0.3.2 + + /levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + dev: true + + /linaria@2.3.1(@babel/core@7.17.5): + resolution: {integrity: sha512-6MdNb2S31ueMK4vYWmC9SSSgKMpknbszdLqu/kC4Vm9ezpR0j3BumdJIWnRLfUfNNhqdnDJwjfR5QX0Uhi9hHw==} + hasBin: true + peerDependencies: + '@babel/core': '>=7' + dependencies: + '@babel/core': 7.17.5 + '@babel/generator': 7.23.0 + '@babel/plugin-proposal-export-namespace-from': 7.16.7(@babel/core@7.17.5) + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.17.5) + '@babel/plugin-transform-modules-commonjs': 7.16.8(@babel/core@7.17.5) + '@babel/plugin-transform-runtime': 7.17.0(@babel/core@7.17.5) + '@babel/plugin-transform-template-literals': 7.16.7(@babel/core@7.17.5) + '@babel/template': 7.22.15 + '@emotion/is-prop-valid': 0.8.8 + babel-plugin-transform-react-remove-prop-types: 0.4.24 + cosmiconfig: 5.2.1 + debug: 4.3.4 + enhanced-resolve: 4.5.0 + glob: 7.2.0 + loader-utils: 1.4.2 + mkdirp: 0.5.5 + normalize-path: 3.0.0 + postcss: 7.0.39 + react-is: 16.13.1 + rollup-pluginutils: 2.8.2 + source-map: 0.6.1 + strip-ansi: 5.2.0 + stylis: 3.5.4 + yargs: 13.3.2 + transitivePeerDependencies: + - supports-color + dev: false + + /lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + dev: true + + /loader-runner@2.4.0: + resolution: {integrity: sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==} + engines: {node: '>=4.3.0 <5.0.0 || >=5.10'} + dev: true + + /loader-utils@1.4.2: + resolution: {integrity: sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==} + engines: {node: '>=4.0.0'} + dependencies: + big.js: 5.2.2 + emojis-list: 3.0.0 + json5: 1.0.2 + + /loader-utils@2.0.0: + resolution: {integrity: sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==} + engines: {node: '>=8.9.0'} + dependencies: + big.js: 5.2.2 + emojis-list: 3.0.0 + json5: 2.2.0 + dev: true + + /loader-utils@2.0.2: + resolution: {integrity: sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==} + engines: {node: '>=8.9.0'} + dependencies: + big.js: 5.2.2 + emojis-list: 3.0.0 + json5: 2.2.0 + dev: true + + /locate-path@2.0.0: + resolution: {integrity: sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==} + engines: {node: '>=4'} + dependencies: + p-locate: 2.0.0 + path-exists: 3.0.0 + dev: true + + /locate-path@3.0.0: + resolution: {integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==} + engines: {node: '>=6'} + dependencies: + p-locate: 3.0.0 + path-exists: 3.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: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + dependencies: + p-locate: 5.0.0 + dev: true + + /lodash-es@4.17.21: + resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} + dev: true + + /lodash.curry@4.1.1: + resolution: {integrity: sha512-/u14pXGviLaweY5JI0IUzgzF2J6Ne8INyzAZjImcryjgkZ+ebruBxy2/JaOOkTqScddcYtakjhSaeemV8lR0tA==} + dev: true + + /lodash.debounce@4.0.8: + resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} + + /lodash.flow@3.5.0: + resolution: {integrity: sha512-ff3BX/tSioo+XojX4MOsOMhJw0nZoUEF011LX8g8d3gvjVbxd89cCio4BCXronjxcTUIJUoqKEUA+n4CqvvRPw==} + dev: true + + /lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + dev: true + + /lodash.uniq@4.5.0: + resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==} + dev: true + + /lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + /longest-streak@2.0.4: + resolution: {integrity: sha512-vM6rUVCVUJJt33bnmHiZEvr7wPT78ztX7rojL+LW51bHtLh6HTjx84LA5W4+oa6aKEJA7jJu5LR6vQRBpA5DVg==} + dev: true + + /longest-streak@3.0.1: + resolution: {integrity: sha512-cHlYSUpL2s7Fb3394mYxwTYj8niTaNHUCLr0qdiCXQfSjfuA7CKofpX2uSwEfFDQ0EB7JcnMnm+GjbqqoinYYg==} + dev: false + + /loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + dependencies: + js-tokens: 4.0.0 + + /lower-case@2.0.2: + resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} + dependencies: + tslib: 2.3.1 + dev: true + + /lowlight@1.20.0: + resolution: {integrity: sha512-8Ktj+prEb1RoCPkEOrPMYUN/nCggB7qAWe3a7OpMjWQkh3l2RD5wKRQ+o8Q8YuI9RG/xs95waaI/E6ym/7NsTw==} + dependencies: + fault: 1.0.4 + highlight.js: 10.7.3 + dev: true + + /lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + dependencies: + yallist: 3.1.1 + dev: true + + /lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + dependencies: + yallist: 4.0.0 + dev: true + + /lz-string@1.4.4: + resolution: {integrity: sha512-0ckx7ZHRPqb0oUm8zNr+90mtf9DQB60H1wMCjBtfi62Kl3a7JbHob6gA2bC+xRvZoOL+1hzUK8jeuEIQE8svEQ==} + hasBin: true + dev: true + + /make-dir@2.1.0: + resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==} + engines: {node: '>=6'} + dependencies: + pify: 4.0.1 + semver: 5.7.2 + dev: true + + /make-dir@3.1.0: + resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} + engines: {node: '>=8'} + dependencies: + semver: 6.3.1 + dev: true + + /make-error@1.3.6: + resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + dev: false + + /makeerror@1.0.12: + resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} + dependencies: + tmpl: 1.0.5 + dev: true + + /map-cache@0.2.2: + resolution: {integrity: sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==} + engines: {node: '>=0.10.0'} + dev: true + + /map-or-similar@1.5.0: + resolution: {integrity: sha512-0aF7ZmVon1igznGI4VS30yugpduQW3y3GkcgGJOp7d8x8QrizhigUxjI/m2UojsXXto+jLAH3KSz+xOJTiORjg==} + dev: true + + /map-visit@1.0.0: + resolution: {integrity: sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==} + engines: {node: '>=0.10.0'} + dependencies: + object-visit: 1.0.1 + dev: true + + /markdown-escapes@1.0.4: + resolution: {integrity: sha512-8z4efJYk43E0upd0NbVXwgSTQs6cT3T06etieCMEg7dRbzCbxUCK/GHlX8mhHRDcp+OLlHkPKsvqQTCvsRl2cg==} + dev: true + + /markdown-extensions@1.1.1: + resolution: {integrity: sha512-WWC0ZuMzCyDHYCasEGs4IPvLyTGftYwh6wIEOULOF0HXcqZlhwRzrK0w2VUlxWA98xnvb/jszw4ZSkJ6ADpM6Q==} + engines: {node: '>=0.10.0'} + dev: false + + /markdown-table@2.0.0: + resolution: {integrity: sha512-Ezda85ToJUBhM6WGaG6veasyym+Tbs3cMAw/ZhOPqXiYsr0jgocBV3j3nx+4lk47plLlIqjwuTm/ywVI+zjJ/A==} + dependencies: + repeat-string: 1.6.1 + dev: true + + /markdown-table@3.0.2: + resolution: {integrity: sha512-y8j3a5/DkJCmS5x4dMCQL+OR0+2EAq3DOtio1COSHsmW2BGXnNCK3v12hJt1LrUz5iZH5g0LmuYOjDdI+czghA==} + dev: false + + /markdown-to-jsx@7.1.6(react@17.0.2): + resolution: {integrity: sha512-1wrIGZYwIG2gR3yfRmbr4FlQmhaAKoKTpRo4wur4fp9p0njU1Hi7vR8fj0AUKKIcPduiJmPprzmCB5B/GvlC7g==} + engines: {node: '>= 10'} + peerDependencies: + react: '>= 0.14.0' + dependencies: + react: 17.0.2 + dev: true + + /material-colors@1.2.6: + resolution: {integrity: sha512-6qE4B9deFBIa9YSpOc9O0Sgc43zTeVYbgDT5veRKSlB2+ZuHNoVVxA1L/ckMUayV9Ay9y7Z/SZCLcGteW9i7bg==} + dev: true + + /md5.js@1.3.5: + resolution: {integrity: sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==} + dependencies: + hash-base: 3.1.0 + inherits: 2.0.4 + safe-buffer: 5.2.1 + dev: true + + /mdast-squeeze-paragraphs@4.0.0: + resolution: {integrity: sha512-zxdPn69hkQ1rm4J+2Cs2j6wDEv7O17TfXTJ33tl/+JPIoEmtV9t2ZzBM5LPHE8QlHsmVD8t3vPKCyY3oH+H8MQ==} + dependencies: + unist-util-remove: 2.1.0 + dev: true + + /mdast-util-compact@2.0.1: + resolution: {integrity: sha512-7GlnT24gEwDrdAwEHrU4Vv5lLWrEer4KOkAiKT9nYstsTad7Oc1TwqT2zIMKRdZF7cTuaf+GA1E4Kv7jJh8mPA==} + dependencies: + unist-util-visit: 2.0.3 + dev: true + + /mdast-util-definitions@4.0.0: + resolution: {integrity: sha512-k8AJ6aNnUkB7IE+5azR9h81O5EQ/cTDXtWdMq9Kk5KcEW/8ritU5CeLg/9HhOC++nALHBlaogJ5jz0Ybk3kPMQ==} + dependencies: + unist-util-visit: 2.0.3 + dev: true + + /mdast-util-definitions@5.1.0: + resolution: {integrity: sha512-5hcR7FL2EuZ4q6lLMUK5w4lHT2H3vqL9quPvYZ/Ku5iifrirfMHiGdhxdXMUbUkDmz5I+TYMd7nbaxUhbQkfpQ==} + dependencies: + '@types/mdast': 3.0.10 + '@types/unist': 2.0.6 + unist-util-visit: 3.1.0 + dev: false + + /mdast-util-directive@2.2.1: + resolution: {integrity: sha512-yZRRuaulzc6bM4IOyZfkOrVs+9Sf1BC+rldRXJyl/Ej6S/6ewQQ9jt75HvEoqZZ4m9ealVTHiS4MP2GRUE7INA==} + dependencies: + '@types/mdast': 3.0.10 + '@types/unist': 2.0.6 + mdast-util-to-markdown: 1.3.0 + parse-entities: 4.0.0 + stringify-entities: 4.0.2 + unist-util-visit-parents: 5.1.0 + dev: false + + /mdast-util-find-and-replace@2.1.0: + resolution: {integrity: sha512-1w1jbqAd13oU78QPBf5223+xB+37ecNtQ1JElq2feWols5oEYAl+SgNDnOZipe7NfLemoEt362yUS15/wip4mw==} + dependencies: + escape-string-regexp: 5.0.0 + unist-util-is: 5.1.1 + unist-util-visit-parents: 4.1.1 + dev: false + + /mdast-util-from-markdown@1.2.0: + resolution: {integrity: sha512-iZJyyvKD1+K7QX1b5jXdE7Sc5dtoTry1vzV28UZZe8Z1xVnB/czKntJ7ZAkG0tANqRnBF6p3p7GpU1y19DTf2Q==} + dependencies: + '@types/mdast': 3.0.10 + '@types/unist': 2.0.6 + decode-named-character-reference: 1.0.1 + mdast-util-to-string: 3.1.0 + micromark: 3.0.10 + micromark-util-decode-numeric-character-reference: 1.0.0 + micromark-util-decode-string: 1.0.2 + micromark-util-normalize-identifier: 1.0.0 + micromark-util-symbol: 1.0.1 + micromark-util-types: 1.0.2 + unist-util-stringify-position: 3.0.2 + uvu: 0.5.3 + transitivePeerDependencies: + - supports-color + dev: false + + /mdast-util-gfm-autolink-literal@1.0.2: + resolution: {integrity: sha512-FzopkOd4xTTBeGXhXSBU0OCDDh5lUj2rd+HQqG92Ld+jL4lpUfgX2AT2OHAVP9aEeDKp7G92fuooSZcYJA3cRg==} + dependencies: + '@types/mdast': 3.0.10 + ccount: 2.0.1 + mdast-util-find-and-replace: 2.1.0 + micromark-util-character: 1.1.0 + dev: false + + /mdast-util-gfm-footnote@1.0.1: + resolution: {integrity: sha512-p+PrYlkw9DeCRkTVw1duWqPRHX6Ywh2BNKJQcZbCwAuP/59B0Lk9kakuAd7KbQprVO4GzdW8eS5++A9PUSqIyw==} + dependencies: + '@types/mdast': 3.0.10 + mdast-util-to-markdown: 1.3.0 + micromark-util-normalize-identifier: 1.0.0 + dev: false + + /mdast-util-gfm-strikethrough@1.0.1: + resolution: {integrity: sha512-zKJbEPe+JP6EUv0mZ0tQUyLQOC+FADt0bARldONot/nefuISkaZFlmVK4tU6JgfyZGrky02m/I6PmehgAgZgqg==} + dependencies: + '@types/mdast': 3.0.10 + mdast-util-to-markdown: 1.3.0 + dev: false + + /mdast-util-gfm-table@1.0.4: + resolution: {integrity: sha512-aEuoPwZyP4iIMkf2cLWXxx3EQ6Bmh2yKy9MVCg4i6Sd3cX80dcLEfXO/V4ul3pGH9czBK4kp+FAl+ZHmSUt9/w==} + dependencies: + markdown-table: 3.0.2 + mdast-util-from-markdown: 1.2.0 + mdast-util-to-markdown: 1.3.0 + transitivePeerDependencies: + - supports-color + dev: false + + /mdast-util-gfm-task-list-item@1.0.1: + resolution: {integrity: sha512-KZ4KLmPdABXOsfnM6JHUIjxEvcx2ulk656Z/4Balw071/5qgnhz+H1uGtf2zIGnrnvDC8xR4Fj9uKbjAFGNIeA==} + dependencies: + '@types/mdast': 3.0.10 + mdast-util-to-markdown: 1.3.0 + dev: false + + /mdast-util-gfm@2.0.1: + resolution: {integrity: sha512-42yHBbfWIFisaAfV1eixlabbsa6q7vHeSPY+cg+BBjX51M8xhgMacqH9g6TftB/9+YkcI0ooV4ncfrJslzm/RQ==} + dependencies: + mdast-util-from-markdown: 1.2.0 + mdast-util-gfm-autolink-literal: 1.0.2 + mdast-util-gfm-footnote: 1.0.1 + mdast-util-gfm-strikethrough: 1.0.1 + mdast-util-gfm-table: 1.0.4 + mdast-util-gfm-task-list-item: 1.0.1 + mdast-util-to-markdown: 1.3.0 + transitivePeerDependencies: + - supports-color + dev: false + + /mdast-util-mdx-expression@1.2.0: + resolution: {integrity: sha512-wb36oi09XxqO9RVqgfD+xo8a7xaNgS+01+k3v0GKW0X0bYbeBmUZz22Z/IJ8SuphVlG+DNgNo9VoEaUJ3PKfJQ==} + dependencies: + '@types/estree-jsx': 0.0.1 + '@types/hast': 2.3.4 + '@types/mdast': 3.0.10 + mdast-util-from-markdown: 1.2.0 + mdast-util-to-markdown: 1.3.0 + transitivePeerDependencies: + - supports-color + dev: false + + /mdast-util-mdx-jsx@2.0.1: + resolution: {integrity: sha512-oPC7/smPBf7vxnvIYH5y3fPo2lw1rdrswFfSb4i0GTAXRUQv7JUU/t/hbp07dgGdUFTSDOHm5DNamhNg/s2Hrg==} + dependencies: + '@types/estree-jsx': 0.0.1 + '@types/hast': 2.3.4 + '@types/mdast': 3.0.10 + ccount: 2.0.1 + mdast-util-to-markdown: 1.3.0 + parse-entities: 4.0.0 + stringify-entities: 4.0.2 + unist-util-remove-position: 4.0.1 + unist-util-stringify-position: 3.0.2 + vfile-message: 3.1.2 + dev: false + + /mdast-util-mdx@2.0.0: + resolution: {integrity: sha512-M09lW0CcBT1VrJUaF/PYxemxxHa7SLDHdSn94Q9FhxjCQfuW7nMAWKWimTmA3OyDMSTH981NN1csW1X+HPSluw==} + dependencies: + mdast-util-mdx-expression: 1.2.0 + mdast-util-mdx-jsx: 2.0.1 + mdast-util-mdxjs-esm: 1.2.0 + transitivePeerDependencies: + - supports-color + dev: false + + /mdast-util-mdxjs-esm@1.2.0: + resolution: {integrity: sha512-IPpX9GBzAIbIRCjbyeLDpMhACFb0wxTIujuR3YElB8LWbducUdMgRJuqs/Vg8xQ1bIAMm7lw8L+YNtua0xKXRw==} + dependencies: + '@types/estree-jsx': 0.0.1 + '@types/hast': 2.3.4 + '@types/mdast': 3.0.10 + mdast-util-from-markdown: 1.2.0 + mdast-util-to-markdown: 1.3.0 + transitivePeerDependencies: + - supports-color + dev: false + + /mdast-util-to-hast@10.0.1: + resolution: {integrity: sha512-BW3LM9SEMnjf4HXXVApZMt8gLQWVNXc3jryK0nJu/rOXPOnlkUjmdkDlmxMirpbU9ILncGFIwLH/ubnWBbcdgA==} + dependencies: + '@types/mdast': 3.0.10 + '@types/unist': 2.0.6 + mdast-util-definitions: 4.0.0 + mdurl: 1.0.1 + unist-builder: 2.0.3 + unist-util-generated: 1.1.6 + unist-util-position: 3.1.0 + unist-util-visit: 2.0.3 + dev: true + + /mdast-util-to-hast@12.1.1: + resolution: {integrity: sha512-qE09zD6ylVP14jV4mjLIhDBOrpFdShHZcEsYvvKGABlr9mGbV7mTlRWdoFxL/EYSTNDiC9GZXy7y8Shgb9Dtzw==} + dependencies: + '@types/hast': 2.3.4 + '@types/mdast': 3.0.10 + '@types/mdurl': 1.0.2 + mdast-util-definitions: 5.1.0 + mdurl: 1.0.1 + micromark-util-sanitize-uri: 1.0.0 + unist-builder: 3.0.0 + unist-util-generated: 2.0.0 + unist-util-position: 4.0.2 + unist-util-visit: 4.1.0 + dev: false + + /mdast-util-to-markdown@1.3.0: + resolution: {integrity: sha512-6tUSs4r+KK4JGTTiQ7FfHmVOaDrLQJPmpjD6wPMlHGUVXoG9Vjc3jIeP+uyBWRf8clwB2blM+W7+KrlMYQnftA==} + dependencies: + '@types/mdast': 3.0.10 + '@types/unist': 2.0.6 + longest-streak: 3.0.1 + mdast-util-to-string: 3.1.0 + micromark-util-decode-string: 1.0.2 + unist-util-visit: 4.1.0 + zwitch: 2.0.2 + dev: false + + /mdast-util-to-string@1.1.0: + resolution: {integrity: sha512-jVU0Nr2B9X3MU4tSK7JP1CMkSvOj7X5l/GboG1tKRw52lLF1x2Ju92Ms9tNetCcbfX3hzlM73zYo2NKkWSfF/A==} + dev: true + + /mdast-util-to-string@3.1.0: + resolution: {integrity: sha512-n4Vypz/DZgwo0iMHLQL49dJzlp7YtAJP+N07MZHpjPf/5XJuHUWstviF4Mn2jEiR/GNmtnRRqnwsXExk3igfFA==} + dev: false + + /mdurl@1.0.1: + resolution: {integrity: sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==} + + /media-typer@0.3.0: + resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} + engines: {node: '>= 0.6'} + dev: true + + /memfs@3.4.1: + resolution: {integrity: sha512-1c9VPVvW5P7I85c35zAdEr1TD5+F11IToIHIlrVIcflfnzPkJa0ZoYEoEdYDP8KgPFoSZ/opDrUsAoZWym3mtw==} + engines: {node: '>= 4.0.0'} + dependencies: + fs-monkey: 1.0.3 + dev: true + + /memoizerific@1.11.3: + resolution: {integrity: sha512-/EuHYwAPdLtXwAwSZkh/Gutery6pD2KYd44oQLhAvQp/50mpyduZh8Q7PYHXTCJ+wuXxt7oij2LXyIJOOYFPog==} + dependencies: + map-or-similar: 1.5.0 + dev: true + + /memory-fs@0.4.1: + resolution: {integrity: sha512-cda4JKCxReDXFXRqOHPQscuIYg1PvxbE2S2GP45rnwfEK+vZaXC8C1OFvdHIbgw0DLzowXGVoxLaAmlgRy14GQ==} + dependencies: + errno: 0.1.8 + readable-stream: 2.3.7 + dev: true + + /memory-fs@0.5.0: + resolution: {integrity: sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==} + engines: {node: '>=4.3.0 <5.0.0 || >=5.10'} + dependencies: + errno: 0.1.8 + readable-stream: 2.3.7 + + /merge-descriptors@1.0.1: + resolution: {integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==} + dev: true + + /merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + dev: true + + /merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + dev: true + + /methods@1.1.2: + resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} + engines: {node: '>= 0.6'} + dev: true + + /microevent.ts@0.1.1: + resolution: {integrity: sha512-jo1OfR4TaEwd5HOrt5+tAZ9mqT4jmpNAusXtyfNzqVm9uiSYFZlKM1wYL4oU7azZW/PxQW53wM0S6OR1JHNa2g==} + dev: true + + /micromark-core-commonmark@1.0.6: + resolution: {integrity: sha512-K+PkJTxqjFfSNkfAhp4GB+cZPfQd6dxtTXnf+RjZOV7T4EEXnvgzOcnp+eSTmpGk9d1S9sL6/lqrgSNn/s0HZA==} + dependencies: + decode-named-character-reference: 1.0.1 + micromark-factory-destination: 1.0.0 + micromark-factory-label: 1.0.2 + micromark-factory-space: 1.0.0 + micromark-factory-title: 1.0.2 + micromark-factory-whitespace: 1.0.0 + micromark-util-character: 1.1.0 + micromark-util-chunked: 1.0.0 + micromark-util-classify-character: 1.0.0 + micromark-util-html-tag-name: 1.0.0 + micromark-util-normalize-identifier: 1.0.0 + micromark-util-resolve-all: 1.0.0 + micromark-util-subtokenize: 1.0.2 + micromark-util-symbol: 1.0.1 + micromark-util-types: 1.0.2 + uvu: 0.5.3 + dev: false + + /micromark-extension-directive@2.1.1: + resolution: {integrity: sha512-+7MYZ3a10cpPrQRg3530srFMSBx0EL7gQaJ3ekguOQFSlJHLikW15AphBmNxvCNdRSWTX1R8RepzjKQra8INQw==} + dependencies: + micromark-factory-space: 1.0.0 + micromark-factory-whitespace: 1.0.0 + micromark-util-character: 1.1.0 + micromark-util-symbol: 1.0.1 + micromark-util-types: 1.0.2 + parse-entities: 4.0.0 + uvu: 0.5.3 + dev: false + + /micromark-extension-gfm-autolink-literal@1.0.3: + resolution: {integrity: sha512-i3dmvU0htawfWED8aHMMAzAVp/F0Z+0bPh3YrbTPPL1v4YAlCZpy5rBO5p0LPYiZo0zFVkoYh7vDU7yQSiCMjg==} + dependencies: + micromark-util-character: 1.1.0 + micromark-util-sanitize-uri: 1.0.0 + micromark-util-symbol: 1.0.1 + micromark-util-types: 1.0.2 + uvu: 0.5.3 + dev: false + + /micromark-extension-gfm-footnote@1.0.4: + resolution: {integrity: sha512-E/fmPmDqLiMUP8mLJ8NbJWJ4bTw6tS+FEQS8CcuDtZpILuOb2kjLqPEeAePF1djXROHXChM/wPJw0iS4kHCcIg==} + dependencies: + micromark-core-commonmark: 1.0.6 + micromark-factory-space: 1.0.0 + micromark-util-character: 1.1.0 + micromark-util-normalize-identifier: 1.0.0 + micromark-util-sanitize-uri: 1.0.0 + micromark-util-symbol: 1.0.1 + micromark-util-types: 1.0.2 + uvu: 0.5.3 + dev: false + + /micromark-extension-gfm-strikethrough@1.0.4: + resolution: {integrity: sha512-/vjHU/lalmjZCT5xt7CcHVJGq8sYRm80z24qAKXzaHzem/xsDYb2yLL+NNVbYvmpLx3O7SYPuGL5pzusL9CLIQ==} + dependencies: + micromark-util-chunked: 1.0.0 + micromark-util-classify-character: 1.0.0 + micromark-util-resolve-all: 1.0.0 + micromark-util-symbol: 1.0.1 + micromark-util-types: 1.0.2 + uvu: 0.5.3 + dev: false + + /micromark-extension-gfm-table@1.0.5: + resolution: {integrity: sha512-xAZ8J1X9W9K3JTJTUL7G6wSKhp2ZYHrFk5qJgY/4B33scJzE2kpfRL6oiw/veJTbt7jiM/1rngLlOKPWr1G+vg==} + dependencies: + micromark-factory-space: 1.0.0 + micromark-util-character: 1.1.0 + micromark-util-symbol: 1.0.1 + micromark-util-types: 1.0.2 + uvu: 0.5.3 + dev: false + + /micromark-extension-gfm-tagfilter@1.0.1: + resolution: {integrity: sha512-Ty6psLAcAjboRa/UKUbbUcwjVAv5plxmpUTy2XC/3nJFL37eHej8jrHrRzkqcpipJliuBH30DTs7+3wqNcQUVA==} + dependencies: + micromark-util-types: 1.0.2 + dev: false + + /micromark-extension-gfm-task-list-item@1.0.3: + resolution: {integrity: sha512-PpysK2S1Q/5VXi72IIapbi/jliaiOFzv7THH4amwXeYXLq3l1uo8/2Be0Ac1rEwK20MQEsGH2ltAZLNY2KI/0Q==} + dependencies: + micromark-factory-space: 1.0.0 + micromark-util-character: 1.1.0 + micromark-util-symbol: 1.0.1 + micromark-util-types: 1.0.2 + uvu: 0.5.3 + dev: false + + /micromark-extension-gfm@2.0.1: + resolution: {integrity: sha512-p2sGjajLa0iYiGQdT0oelahRYtMWvLjy8J9LOCxzIQsllMCGLbsLW+Nc+N4vi02jcRJvedVJ68cjelKIO6bpDA==} + dependencies: + micromark-extension-gfm-autolink-literal: 1.0.3 + micromark-extension-gfm-footnote: 1.0.4 + micromark-extension-gfm-strikethrough: 1.0.4 + micromark-extension-gfm-table: 1.0.5 + micromark-extension-gfm-tagfilter: 1.0.1 + micromark-extension-gfm-task-list-item: 1.0.3 + micromark-util-combine-extensions: 1.0.0 + micromark-util-types: 1.0.2 + dev: false + + /micromark-extension-mdx-expression@1.0.3: + resolution: {integrity: sha512-TjYtjEMszWze51NJCZmhv7MEBcgYRgb3tJeMAJ+HQCAaZHHRBaDCccqQzGizR/H4ODefP44wRTgOn2vE5I6nZA==} + dependencies: + micromark-factory-mdx-expression: 1.0.6 + micromark-factory-space: 1.0.0 + micromark-util-character: 1.1.0 + micromark-util-events-to-acorn: 1.0.4 + micromark-util-symbol: 1.0.1 + micromark-util-types: 1.0.2 + uvu: 0.5.3 + dev: false + + /micromark-extension-mdx-jsx@1.0.3: + resolution: {integrity: sha512-VfA369RdqUISF0qGgv2FfV7gGjHDfn9+Qfiv5hEwpyr1xscRj/CiVRkU7rywGFCO7JwJ5L0e7CJz60lY52+qOA==} + dependencies: + '@types/acorn': 4.0.6 + estree-util-is-identifier-name: 2.0.0 + micromark-factory-mdx-expression: 1.0.6 + micromark-factory-space: 1.0.0 + micromark-util-character: 1.1.0 + micromark-util-symbol: 1.0.1 + micromark-util-types: 1.0.2 + uvu: 0.5.3 + vfile-message: 3.1.2 + dev: false + + /micromark-extension-mdx-md@1.0.0: + resolution: {integrity: sha512-xaRAMoSkKdqZXDAoSgp20Azm0aRQKGOl0RrS81yGu8Hr/JhMsBmfs4wR7m9kgVUIO36cMUQjNyiyDKPrsv8gOw==} + dependencies: + micromark-util-types: 1.0.2 + dev: false + + /micromark-extension-mdxjs-esm@1.0.2: + resolution: {integrity: sha512-bIaxblNIM+CCaJvp3L/V+168l79iuNmxEiTU6i3vB0YuDW+rumV64BFMxvhfRDxaJxQE1zD5vTPdyLBbW4efGA==} + dependencies: + micromark-core-commonmark: 1.0.6 + micromark-util-character: 1.1.0 + micromark-util-events-to-acorn: 1.0.4 + micromark-util-symbol: 1.0.1 + micromark-util-types: 1.0.2 + unist-util-position-from-estree: 1.1.1 + uvu: 0.5.3 + vfile-message: 3.1.2 + dev: false + + /micromark-extension-mdxjs@1.0.0: + resolution: {integrity: sha512-TZZRZgeHvtgm+IhtgC2+uDMR7h8eTKF0QUX9YsgoL9+bADBpBY6SiLvWqnBlLbCEevITmTqmEuY3FoxMKVs1rQ==} + dependencies: + acorn: 8.7.1 + acorn-jsx: 5.3.2(acorn@8.7.1) + micromark-extension-mdx-expression: 1.0.3 + micromark-extension-mdx-jsx: 1.0.3 + micromark-extension-mdx-md: 1.0.0 + micromark-extension-mdxjs-esm: 1.0.2 + micromark-util-combine-extensions: 1.0.0 + micromark-util-types: 1.0.2 + dev: false + + /micromark-factory-destination@1.0.0: + resolution: {integrity: sha512-eUBA7Rs1/xtTVun9TmV3gjfPz2wEwgK5R5xcbIM5ZYAtvGF6JkyaDsj0agx8urXnO31tEO6Ug83iVH3tdedLnw==} + dependencies: + micromark-util-character: 1.1.0 + micromark-util-symbol: 1.0.1 + micromark-util-types: 1.0.2 + dev: false + + /micromark-factory-label@1.0.2: + resolution: {integrity: sha512-CTIwxlOnU7dEshXDQ+dsr2n+yxpP0+fn271pu0bwDIS8uqfFcumXpj5mLn3hSC8iw2MUr6Gx8EcKng1dD7i6hg==} + dependencies: + micromark-util-character: 1.1.0 + micromark-util-symbol: 1.0.1 + micromark-util-types: 1.0.2 + uvu: 0.5.3 + dev: false + + /micromark-factory-mdx-expression@1.0.6: + resolution: {integrity: sha512-WRQIc78FV7KrCfjsEf/sETopbYjElh3xAmNpLkd1ODPqxEngP42eVRGbiPEQWpRV27LzqW+XVTvQAMIIRLPnNA==} + dependencies: + micromark-factory-space: 1.0.0 + micromark-util-character: 1.1.0 + micromark-util-events-to-acorn: 1.0.4 + micromark-util-symbol: 1.0.1 + micromark-util-types: 1.0.2 + unist-util-position-from-estree: 1.1.1 + uvu: 0.5.3 + vfile-message: 3.1.2 + dev: false + + /micromark-factory-space@1.0.0: + resolution: {integrity: sha512-qUmqs4kj9a5yBnk3JMLyjtWYN6Mzfcx8uJfi5XAveBniDevmZasdGBba5b4QsvRcAkmvGo5ACmSUmyGiKTLZew==} + dependencies: + micromark-util-character: 1.1.0 + micromark-util-types: 1.0.2 + dev: false + + /micromark-factory-title@1.0.2: + resolution: {integrity: sha512-zily+Nr4yFqgMGRKLpTVsNl5L4PMu485fGFDOQJQBl2NFpjGte1e86zC0da93wf97jrc4+2G2GQudFMHn3IX+A==} + dependencies: + micromark-factory-space: 1.0.0 + micromark-util-character: 1.1.0 + micromark-util-symbol: 1.0.1 + micromark-util-types: 1.0.2 + uvu: 0.5.3 + dev: false + + /micromark-factory-whitespace@1.0.0: + resolution: {integrity: sha512-Qx7uEyahU1lt1RnsECBiuEbfr9INjQTGa6Err+gF3g0Tx4YEviPbqqGKNv/NrBaE7dVHdn1bVZKM/n5I/Bak7A==} + dependencies: + micromark-factory-space: 1.0.0 + micromark-util-character: 1.1.0 + micromark-util-symbol: 1.0.1 + micromark-util-types: 1.0.2 + dev: false + + /micromark-util-character@1.1.0: + resolution: {integrity: sha512-agJ5B3unGNJ9rJvADMJ5ZiYjBRyDpzKAOk01Kpi1TKhlT1APx3XZk6eN7RtSz1erbWHC2L8T3xLZ81wdtGRZzg==} + dependencies: + micromark-util-symbol: 1.0.1 + micromark-util-types: 1.0.2 + dev: false + + /micromark-util-chunked@1.0.0: + resolution: {integrity: sha512-5e8xTis5tEZKgesfbQMKRCyzvffRRUX+lK/y+DvsMFdabAicPkkZV6gO+FEWi9RfuKKoxxPwNL+dFF0SMImc1g==} + dependencies: + micromark-util-symbol: 1.0.1 + dev: false + + /micromark-util-classify-character@1.0.0: + resolution: {integrity: sha512-F8oW2KKrQRb3vS5ud5HIqBVkCqQi224Nm55o5wYLzY/9PwHGXC01tr3d7+TqHHz6zrKQ72Okwtvm/xQm6OVNZA==} + dependencies: + micromark-util-character: 1.1.0 + micromark-util-symbol: 1.0.1 + micromark-util-types: 1.0.2 + dev: false + + /micromark-util-combine-extensions@1.0.0: + resolution: {integrity: sha512-J8H058vFBdo/6+AsjHp2NF7AJ02SZtWaVUjsayNFeAiydTxUwViQPxN0Hf8dp4FmCQi0UUFovFsEyRSUmFH3MA==} + dependencies: + micromark-util-chunked: 1.0.0 + micromark-util-types: 1.0.2 + dev: false + + /micromark-util-decode-numeric-character-reference@1.0.0: + resolution: {integrity: sha512-OzO9AI5VUtrTD7KSdagf4MWgHMtET17Ua1fIpXTpuhclCqD8egFWo85GxSGvxgkGS74bEahvtM0WP0HjvV0e4w==} + dependencies: + micromark-util-symbol: 1.0.1 + dev: false + + /micromark-util-decode-string@1.0.2: + resolution: {integrity: sha512-DLT5Ho02qr6QWVNYbRZ3RYOSSWWFuH3tJexd3dgN1odEuPNxCngTCXJum7+ViRAd9BbdxCvMToPOD/IvVhzG6Q==} + dependencies: + decode-named-character-reference: 1.0.1 + micromark-util-character: 1.1.0 + micromark-util-decode-numeric-character-reference: 1.0.0 + micromark-util-symbol: 1.0.1 + dev: false + + /micromark-util-encode@1.0.1: + resolution: {integrity: sha512-U2s5YdnAYexjKDel31SVMPbfi+eF8y1U4pfiRW/Y8EFVCy/vgxk/2wWTxzcqE71LHtCuCzlBDRU2a5CQ5j+mQA==} + dev: false + + /micromark-util-events-to-acorn@1.0.4: + resolution: {integrity: sha512-dpo8ecREK5s/KMph7jJ46RLM6g7N21CMc9LAJQbDLdbQnTpijigkSJPTIfLXZ+h5wdXlcsQ+b6ufAE9v76AdgA==} + dependencies: + '@types/acorn': 4.0.6 + '@types/estree': 0.0.50 + estree-util-visit: 1.1.0 + micromark-util-types: 1.0.2 + uvu: 0.5.3 + vfile-message: 3.1.2 + dev: false + + /micromark-util-html-tag-name@1.0.0: + resolution: {integrity: sha512-NenEKIshW2ZI/ERv9HtFNsrn3llSPZtY337LID/24WeLqMzeZhBEE6BQ0vS2ZBjshm5n40chKtJ3qjAbVV8S0g==} + dev: false + + /micromark-util-normalize-identifier@1.0.0: + resolution: {integrity: sha512-yg+zrL14bBTFrQ7n35CmByWUTFsgst5JhA4gJYoty4Dqzj4Z4Fr/DHekSS5aLfH9bdlfnSvKAWsAgJhIbogyBg==} + dependencies: + micromark-util-symbol: 1.0.1 + dev: false + + /micromark-util-resolve-all@1.0.0: + resolution: {integrity: sha512-CB/AGk98u50k42kvgaMM94wzBqozSzDDaonKU7P7jwQIuH2RU0TeBqGYJz2WY1UdihhjweivStrJ2JdkdEmcfw==} + dependencies: + micromark-util-types: 1.0.2 + dev: false + + /micromark-util-sanitize-uri@1.0.0: + resolution: {integrity: sha512-cCxvBKlmac4rxCGx6ejlIviRaMKZc0fWm5HdCHEeDWRSkn44l6NdYVRyU+0nT1XC72EQJMZV8IPHF+jTr56lAg==} + dependencies: + micromark-util-character: 1.1.0 + micromark-util-encode: 1.0.1 + micromark-util-symbol: 1.0.1 + dev: false + + /micromark-util-subtokenize@1.0.2: + resolution: {integrity: sha512-d90uqCnXp/cy4G881Ub4psE57Sf8YD0pim9QdjCRNjfas2M1u6Lbt+XZK9gnHL2XFhnozZiEdCa9CNfXSfQ6xA==} + dependencies: + micromark-util-chunked: 1.0.0 + micromark-util-symbol: 1.0.1 + micromark-util-types: 1.0.2 + uvu: 0.5.3 + dev: false + + /micromark-util-symbol@1.0.1: + resolution: {integrity: sha512-oKDEMK2u5qqAptasDAwWDXq0tG9AssVwAx3E9bBF3t/shRIGsWIRG+cGafs2p/SnDSOecnt6hZPCE2o6lHfFmQ==} + dev: false + + /micromark-util-types@1.0.2: + resolution: {integrity: sha512-DCfg/T8fcrhrRKTPjRrw/5LLvdGV7BHySf/1LOZx7TzWZdYRjogNtyNq885z3nNallwr3QUKARjqvHqX1/7t+w==} + dev: false + + /micromark@3.0.10: + resolution: {integrity: sha512-ryTDy6UUunOXy2HPjelppgJ2sNfcPz1pLlMdA6Rz9jPzhLikWXv/irpWV/I2jd68Uhmny7hHxAlAhk4+vWggpg==} + dependencies: + '@types/debug': 4.1.7 + debug: 4.3.4 + decode-named-character-reference: 1.0.1 + micromark-core-commonmark: 1.0.6 + micromark-factory-space: 1.0.0 + micromark-util-character: 1.1.0 + micromark-util-chunked: 1.0.0 + micromark-util-combine-extensions: 1.0.0 + micromark-util-decode-numeric-character-reference: 1.0.0 + micromark-util-encode: 1.0.1 + micromark-util-normalize-identifier: 1.0.0 + micromark-util-resolve-all: 1.0.0 + micromark-util-sanitize-uri: 1.0.0 + micromark-util-subtokenize: 1.0.2 + micromark-util-symbol: 1.0.1 + micromark-util-types: 1.0.2 + uvu: 0.5.3 + transitivePeerDependencies: + - supports-color + dev: false + + /micromatch@3.1.10: + resolution: {integrity: sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==} + engines: {node: '>=0.10.0'} + dependencies: + arr-diff: 4.0.0 + array-unique: 0.3.2 + braces: 2.3.2 + define-property: 2.0.2 + extend-shallow: 3.0.2 + extglob: 2.0.4 + fragment-cache: 0.2.1 + kind-of: 6.0.3 + nanomatch: 1.2.13 + object.pick: 1.3.0 + regex-not: 1.0.2 + snapdragon: 0.8.2 + to-regex: 3.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + /micromatch@4.0.4: + resolution: {integrity: sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==} + engines: {node: '>=8.6'} + dependencies: + braces: 3.0.2 + picomatch: 2.3.1 + dev: true + + /miller-rabin@4.0.1: + resolution: {integrity: sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==} + hasBin: true + dependencies: + bn.js: 4.12.0 + brorand: 1.1.0 + dev: true + + /mime-db@1.51.0: + resolution: {integrity: sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==} + engines: {node: '>= 0.6'} + + /mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + dev: true + + /mime-types@2.1.34: + resolution: {integrity: sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==} + engines: {node: '>= 0.6'} + dependencies: + mime-db: 1.51.0 + + /mime@1.6.0: + resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} + engines: {node: '>=4'} + hasBin: true + dev: true + + /mime@2.6.0: + resolution: {integrity: sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==} + engines: {node: '>=4.0.0'} + hasBin: true + dev: true + + /min-document@2.19.0: + resolution: {integrity: sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ==} + dependencies: + dom-walk: 0.1.2 + dev: true + + /min-indent@1.0.1: + resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} + engines: {node: '>=4'} + dev: true + + /minimalistic-assert@1.0.1: + resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} + dev: true + + /minimalistic-crypto-utils@1.0.1: + resolution: {integrity: sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==} + dev: true + + /minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + dependencies: + brace-expansion: 1.1.11 + + /minimatch@5.0.1: + resolution: {integrity: sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==} + engines: {node: '>=10'} + dependencies: + brace-expansion: 2.0.1 + dev: false + + /minimist@1.2.7: + resolution: {integrity: sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==} + + /minipass-collect@1.0.2: + resolution: {integrity: sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==} + engines: {node: '>= 8'} + dependencies: + minipass: 3.1.6 + dev: true + + /minipass-flush@1.0.5: + resolution: {integrity: sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==} + engines: {node: '>= 8'} + dependencies: + minipass: 3.1.6 + dev: true + + /minipass-pipeline@1.2.4: + resolution: {integrity: sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==} + engines: {node: '>=8'} + dependencies: + minipass: 3.1.6 + dev: true + + /minipass@3.1.6: + resolution: {integrity: sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ==} + engines: {node: '>=8'} + dependencies: + yallist: 4.0.0 + dev: true + + /minizlib@2.1.2: + resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} + engines: {node: '>= 8'} + dependencies: + minipass: 3.1.6 + yallist: 4.0.0 + dev: true + + /mississippi@3.0.0: + resolution: {integrity: sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==} + engines: {node: '>=4.0.0'} + dependencies: + concat-stream: 1.6.2 + duplexify: 3.7.1 + end-of-stream: 1.4.4 + flush-write-stream: 1.1.1 + from2: 2.3.0 + parallel-transform: 1.2.0 + pump: 3.0.0 + pumpify: 1.5.1 + stream-each: 1.2.3 + through2: 2.0.5 + dev: true + + /mixin-deep@1.3.2: + resolution: {integrity: sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==} + engines: {node: '>=0.10.0'} + dependencies: + for-in: 1.0.2 + is-extendable: 1.0.1 + dev: true + + /mkdirp@0.5.5: + resolution: {integrity: sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==} + hasBin: true + dependencies: + minimist: 1.2.7 + + /mkdirp@1.0.4: + resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} + engines: {node: '>=10'} + hasBin: true + dev: true + + /move-concurrently@1.0.1: + resolution: {integrity: sha512-hdrFxZOycD/g6A6SoI2bB5NA/5NEqD0569+S47WZhPvm46sD50ZHdYaFmnua5lndde9rCHGjmfK7Z8BuCt/PcQ==} + dependencies: + aproba: 1.2.0 + copy-concurrently: 1.0.5 + fs-write-stream-atomic: 1.0.10 + mkdirp: 0.5.5 + rimraf: 2.7.1 + run-queue: 1.0.3 + dev: true + + /mri@1.2.0: + resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} + engines: {node: '>=4'} + dev: false + + /mrmime@1.0.0: + resolution: {integrity: sha512-a70zx7zFfVO7XpnQ2IX1Myh9yY4UYvfld/dikWRnsXxbyvMcfz+u6UfgNAtH+k2QqtJuzVpv6eLTx1G2+WKZbQ==} + engines: {node: '>=10'} + dev: true + + /ms@2.0.0: + resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + dev: true + + /ms@2.1.1: + resolution: {integrity: sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==} + dev: true + + /ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + + /ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + dev: true + + /nan@2.15.0: + resolution: {integrity: sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ==} + requiresBuild: true + dev: true + optional: true + + /nanoid@3.3.1: + resolution: {integrity: sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + dev: true + + /nanoid@3.3.7: + resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + /nanomatch@1.2.13: + resolution: {integrity: sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==} + engines: {node: '>=0.10.0'} + dependencies: + arr-diff: 4.0.0 + array-unique: 0.3.2 + define-property: 2.0.2 + extend-shallow: 3.0.2 + fragment-cache: 0.2.1 + is-windows: 1.0.2 + kind-of: 6.0.3 + object.pick: 1.3.0 + regex-not: 1.0.2 + snapdragon: 0.8.2 + to-regex: 3.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + /natural-compare-lite@1.4.0: + resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} + dev: true + + /natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + dev: true + + /nearest-color@0.4.4: + resolution: {integrity: sha512-orhcaIORC10tf41Ld2wwlcC+FaAavHG87JHWB3eHH5p7v2k9Tzym2XNEZzLAm5YJwGv6Q38WWc7SOb+Qfu/4NQ==} + dev: true + + /negotiator@0.6.3: + resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} + engines: {node: '>= 0.6'} + dev: true + + /neo-async@2.6.2: + resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + dev: true + + /nested-error-stacks@2.1.0: + resolution: {integrity: sha512-AO81vsIO1k1sM4Zrd6Hu7regmJN1NSiAja10gc4bX3F0wd+9rQmcuHQaHVQCYIEC8iFXnE+mavh23GOt7wBgug==} + dev: true + + /next-compose-plugins@2.2.1: + resolution: {integrity: sha512-OjJ+fV15FXO2uQXQagLD4C0abYErBjyjE0I0FHpOEIB8upw0hg1ldFP6cqHTJBH1cZqy96OeR3u1dJ+Ez2D4Bg==} + dev: true + + /next-linaria@0.11.0(linaria@2.3.1): + resolution: {integrity: sha512-JoVY9gF8d8NXRWfGMCIqh1m0uLvFV7wQA2kz8mzU4diHe3/VuNuXXwnogJOK9JMvhK1RD36/0eKiCbbeGI2mTw==} + peerDependencies: + linaria: '*' + dependencies: + linaria: 2.3.1(@babel/core@7.17.5) + dev: false + + /next-mdx-remote@4.0.2(react-dom@17.0.2)(react@17.0.2): + resolution: {integrity: sha512-1cZM2xm+G1FyYodGt92lCXisP0owPeppVHeH5TIaXUGdt6ENBZYOxLNFaVl9fkS9wP/s2sLcC9m2c1iLH2H4rA==} + engines: {node: '>=14', npm: '>=7'} + peerDependencies: + react: '>=16.x <=17.x' + react-dom: '>=16.x <=17.x' + dependencies: + '@mdx-js/mdx': 2.1.0 + '@mdx-js/react': 2.1.1(react@17.0.2) + react: 17.0.2 + react-dom: 17.0.2(react@17.0.2) + vfile: 5.3.2 + vfile-matter: 3.0.1 + transitivePeerDependencies: + - supports-color + dev: false + + /next-remote-watch@1.0.0: + resolution: {integrity: sha512-kV+pglCwcnKyqJIXPHUUrnZr9d3rCqCIEQWBkFYC02GDXHyKVmcFytoY6q0+wMIQqh/izIAQL1x6OKXZhksjLA==} + hasBin: true + dependencies: + body-parser: 1.20.0 + chalk: 4.1.2 + chokidar: 3.5.3 + commander: 5.1.0 + express: 4.17.3 + transitivePeerDependencies: + - supports-color + dev: true + + /next-sitemap@2.5.20(next@12.3.4): + resolution: {integrity: sha512-Qbm4N2WGA6VHemFN0C9PNWQav9RKwMEbVrNgVvDQhG0sDBmNBgKii54WklOjCvVJVHgQPgtXLBhlNaJGS+RVQA==} + engines: {node: '>=14.18'} + hasBin: true + peerDependencies: + next: '*' + dependencies: + '@corex/deepmerge': 2.6.148 + minimist: 1.2.7 + next: 12.3.4(@babel/core@7.17.5)(react-dom@17.0.2)(react@17.0.2) + dev: true + + /next@12.3.4(@babel/core@7.17.5)(react-dom@17.0.2)(react@17.0.2): + resolution: {integrity: sha512-VcyMJUtLZBGzLKo3oMxrEF0stxh8HwuW976pAzlHhI3t8qJ4SROjCrSh1T24bhrbjw55wfZXAbXPGwPt5FLRfQ==} + engines: {node: '>=12.22.0'} + hasBin: true + peerDependencies: + fibers: '>= 3.1.0' + node-sass: ^6.0.0 || ^7.0.0 + react: ^17.0.2 || ^18.0.0-0 + react-dom: ^17.0.2 || ^18.0.0-0 + sass: ^1.3.0 + peerDependenciesMeta: + fibers: + optional: true + node-sass: + optional: true + sass: + optional: true + dependencies: + '@next/env': 12.3.4 + '@swc/helpers': 0.4.11 + caniuse-lite: 1.0.30001561 + postcss: 8.4.14 + react: 17.0.2 + react-dom: 17.0.2(react@17.0.2) + styled-jsx: 5.0.7(@babel/core@7.17.5)(react@17.0.2) + use-sync-external-store: 1.2.0(react@17.0.2) + optionalDependencies: + '@next/swc-android-arm-eabi': 12.3.4 + '@next/swc-android-arm64': 12.3.4 + '@next/swc-darwin-arm64': 12.3.4 + '@next/swc-darwin-x64': 12.3.4 + '@next/swc-freebsd-x64': 12.3.4 + '@next/swc-linux-arm-gnueabihf': 12.3.4 + '@next/swc-linux-arm64-gnu': 12.3.4 + '@next/swc-linux-arm64-musl': 12.3.4 + '@next/swc-linux-x64-gnu': 12.3.4 + '@next/swc-linux-x64-musl': 12.3.4 + '@next/swc-win32-arm64-msvc': 12.3.4 + '@next/swc-win32-ia32-msvc': 12.3.4 + '@next/swc-win32-x64-msvc': 12.3.4 + transitivePeerDependencies: + - '@babel/core' + - babel-plugin-macros + + /nice-try@1.0.5: + resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==} + dev: true + + /no-case@3.0.4: + resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} + dependencies: + lower-case: 2.0.2 + tslib: 2.3.1 + dev: true + + /node-dir@0.1.17: + resolution: {integrity: sha512-tmPX422rYgofd4epzrNoOXiE8XFZYOcCq1vD7MAXCDO+O+zndlA2ztdKKMa+EeuBG5tHETpr4ml4RGgpqDCCAg==} + engines: {node: '>= 0.10.5'} + dependencies: + minimatch: 3.1.2 + dev: true + + /node-fetch@2.6.7: + resolution: {integrity: sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + dependencies: + whatwg-url: 5.0.0 + dev: true + + /node-int64@0.4.0: + resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} + dev: true + + /node-libs-browser@2.2.1: + resolution: {integrity: sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==} + dependencies: + assert: 1.5.0 + browserify-zlib: 0.2.0 + buffer: 4.9.2 + console-browserify: 1.2.0 + constants-browserify: 1.0.0 + crypto-browserify: 3.12.0 + domain-browser: 1.2.0 + events: 3.3.0 + https-browserify: 1.0.0 + os-browserify: 0.3.0 + path-browserify: 0.0.1 + process: 0.11.10 + punycode: 1.4.1 + querystring-es3: 0.2.1 + readable-stream: 2.3.7 + stream-browserify: 2.0.2 + stream-http: 2.8.3 + string_decoder: 1.3.0 + timers-browserify: 2.0.12 + tty-browserify: 0.0.0 + url: 0.11.0 + util: 0.11.1 + vm-browserify: 1.1.2 + dev: true + + /node-releases@2.0.2: + resolution: {integrity: sha512-XxYDdcQ6eKqp/YjI+tb2C5WM2LgjnZrfYg4vgQt49EK268b6gYCHsBLrK2qvJo4FmCtqmKezb0WZFK4fkrZNsg==} + + /normalize-package-data@2.5.0: + resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} + dependencies: + hosted-git-info: 2.8.9 + resolve: 1.22.0 + semver: 5.7.2 + validate-npm-package-license: 3.0.4 + dev: true + + /normalize-path@2.1.1: + resolution: {integrity: sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==} + engines: {node: '>=0.10.0'} + requiresBuild: true + dependencies: + remove-trailing-separator: 1.1.0 + dev: true + + /normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + /normalize-range@0.1.2: + resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} + engines: {node: '>=0.10.0'} + dev: true + + /npm-run-path@2.0.2: + resolution: {integrity: sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==} + engines: {node: '>=4'} + dependencies: + path-key: 2.0.1 + dev: true + + /npmlog@5.0.1: + resolution: {integrity: sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==} + dependencies: + are-we-there-yet: 2.0.0 + console-control-strings: 1.1.0 + gauge: 3.0.2 + set-blocking: 2.0.0 + dev: true + + /nth-check@2.0.1: + resolution: {integrity: sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w==} + dependencies: + boolbase: 1.0.0 + + /num2fraction@1.2.2: + resolution: {integrity: sha512-Y1wZESM7VUThYY+4W+X4ySH2maqcA+p7UR+w8VWNWVAd6lwuXXWz/w/Cz43J/dI2I+PS6wD5N+bJUF+gjWvIqg==} + dev: true + + /nwsapi@2.2.0: + resolution: {integrity: sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==} + dev: false + + /object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + /object-copy@0.1.0: + resolution: {integrity: sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==} + engines: {node: '>=0.10.0'} + dependencies: + copy-descriptor: 0.1.1 + define-property: 0.2.5 + kind-of: 3.2.2 + dev: true + + /object-inspect@1.12.0: + resolution: {integrity: sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==} + dev: true + + /object-is@1.1.5: + resolution: {integrity: sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.1.3 + dev: true + + /object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + + /object-visit@1.0.1: + resolution: {integrity: sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==} + engines: {node: '>=0.10.0'} + dependencies: + isobject: 3.0.1 + dev: true + + /object.assign@4.1.2: + resolution: {integrity: sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.1.3 + has-symbols: 1.0.2 + object-keys: 1.1.1 + + /object.entries@1.1.5: + resolution: {integrity: sha512-TyxmjUoZggd4OrrU1W66FMDG6CuqJxsFvymeyXI51+vQLN67zYfZseptRge703kKQdo4uccgAKebXFcRCzk4+g==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.1.3 + es-abstract: 1.19.1 + dev: true + + /object.fromentries@2.0.5: + resolution: {integrity: sha512-CAyG5mWQRRiBU57Re4FKoTBjXfDoNwdFVH2Y1tS9PqCsfUTymAohOkEMSG3aRNKmv4lV3O7p1et7c187q6bynw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.1.3 + es-abstract: 1.19.1 + dev: true + + /object.getownpropertydescriptors@2.1.3: + resolution: {integrity: sha512-VdDoCwvJI4QdC6ndjpqFmoL3/+HxffFBbcJzKi5hwLLqqx3mdbedRpfZDdK0SrOSauj8X4GzBvnDZl4vTN7dOw==} + engines: {node: '>= 0.8'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.1.3 + es-abstract: 1.19.1 + dev: true + + /object.hasown@1.1.0: + resolution: {integrity: sha512-MhjYRfj3GBlhSkDHo6QmvgjRLXQ2zndabdf3nX0yTyZK9rPfxb6uRpAac8HXNLy1GpqWtZ81Qh4v3uOls2sRAg==} + dependencies: + define-properties: 1.1.3 + es-abstract: 1.19.1 + dev: true + + /object.pick@1.3.0: + resolution: {integrity: sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==} + engines: {node: '>=0.10.0'} + dependencies: + isobject: 3.0.1 + dev: true + + /object.values@1.1.5: + resolution: {integrity: sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.1.3 + es-abstract: 1.19.1 + dev: true + + /objectorarray@1.0.5: + resolution: {integrity: sha512-eJJDYkhJFFbBBAxeh8xW+weHlkI28n2ZdQV/J/DNfWfSKlGEf2xcfAbZTv3riEXHAhL9SVOTs2pRmXiSTf78xg==} + dev: true + + /on-finished@2.3.0: + resolution: {integrity: sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==} + engines: {node: '>= 0.8'} + dependencies: + ee-first: 1.1.1 + dev: true + + /on-finished@2.4.1: + resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} + engines: {node: '>= 0.8'} + dependencies: + ee-first: 1.1.1 + dev: true + + /on-headers@1.0.2: + resolution: {integrity: sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==} + engines: {node: '>= 0.8'} + dev: true + + /once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + dependencies: + wrappy: 1.0.2 + + /open@7.4.2: + resolution: {integrity: sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==} + engines: {node: '>=8'} + dependencies: + is-docker: 2.2.1 + is-wsl: 2.2.0 + dev: true + + /opener@1.5.2: + resolution: {integrity: sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==} + hasBin: true + dev: true + + /optionator@0.8.3: + resolution: {integrity: sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==} + engines: {node: '>= 0.8.0'} + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.3.0 + prelude-ls: 1.1.2 + type-check: 0.3.2 + word-wrap: 1.2.4 + + /optionator@0.9.1: + resolution: {integrity: sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==} + engines: {node: '>= 0.8.0'} + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + word-wrap: 1.2.4 + dev: true + + /os-browserify@0.3.0: + resolution: {integrity: sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==} + dev: true + + /overlayscrollbars@1.13.1: + resolution: {integrity: sha512-gIQfzgGgu1wy80EB4/6DaJGHMEGmizq27xHIESrzXq0Y/J0Ay1P3DWk6tuVmEPIZH15zaBlxeEJOqdJKmowHCQ==} + dev: true + + /p-all@2.1.0: + resolution: {integrity: sha512-HbZxz5FONzz/z2gJfk6bFca0BCiSRF8jU3yCsWOen/vR6lZjfPOu/e7L3uFzTW1i0H8TlC3vqQstEJPQL4/uLA==} + engines: {node: '>=6'} + dependencies: + p-map: 2.1.0 + dev: true + + /p-event@4.2.0: + resolution: {integrity: sha512-KXatOjCRXXkSePPb1Nbi0p0m+gQAwdlbhi4wQKJPI1HsMQS9g+Sqp2o+QHziPr7eYJyOZet836KoHEVM1mwOrQ==} + engines: {node: '>=8'} + dependencies: + p-timeout: 3.2.0 + dev: true + + /p-filter@2.1.0: + resolution: {integrity: sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==} + engines: {node: '>=8'} + dependencies: + p-map: 2.1.0 + dev: true + + /p-finally@1.0.0: + resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==} + engines: {node: '>=4'} + dev: true + + /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: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + dependencies: + p-try: 2.2.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: + resolution: {integrity: sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==} + engines: {node: '>=4'} + dependencies: + p-limit: 1.3.0 + dev: true + + /p-locate@3.0.0: + resolution: {integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==} + engines: {node: '>=6'} + dependencies: + p-limit: 2.3.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: + 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: + resolution: {integrity: sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==} + engines: {node: '>=6'} + dev: true + + /p-map@3.0.0: + resolution: {integrity: sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==} + engines: {node: '>=8'} + dependencies: + aggregate-error: 3.1.0 + dev: true + + /p-map@4.0.0: + resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} + engines: {node: '>=10'} + dependencies: + aggregate-error: 3.1.0 + dev: true + + /p-timeout@3.2.0: + resolution: {integrity: sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==} + engines: {node: '>=8'} + dependencies: + p-finally: 1.0.0 + dev: true + + /p-try@1.0.0: + resolution: {integrity: sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==} + engines: {node: '>=4'} + dev: true + + /p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + + /pako@1.0.11: + resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} + dev: true + + /parallel-transform@1.2.0: + resolution: {integrity: sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==} + dependencies: + cyclist: 1.0.1 + inherits: 2.0.4 + readable-stream: 2.3.7 + dev: true + + /param-case@3.0.4: + resolution: {integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==} + dependencies: + dot-case: 3.0.4 + tslib: 2.3.1 + dev: true + + /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-asn1@5.1.6: + resolution: {integrity: sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==} + dependencies: + asn1.js: 5.4.1 + browserify-aes: 1.2.0 + evp_bytestokey: 1.0.3 + pbkdf2: 3.1.2 + safe-buffer: 5.2.1 + dev: true + + /parse-entities@2.0.0: + resolution: {integrity: sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==} + dependencies: + character-entities: 1.2.4 + character-entities-legacy: 1.1.4 + character-reference-invalid: 1.1.4 + is-alphanumerical: 1.0.4 + is-decimal: 1.0.4 + is-hexadecimal: 1.0.4 + dev: true + + /parse-entities@4.0.0: + resolution: {integrity: sha512-5nk9Fn03x3rEhGaX1FU6IDwG/k+GxLXlFAkgrbM1asuAFl3BhdQWvASaIsmwWypRNcZKHPYnIuOSfIWEyEQnPQ==} + dependencies: + '@types/unist': 2.0.6 + character-entities: 2.0.1 + character-entities-legacy: 3.0.0 + character-reference-invalid: 2.0.1 + decode-named-character-reference: 1.0.1 + is-alphanumerical: 2.0.1 + is-decimal: 2.0.1 + is-hexadecimal: 2.0.1 + dev: false + + /parse-json@4.0.0: + resolution: {integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==} + engines: {node: '>=4'} + dependencies: + error-ex: 1.3.2 + json-parse-better-errors: 1.0.2 + dev: false + + /parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + dependencies: + '@babel/code-frame': 7.22.13 + error-ex: 1.3.2 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + dev: true + + /parse-numeric-range@1.3.0: + resolution: {integrity: sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ==} + dev: false + + /parse5-htmlparser2-tree-adapter@6.0.1: + resolution: {integrity: sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==} + dependencies: + parse5: 6.0.1 + dev: false + + /parse5@6.0.1: + resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==} + + /parseurl@1.3.3: + resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} + engines: {node: '>= 0.8'} + dev: true + + /pascal-case@3.1.2: + resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==} + dependencies: + no-case: 3.0.4 + tslib: 2.3.1 + dev: true + + /pascalcase@0.1.1: + resolution: {integrity: sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==} + engines: {node: '>=0.10.0'} + dev: true + + /path-browserify@0.0.1: + resolution: {integrity: sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==} + dev: true + + /path-dirname@1.0.2: + resolution: {integrity: sha512-ALzNPpyNq9AqXMBjeymIjFDAkAFH06mHJH/cSBHAgU0s4vfpBn6b2nf8tiRLvagKD8RbTpq2FKTBg7cl9l3c7Q==} + requiresBuild: true + dev: true + + /path-exists@3.0.0: + resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} + engines: {node: '>=4'} + + /path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + dev: true + + /path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + /path-key@2.0.1: + resolution: {integrity: sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==} + engines: {node: '>=4'} + dev: true + + /path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + dev: true + + /path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + /path-to-regexp@0.1.7: + resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==} + dev: true + + /path-type@3.0.0: + resolution: {integrity: sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==} + engines: {node: '>=4'} + dependencies: + pify: 3.0.0 + dev: true + + /path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + dev: true + + /pbkdf2@3.1.2: + resolution: {integrity: sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==} + engines: {node: '>=0.12'} + dependencies: + create-hash: 1.2.0 + create-hmac: 1.1.7 + ripemd160: 2.0.2 + safe-buffer: 5.2.1 + sha.js: 2.4.11 + dev: true + + /periscopic@3.0.4: + resolution: {integrity: sha512-SFx68DxCv0Iyo6APZuw/AKewkkThGwssmU0QWtTlvov3VAtPX+QJ4CadwSaz8nrT5jPIuxdvJWB4PnD2KNDxQg==} + dependencies: + estree-walker: 3.0.1 + is-reference: 3.0.0 + dev: false + + /picocolors@0.2.1: + resolution: {integrity: sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==} + + /picocolors@1.0.0: + resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + + /picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + dev: true + + /pify@3.0.0: + resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} + engines: {node: '>=4'} + dev: true + + /pify@4.0.1: + resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} + engines: {node: '>=6'} + dev: true + + /pirates@4.0.5: + resolution: {integrity: sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==} + engines: {node: '>= 6'} + dev: true + + /pkg-dir@3.0.0: + resolution: {integrity: sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==} + engines: {node: '>=6'} + dependencies: + find-up: 3.0.0 + dev: true + + /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 + + /pkg-dir@5.0.0: + resolution: {integrity: sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==} + engines: {node: '>=10'} + dependencies: + find-up: 5.0.0 + dev: true + + /pnp-webpack-plugin@1.6.4(typescript@4.5.5): + resolution: {integrity: sha512-7Wjy+9E3WwLOEL30D+m8TSTF7qJJUJLONBnwQp0518siuMxUQUbgZwssaFX+QKlZkjHZcw/IpZCt/H0srrntSg==} + engines: {node: '>=6'} + dependencies: + ts-pnp: 1.2.0(typescript@4.5.5) + transitivePeerDependencies: + - typescript + dev: true + + /polished@4.1.4: + resolution: {integrity: sha512-Nq5Mbza+Auo7N3sQb1QMFaQiDO+4UexWuSGR7Cjb4Sw11SZIJcrrFtiZ+L0jT9MBsUsxDboHVASbCLbE1rnECg==} + engines: {node: '>=10'} + dependencies: + '@babel/runtime': 7.17.2 + dev: true + + /posix-character-classes@0.1.1: + resolution: {integrity: sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==} + engines: {node: '>=0.10.0'} + dev: true + + /postcss-flexbugs-fixes@4.2.1: + resolution: {integrity: sha512-9SiofaZ9CWpQWxOwRh1b/r85KD5y7GgvsNt1056k6OYLvWUun0czCvogfJgylC22uJTwW1KzY3Gz65NZRlvoiQ==} + dependencies: + postcss: 7.0.39 + dev: true + + /postcss-loader@4.3.0(postcss@7.0.39)(webpack@4.46.0): + resolution: {integrity: sha512-M/dSoIiNDOo8Rk0mUqoj4kpGq91gcxCfb9PoyZVdZ76/AuhxylHDYZblNE8o+EQ9AMSASeMFEKxZf5aU6wlx1Q==} + engines: {node: '>= 10.13.0'} + peerDependencies: + postcss: ^7.0.0 || ^8.0.1 + webpack: ^4.0.0 || ^5.0.0 + dependencies: + cosmiconfig: 7.0.1 + klona: 2.0.5 + loader-utils: 2.0.2 + postcss: 7.0.39 + schema-utils: 3.1.1 + semver: 7.5.4 + webpack: 4.46.0 + dev: true + + /postcss-modules-extract-imports@2.0.0: + resolution: {integrity: sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ==} + engines: {node: '>= 6'} + dependencies: + postcss: 7.0.39 + dev: true + + /postcss-modules-local-by-default@3.0.3: + resolution: {integrity: sha512-e3xDq+LotiGesympRlKNgaJ0PCzoUIdpH0dj47iWAui/kyTgh3CiAr1qP54uodmJhl6p9rN6BoNcdEDVJx9RDw==} + engines: {node: '>= 6'} + dependencies: + icss-utils: 4.1.1 + postcss: 7.0.39 + postcss-selector-parser: 6.0.9 + postcss-value-parser: 4.2.0 + dev: true + + /postcss-modules-scope@2.2.0: + resolution: {integrity: sha512-YyEgsTMRpNd+HmyC7H/mh3y+MeFWevy7V1evVhJWewmMbjDHIbZbOXICC2y+m1xI1UVfIT1HMW/O04Hxyu9oXQ==} + engines: {node: '>= 6'} + dependencies: + postcss: 7.0.39 + postcss-selector-parser: 6.0.9 + dev: true + + /postcss-modules-values@3.0.0: + resolution: {integrity: sha512-1//E5jCBrZ9DmRX+zCtmQtRSV6PV42Ix7Bzj9GbwJceduuf7IqP8MgeTXuRDHOWj2m0VzZD5+roFWDuU8RQjcg==} + dependencies: + icss-utils: 4.1.1 + postcss: 7.0.39 + dev: true + + /postcss-selector-parser@6.0.9: + resolution: {integrity: sha512-UO3SgnZOVTwu4kyLR22UQ1xZh086RyNZppb7lLAKBFK8a32ttG5i87Y/P3+2bRSjZNyJ1B7hfFNo273tKe9YxQ==} + engines: {node: '>=4'} + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + dev: true + + /postcss-value-parser@4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + dev: true + + /postcss@7.0.39: + resolution: {integrity: sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==} + engines: {node: '>=6.0.0'} + dependencies: + picocolors: 0.2.1 + source-map: 0.6.1 + + /postcss@8.4.14: + resolution: {integrity: sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.7 + picocolors: 1.0.0 + source-map-js: 1.0.2 + + /prelude-ls@1.1.2: + resolution: {integrity: sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==} + engines: {node: '>= 0.8.0'} + + /prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + dev: true + + /prettier-linter-helpers@1.0.0: + resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} + engines: {node: '>=6.0.0'} + dependencies: + fast-diff: 1.2.0 + dev: true + + /prettier@2.3.0: + resolution: {integrity: sha512-kXtO4s0Lz/DW/IJ9QdWhAf7/NmPWQXkFr/r/WkR3vyI+0v8amTDxiaQSLzs8NBlytfLWX/7uQUMIW677yLKl4w==} + engines: {node: '>=10.13.0'} + hasBin: true + dev: true + + /prettier@2.4.1: + resolution: {integrity: sha512-9fbDAXSBcc6Bs1mZrDYb3XKzDLm4EXXL9sC1LqKP5rZkT6KRr/rf9amVUcODVXgguK/isJz0d0hP72WeaKWsvA==} + engines: {node: '>=10.13.0'} + hasBin: true + dev: true + + /pretty-error@2.1.2: + resolution: {integrity: sha512-EY5oDzmsX5wvuynAByrmY0P0hcp+QpnAKbJng2A2MPjVKXCxrDSUkzghVJ4ZGPIv+JC4gX8fPUWscC0RtjsWGw==} + dependencies: + lodash: 4.17.21 + renderkid: 2.0.7 + dev: true + + /pretty-format@27.5.1: + resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + ansi-regex: 5.0.1 + ansi-styles: 5.2.0 + react-is: 17.0.2 + dev: true + + /pretty-hrtime@1.0.3: + resolution: {integrity: sha512-66hKPCr+72mlfiSjlEB1+45IjXSqvVAIy6mocupoww4tBFE9R9IhwwUGoI4G++Tc9Aq+2rxOt0RFU6gPcrte0A==} + engines: {node: '>= 0.8'} + dev: true + + /prismjs@1.27.0: + resolution: {integrity: sha512-t13BGPUlFDR7wRB5kQDG4jjl7XeuH6jbJGt11JHPL96qwsEHNX2+68tFXqc1/k+/jALsbSWJKUOT/hcYAZ5LkA==} + engines: {node: '>=6'} + dev: true + + /prismjs@1.28.0: + resolution: {integrity: sha512-8aaXdYvl1F7iC7Xm1spqSaY/OJBpYW3v+KJ+F17iYxvdc8sfjW194COK5wVhMZX45tGteiBQgdvD/nhxcRwylw==} + engines: {node: '>=6'} + + /process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + + /process@0.11.10: + resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} + engines: {node: '>= 0.6.0'} + dev: true + + /promise-inflight@1.0.1(bluebird@3.7.2): + resolution: {integrity: sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==} + peerDependencies: + bluebird: '*' + peerDependenciesMeta: + bluebird: + optional: true + dependencies: + bluebird: 3.7.2 + dev: true + + /promise.allsettled@1.0.5: + resolution: {integrity: sha512-tVDqeZPoBC0SlzJHzWGZ2NKAguVq2oiYj7gbggbiTvH2itHohijTp7njOUA0aQ/nl+0lr/r6egmhoYu63UZ/pQ==} + engines: {node: '>= 0.4'} + dependencies: + array.prototype.map: 1.0.4 + call-bind: 1.0.2 + define-properties: 1.1.3 + es-abstract: 1.19.1 + get-intrinsic: 1.1.1 + iterate-value: 1.0.2 + dev: true + + /promise.prototype.finally@3.1.3: + resolution: {integrity: sha512-EXRF3fC9/0gz4qkt/f5EP5iW4kj9oFpBICNpCNOb/52+8nlHIX07FPLbi/q4qYBQ1xZqivMzTpNQSnArVASolQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.1.3 + es-abstract: 1.19.1 + dev: true + + /promise@7.3.1: + resolution: {integrity: sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==} + dependencies: + asap: 2.0.6 + dev: true + + /prompts@2.4.2: + resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} + engines: {node: '>= 6'} + dependencies: + kleur: 3.0.3 + sisteransi: 1.0.5 + dev: true + + /prop-types@15.8.1: + resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + dependencies: + loose-envify: 1.4.0 + object-assign: 4.1.1 + react-is: 16.13.1 + + /property-information@5.6.0: + resolution: {integrity: sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA==} + dependencies: + xtend: 4.0.2 + + /property-information@6.1.1: + resolution: {integrity: sha512-hrzC564QIl0r0vy4l6MvRLhafmUowhO/O3KgVSoXIbbA2Sz4j8HGpJc6T2cubRVwMwpdiG/vKGfhT4IixmKN9w==} + dev: false + + /proxy-addr@2.0.7: + resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} + engines: {node: '>= 0.10'} + dependencies: + forwarded: 0.2.0 + ipaddr.js: 1.9.1 + dev: true + + /prr@1.0.1: + resolution: {integrity: sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==} + + /psl@1.8.0: + resolution: {integrity: sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==} + dev: false + + /public-encrypt@4.0.3: + resolution: {integrity: sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==} + dependencies: + bn.js: 4.12.0 + browserify-rsa: 4.1.0 + create-hash: 1.2.0 + parse-asn1: 5.1.6 + randombytes: 2.1.0 + safe-buffer: 5.2.1 + dev: true + + /pump@2.0.1: + resolution: {integrity: sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==} + dependencies: + end-of-stream: 1.4.4 + once: 1.4.0 + dev: true + + /pump@3.0.0: + resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} + dependencies: + end-of-stream: 1.4.4 + once: 1.4.0 + dev: true + + /pumpify@1.5.1: + resolution: {integrity: sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==} + dependencies: + duplexify: 3.7.1 + inherits: 2.0.4 + pump: 2.0.1 + dev: true + + /punycode@1.3.2: + resolution: {integrity: sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==} + dev: true + + /punycode@1.4.1: + resolution: {integrity: sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==} + dev: true + + /punycode@2.1.1: + resolution: {integrity: sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==} + engines: {node: '>=6'} + + /pure-color@1.3.0: + resolution: {integrity: sha512-QFADYnsVoBMw1srW7OVKEYjG+MbIa49s54w1MA1EDY6r2r/sTcKKYqRX1f4GYvnXP7eN/Pe9HFcX+hwzmrXRHA==} + dev: true + + /qs@6.10.3: + resolution: {integrity: sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==} + engines: {node: '>=0.6'} + dependencies: + side-channel: 1.0.4 + dev: true + + /qs@6.9.7: + resolution: {integrity: sha512-IhMFgUmuNpyRfxA90umL7ByLlgRXu6tIfKPpF5TmcfRLlLCckfP/g3IQmju6jjpu+Hh8rA+2p6A27ZSPOOHdKw==} + engines: {node: '>=0.6'} + dev: true + + /querystring-es3@0.2.1: + resolution: {integrity: sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA==} + engines: {node: '>=0.4.x'} + dev: true + + /querystring@0.2.0: + resolution: {integrity: sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==} + engines: {node: '>=0.4.x'} + deprecated: The querystring API is considered Legacy. new code should use the URLSearchParams API instead. + dev: true + + /querystring@0.2.1: + resolution: {integrity: sha512-wkvS7mL/JMugcup3/rMitHmd9ecIGd2lhFhK9N3UUQ450h66d1r3Y9nvXzQAW1Lq+wyx61k/1pfKS5KuKiyEbg==} + engines: {node: '>=0.4.x'} + deprecated: The querystring API is considered Legacy. new code should use the URLSearchParams API instead. + dev: true + + /queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + dev: true + + /ramda@0.21.0: + resolution: {integrity: sha512-HGd5aczYKQXGILB+abY290V7Xz62eFajpa6AtMdwEmQSakJmgSO7ks4eI3HdR34j+X2Vz4Thp9VAJbrCAMbO2w==} + dev: true + + /randombytes@2.1.0: + resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + dependencies: + safe-buffer: 5.2.1 + dev: true + + /randomfill@1.0.4: + resolution: {integrity: sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==} + dependencies: + randombytes: 2.1.0 + safe-buffer: 5.2.1 + dev: true + + /range-parser@1.2.1: + resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} + engines: {node: '>= 0.6'} + dev: true + + /raw-body@2.4.3: + resolution: {integrity: sha512-UlTNLIcu0uzb4D2f4WltY6cVjLi+/jEN4lgEUj3E04tpMDpUlkBo/eSn6zou9hum2VMNpCCUone0O0WeJim07g==} + engines: {node: '>= 0.8'} + dependencies: + bytes: 3.1.2 + http-errors: 1.8.1 + iconv-lite: 0.4.24 + unpipe: 1.0.0 + dev: true + + /raw-body@2.5.1: + resolution: {integrity: sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==} + engines: {node: '>= 0.8'} + dependencies: + bytes: 3.1.2 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + unpipe: 1.0.0 + dev: true + + /raw-loader@4.0.2(webpack@4.46.0): + resolution: {integrity: sha512-ZnScIV3ag9A4wPX/ZayxL/jZH+euYb6FcUinPcgiQW0+UBtEv0O6Q3lGd3cqJ+GHH+rksEv3Pj99oxJ3u3VIKA==} + engines: {node: '>= 10.13.0'} + peerDependencies: + webpack: ^4.0.0 || ^5.0.0 + dependencies: + loader-utils: 2.0.2 + schema-utils: 3.1.1 + webpack: 4.46.0 + dev: true + + /react-base16-styling@0.6.0: + resolution: {integrity: sha512-yvh/7CArceR/jNATXOKDlvTnPKPmGZz7zsenQ3jUwLzHkNUR0CvY3yGYJbWJ/nnxsL8Sgmt5cO3/SILVuPO6TQ==} + dependencies: + base16: 1.0.0 + lodash.curry: 4.1.1 + lodash.flow: 3.5.0 + pure-color: 1.3.0 + dev: true + + /react-color@2.19.3(react@17.0.2): + resolution: {integrity: sha512-LEeGE/ZzNLIsFWa1TMe8y5VYqr7bibneWmvJwm1pCn/eNmrabWDh659JSPn9BuaMpEfU83WTOJfnCcjDZwNQTA==} + peerDependencies: + react: '*' + dependencies: + '@icons/material': 0.2.4(react@17.0.2) + lodash: 4.17.21 + lodash-es: 4.17.21 + material-colors: 1.2.6 + prop-types: 15.8.1 + react: 17.0.2 + reactcss: 1.2.3(react@17.0.2) + tinycolor2: 1.4.2 + dev: true + + /react-colorful@5.5.1(react-dom@17.0.2)(react@17.0.2): + resolution: {integrity: sha512-M1TJH2X3RXEt12sWkpa6hLc/bbYS0H6F4rIqjQZ+RxNBstpY67d9TrFXtqdZwhpmBXcCwEi7stKqFue3ZRkiOg==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + dependencies: + react: 17.0.2 + react-dom: 17.0.2(react@17.0.2) + dev: true + + /react-docgen-typescript@2.2.2(typescript@4.5.5): + resolution: {integrity: sha512-tvg2ZtOpOi6QDwsb3GZhOjDkkX0h8Z2gipvTg6OVMUyoYoURhEiRNePT8NZItTVCDh39JJHnLdfCOkzoLbFnTg==} + peerDependencies: + typescript: '>= 4.3.x' + dependencies: + typescript: 4.5.5 + dev: true + + /react-docgen@5.4.0: + resolution: {integrity: sha512-JBjVQ9cahmNlfjMGxWUxJg919xBBKAoy3hgDgKERbR+BcF4ANpDuzWAScC7j27hZfd8sJNmMPOLWo9+vB/XJEQ==} + engines: {node: '>=8.10.0'} + hasBin: true + dependencies: + '@babel/core': 7.17.5 + '@babel/generator': 7.23.0 + '@babel/runtime': 7.17.2 + ast-types: 0.14.2 + commander: 2.20.3 + doctrine: 3.0.0 + estree-to-babel: 3.2.1 + neo-async: 2.6.2 + node-dir: 0.1.17 + strip-indent: 3.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /react-dom@17.0.2(react@17.0.2): + resolution: {integrity: sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==} + peerDependencies: + react: 17.0.2 + dependencies: + loose-envify: 1.4.0 + object-assign: 4.1.1 + react: 17.0.2 + scheduler: 0.20.2 + + /react-draggable@4.4.4(react-dom@17.0.2)(react@17.0.2): + resolution: {integrity: sha512-6e0WdcNLwpBx/YIDpoyd2Xb04PB0elrDrulKUgdrIlwuYvxh5Ok9M+F8cljm8kPXXs43PmMzek9RrB1b7mLMqA==} + peerDependencies: + react: '>= 16.3.0' + react-dom: '>= 16.3.0' + dependencies: + clsx: 1.1.1 + prop-types: 15.8.1 + react: 17.0.2 + react-dom: 17.0.2(react@17.0.2) + dev: true + + /react-easy-swipe@0.0.21: + resolution: {integrity: sha512-OeR2jAxdoqUMHIn/nS9fgreI5hSpgGoL5ezdal4+oO7YSSgJR8ga+PkYGJrSrJ9MKlPcQjMQXnketrD7WNmNsg==} + engines: {node: '>= 6'} + dependencies: + prop-types: 15.8.1 + dev: false + + /react-element-to-jsx-string@14.3.4(react-dom@17.0.2)(react@17.0.2): + resolution: {integrity: sha512-t4ZwvV6vwNxzujDQ+37bspnLwA4JlgUPWhLjBJWsNIDceAf6ZKUTCjdm08cN6WeZ5pTMKiCJkmAYnpmR4Bm+dg==} + peerDependencies: + react: ^0.14.8 || ^15.0.1 || ^16.0.0 || ^17.0.1 + react-dom: ^0.14.8 || ^15.0.1 || ^16.0.0 || ^17.0.1 + dependencies: + '@base2/pretty-print-object': 1.0.1 + is-plain-object: 5.0.0 + react: 17.0.2 + react-dom: 17.0.2(react@17.0.2) + react-is: 17.0.2 + dev: true + + /react-fast-compare@3.2.0: + resolution: {integrity: sha512-rtGImPZ0YyLrscKI9xTpV8psd6I8VAtjKCzQDlzyDvqJA8XOW78TXYQwNRNd8g8JZnDu8q9Fu/1v4HPAVwVdHA==} + dev: true + + /react-helmet-async@1.2.3(react-dom@17.0.2)(react@17.0.2): + resolution: {integrity: sha512-mCk2silF53Tq/YaYdkl2sB+/tDoPnaxN7dFS/6ZLJb/rhUY2EWGI5Xj2b4jHppScMqY45MbgPSwTxDchKpZ5Kw==} + peerDependencies: + react: ^16.6.0 || ^17.0.0 + react-dom: ^16.6.0 || ^17.0.0 + dependencies: + '@babel/runtime': 7.17.2 + invariant: 2.2.4 + prop-types: 15.8.1 + react: 17.0.2 + react-dom: 17.0.2(react@17.0.2) + react-fast-compare: 3.2.0 + shallowequal: 1.1.0 + dev: true + + /react-inspector@5.1.1(react@17.0.2): + resolution: {integrity: sha512-GURDaYzoLbW8pMGXwYPDBIv6nqei4kK7LPRZ9q9HCZF54wqXz/dnylBp/kfE9XmekBhHvLDdcYeyIwSrvtOiWg==} + peerDependencies: + react: ^16.8.4 || ^17.0.0 + dependencies: + '@babel/runtime': 7.17.2 + is-dom: 1.1.0 + prop-types: 15.8.1 + react: 17.0.2 + dev: true + + /react-is@16.13.1: + resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + + /react-is@17.0.2: + resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} + dev: true + + /react-lifecycles-compat@3.0.4: + resolution: {integrity: sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==} + dev: true + + /react-popper-tooltip@3.1.1(react-dom@17.0.2)(react@17.0.2): + resolution: {integrity: sha512-EnERAnnKRptQBJyaee5GJScWNUKQPDD2ywvzZyUjst/wj5U64C8/CnSYLNEmP2hG0IJ3ZhtDxE8oDN+KOyavXQ==} + peerDependencies: + react: ^16.6.0 || ^17.0.0 + react-dom: ^16.6.0 || ^17.0.0 + dependencies: + '@babel/runtime': 7.17.2 + '@popperjs/core': 2.11.2 + react: 17.0.2 + react-dom: 17.0.2(react@17.0.2) + react-popper: 2.2.5(@popperjs/core@2.11.2)(react@17.0.2) + dev: true + + /react-popper@2.2.5(@popperjs/core@2.11.2)(react@17.0.2): + resolution: {integrity: sha512-kxGkS80eQGtLl18+uig1UIf9MKixFSyPxglsgLBxlYnyDf65BiY9B3nZSc6C9XUNDgStROB0fMQlTEz1KxGddw==} + peerDependencies: + '@popperjs/core': ^2.0.0 + react: ^16.8.0 || ^17 + dependencies: + '@popperjs/core': 2.11.2 + react: 17.0.2 + react-fast-compare: 3.2.0 + warning: 4.0.3 + dev: true + + /react-refresh@0.11.0: + resolution: {integrity: sha512-F27qZr8uUqwhWZboondsPx8tnC3Ct3SxZA3V5WyEvujRyyNv0VYPhoBg1gZ8/MV5tubQp76Trw8lTv9hzRBa+A==} + engines: {node: '>=0.10.0'} + dev: true + + /react-responsive-carousel@3.2.23: + resolution: {integrity: sha512-pqJLsBaKHWJhw/ItODgbVoziR2z4lpcJg+YwmRlSk4rKH32VE633mAtZZ9kDXjy4wFO+pgUZmDKPsPe1fPmHCg==} + dependencies: + classnames: 2.3.1 + prop-types: 15.8.1 + react-easy-swipe: 0.0.21 + dev: false + + /react-router-dom@6.2.2(react-dom@17.0.2)(react@17.0.2): + resolution: {integrity: sha512-AtYEsAST7bDD4dLSQHDnk/qxWLJdad5t1HFa1qJyUrCeGgEuCSw0VB/27ARbF9Fi/W5598ujvJOm3ujUCVzuYQ==} + peerDependencies: + react: '>=16.8' + react-dom: '>=16.8' + dependencies: + history: 5.3.0 + react: 17.0.2 + react-dom: 17.0.2(react@17.0.2) + react-router: 6.2.2(react@17.0.2) + dev: true + + /react-router@6.2.2(react@17.0.2): + resolution: {integrity: sha512-/MbxyLzd7Q7amp4gDOGaYvXwhEojkJD5BtExkuKmj39VEE0m3l/zipf6h2WIB2jyAO0lI6NGETh4RDcktRm4AQ==} + peerDependencies: + react: '>=16.8' + dependencies: + history: 5.3.0 + react: 17.0.2 + dev: true + + /react-sizeme@3.0.2: + resolution: {integrity: sha512-xOIAOqqSSmKlKFJLO3inBQBdymzDuXx4iuwkNcJmC96jeiOg5ojByvL+g3MW9LPEsojLbC6pf68zOfobK8IPlw==} + dependencies: + element-resize-detector: 1.2.4 + invariant: 2.2.4 + shallowequal: 1.1.0 + throttle-debounce: 3.0.1 + dev: true + + /react-syntax-highlighter@13.5.3(react@17.0.2): + resolution: {integrity: sha512-crPaF+QGPeHNIblxxCdf2Lg936NAHKhNhuMzRL3F9ct6aYXL3NcZtCL0Rms9+qVo6Y1EQLdXGypBNSbPL/r+qg==} + peerDependencies: + react: '>= 0.14.0' + dependencies: + '@babel/runtime': 7.17.2 + highlight.js: 10.7.3 + lowlight: 1.20.0 + prismjs: 1.28.0 + react: 17.0.2 + refractor: 3.6.0 + dev: true + + /react-textarea-autosize@6.1.0(react@17.0.2): + resolution: {integrity: sha512-F6bI1dgib6fSvG8so1HuArPUv+iVEfPliuLWusLF+gAKz0FbB4jLrWUrTAeq1afnPT2c9toEZYUdz/y1uKMy4A==} + peerDependencies: + react: '>=0.14.0 <17.0.0' + dependencies: + prop-types: 15.8.1 + react: 17.0.2 + dev: true + + /react-textarea-autosize@8.3.3(@types/react@17.0.39)(react@17.0.2): + resolution: {integrity: sha512-2XlHXK2TDxS6vbQaoPbMOfQ8GK7+irc2fVK6QFIcC8GOnH3zI/v481n+j1L0WaPVvKxwesnY93fEfH++sus2rQ==} + engines: {node: '>=10'} + peerDependencies: + react: ^16.8.0 || ^17.0.0 + dependencies: + '@babel/runtime': 7.17.2 + react: 17.0.2 + use-composed-ref: 1.2.1(react@17.0.2) + use-latest: 1.2.0(@types/react@17.0.39)(react@17.0.2) + transitivePeerDependencies: + - '@types/react' + dev: true + + /react@17.0.2: + resolution: {integrity: sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==} + engines: {node: '>=0.10.0'} + dependencies: + loose-envify: 1.4.0 + object-assign: 4.1.1 + + /reactcss@1.2.3(react@17.0.2): + resolution: {integrity: sha512-KiwVUcFu1RErkI97ywr8nvx8dNOpT03rbnma0SSalTYjkrPYaEajR4a/MRt6DZ46K6arDRbWMNHF+xH7G7n/8A==} + peerDependencies: + react: '*' + dependencies: + lodash: 4.17.21 + react: 17.0.2 + dev: true + + /read-pkg-up@7.0.1: + resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} + engines: {node: '>=8'} + dependencies: + find-up: 4.1.0 + read-pkg: 5.2.0 + type-fest: 0.8.1 + dev: true + + /read-pkg@5.2.0: + resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} + engines: {node: '>=8'} + dependencies: + '@types/normalize-package-data': 2.4.1 + normalize-package-data: 2.5.0 + parse-json: 5.2.0 + type-fest: 0.6.0 + dev: true + + /readable-stream@2.3.7: + resolution: {integrity: sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==} + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 2.0.1 + safe-buffer: 5.1.2 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + + /readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + dev: true + + /readdirp@2.2.1: + resolution: {integrity: sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==} + engines: {node: '>=0.10'} + requiresBuild: true + dependencies: + graceful-fs: 4.2.9 + micromatch: 3.1.10 + readable-stream: 2.3.7 + transitivePeerDependencies: + - supports-color + dev: true + optional: true + + /readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + dependencies: + picomatch: 2.3.1 + dev: true + + /refractor@3.6.0: + resolution: {integrity: sha512-MY9W41IOWxxk31o+YvFCNyNzdkc9M20NoZK5vq6jkv4I/uh2zkWcfudj0Q1fovjUQJrNewS9NMzeTtqPf+n5EA==} + dependencies: + hastscript: 6.0.0 + parse-entities: 2.0.0 + prismjs: 1.27.0 + dev: true + + /regenerate-unicode-properties@10.0.1: + resolution: {integrity: sha512-vn5DU6yg6h8hP/2OkQo3K7uVILvY4iu0oI4t3HFa81UPkhGJwkRwM10JEc3upjdhHjs/k8GJY1sRBhk5sr69Bw==} + engines: {node: '>=4'} + dependencies: + regenerate: 1.4.2 + dev: true + + /regenerate@1.4.2: + resolution: {integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==} + dev: true + + /regenerator-runtime@0.13.9: + resolution: {integrity: sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==} + dev: true + + /regenerator-transform@0.14.5: + resolution: {integrity: sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==} + dependencies: + '@babel/runtime': 7.17.2 + dev: true + + /regex-not@1.0.2: + resolution: {integrity: sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==} + engines: {node: '>=0.10.0'} + dependencies: + extend-shallow: 3.0.2 + safe-regex: 1.1.0 + dev: true + + /regexp.prototype.flags@1.4.1: + resolution: {integrity: sha512-pMR7hBVUUGI7PMA37m2ofIdQCsomVnas+Jn5UPGAHQ+/LlwKm/aTLJHdasmHRzlfeZwHiAOaRSo2rbBDm3nNUQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.1.3 + dev: true + + /regexpp@3.2.0: + resolution: {integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==} + engines: {node: '>=8'} + dev: true + + /regexpu-core@5.0.1: + resolution: {integrity: sha512-CriEZlrKK9VJw/xQGJpQM5rY88BtuL8DM+AEwvcThHilbxiTAy8vq4iJnd2tqq8wLmjbGZzP7ZcKFjbGkmEFrw==} + engines: {node: '>=4'} + dependencies: + regenerate: 1.4.2 + regenerate-unicode-properties: 10.0.1 + regjsgen: 0.6.0 + regjsparser: 0.8.4 + unicode-match-property-ecmascript: 2.0.0 + unicode-match-property-value-ecmascript: 2.0.0 + dev: true + + /regjsgen@0.6.0: + resolution: {integrity: sha512-ozE883Uigtqj3bx7OhL1KNbCzGyW2NQZPl6Hs09WTvCuZD5sTI4JY58bkbQWa/Y9hxIsvJ3M8Nbf7j54IqeZbA==} + dev: true + + /regjsparser@0.8.4: + resolution: {integrity: sha512-J3LABycON/VNEu3abOviqGHuB/LOtOQj8SKmfP9anY5GfAVw/SPjwzSjxGjbZXIxbGfqTHtJw58C2Li/WkStmA==} + hasBin: true + dependencies: + jsesc: 0.5.0 + dev: true + + /rehype-parse@7.0.1: + resolution: {integrity: sha512-fOiR9a9xH+Le19i4fGzIEowAbwG7idy2Jzs4mOrFWBSJ0sNUgy0ev871dwWnbOo371SjgjG4pwzrbgSVrKxecw==} + dependencies: + hast-util-from-parse5: 6.0.1 + parse5: 6.0.1 + dev: false + + /rehype-prism@2.1.2(unified@10.1.2): + resolution: {integrity: sha512-2tnWCx6k6UP2za57j5q+ND7GlFsFDDMPwJhJOT4ge3skyBwJpNBTfIs5WC70ATxOKXFm0NpEBryai0u/4fbjIg==} + peerDependencies: + unified: ^10 + dependencies: + '@types/node': 17.0.34 + '@types/prismjs': 1.26.0 + prismjs: 1.28.0 + rehype-parse: 7.0.1 + unified: 10.1.2 + unist-util-is: 5.1.1 + unist-util-select: 4.0.1 + unist-util-visit: 4.1.0 + dev: false + + /relateurl@0.2.7: + resolution: {integrity: sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==} + engines: {node: '>= 0.10'} + dev: true + + /remark-directive@2.0.1: + resolution: {integrity: sha512-oosbsUAkU/qmUE78anLaJePnPis4ihsE7Agp0T/oqTzvTea8pOiaYEtfInU/+xMOVTS9PN5AhGOiaIVe4GD8gw==} + dependencies: + '@types/mdast': 3.0.10 + mdast-util-directive: 2.2.1 + micromark-extension-directive: 2.1.1 + unified: 10.1.2 + dev: false + + /remark-external-links@8.0.0: + resolution: {integrity: sha512-5vPSX0kHoSsqtdftSHhIYofVINC8qmp0nctkeU9YoJwV3YfiBRiI6cbFRJ0oI/1F9xS+bopXG0m2KS8VFscuKA==} + dependencies: + extend: 3.0.2 + is-absolute-url: 3.0.3 + mdast-util-definitions: 4.0.0 + space-separated-tokens: 1.1.5 + unist-util-visit: 2.0.3 + dev: true + + /remark-footnotes@2.0.0: + resolution: {integrity: sha512-3Clt8ZMH75Ayjp9q4CorNeyjwIxHFcTkaektplKGl2A1jNGEUey8cKL0ZC5vJwfcD5GFGsNLImLG/NGzWIzoMQ==} + dev: true + + /remark-gfm@3.0.1: + resolution: {integrity: sha512-lEFDoi2PICJyNrACFOfDD3JlLkuSbOa5Wd8EPt06HUdptv8Gn0bxYTdbU/XXQ3swAPkEaGxxPN9cbnMHvVu1Ig==} + dependencies: + '@types/mdast': 3.0.10 + mdast-util-gfm: 2.0.1 + micromark-extension-gfm: 2.0.1 + unified: 10.1.2 + transitivePeerDependencies: + - supports-color + dev: false + + /remark-mdx@1.6.22: + resolution: {integrity: sha512-phMHBJgeV76uyFkH4rvzCftLfKCr2RZuF+/gmVcaKrpsihyzmhXjA0BEMDaPTXG5y8qZOKPVo83NAOX01LPnOQ==} + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-plugin-utils': 7.10.4 + '@babel/plugin-proposal-object-rest-spread': 7.12.1(@babel/core@7.12.9) + '@babel/plugin-syntax-jsx': 7.12.1(@babel/core@7.12.9) + '@mdx-js/util': 1.6.22 + is-alphabetical: 1.0.4 + remark-parse: 8.0.3 + unified: 9.2.0 + transitivePeerDependencies: + - supports-color + dev: true + + /remark-mdx@2.1.0: + resolution: {integrity: sha512-J6Yqw566SaEy6A9Neni1JJTaEjbjsM3OsKqL04TtCvZhevRtFi8CG8GIQPzvxIRKRCAOnWw1Vpk1AInB1OpNqA==} + dependencies: + mdast-util-mdx: 2.0.0 + micromark-extension-mdxjs: 1.0.0 + transitivePeerDependencies: + - supports-color + dev: false + + /remark-parse@10.0.1: + resolution: {integrity: sha512-1fUyHr2jLsVOkhbvPRBJ5zTKZZyD6yZzYaWCS6BPBdQ8vEMBCH+9zNCDA6tET/zHCi/jLqjCWtlJZUPk+DbnFw==} + dependencies: + '@types/mdast': 3.0.10 + mdast-util-from-markdown: 1.2.0 + unified: 10.1.2 + transitivePeerDependencies: + - supports-color + dev: false + + /remark-parse@8.0.3: + resolution: {integrity: sha512-E1K9+QLGgggHxCQtLt++uXltxEprmWzNfg+MxpfHsZlrddKzZ/hZyWHDbK3/Ap8HJQqYJRXP+jHczdL6q6i85Q==} + dependencies: + ccount: 1.1.0 + collapse-white-space: 1.0.6 + is-alphabetical: 1.0.4 + is-decimal: 1.0.4 + is-whitespace-character: 1.0.4 + is-word-character: 1.0.4 + markdown-escapes: 1.0.4 + parse-entities: 2.0.0 + repeat-string: 1.6.1 + state-toggle: 1.0.3 + trim: 0.0.1 + trim-trailing-lines: 1.1.4 + unherit: 1.1.3 + unist-util-remove-position: 2.0.1 + vfile-location: 3.2.0 + xtend: 4.0.2 + dev: true + + /remark-prism@1.3.6: + resolution: {integrity: sha512-yYSXJ2MEK2DeD9UKDKFkQPcVqRx6aX2FYD1kE27ScogpZ/BBO8MoOO6gf/AKqfXvKGnP51wqvDEBmPseypgaug==} + dependencies: + classnames: 2.3.1 + css-selector-parser: 1.4.1 + escape-html: 1.0.3 + jsdom: 16.7.0 + parse-numeric-range: 1.3.0 + parse5: 6.0.1 + parse5-htmlparser2-tree-adapter: 6.0.1 + prismjs: 1.28.0 + unist-util-map: 2.0.1 + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - utf-8-validate + dev: false + + /remark-rehype@10.1.0: + resolution: {integrity: sha512-EFmR5zppdBp0WQeDVZ/b66CWJipB2q2VLNFMabzDSGR66Z2fQii83G5gTBbgGEnEEA0QRussvrFHxk1HWGJskw==} + dependencies: + '@types/hast': 2.3.4 + '@types/mdast': 3.0.10 + mdast-util-to-hast: 12.1.1 + unified: 10.1.2 + dev: false + + /remark-slug@6.1.0: + resolution: {integrity: sha512-oGCxDF9deA8phWvxFuyr3oSJsdyUAxMFbA0mZ7Y1Sas+emILtO+e5WutF9564gDsEN4IXaQXm5pFo6MLH+YmwQ==} + dependencies: + github-slugger: 1.4.0 + mdast-util-to-string: 1.1.0 + unist-util-visit: 2.0.3 + dev: true + + /remark-squeeze-paragraphs@4.0.0: + resolution: {integrity: sha512-8qRqmL9F4nuLPIgl92XUuxI3pFxize+F1H0e/W3llTk0UsjJaj01+RrirkMw7P21RKe4X6goQhYRSvNWX+70Rw==} + dependencies: + mdast-squeeze-paragraphs: 4.0.0 + dev: true + + /remark-stringify@8.1.1: + resolution: {integrity: sha512-q4EyPZT3PcA3Eq7vPpT6bIdokXzFGp9i85igjmhRyXWmPs0Y6/d2FYwUNotKAWyLch7g0ASZJn/KHHcHZQ163A==} + dependencies: + ccount: 1.1.0 + is-alphanumeric: 1.0.0 + is-decimal: 1.0.4 + is-whitespace-character: 1.0.4 + longest-streak: 2.0.4 + markdown-escapes: 1.0.4 + markdown-table: 2.0.0 + mdast-util-compact: 2.0.1 + parse-entities: 2.0.0 + repeat-string: 1.6.1 + state-toggle: 1.0.3 + stringify-entities: 3.1.0 + unherit: 1.1.3 + xtend: 4.0.2 + dev: true + + /remark-unwrap-images@3.0.1: + resolution: {integrity: sha512-5VUY0n+J9lPTPfkct5S3/SbutryBjp8J/4mbgtlkDrOk3h8jde0hyqdYUJOoJKherZezS08tjd6i4+nnQ+wl5w==} + dependencies: + '@types/mdast': 3.0.10 + hast-util-whitespace: 2.0.0 + unified: 10.1.2 + unist-util-visit: 4.1.0 + dev: false + + /remark@12.0.1: + resolution: {integrity: sha512-gS7HDonkdIaHmmP/+shCPejCEEW+liMp/t/QwmF0Xt47Rpuhl32lLtDV1uKWvGoq+kxr5jSgg5oAIpGuyULjUw==} + dependencies: + remark-parse: 8.0.3 + remark-stringify: 8.1.1 + unified: 9.2.2 + dev: true + + /remove-trailing-separator@1.1.0: + resolution: {integrity: sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==} + requiresBuild: true + dev: true + + /renderkid@2.0.7: + resolution: {integrity: sha512-oCcFyxaMrKsKcTY59qnCAtmDVSLfPbrv6A3tVbPdFMMrv5jaK10V6m40cKsoPNhAqN6rmHW9sswW4o3ruSrwUQ==} + dependencies: + css-select: 4.2.1 + dom-converter: 0.2.0 + htmlparser2: 6.1.0 + lodash: 4.17.21 + strip-ansi: 3.0.1 + dev: true + + /repeat-element@1.1.4: + resolution: {integrity: sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==} + engines: {node: '>=0.10.0'} + dev: true + + /repeat-string@1.6.1: + resolution: {integrity: sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==} + engines: {node: '>=0.10'} + dev: true + + /require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + /require-main-filename@2.0.0: + resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} + dev: false + + /requireindex@1.2.0: + resolution: {integrity: sha512-L9jEkOi3ASd9PYit2cwRfyppc9NoABujTP8/5gFcbERmo5jUoAKovIC3fsF17pkTnGsrByysqX+Kxd2OTNI1ww==} + engines: {node: '>=0.10.5'} + dev: true + + /resolve-from@3.0.0: + resolution: {integrity: sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==} + engines: {node: '>=4'} + dev: false + + /resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + dev: true + + /resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + dev: true + + /resolve-url@0.2.1: + resolution: {integrity: sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==} + deprecated: https://github.com/lydell/resolve-url#deprecated + dev: true + + /resolve@1.22.0: + resolution: {integrity: sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==} + hasBin: true + dependencies: + is-core-module: 2.8.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + /resolve@2.0.0-next.3: + resolution: {integrity: sha512-W8LucSynKUIDu9ylraa7ueVZ7hc0uAgJBxVsQSKOXOyle8a93qXhcz+XAXZ8bIq2d6i4Ehddn6Evt+0/UwKk6Q==} + dependencies: + is-core-module: 2.8.1 + path-parse: 1.0.7 + dev: true + + /ret@0.1.15: + resolution: {integrity: sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==} + engines: {node: '>=0.12'} + dev: true + + /reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + dev: true + + /rgb-hex@3.0.0: + resolution: {integrity: sha512-8h7ZcwxCBDKvchSWbWngJuSCqJGQ6nDuLLg+QcRyQDbX9jMWt+PpPeXAhSla0GOooEomk3lCprUpGkMdsLjKyg==} + engines: {node: '>=8'} + dev: true + + /rgb-regex@1.0.1: + resolution: {integrity: sha512-gDK5mkALDFER2YLqH6imYvK6g02gpNGM4ILDZ472EwWfXZnC2ZEpoB2ECXTyOVUKuk/bPJZMzwQPBYICzP+D3w==} + dev: true + + /rgba-regex@1.0.0: + resolution: {integrity: sha512-zgn5OjNQXLUTdq8m17KdaicF6w89TZs8ZU8y0AYENIU6wG8GG6LLm0yLSiPY8DmaYmHdgRW8rnApjoT0fQRfMg==} + dev: true + + /rimraf@2.7.1: + resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==} + hasBin: true + dependencies: + glob: 7.2.0 + dev: true + + /rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + hasBin: true + dependencies: + glob: 7.2.0 + dev: true + + /ripemd160@2.0.2: + resolution: {integrity: sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==} + dependencies: + hash-base: 3.1.0 + inherits: 2.0.4 + dev: true + + /rollup-pluginutils@2.8.2: + resolution: {integrity: sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==} + dependencies: + estree-walker: 0.6.1 + dev: false + + /rsvp@4.8.5: + resolution: {integrity: sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==} + engines: {node: 6.* || >= 7.*} + dev: true + + /run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + dependencies: + queue-microtask: 1.2.3 + dev: true + + /run-queue@1.0.3: + resolution: {integrity: sha512-ntymy489o0/QQplUDnpYAYUsO50K9SBrIVaKCWDOJzYJts0f9WH9RFJkyagebkw5+y1oi00R7ynNW/d12GBumg==} + dependencies: + aproba: 1.2.0 + dev: true + + /sade@1.8.1: + resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} + engines: {node: '>=6'} + dependencies: + mri: 1.2.0 + dev: false + + /safe-buffer@5.1.1: + resolution: {integrity: sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==} + dev: true + + /safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + + /safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + dev: true + + /safe-regex@1.1.0: + resolution: {integrity: sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==} + dependencies: + ret: 0.1.15 + dev: true + + /safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + /sane@4.1.0: + resolution: {integrity: sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==} + engines: {node: 6.* || 8.* || >= 10.*} + deprecated: some dependency vulnerabilities fixed, support for node < 10 dropped, and newer ECMAScript syntax/features added + hasBin: true + dependencies: + '@cnakazawa/watch': 1.0.4 + anymatch: 2.0.0 + capture-exit: 2.0.0 + exec-sh: 0.3.6 + execa: 1.0.0 + fb-watchman: 2.0.1 + micromatch: 3.1.10 + minimist: 1.2.7 + walker: 1.0.8 + transitivePeerDependencies: + - supports-color + dev: true + + /saxes@5.0.1: + resolution: {integrity: sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==} + engines: {node: '>=10'} + dependencies: + xmlchars: 2.2.0 + dev: false + + /scheduler@0.20.2: + resolution: {integrity: sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==} + dependencies: + loose-envify: 1.4.0 + object-assign: 4.1.1 + + /schema-utils@1.0.0: + resolution: {integrity: sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==} + engines: {node: '>= 4'} + dependencies: + ajv: 6.12.6 + ajv-errors: 1.0.1(ajv@6.12.6) + ajv-keywords: 3.5.2(ajv@6.12.6) + dev: true + + /schema-utils@2.7.0: + resolution: {integrity: sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==} + engines: {node: '>= 8.9.0'} + dependencies: + '@types/json-schema': 7.0.9 + ajv: 6.12.6 + ajv-keywords: 3.5.2(ajv@6.12.6) + dev: true + + /schema-utils@2.7.1: + resolution: {integrity: sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==} + engines: {node: '>= 8.9.0'} + dependencies: + '@types/json-schema': 7.0.9 + ajv: 6.12.6 + ajv-keywords: 3.5.2(ajv@6.12.6) + dev: true + + /schema-utils@3.1.1: + resolution: {integrity: sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==} + engines: {node: '>= 10.13.0'} + dependencies: + '@types/json-schema': 7.0.9 + ajv: 6.12.6 + ajv-keywords: 3.5.2(ajv@6.12.6) + dev: true + + /section-matter@1.0.0: + resolution: {integrity: sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==} + engines: {node: '>=4'} + dependencies: + extend-shallow: 2.0.1 + kind-of: 6.0.3 + dev: false + + /semver@5.7.2: + resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} + hasBin: true + dev: true + + /semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + /semver@7.0.0: + resolution: {integrity: sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==} + hasBin: true + + /semver@7.5.4: + resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} + engines: {node: '>=10'} + hasBin: true + dependencies: + lru-cache: 6.0.0 + dev: true + + /send@0.17.2: + resolution: {integrity: sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww==} + engines: {node: '>= 0.8.0'} + dependencies: + debug: 2.6.9 + depd: 1.1.2 + destroy: 1.0.4 + encodeurl: 1.0.2 + escape-html: 1.0.3 + etag: 1.8.1 + fresh: 0.5.2 + http-errors: 1.8.1 + mime: 1.6.0 + ms: 2.1.3 + on-finished: 2.3.0 + range-parser: 1.2.1 + statuses: 1.5.0 + transitivePeerDependencies: + - supports-color + dev: true + + /serialize-javascript@4.0.0: + resolution: {integrity: sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==} + dependencies: + randombytes: 2.1.0 + dev: true + + /serialize-javascript@5.0.1: + resolution: {integrity: sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==} + dependencies: + randombytes: 2.1.0 + dev: true + + /serve-favicon@2.5.0: + resolution: {integrity: sha512-FMW2RvqNr03x+C0WxTyu6sOv21oOjkq5j8tjquWccwa6ScNyGFOGJVpuS1NmTVGBAHS07xnSKotgf2ehQmf9iA==} + engines: {node: '>= 0.8.0'} + dependencies: + etag: 1.8.1 + fresh: 0.5.2 + ms: 2.1.1 + parseurl: 1.3.3 + safe-buffer: 5.1.1 + dev: true + + /serve-static@1.14.2: + resolution: {integrity: sha512-+TMNA9AFxUEGuC0z2mevogSnn9MXKb4fa7ngeRMJaaGv8vTwnIEkKi+QGvPt33HSnf8pRS+WGM0EbMtCJLKMBQ==} + engines: {node: '>= 0.8.0'} + dependencies: + encodeurl: 1.0.2 + escape-html: 1.0.3 + parseurl: 1.3.3 + send: 0.17.2 + transitivePeerDependencies: + - supports-color + dev: true + + /set-blocking@2.0.0: + resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} + + /set-value@2.0.1: + resolution: {integrity: sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==} + engines: {node: '>=0.10.0'} + dependencies: + extend-shallow: 2.0.1 + is-extendable: 0.1.1 + is-plain-object: 2.0.4 + split-string: 3.1.0 + dev: true + + /setimmediate@1.0.5: + resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} + dev: true + + /setprototypeof@1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + dev: true + + /sha.js@2.4.11: + resolution: {integrity: sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==} + hasBin: true + dependencies: + inherits: 2.0.4 + safe-buffer: 5.2.1 + dev: true + + /shallow-clone@3.0.1: + resolution: {integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==} + engines: {node: '>=8'} + dependencies: + kind-of: 6.0.3 + dev: true + + /shallowequal@1.1.0: + resolution: {integrity: sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==} + dev: true + + /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: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + dependencies: + shebang-regex: 3.0.0 + dev: true + + /shebang-regex@1.0.0: + resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==} + engines: {node: '>=0.10.0'} + dev: true + + /shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + dev: true + + /side-channel@1.0.4: + resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.1.1 + object-inspect: 1.12.0 + dev: true + + /signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + dev: true + + /simple-swizzle@0.2.2: + resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} + dependencies: + is-arrayish: 0.3.2 + dev: true + + /sirv@1.0.19: + resolution: {integrity: sha512-JuLThK3TnZG1TAKDwNIqNq6QA2afLOCcm+iE8D1Kj3GA40pSPsxQjjJl0J8X3tsR7T+CP1GavpzLwYkgVLWrZQ==} + engines: {node: '>= 10'} + dependencies: + '@polka/url': 1.0.0-next.21 + mrmime: 1.0.0 + totalist: 1.1.0 + dev: true + + /sisteransi@1.0.5: + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + dev: true + + /slash@2.0.0: + resolution: {integrity: sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==} + engines: {node: '>=6'} + dev: true + + /slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + dev: true + + /snapdragon-node@2.1.1: + resolution: {integrity: sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==} + engines: {node: '>=0.10.0'} + dependencies: + define-property: 1.0.0 + isobject: 3.0.1 + snapdragon-util: 3.0.1 + dev: true + + /snapdragon-util@3.0.1: + resolution: {integrity: sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==} + engines: {node: '>=0.10.0'} + dependencies: + kind-of: 3.2.2 + dev: true + + /snapdragon@0.8.2: + resolution: {integrity: sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==} + engines: {node: '>=0.10.0'} + dependencies: + base: 0.11.2 + debug: 2.6.9 + define-property: 0.2.5 + extend-shallow: 2.0.1 + map-cache: 0.2.2 + source-map: 0.5.7 + source-map-resolve: 0.5.3 + use: 3.1.1 + transitivePeerDependencies: + - supports-color + dev: true + + /source-list-map@2.0.1: + resolution: {integrity: sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==} + dev: true + + /source-map-js@1.0.2: + resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} + engines: {node: '>=0.10.0'} + + /source-map-resolve@0.5.3: + resolution: {integrity: sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==} + deprecated: See https://github.com/lydell/source-map-resolve#deprecated + dependencies: + atob: 2.1.2 + decode-uri-component: 0.2.2 + resolve-url: 0.2.1 + source-map-url: 0.4.1 + urix: 0.1.0 + dev: true + + /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-url@0.4.1: + resolution: {integrity: sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==} + deprecated: See https://github.com/lydell/source-map-url#deprecated + dev: true + + /source-map@0.5.7: + resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} + engines: {node: '>=0.10.0'} + dev: true + + /source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + /source-map@0.7.3: + resolution: {integrity: sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==} + engines: {node: '>= 8'} + dev: true + + /space-separated-tokens@1.1.5: + resolution: {integrity: sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==} + + /space-separated-tokens@2.0.1: + resolution: {integrity: sha512-ekwEbFp5aqSPKaqeY1PGrlGQxPNaq+Cnx4+bE2D8sciBQrHpbwoBbawqTN2+6jPs9IdWxxiUcN0K2pkczD3zmw==} + dev: false + + /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: + resolution: {integrity: sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==} + dev: true + + /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: + resolution: {integrity: sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g==} + dev: true + + /split-string@3.1.0: + resolution: {integrity: sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==} + engines: {node: '>=0.10.0'} + dependencies: + extend-shallow: 3.0.2 + dev: true + + /sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + + /ssri@6.0.2: + resolution: {integrity: sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==} + dependencies: + figgy-pudding: 3.5.2 + dev: true + + /ssri@8.0.1: + resolution: {integrity: sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==} + engines: {node: '>= 8'} + dependencies: + minipass: 3.1.6 + dev: true + + /stable@0.1.8: + resolution: {integrity: sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==} + deprecated: 'Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility' + dev: true + + /stackframe@1.2.1: + resolution: {integrity: sha512-h88QkzREN/hy8eRdyNhhsO7RSJ5oyTqxxmmn0dzBIMUclZsjpfmrsg81vp8mjjAs2vAZ72nyWxRUwSwmh0e4xg==} + dev: true + + /state-toggle@1.0.3: + resolution: {integrity: sha512-d/5Z4/2iiCnHw6Xzghyhb+GcmF89bxwgXG60wjIiZaxnymbyOmI8Hk4VqHXiVVp6u2ysaskFfXg3ekCj4WNftQ==} + dev: true + + /static-extend@0.1.2: + resolution: {integrity: sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==} + engines: {node: '>=0.10.0'} + dependencies: + define-property: 0.2.5 + object-copy: 0.1.0 + dev: true + + /statuses@1.5.0: + resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==} + engines: {node: '>= 0.6'} + dev: true + + /statuses@2.0.1: + resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} + engines: {node: '>= 0.8'} + dev: true + + /store2@2.13.1: + resolution: {integrity: sha512-iJtHSGmNgAUx0b/MCS6ASGxb//hGrHHRgzvN+K5bvkBTN7A9RTpPSf1WSp+nPGvWCJ1jRnvY7MKnuqfoi3OEqg==} + dev: true + + /stream-browserify@2.0.2: + resolution: {integrity: sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==} + dependencies: + inherits: 2.0.4 + readable-stream: 2.3.7 + dev: true + + /stream-each@1.2.3: + resolution: {integrity: sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==} + dependencies: + end-of-stream: 1.4.4 + stream-shift: 1.0.1 + dev: true + + /stream-http@2.8.3: + resolution: {integrity: sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==} + dependencies: + builtin-status-codes: 3.0.0 + inherits: 2.0.4 + readable-stream: 2.3.7 + to-arraybuffer: 1.0.1 + xtend: 4.0.2 + dev: true + + /stream-shift@1.0.1: + resolution: {integrity: sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==} + dev: true + + /string-width@3.1.0: + resolution: {integrity: sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==} + engines: {node: '>=6'} + dependencies: + emoji-regex: 7.0.3 + is-fullwidth-code-point: 2.0.0 + strip-ansi: 5.2.0 + dev: false + + /string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + dev: true + + /string.prototype.matchall@4.0.6: + resolution: {integrity: sha512-6WgDX8HmQqvEd7J+G6VtAahhsQIssiZ8zl7zKh1VDMFyL3hRTJP4FTNA3RbIp2TOQ9AYNDcc7e3fH0Qbup+DBg==} + dependencies: + call-bind: 1.0.2 + define-properties: 1.1.3 + es-abstract: 1.19.1 + get-intrinsic: 1.1.1 + has-symbols: 1.0.2 + internal-slot: 1.0.3 + regexp.prototype.flags: 1.4.1 + side-channel: 1.0.4 + dev: true + + /string.prototype.padend@3.1.3: + resolution: {integrity: sha512-jNIIeokznm8SD/TZISQsZKYu7RJyheFNt84DUPrh482GC8RVp2MKqm2O5oBRdGxbDQoXrhhWtPIWQOiy20svUg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.1.3 + es-abstract: 1.19.1 + dev: true + + /string.prototype.padstart@3.1.3: + resolution: {integrity: sha512-NZydyOMtYxpTjGqp0VN5PYUF/tsU15yDMZnUdj16qRUIUiMJkHHSDElYyQFrMu+/WloTpA7MQSiADhBicDfaoA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.1.3 + es-abstract: 1.19.1 + dev: true + + /string.prototype.trimend@1.0.4: + resolution: {integrity: sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==} + dependencies: + call-bind: 1.0.2 + define-properties: 1.1.3 + dev: true + + /string.prototype.trimstart@1.0.4: + resolution: {integrity: sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==} + dependencies: + call-bind: 1.0.2 + define-properties: 1.1.3 + dev: true + + /string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + dependencies: + safe-buffer: 5.1.2 + + /string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + dependencies: + safe-buffer: 5.2.1 + dev: true + + /stringify-entities@3.1.0: + resolution: {integrity: sha512-3FP+jGMmMV/ffZs86MoghGqAoqXAdxLrJP4GUdrDN1aIScYih5tuIO3eF4To5AJZ79KDZ8Fpdy7QJnK8SsL1Vg==} + dependencies: + character-entities-html4: 1.1.4 + character-entities-legacy: 1.1.4 + xtend: 4.0.2 + dev: true + + /stringify-entities@4.0.2: + resolution: {integrity: sha512-MTxTVcEkorNtBbNpoFJPEh0kKdM6+QbMjLbaxmvaPMmayOXdr/AIVIIJX7FReUVweRBFJfZepK4A4AKgwuFpMQ==} + dependencies: + character-entities-html4: 2.1.0 + character-entities-legacy: 3.0.0 + dev: false + + /strip-ansi@3.0.1: + resolution: {integrity: sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==} + engines: {node: '>=0.10.0'} + dependencies: + ansi-regex: 2.1.1 + dev: true + + /strip-ansi@5.2.0: + resolution: {integrity: sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==} + engines: {node: '>=6'} + dependencies: + ansi-regex: 4.1.0 + dev: false + + /strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + dependencies: + ansi-regex: 5.0.1 + dev: true + + /strip-bom-string@1.0.0: + resolution: {integrity: sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==} + engines: {node: '>=0.10.0'} + dev: false + + /strip-bom@3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + dev: true + + /strip-eof@1.0.0: + resolution: {integrity: sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==} + engines: {node: '>=0.10.0'} + dev: true + + /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@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + dev: true + + /style-loader@1.3.0(webpack@4.46.0): + resolution: {integrity: sha512-V7TCORko8rs9rIqkSrlMfkqA63DfoGBBJmK1kKGCcSi+BWb4cqz0SRsnp4l6rU5iwOEd0/2ePv68SV22VXon4Q==} + engines: {node: '>= 8.9.0'} + peerDependencies: + webpack: ^4.0.0 || ^5.0.0 + dependencies: + loader-utils: 2.0.2 + schema-utils: 2.7.1 + webpack: 4.46.0 + dev: true + + /style-to-object@0.3.0: + resolution: {integrity: sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA==} + dependencies: + inline-style-parser: 0.1.1 + + /styled-jsx@5.0.7(@babel/core@7.17.5)(react@17.0.2): + resolution: {integrity: sha512-b3sUzamS086YLRuvnaDigdAewz1/EFYlHpYBP5mZovKEdQQOIIYq8lApylub3HHZ6xFjV051kkGU7cudJmrXEA==} + engines: {node: '>= 12.0.0'} + peerDependencies: + '@babel/core': '*' + babel-plugin-macros: '*' + react: '>= 16.8.0 || 17.x.x || ^18.0.0-0' + peerDependenciesMeta: + '@babel/core': + optional: true + babel-plugin-macros: + optional: true + dependencies: + '@babel/core': 7.17.5 + react: 17.0.2 + + /stylis@3.5.4: + resolution: {integrity: sha512-8/3pSmthWM7lsPBKv7NXkzn2Uc9W7NotcwGNpJaa3k7WMM1XDCA4MgT5k/8BIexd5ydZdboXtU90XH9Ec4Bv/Q==} + dev: false + + /supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + dependencies: + has-flag: 3.0.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-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + /symbol-tree@3.2.4: + resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} + dev: false + + /symbol.prototype.description@1.0.5: + resolution: {integrity: sha512-x738iXRYsrAt9WBhRCVG5BtIC3B7CUkFwbHW2zOvGtwM33s7JjrCDyq8V0zgMYVb5ymsL8+qkzzpANH63CPQaQ==} + engines: {node: '>= 0.11.15'} + dependencies: + call-bind: 1.0.2 + get-symbol-description: 1.0.0 + has-symbols: 1.0.2 + object.getownpropertydescriptors: 2.1.3 + dev: true + + /synchronous-promise@2.0.15: + resolution: {integrity: sha512-k8uzYIkIVwmT+TcglpdN50pS2y1BDcUnBPK9iJeGu0Pl1lOI8pD6wtzgw91Pjpe+RxtTncw32tLxs/R0yNL2Mg==} + dev: true + + /tapable@1.1.3: + resolution: {integrity: sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==} + engines: {node: '>=6'} + + /tar@6.1.11: + resolution: {integrity: sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==} + engines: {node: '>= 10'} + dependencies: + chownr: 2.0.0 + fs-minipass: 2.1.0 + minipass: 3.1.6 + minizlib: 2.1.2 + mkdirp: 1.0.4 + yallist: 4.0.0 + dev: true + + /telejson@5.3.3: + resolution: {integrity: sha512-PjqkJZpzEggA9TBpVtJi1LVptP7tYtXB6rEubwlHap76AMjzvOdKX41CxyaW7ahhzDU1aftXnMCx5kAPDZTQBA==} + dependencies: + '@types/is-function': 1.0.1 + global: 4.4.0 + is-function: 1.0.2 + is-regex: 1.1.4 + is-symbol: 1.0.4 + isobject: 4.0.0 + lodash: 4.17.21 + memoizerific: 1.11.3 + dev: true + + /terser-webpack-plugin@1.4.5(webpack@4.46.0): + resolution: {integrity: sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw==} + engines: {node: '>= 6.9.0'} + peerDependencies: + webpack: ^4.0.0 + dependencies: + cacache: 12.0.4 + find-cache-dir: 2.1.0 + is-wsl: 1.1.0 + schema-utils: 1.0.0 + serialize-javascript: 4.0.0 + source-map: 0.6.1 + terser: 4.8.1 + webpack: 4.46.0 + webpack-sources: 1.4.3 + worker-farm: 1.7.0 + dev: true + + /terser-webpack-plugin@4.2.3(webpack@4.46.0): + resolution: {integrity: sha512-jTgXh40RnvOrLQNgIkwEKnQ8rmHjHK4u+6UBEi+W+FPmvb+uo+chJXntKe7/3lW5mNysgSWD60KyesnhW8D6MQ==} + engines: {node: '>= 10.13.0'} + peerDependencies: + webpack: ^4.0.0 || ^5.0.0 + dependencies: + cacache: 15.3.0 + find-cache-dir: 3.3.2 + jest-worker: 26.6.2 + p-limit: 3.1.0 + schema-utils: 3.1.1 + serialize-javascript: 5.0.1 + source-map: 0.6.1 + terser: 5.12.0 + webpack: 4.46.0 + webpack-sources: 1.4.3 + transitivePeerDependencies: + - bluebird + dev: true + + /terser@4.8.1: + resolution: {integrity: sha512-4GnLC0x667eJG0ewJTa6z/yXrbLGv80D9Ru6HIpCQmO+Q4PfEtBFi0ObSckqwL6VyQv/7ENJieXHo2ANmdQwgw==} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + acorn: 8.7.1 + commander: 2.20.3 + source-map: 0.6.1 + source-map-support: 0.5.21 + dev: true + + /terser@5.12.0: + resolution: {integrity: sha512-R3AUhNBGWiFc77HXag+1fXpAxTAFRQTJemlJKjAgD9r8xXTpjNKqIXwHM/o7Rh+O0kUJtS3WQVdBeMKFk5sw9A==} + engines: {node: '>=10'} + hasBin: true + dependencies: + acorn: 8.7.1 + commander: 2.20.3 + source-map: 0.7.3 + source-map-support: 0.5.21 + dev: true + + /test-exclude@6.0.0: + resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} + engines: {node: '>=8'} + dependencies: + '@istanbuljs/schema': 0.1.3 + glob: 7.2.0 + minimatch: 3.1.2 + dev: true + + /text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + dev: true + + /throttle-debounce@3.0.1: + resolution: {integrity: sha512-dTEWWNu6JmeVXY0ZYoPuH5cRIwc0MeGbJwah9KUNYSJwommQpCzTySTpEe8Gs1J23aeWEuAobe4Ag7EHVt/LOg==} + engines: {node: '>=10'} + dev: true + + /through2@2.0.5: + resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} + dependencies: + readable-stream: 2.3.7 + xtend: 4.0.2 + dev: true + + /timers-browserify@2.0.12: + resolution: {integrity: sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==} + engines: {node: '>=0.6.0'} + dependencies: + setimmediate: 1.0.5 + dev: true + + /tinycolor2@1.4.2: + resolution: {integrity: sha512-vJhccZPs965sV/L2sU4oRQVAos0pQXwsvTLkWYdqJ+a8Q5kPFzJTuOFwy7UniPli44NKQGAglksjvOcpo95aZA==} + dev: true + + /tmpl@1.0.5: + resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} + dev: true + + /to-arraybuffer@1.0.1: + resolution: {integrity: sha512-okFlQcoGTi4LQBG/PgSYblw9VOyptsz2KJZqc6qtgGdes8VktzUQkj4BI2blit072iS8VODNcMA+tvnS9dnuMA==} + dev: true + + /to-fast-properties@2.0.0: + resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} + engines: {node: '>=4'} + + /to-object-path@0.3.0: + resolution: {integrity: sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==} + engines: {node: '>=0.10.0'} + dependencies: + kind-of: 3.2.2 + dev: true + + /to-regex-range@2.1.1: + resolution: {integrity: sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==} + engines: {node: '>=0.10.0'} + dependencies: + is-number: 3.0.0 + repeat-string: 1.6.1 + dev: true + + /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 + + /to-regex@3.0.2: + resolution: {integrity: sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==} + engines: {node: '>=0.10.0'} + dependencies: + define-property: 2.0.2 + extend-shallow: 3.0.2 + regex-not: 1.0.2 + safe-regex: 1.1.0 + dev: true + + /toggle-selection@1.0.6: + resolution: {integrity: sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==} + dev: true + + /toidentifier@1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} + dev: true + + /totalist@1.1.0: + resolution: {integrity: sha512-gduQwd1rOdDMGxFG1gEvhV88Oirdo2p+KjoYFU7k2g+i7n6AFFbDQ5kMPUsW0pNbfQsB/cwXvT1i4Bue0s9g5g==} + engines: {node: '>=6'} + dev: true + + /tough-cookie@4.0.0: + resolution: {integrity: sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==} + engines: {node: '>=6'} + dependencies: + psl: 1.8.0 + punycode: 2.1.1 + universalify: 0.1.2 + dev: false + + /tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + dev: true + + /tr46@2.1.0: + resolution: {integrity: sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==} + engines: {node: '>=8'} + dependencies: + punycode: 2.1.1 + dev: false + + /trim-trailing-lines@1.1.4: + resolution: {integrity: sha512-rjUWSqnfTNrjbB9NQWfPMH/xRK1deHeGsHoVfpxJ++XeYXE0d6B1En37AHfw3jtfTU7dzMzZL2jjpe8Qb5gLIQ==} + dev: true + + /trim@0.0.1: + resolution: {integrity: sha512-YzQV+TZg4AxpKxaTHK3c3D+kRDCGVEE7LemdlQZoQXn0iennk10RsIoY6ikzAqJTc9Xjl9C1/waHom/J86ziAQ==} + deprecated: Use String.prototype.trim() instead + dev: true + + /trough@1.0.5: + resolution: {integrity: sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==} + dev: true + + /trough@2.1.0: + resolution: {integrity: sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g==} + dev: false + + /ts-dedent@2.2.0: + resolution: {integrity: sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==} + engines: {node: '>=6.10'} + dev: true + + /ts-node@10.8.0(@types/node@17.0.21)(typescript@4.5.5): + resolution: {integrity: sha512-/fNd5Qh+zTt8Vt1KbYZjRHCE9sI5i7nqfD/dzBBRDeVXZXS6kToW6R7tTU6Nd4XavFs0mAVCg29Q//ML7WsZYA==} + hasBin: true + peerDependencies: + '@swc/core': '>=1.2.50' + '@swc/wasm': '>=1.2.50' + '@types/node': '*' + typescript: '>=2.7' + peerDependenciesMeta: + '@swc/core': + optional: true + '@swc/wasm': + optional: true + dependencies: + '@cspotcode/source-map-support': 0.8.1 + '@tsconfig/node10': 1.0.8 + '@tsconfig/node12': 1.0.9 + '@tsconfig/node14': 1.0.1 + '@tsconfig/node16': 1.0.2 + '@types/node': 17.0.21 + acorn: 8.7.1 + acorn-walk: 8.2.0 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.2 + make-error: 1.3.6 + typescript: 4.5.5 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + dev: false + + /ts-pnp@1.2.0(typescript@4.5.5): + resolution: {integrity: sha512-csd+vJOb/gkzvcCHgTGSChYpy5f1/XKNsmvBGO4JXS+z1v2HobugDz4s1IeFXM3wZB44uczs+eazB5Q/ccdhQw==} + engines: {node: '>=6'} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + typescript: 4.5.5 + dev: true + + /tsconfig-paths@3.12.0: + resolution: {integrity: sha512-e5adrnOYT6zqVnWqZu7i/BQ3BnhzvGbjEjejFXO20lKIKpwTaupkCPgEfv4GZK1IBciJUEhYs3J3p75FdaTFVg==} + dependencies: + '@types/json5': 0.0.29 + json5: 1.0.2 + minimist: 1.2.7 + strip-bom: 3.0.0 + dev: true + + /tslib@1.14.1: + resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} + dev: true + + /tslib@2.3.1: + resolution: {integrity: sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==} + dev: true + + /tslib@2.6.2: + resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} + + /tsutils@3.21.0(typescript@4.5.5): + resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} + engines: {node: '>= 6'} + peerDependencies: + typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' + dependencies: + tslib: 1.14.1 + typescript: 4.5.5 + dev: true + + /tty-browserify@0.0.0: + resolution: {integrity: sha512-JVa5ijo+j/sOoHGjw0sxw734b1LhBkQ3bvUGNdxnVXDCX81Yx7TFgnZygxrIIWn23hbfTaMYLwRmAxFyDuFmIw==} + dev: true + + /type-check@0.3.2: + resolution: {integrity: sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.1.2 + + /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-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + dev: true + + /type-fest@0.6.0: + resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} + engines: {node: '>=8'} + dev: true + + /type-fest@0.8.1: + resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} + engines: {node: '>=8'} + dev: true + + /type-is@1.6.18: + resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} + engines: {node: '>= 0.6'} + dependencies: + media-typer: 0.3.0 + mime-types: 2.1.34 + dev: true + + /typedarray-to-buffer@3.1.5: + resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} + dependencies: + is-typedarray: 1.0.0 + dev: true + + /typedarray@0.0.6: + resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} + dev: true + + /typescript@4.5.5: + resolution: {integrity: sha512-TCTIul70LyWe6IJWT8QSYeA54WQe8EjQFU4wY52Fasj5UKx88LNYKCgBEHcOMOrFF1rKGbD8v/xcNWVUq9SymA==} + engines: {node: '>=4.2.0'} + hasBin: true + + /ua-parser-js@0.7.33: + resolution: {integrity: sha512-s8ax/CeZdK9R/56Sui0WM6y9OFREJarMRHqLB2EwkovemBxNQ+Bqu8GAsUnVcXKgphb++ghr/B2BZx4mahujPw==} + dev: true + + /uglify-js@3.15.2: + resolution: {integrity: sha512-peeoTk3hSwYdoc9nrdiEJk+gx1ALCtTjdYuKSXMTDqq7n1W7dHPqWDdSi+BPL0ni2YMeHD7hKUSdbj3TZauY2A==} + engines: {node: '>=0.8.0'} + hasBin: true + requiresBuild: true + dev: true + optional: true + + /unbox-primitive@1.0.1: + resolution: {integrity: sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==} + dependencies: + function-bind: 1.1.1 + has-bigints: 1.0.1 + has-symbols: 1.0.2 + which-boxed-primitive: 1.0.2 + dev: true + + /undici@5.26.2: + resolution: {integrity: sha512-a4PDLQgLTPHVzOK+x3F79/M4GtyYPl+aX9AAK7aQxpwxDwCqkeZCScy7Gk5kWT3JtdFq1uhO3uZJdLtHI4dK9A==} + engines: {node: '>=14.0'} + dependencies: + '@fastify/busboy': 2.0.0 + dev: false + + /unfetch@4.2.0: + resolution: {integrity: sha512-F9p7yYCn6cIW9El1zi0HI6vqpeIvBsr3dSuRO6Xuppb1u5rXpCPmMvLSyECLhybr9isec8Ohl0hPekMVrEinDA==} + dev: true + + /unherit@1.1.3: + resolution: {integrity: sha512-Ft16BJcnapDKp0+J/rqFC3Rrk6Y/Ng4nzsC028k2jdDII/rdZ7Wd3pPT/6+vIIxRagwRc9K0IUX0Ra4fKvw+WQ==} + dependencies: + inherits: 2.0.4 + xtend: 4.0.2 + dev: true + + /unicode-canonical-property-names-ecmascript@2.0.0: + resolution: {integrity: sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==} + engines: {node: '>=4'} + dev: true + + /unicode-match-property-ecmascript@2.0.0: + resolution: {integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==} + engines: {node: '>=4'} + dependencies: + unicode-canonical-property-names-ecmascript: 2.0.0 + unicode-property-aliases-ecmascript: 2.0.0 + dev: true + + /unicode-match-property-value-ecmascript@2.0.0: + resolution: {integrity: sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw==} + engines: {node: '>=4'} + dev: true + + /unicode-property-aliases-ecmascript@2.0.0: + resolution: {integrity: sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ==} + engines: {node: '>=4'} + dev: true + + /unified@10.1.2: + resolution: {integrity: sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==} + dependencies: + '@types/unist': 2.0.6 + bail: 2.0.2 + extend: 3.0.2 + is-buffer: 2.0.5 + is-plain-obj: 4.0.0 + trough: 2.1.0 + vfile: 5.3.2 + dev: false + + /unified@9.2.0: + resolution: {integrity: sha512-vx2Z0vY+a3YoTj8+pttM3tiJHCwY5UFbYdiWrwBEbHmK8pvsPj2rtAX2BFfgXen8T39CJWblWRDT4L5WGXtDdg==} + dependencies: + '@types/unist': 2.0.6 + bail: 1.0.5 + extend: 3.0.2 + is-buffer: 2.0.5 + is-plain-obj: 2.1.0 + trough: 1.0.5 + vfile: 4.2.1 + dev: true + + /unified@9.2.2: + resolution: {integrity: sha512-Sg7j110mtefBD+qunSLO1lqOEKdrwBFBrR6Qd8f4uwkhWNlbkaqwHse6e7QvD3AP/MNoJdEDLaf8OxYyoWgorQ==} + dependencies: + '@types/unist': 2.0.6 + bail: 1.0.5 + extend: 3.0.2 + is-buffer: 2.0.5 + is-plain-obj: 2.1.0 + trough: 1.0.5 + vfile: 4.2.1 + dev: true + + /union-value@1.0.1: + resolution: {integrity: sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==} + engines: {node: '>=0.10.0'} + dependencies: + arr-union: 3.1.0 + get-value: 2.0.6 + is-extendable: 0.1.1 + set-value: 2.0.1 + dev: true + + /unique-filename@1.1.1: + resolution: {integrity: sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==} + dependencies: + unique-slug: 2.0.2 + dev: true + + /unique-slug@2.0.2: + resolution: {integrity: sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==} + dependencies: + imurmurhash: 0.1.4 + dev: true + + /unist-builder@2.0.3: + resolution: {integrity: sha512-f98yt5pnlMWlzP539tPc4grGMsFaQQlP/vM396b00jngsiINumNmsY8rkXjfoi1c6QaM8nQ3vaGDuoKWbe/1Uw==} + dev: true + + /unist-builder@3.0.0: + resolution: {integrity: sha512-GFxmfEAa0vi9i5sd0R2kcrI9ks0r82NasRq5QHh2ysGngrc6GiqD5CDf1FjPenY4vApmFASBIIlk/jj5J5YbmQ==} + dependencies: + '@types/unist': 2.0.6 + dev: false + + /unist-util-generated@1.1.6: + resolution: {integrity: sha512-cln2Mm1/CZzN5ttGK7vkoGw+RZ8VcUH6BtGbq98DDtRGquAAOXig1mrBQYelOwMXYS8rK+vZDyyojSjp7JX+Lg==} + dev: true + + /unist-util-generated@2.0.0: + resolution: {integrity: sha512-TiWE6DVtVe7Ye2QxOVW9kqybs6cZexNwTwSMVgkfjEReqy/xwGpAXb99OxktoWwmL+Z+Epb0Dn8/GNDYP1wnUw==} + dev: false + + /unist-util-is@4.1.0: + resolution: {integrity: sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==} + dev: true + + /unist-util-is@5.1.1: + resolution: {integrity: sha512-F5CZ68eYzuSvJjGhCLPL3cYx45IxkqXSetCcRgUXtbcm50X2L9oOWQlfUfDdAf+6Pd27YDblBfdtmsThXmwpbQ==} + dev: false + + /unist-util-map@2.0.1: + resolution: {integrity: sha512-VdNvk4BQUUU9Rgr8iUOvclHa/iN9O+6Dt66FKij8l9OVezGG37gGWCPU5KSax1R2degqXFvl3kWTkvzL79e9tQ==} + dependencies: + '@types/mdast': 3.0.10 + object-assign: 4.1.1 + dev: false + + /unist-util-position-from-estree@1.1.1: + resolution: {integrity: sha512-xtoY50b5+7IH8tFbkw64gisG9tMSpxDjhX9TmaJJae/XuxQ9R/Kc8Nv1eOsf43Gt4KV/LkriMy9mptDr7XLcaw==} + dependencies: + '@types/unist': 2.0.6 + dev: false + + /unist-util-position@3.1.0: + resolution: {integrity: sha512-w+PkwCbYSFw8vpgWD0v7zRCl1FpY3fjDSQ3/N/wNd9Ffa4gPi8+4keqt99N3XW6F99t/mUzp2xAhNmfKWp95QA==} + dev: true + + /unist-util-position@4.0.2: + resolution: {integrity: sha512-Y6+plxR41dOLbyyqVDLuGWgXDmxdXslCSRYQkSDagBnOT9oFsQH0J8FzhirSklUEe0xZTT0WDnAE1gXPaDFljA==} + dependencies: + '@types/unist': 2.0.6 + dev: false + + /unist-util-remove-position@2.0.1: + resolution: {integrity: sha512-fDZsLYIe2uT+oGFnuZmy73K6ZxOPG/Qcm+w7jbEjaFcJgbQ6cqjs/eSPzXhsmGpAsWPkqZM9pYjww5QTn3LHMA==} + dependencies: + unist-util-visit: 2.0.3 + dev: true + + /unist-util-remove-position@4.0.1: + resolution: {integrity: sha512-0yDkppiIhDlPrfHELgB+NLQD5mfjup3a8UYclHruTJWmY74je8g+CIFr79x5f6AkmzSwlvKLbs63hC0meOMowQ==} + dependencies: + '@types/unist': 2.0.6 + unist-util-visit: 4.1.0 + dev: false + + /unist-util-remove@2.1.0: + resolution: {integrity: sha512-J8NYPyBm4baYLdCbjmf1bhPu45Cr1MWTm77qd9istEkzWpnN6O9tMsEbB2JhNnBCqGENRqEWomQ+He6au0B27Q==} + dependencies: + unist-util-is: 4.1.0 + dev: true + + /unist-util-select@4.0.1: + resolution: {integrity: sha512-zPozyEo5vr1csbHf1TqlQrnuLVJ0tNMo63og3HrnINh2+OIDAgQpqHVr+0BMw1DIVHJV8ft/e6BZqtvD1Y5enw==} + dependencies: + '@types/unist': 2.0.6 + css-selector-parser: 1.4.1 + nth-check: 2.0.1 + unist-util-is: 5.1.1 + zwitch: 2.0.2 + dev: false + + /unist-util-stringify-position@2.0.3: + resolution: {integrity: sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==} + dependencies: + '@types/unist': 2.0.6 + + /unist-util-stringify-position@3.0.2: + resolution: {integrity: sha512-7A6eiDCs9UtjcwZOcCpM4aPII3bAAGv13E96IkawkOAW0OhH+yRxtY0lzo8KiHpzEMfH7Q+FizUmwp8Iqy5EWg==} + dependencies: + '@types/unist': 2.0.6 + dev: false + + /unist-util-visit-parents@3.1.1: + resolution: {integrity: sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg==} + dependencies: + '@types/unist': 2.0.6 + unist-util-is: 4.1.0 + dev: true + + /unist-util-visit-parents@4.1.1: + resolution: {integrity: sha512-1xAFJXAKpnnJl8G7K5KgU7FY55y3GcLIXqkzUj5QF/QVP7biUm0K0O2oqVkYsdjzJKifYeWn9+o6piAK2hGSHw==} + dependencies: + '@types/unist': 2.0.6 + unist-util-is: 5.1.1 + dev: false + + /unist-util-visit-parents@5.1.0: + resolution: {integrity: sha512-y+QVLcY5eR/YVpqDsLf/xh9R3Q2Y4HxkZTp7ViLDU6WtJCEcPmRzW1gpdWDCDIqIlhuPDXOgttqPlykrHYDekg==} + dependencies: + '@types/unist': 2.0.6 + unist-util-is: 5.1.1 + dev: false + + /unist-util-visit@2.0.3: + resolution: {integrity: sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==} + dependencies: + '@types/unist': 2.0.6 + unist-util-is: 4.1.0 + unist-util-visit-parents: 3.1.1 + dev: true + + /unist-util-visit@3.1.0: + resolution: {integrity: sha512-Szoh+R/Ll68QWAyQyZZpQzZQm2UPbxibDvaY8Xc9SUtYgPsDzx5AWSk++UUt2hJuow8mvwR+rG+LQLw+KsuAKA==} + dependencies: + '@types/unist': 2.0.6 + unist-util-is: 5.1.1 + unist-util-visit-parents: 4.1.1 + dev: false + + /unist-util-visit@4.1.0: + resolution: {integrity: sha512-n7lyhFKJfVZ9MnKtqbsqkQEk5P1KShj0+//V7mAcoI6bpbUjh3C/OG8HVD+pBihfh6Ovl01m8dkcv9HNqYajmQ==} + dependencies: + '@types/unist': 2.0.6 + unist-util-is: 5.1.1 + unist-util-visit-parents: 5.1.0 + dev: false + + /universalify@0.1.2: + resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} + engines: {node: '>= 4.0.0'} + dev: false + + /universalify@2.0.0: + resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==} + engines: {node: '>= 10.0.0'} + dev: true + + /unpipe@1.0.0: + resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} + engines: {node: '>= 0.8'} + dev: true + + /unset-value@1.0.0: + resolution: {integrity: sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==} + engines: {node: '>=0.10.0'} + dependencies: + has-value: 0.3.1 + isobject: 3.0.1 + dev: true + + /upath@1.2.0: + resolution: {integrity: sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==} + engines: {node: '>=4'} + requiresBuild: true + dev: true + optional: true + + /uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + dependencies: + punycode: 2.1.1 + dev: true + + /urix@0.1.0: + resolution: {integrity: sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==} + deprecated: Please see https://github.com/lydell/urix#deprecated + dev: true + + /url-loader@4.1.1(file-loader@6.2.0)(webpack@4.46.0): + resolution: {integrity: sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==} + engines: {node: '>= 10.13.0'} + peerDependencies: + file-loader: '*' + webpack: ^4.0.0 || ^5.0.0 + peerDependenciesMeta: + file-loader: + optional: true + dependencies: + file-loader: 6.2.0(webpack@4.46.0) + loader-utils: 2.0.2 + mime-types: 2.1.34 + schema-utils: 3.1.1 + webpack: 4.46.0 + dev: true + + /url@0.11.0: + resolution: {integrity: sha512-kbailJa29QrtXnxgq+DdCEGlbTeYM2eJUxsz6vjZavrCYPMIFHMKQmSKYAIuUK2i7hgPm28a8piX5NTUtM/LKQ==} + dependencies: + punycode: 1.3.2 + querystring: 0.2.0 + dev: true + + /use-composed-ref@1.2.1(react@17.0.2): + resolution: {integrity: sha512-6+X1FLlIcjvFMAeAD/hcxDT8tmyrWnbSPMU0EnxQuDLIxokuFzWliXBiYZuGIx+mrAMLBw0WFfCkaPw8ebzAhw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 + dependencies: + react: 17.0.2 + dev: true + + /use-isomorphic-layout-effect@1.1.1(@types/react@17.0.39)(react@17.0.2): + resolution: {integrity: sha512-L7Evj8FGcwo/wpbv/qvSfrkHFtOpCzvM5yl2KVyDJoylVuSvzphiiasmjgQPttIGBAy2WKiBNR98q8w7PiNgKQ==} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 17.0.39 + react: 17.0.2 + dev: true + + /use-latest@1.2.0(@types/react@17.0.39)(react@17.0.2): + resolution: {integrity: sha512-d2TEuG6nSLKQLAfW3By8mKr8HurOlTkul0sOpxbClIv4SQ4iOd7BYr7VIzdbktUCnv7dua/60xzd8igMU6jmyw==} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 17.0.39 + react: 17.0.2 + use-isomorphic-layout-effect: 1.1.1(@types/react@17.0.39)(react@17.0.2) + dev: true + + /use-sync-external-store@1.2.0(react@17.0.2): + resolution: {integrity: sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + dependencies: + react: 17.0.2 + + /use@3.1.1: + resolution: {integrity: sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==} + engines: {node: '>=0.10.0'} + dev: true + + /util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + /util.promisify@1.0.0: + resolution: {integrity: sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==} + dependencies: + define-properties: 1.1.3 + object.getownpropertydescriptors: 2.1.3 + dev: true + + /util@0.10.3: + resolution: {integrity: sha512-5KiHfsmkqacuKjkRkdV7SsfDJ2EGiPsK92s2MhNSY0craxjTdKTtqKsJaCWp4LW33ZZ0OPUv1WO/TFvNQRiQxQ==} + dependencies: + inherits: 2.0.1 + dev: true + + /util@0.11.1: + resolution: {integrity: sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==} + dependencies: + inherits: 2.0.3 + dev: true + + /utila@0.4.0: + resolution: {integrity: sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==} + dev: true + + /utils-merge@1.0.1: + resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} + engines: {node: '>= 0.4.0'} + dev: true + + /uuid-browser@3.1.0: + resolution: {integrity: sha512-dsNgbLaTrd6l3MMxTtouOCFw4CBFc/3a+GgYA2YyrJvyQ1u6q4pcu3ktLoUZ/VN/Aw9WsauazbgsgdfVWgAKQg==} + deprecated: Package no longer supported and required. Use the uuid package or crypto.randomUUID instead + dev: true + + /uuid@3.4.0: + resolution: {integrity: sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==} + deprecated: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details. + hasBin: true + dev: true + + /uvu@0.5.3: + resolution: {integrity: sha512-brFwqA3FXzilmtnIyJ+CxdkInkY/i4ErvP7uV0DnUVxQcQ55reuHphorpF+tZoVHK2MniZ/VJzI7zJQoc9T9Yw==} + engines: {node: '>=8'} + hasBin: true + dependencies: + dequal: 2.0.2 + diff: 5.0.0 + kleur: 4.1.4 + sade: 1.8.1 + dev: false + + /v8-compile-cache-lib@3.0.1: + resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} + dev: false + + /v8-compile-cache@2.3.0: + resolution: {integrity: sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==} + dev: true + + /v8-to-istanbul@8.1.1: + resolution: {integrity: sha512-FGtKtv3xIpR6BYhvgH8MI/y78oT7d8Au3ww4QIxymrCtZEh5b8gCw2siywE+puhEmuWKDtmfrvF5UlB298ut3w==} + engines: {node: '>=10.12.0'} + dependencies: + '@types/istanbul-lib-coverage': 2.0.4 + convert-source-map: 1.8.0 + source-map: 0.7.3 + dev: true + + /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 + + /vary@1.1.2: + resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} + engines: {node: '>= 0.8'} + dev: true + + /vfile-location@3.2.0: + resolution: {integrity: sha512-aLEIZKv/oxuCDZ8lkJGhuhztf/BW4M+iHdCwglA/eWc+vtuRFJj8EtgceYFX4LRjOhCAAiNHsKGssC6onJ+jbA==} + + /vfile-matter@3.0.1: + resolution: {integrity: sha512-CAAIDwnh6ZdtrqAuxdElUqQRQDQgbbIrYtDYI8gCjXS1qQ+1XdLoK8FIZWxJwn0/I+BkSSZpar3SOgjemQz4fg==} + dependencies: + '@types/js-yaml': 4.0.9 + is-buffer: 2.0.5 + js-yaml: 4.1.0 + dev: false + + /vfile-message@2.0.4: + resolution: {integrity: sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==} + dependencies: + '@types/unist': 2.0.6 + unist-util-stringify-position: 2.0.3 + + /vfile-message@3.1.2: + resolution: {integrity: sha512-QjSNP6Yxzyycd4SVOtmKKyTsSvClqBPJcd00Z0zuPj3hOIjg0rUPG6DbFGPvUKRgYyaIWLPKpuEclcuvb3H8qA==} + dependencies: + '@types/unist': 2.0.6 + unist-util-stringify-position: 3.0.2 + dev: false + + /vfile@4.2.1: + resolution: {integrity: sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==} + dependencies: + '@types/unist': 2.0.6 + is-buffer: 2.0.5 + unist-util-stringify-position: 2.0.3 + vfile-message: 2.0.4 + + /vfile@5.3.2: + resolution: {integrity: sha512-w0PLIugRY3Crkgw89TeMvHCzqCs/zpreR31hl4D92y6SOE07+bfJe+dK5Q2akwS+i/c801kzjoOr9gMcTe6IAA==} + dependencies: + '@types/unist': 2.0.6 + is-buffer: 2.0.5 + unist-util-stringify-position: 3.0.2 + vfile-message: 3.1.2 + dev: false + + /vm-browserify@1.1.2: + resolution: {integrity: sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==} + dev: true + + /w3c-hr-time@1.0.2: + resolution: {integrity: sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==} + deprecated: Use your platform's native performance.now() and performance.timeOrigin. + dependencies: + browser-process-hrtime: 1.0.0 + dev: false + + /w3c-xmlserializer@2.0.0: + resolution: {integrity: sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==} + engines: {node: '>=10'} + dependencies: + xml-name-validator: 3.0.0 + dev: false + + /walker@1.0.8: + resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} + dependencies: + makeerror: 1.0.12 + dev: true + + /warning@4.0.3: + resolution: {integrity: sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==} + dependencies: + loose-envify: 1.4.0 + dev: true + + /watchpack-chokidar2@2.0.1: + resolution: {integrity: sha512-nCFfBIPKr5Sh61s4LPpy1Wtfi0HE8isJ3d2Yb5/Ppw2P2B/3eVSEBjKfN0fmHJSK14+31KwMKmcrzs2GM4P0Ww==} + requiresBuild: true + dependencies: + chokidar: 2.1.8 + transitivePeerDependencies: + - supports-color + dev: true + optional: true + + /watchpack@1.7.5: + resolution: {integrity: sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ==} + dependencies: + graceful-fs: 4.2.9 + neo-async: 2.6.2 + optionalDependencies: + chokidar: 3.5.3 + watchpack-chokidar2: 2.0.1 + transitivePeerDependencies: + - supports-color + dev: true + + /watchpack@2.3.1: + resolution: {integrity: sha512-x0t0JuydIo8qCNctdDrn1OzH/qDzk2+rdCOC3YzumZ42fiMqmQ7T3xQurykYMhYfHaPHTp4ZxAx2NfUo1K6QaA==} + engines: {node: '>=10.13.0'} + dependencies: + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.9 + dev: true + + /web-namespaces@1.1.4: + resolution: {integrity: sha512-wYxSGajtmoP4WxfejAPIr4l0fVh+jeMXZb08wNc0tMg6xsfZXj3cECqIK0G7ZAqUq0PP8WlMDtaOGVBTAWztNw==} + + /webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + dev: true + + /webidl-conversions@5.0.0: + resolution: {integrity: sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==} + engines: {node: '>=8'} + dev: false + + /webidl-conversions@6.1.0: + resolution: {integrity: sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==} + engines: {node: '>=10.4'} + dev: false + + /webpack-bundle-analyzer@4.3.0: + resolution: {integrity: sha512-J3TPm54bPARx6QG8z4cKBszahnUglcv70+N+8gUqv2I5KOFHJbzBiLx+pAp606so0X004fxM7hqRu10MLjJifA==} + engines: {node: '>= 10.13.0'} + hasBin: true + dependencies: + acorn: 8.7.1 + acorn-walk: 8.2.0 + chalk: 4.1.2 + commander: 6.2.1 + gzip-size: 6.0.0 + lodash: 4.17.21 + opener: 1.5.2 + sirv: 1.0.19 + ws: 7.5.7 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + dev: true + + /webpack-dev-middleware@3.7.3(webpack@4.46.0): + resolution: {integrity: sha512-djelc/zGiz9nZj/U7PTBi2ViorGJXEWo/3ltkPbDyxCXhhEXkW0ce99falaok4TPj+AsxLiXJR0EBOb0zh9fKQ==} + engines: {node: '>= 6'} + peerDependencies: + webpack: ^4.0.0 || ^5.0.0 + dependencies: + memory-fs: 0.4.1 + mime: 2.6.0 + mkdirp: 0.5.5 + range-parser: 1.2.1 + webpack: 4.46.0 + webpack-log: 2.0.0 + dev: true + + /webpack-filter-warnings-plugin@1.2.1(webpack@4.46.0): + resolution: {integrity: sha512-Ez6ytc9IseDMLPo0qCuNNYzgtUl8NovOqjIq4uAU8LTD4uoa1w1KpZyyzFtLTEMZpkkOkLfL9eN+KGYdk1Qtwg==} + engines: {node: '>= 4.3 < 5.0.0 || >= 5.10'} + peerDependencies: + webpack: ^2.0.0 || ^3.0.0 || ^4.0.0 + dependencies: + webpack: 4.46.0 + dev: true + + /webpack-hot-middleware@2.25.1: + resolution: {integrity: sha512-Koh0KyU/RPYwel/khxbsDz9ibDivmUbrRuKSSQvW42KSDdO4w23WI3SkHpSUKHE76LrFnnM/L7JCrpBwu8AXYw==} + dependencies: + ansi-html-community: 0.0.8 + html-entities: 2.3.2 + querystring: 0.2.1 + strip-ansi: 6.0.1 + dev: true + + /webpack-log@2.0.0: + resolution: {integrity: sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==} + engines: {node: '>= 6'} + dependencies: + ansi-colors: 3.2.4 + uuid: 3.4.0 + dev: true + + /webpack-sources@1.4.3: + resolution: {integrity: sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==} + dependencies: + source-list-map: 2.0.1 + source-map: 0.6.1 + dev: true + + /webpack-virtual-modules@0.2.2: + resolution: {integrity: sha512-kDUmfm3BZrei0y+1NTHJInejzxfhtU8eDj2M7OKb2IWrPFAeO1SOH2KuQ68MSZu9IGEHcxbkKKR1v18FrUSOmA==} + dependencies: + debug: 3.2.7 + transitivePeerDependencies: + - supports-color + dev: true + + /webpack@4.46.0: + resolution: {integrity: sha512-6jJuJjg8znb/xRItk7bkT0+Q7AHCYjjFnvKIWQPkNIOyRqoCGvkOs0ipeQzrqz4l5FtN5ZI/ukEHroeX/o1/5Q==} + engines: {node: '>=6.11.5'} + hasBin: true + peerDependencies: + webpack-cli: '*' + webpack-command: '*' + peerDependenciesMeta: + webpack-cli: + optional: true + webpack-command: + optional: true + dependencies: + '@webassemblyjs/ast': 1.9.0 + '@webassemblyjs/helper-module-context': 1.9.0 + '@webassemblyjs/wasm-edit': 1.9.0 + '@webassemblyjs/wasm-parser': 1.9.0 + acorn: 6.4.2 + ajv: 6.12.6 + ajv-keywords: 3.5.2(ajv@6.12.6) + chrome-trace-event: 1.0.3 + enhanced-resolve: 4.5.0 + eslint-scope: 4.0.3 + json-parse-better-errors: 1.0.2 + loader-runner: 2.4.0 + loader-utils: 1.4.2 + memory-fs: 0.4.1 + micromatch: 3.1.10 + mkdirp: 0.5.5 + neo-async: 2.6.2 + node-libs-browser: 2.2.1 + schema-utils: 1.0.0 + tapable: 1.1.3 + terser-webpack-plugin: 1.4.5(webpack@4.46.0) + watchpack: 1.7.5 + webpack-sources: 1.4.3 + transitivePeerDependencies: + - supports-color + dev: true + + /whatwg-encoding@1.0.5: + resolution: {integrity: sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==} + dependencies: + iconv-lite: 0.4.24 + dev: false + + /whatwg-mimetype@2.3.0: + resolution: {integrity: sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==} + dev: false + + /whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + dev: true + + /whatwg-url@8.7.0: + resolution: {integrity: sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==} + engines: {node: '>=10'} + dependencies: + lodash: 4.17.21 + tr46: 2.1.0 + webidl-conversions: 6.1.0 + dev: false + + /which-boxed-primitive@1.0.2: + resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} + dependencies: + is-bigint: 1.0.4 + is-boolean-object: 1.1.2 + is-number-object: 1.0.6 + is-string: 1.0.7 + is-symbol: 1.0.4 + dev: true + + /which-collection@1.0.1: + resolution: {integrity: sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==} + dependencies: + is-map: 2.0.2 + is-set: 2.0.2 + is-weakmap: 2.0.1 + is-weakset: 2.0.2 + dev: true + + /which-module@2.0.0: + resolution: {integrity: sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==} + dev: false + + /which-typed-array@1.1.7: + resolution: {integrity: sha512-vjxaB4nfDqwKI0ws7wZpxIlde1XrLX5uB0ZjpfshgmapJMD7jJWhZI+yToJTqaFByF0eNBcYxbjmCzoRP7CfEw==} + engines: {node: '>= 0.4'} + dependencies: + available-typed-arrays: 1.0.5 + call-bind: 1.0.2 + es-abstract: 1.19.1 + foreach: 2.0.5 + has-tostringtag: 1.0.0 + is-typed-array: 1.1.8 + dev: true + + /which@1.3.1: + resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} + hasBin: true + dependencies: + isexe: 2.0.0 + dev: true + + /which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + dependencies: + isexe: 2.0.0 + dev: true + + /wide-align@1.1.5: + resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==} + dependencies: + string-width: 4.2.3 + dev: true + + /widest-line@3.1.0: + resolution: {integrity: sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==} + engines: {node: '>=8'} + dependencies: + string-width: 4.2.3 + dev: true + + /word-wrap@1.2.4: + resolution: {integrity: sha512-2V81OA4ugVo5pRo46hAoD2ivUJx8jXmWXfUkY4KFNw0hEptvN0QfH3K4nHiwzGeKl5rFKedV48QVoqYavy4YpA==} + engines: {node: '>=0.10.0'} + + /wordwrap@1.0.0: + resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} + dev: true + + /worker-farm@1.7.0: + resolution: {integrity: sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==} + dependencies: + errno: 0.1.8 + dev: true + + /worker-rpc@0.1.1: + resolution: {integrity: sha512-P1WjMrUB3qgJNI9jfmpZ/htmBEjFh//6l/5y8SD9hg1Ef5zTTVVoRjTrTEzPrNBQvmhMxkoTsjOXN10GWU7aCg==} + dependencies: + microevent.ts: 0.1.1 + dev: true + + /wrap-ansi@5.1.0: + resolution: {integrity: sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==} + engines: {node: '>=6'} + dependencies: + ansi-styles: 3.2.1 + string-width: 3.1.0 + strip-ansi: 5.2.0 + dev: false + + /wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + dev: true + + /wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + /write-file-atomic@3.0.3: + resolution: {integrity: sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==} + dependencies: + imurmurhash: 0.1.4 + is-typedarray: 1.0.0 + signal-exit: 3.0.7 + typedarray-to-buffer: 3.1.5 + dev: true + + /ws@7.5.7: + resolution: {integrity: sha512-KMvVuFzpKBuiIXW3E4u3mySRO2/mCHSyZDJQM5NQ9Q9KHWHWh0NHgfbRMLLrceUK5qAL4ytALJbpRMjixFZh8A==} + engines: {node: '>=8.3.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + /ws@8.5.0: + resolution: {integrity: sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + dev: true + + /xml-name-validator@3.0.0: + resolution: {integrity: sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==} + dev: false + + /xmlchars@2.2.0: + resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} + dev: false + + /xtend@4.0.2: + resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} + engines: {node: '>=0.4'} + + /y18n@4.0.3: + resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} + + /y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + dev: true + + /yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + dev: true + + /yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + dev: true + + /yaml@1.10.2: + resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} + engines: {node: '>= 6'} + dev: true + + /yargs-parser@13.1.2: + resolution: {integrity: sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==} + dependencies: + camelcase: 5.3.1 + decamelize: 1.2.0 + dev: false + + /yargs-parser@20.2.9: + resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} + engines: {node: '>=10'} + dev: true + + /yargs@13.3.2: + resolution: {integrity: sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==} + dependencies: + cliui: 5.0.0 + find-up: 3.0.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + require-main-filename: 2.0.0 + set-blocking: 2.0.0 + string-width: 3.1.0 + which-module: 2.0.0 + y18n: 4.0.3 + yargs-parser: 13.1.2 + dev: false + + /yargs@16.2.0: + resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} + engines: {node: '>=10'} + dependencies: + cliui: 7.0.4 + escalade: 3.1.1 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 20.2.9 + dev: true + + /yn@3.1.1: + resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} + engines: {node: '>=6'} + dev: false + + /yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + dev: true + + /zwitch@1.0.5: + resolution: {integrity: sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==} + dev: true + + /zwitch@2.0.2: + resolution: {integrity: sha512-JZxotl7SxAJH0j7dN4pxsTV6ZLXoLdGME+PsjkL/DaBrVryK9kTGq06GfKrwcSOqypP+fdXGoCHE36b99fWVoA==} + dev: false diff --git a/docs/pnpm-workspace.yaml b/docs/pnpm-workspace.yaml new file mode 100644 index 00000000000..5785dce6f5f --- /dev/null +++ b/docs/pnpm-workspace.yaml @@ -0,0 +1,4 @@ +# docs are a workspace with a single package to isolate +# it from the rest of the monorepo +packages: + - '.' diff --git a/docs/public/buidler-plugin-badge.svg b/docs/public/buidler-plugin-badge.svg deleted file mode 100644 index 94f6a233e0f..00000000000 --- a/docs/public/buidler-plugin-badge.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/docs/public/card.jpg b/docs/public/card.jpg deleted file mode 100644 index 51eb13488c2..00000000000 Binary files a/docs/public/card.jpg and /dev/null differ diff --git a/docs/public/cool-hardhat.svg b/docs/public/cool-hardhat.svg deleted file mode 100644 index 622abfd365b..00000000000 --- a/docs/public/cool-hardhat.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/public/favicon.ico b/docs/public/favicon.ico deleted file mode 100755 index d5e6b335eb8..00000000000 Binary files a/docs/public/favicon.ico and /dev/null differ diff --git a/docs/public/fonts/Chivo-Bold.ttf b/docs/public/fonts/Chivo-Bold.ttf deleted file mode 100755 index c83bb44c59c..00000000000 Binary files a/docs/public/fonts/Chivo-Bold.ttf and /dev/null differ diff --git a/docs/public/fonts/Chivo-Bold.woff2 b/docs/public/fonts/Chivo-Bold.woff2 deleted file mode 100644 index 1530d7a6cfa..00000000000 Binary files a/docs/public/fonts/Chivo-Bold.woff2 and /dev/null differ diff --git a/docs/public/fonts/Chivo-Light.ttf b/docs/public/fonts/Chivo-Light.ttf deleted file mode 100755 index daa73e5af10..00000000000 Binary files a/docs/public/fonts/Chivo-Light.ttf and /dev/null differ diff --git a/docs/public/fonts/Chivo-Light.woff2 b/docs/public/fonts/Chivo-Light.woff2 deleted file mode 100644 index b09dcae4643..00000000000 Binary files a/docs/public/fonts/Chivo-Light.woff2 and /dev/null differ diff --git a/docs/public/fonts/Chivo-Regular.ttf b/docs/public/fonts/Chivo-Regular.ttf deleted file mode 100755 index f9cf49002ce..00000000000 Binary files a/docs/public/fonts/Chivo-Regular.ttf and /dev/null differ diff --git a/docs/public/fonts/Chivo-Regular.woff2 b/docs/public/fonts/Chivo-Regular.woff2 deleted file mode 100644 index 34414248759..00000000000 Binary files a/docs/public/fonts/Chivo-Regular.woff2 and /dev/null differ diff --git a/docs/public/front-2.png b/docs/public/front-2.png deleted file mode 100644 index babe1702a20..00000000000 Binary files a/docs/public/front-2.png and /dev/null differ diff --git a/docs/public/front-5.png b/docs/public/front-5.png deleted file mode 100644 index 457d109fe2d..00000000000 Binary files a/docs/public/front-5.png and /dev/null differ diff --git a/docs/public/front-6.png b/docs/public/front-6.png deleted file mode 100644 index c2c0aa5e8fe..00000000000 Binary files a/docs/public/front-6.png and /dev/null differ diff --git a/docs/public/hardhat-ignition-images/hardhat_ignition_stages.png b/docs/public/hardhat-ignition-images/hardhat_ignition_stages.png new file mode 100644 index 00000000000..b87e083cc3b Binary files /dev/null and b/docs/public/hardhat-ignition-images/hardhat_ignition_stages.png differ diff --git a/docs/public/hardhat-tutorial.svg b/docs/public/hardhat-tutorial.svg deleted file mode 100644 index 6487cffc520..00000000000 --- a/docs/public/hardhat-tutorial.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/public/hardhat-vscode-images/configure_default_formatter.png b/docs/public/hardhat-vscode-images/configure_default_formatter.png deleted file mode 100644 index e986e53edc3..00000000000 Binary files a/docs/public/hardhat-vscode-images/configure_default_formatter.png and /dev/null differ diff --git a/docs/public/hardhat-vscode-images/constrain-mutability.gif b/docs/public/hardhat-vscode-images/constrain-mutability.gif deleted file mode 100644 index e8505f5cd82..00000000000 Binary files a/docs/public/hardhat-vscode-images/constrain-mutability.gif and /dev/null differ diff --git a/docs/public/hardhat-vscode-images/diagnostic.gif b/docs/public/hardhat-vscode-images/diagnostic.gif deleted file mode 100644 index ba2fea8ac0e..00000000000 Binary files a/docs/public/hardhat-vscode-images/diagnostic.gif and /dev/null differ diff --git a/docs/public/hardhat-vscode-images/format.gif b/docs/public/hardhat-vscode-images/format.gif deleted file mode 100644 index a888986053d..00000000000 Binary files a/docs/public/hardhat-vscode-images/format.gif and /dev/null differ diff --git a/docs/public/hardhat-vscode-images/format_document_with.png b/docs/public/hardhat-vscode-images/format_document_with.png deleted file mode 100644 index 1eaaa9f6135..00000000000 Binary files a/docs/public/hardhat-vscode-images/format_document_with.png and /dev/null differ diff --git a/docs/public/hardhat-vscode-images/implement-interface.gif b/docs/public/hardhat-vscode-images/implement-interface.gif deleted file mode 100644 index d08f8a36725..00000000000 Binary files a/docs/public/hardhat-vscode-images/implement-interface.gif and /dev/null differ diff --git a/docs/public/hardhat-vscode-images/import-completion.gif b/docs/public/hardhat-vscode-images/import-completion.gif deleted file mode 100644 index bb6e1a1d211..00000000000 Binary files a/docs/public/hardhat-vscode-images/import-completion.gif and /dev/null differ diff --git a/docs/public/hardhat-vscode-images/navigation.gif b/docs/public/hardhat-vscode-images/navigation.gif deleted file mode 100644 index df0c70a189e..00000000000 Binary files a/docs/public/hardhat-vscode-images/navigation.gif and /dev/null differ diff --git a/docs/public/hardhat-vscode-images/on-hover.gif b/docs/public/hardhat-vscode-images/on-hover.gif deleted file mode 100644 index c52ca02a4d4..00000000000 Binary files a/docs/public/hardhat-vscode-images/on-hover.gif and /dev/null differ diff --git a/docs/public/hardhat-vscode-images/open-config.gif b/docs/public/hardhat-vscode-images/open-config.gif deleted file mode 100644 index 94a1a6f8a51..00000000000 Binary files a/docs/public/hardhat-vscode-images/open-config.gif and /dev/null differ diff --git a/docs/public/hardhat-vscode-images/public-private.gif b/docs/public/hardhat-vscode-images/public-private.gif deleted file mode 100644 index 99fa8ec2788..00000000000 Binary files a/docs/public/hardhat-vscode-images/public-private.gif and /dev/null differ diff --git a/docs/public/hardhat-vscode-images/rename.gif b/docs/public/hardhat-vscode-images/rename.gif deleted file mode 100644 index 599d647d5c2..00000000000 Binary files a/docs/public/hardhat-vscode-images/rename.gif and /dev/null differ diff --git a/docs/public/hardhat-vscode-images/select_solidity_plus_hardhat.png b/docs/public/hardhat-vscode-images/select_solidity_plus_hardhat.png deleted file mode 100644 index 8abda218eab..00000000000 Binary files a/docs/public/hardhat-vscode-images/select_solidity_plus_hardhat.png and /dev/null differ diff --git a/docs/public/hardhat-vscode-images/virtual-override.gif b/docs/public/hardhat-vscode-images/virtual-override.gif deleted file mode 100644 index f2a4062d987..00000000000 Binary files a/docs/public/hardhat-vscode-images/virtual-override.gif and /dev/null differ diff --git a/docs/public/hh.gif b/docs/public/hh.gif deleted file mode 100644 index 6bfa0f21b1e..00000000000 Binary files a/docs/public/hh.gif and /dev/null differ diff --git a/docs/public/images/nomic-foundation-logo-dark.svg b/docs/public/images/nomic-foundation-logo-dark.svg deleted file mode 100644 index d315b739ac6..00000000000 --- a/docs/public/images/nomic-foundation-logo-dark.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/public/images/nomic-foundation-logo.svg b/docs/public/images/nomic-foundation-logo.svg deleted file mode 100644 index 83ba25182ed..00000000000 --- a/docs/public/images/nomic-foundation-logo.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/public/images/reveiws-logo/aone.svg b/docs/public/images/reveiws-logo/aone.svg deleted file mode 100755 index 3b4a37835c7..00000000000 --- a/docs/public/images/reveiws-logo/aone.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/public/images/reveiws-logo/connext.svg b/docs/public/images/reveiws-logo/connext.svg deleted file mode 100755 index 359362fe599..00000000000 --- a/docs/public/images/reveiws-logo/connext.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/public/images/reveiws-logo/decentraland.svg b/docs/public/images/reveiws-logo/decentraland.svg deleted file mode 100755 index 37f56bb78c7..00000000000 --- a/docs/public/images/reveiws-logo/decentraland.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/public/images/reveiws-logo/kyber.svg b/docs/public/images/reveiws-logo/kyber.svg deleted file mode 100755 index bae4f777d3c..00000000000 --- a/docs/public/images/reveiws-logo/kyber.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/public/images/reveiws-logo/synthetix.svg b/docs/public/images/reveiws-logo/synthetix.svg deleted file mode 100755 index 8cb51c1a544..00000000000 --- a/docs/public/images/reveiws-logo/synthetix.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/public/images/vibrant_community.png b/docs/public/images/vibrant_community.png deleted file mode 100644 index c7e514b0731..00000000000 Binary files a/docs/public/images/vibrant_community.png and /dev/null differ diff --git a/docs/public/robots.txt b/docs/public/robots.txt deleted file mode 100644 index 1ce6c5d2015..00000000000 --- a/docs/public/robots.txt +++ /dev/null @@ -1,9 +0,0 @@ -# * -User-agent: * -Allow: / - -# Host -Host: https://hardhat.org - -# Sitemaps -Sitemap: https://hardhat.org/sitemap.xml diff --git a/docs/public/sitemap.xml b/docs/public/sitemap.xml deleted file mode 100644 index 385e9b27d05..00000000000 --- a/docs/public/sitemap.xml +++ /dev/null @@ -1,4 +0,0 @@ - - -https://hardhat.org/sitemap-0.xml - \ No newline at end of file diff --git a/docs/public/static/ignition-visualize-example.html b/docs/public/static/ignition-visualize-example.html new file mode 100644 index 00000000000..074dcfb9707 --- /dev/null +++ b/docs/public/static/ignition-visualize-example.html @@ -0,0 +1,2057 @@ + + + + + + + Hardhat Ignition + + + + +
+

Ignition deployment loading...

+
+ + + + diff --git a/docs/public/privacy-policy.html b/docs/public/static/privacy-policy.html similarity index 100% rename from docs/public/privacy-policy.html rename to docs/public/static/privacy-policy.html diff --git a/docs/redirects.config.js b/docs/redirects.config.js index 0d801afd81f..9eca3dc24a4 100644 --- a/docs/redirects.config.js +++ b/docs/redirects.config.js @@ -18,258 +18,300 @@ const customRedirects = [ { source: "/config", destination: "/hardhat-runner/docs/config", - permanent: false + permanent: false, }, { source: "/plugins", destination: "/hardhat-runner/plugins", - permanent: false + permanent: false, }, { source: "/getting-started", destination: "/hardhat-runner/docs/getting-started#overview", - permanent: false + permanent: false, }, { source: "/links/stack-traces", destination: "/", permanent: false }, { source: "/reportbug", destination: "https://github.com/NomicFoundation/hardhat/issues/new", - permanent: false + permanent: false, }, { source: "/report-bug", destination: "https://github.com/NomicFoundation/hardhat/issues/new", - permanent: false + permanent: false, }, { source: "/console-log", destination: "/hardhat-network/#console.log", - permanent: false + permanent: false, }, { source: "/discord", destination: "https://discord.gg/TETZs2KK4k", - permanent: false + permanent: false, + }, + { + source: "/ignition-discord", + destination: "https://discord.gg/7jBkZQXB25", + permanent: false, }, { source: "/hre", destination: "/advanced/hardhat-runtime-environment", - permanent: false + permanent: false, }, { source: "/nodejs-versions", destination: "/reference/stability-guarantees#node.js-versions-support", - permanent: false + permanent: false, }, { source: "/verify-custom-networks", - destination: "/plugins/nomicfoundation-hardhat-verify#adding-support-for-other-networks", - permanent: false + destination: + "/plugins/nomicfoundation-hardhat-verify#adding-support-for-other-networks", + permanent: false, }, { source: "/verify-multiple-networks", - destination: "plugins/nomicfoundation-hardhat-verify.html#multiple-api-keys-and-alternative-block-explorers", - permanent: false + destination: + "plugins/nomicfoundation-hardhat-verify.html#multiple-api-keys-and-alternative-block-explorers", + permanent: false, }, { source: "/metamask-issue", destination: "/hardhat-network/docs/metamask-issue", - permanent: false + permanent: false, }, { source: "/migrate-from-waffle", destination: "/hardhat-runner/docs/guides/migrating-from-hardhat-waffle", - permanent: false + permanent: false, + }, + { + source: "/hardhat-runner/docs/guides/migrating-from-hardhat-waffle", + destination: "/hardhat-runner/docs/advanced/migrating-from-hardhat-waffle", + permanent: false, }, { source: "/custom-hardfork-history", - destination: "/hardhat-network/docs/guides/forking-other-networks.html#using-a-custom-hardfork-history", - permanent: false + destination: + "/hardhat-network/docs/guides/forking-other-networks.html#using-a-custom-hardfork-history", + permanent: false, }, { - source: "/solidity-survey-2022", - destination: "https://cryptpad.fr/form/#/2/form/view/HuPIRv4gvziSV0dPV1SJncKzYJXTVc8LGCaMfLUoj2c/", - permanent: false + source: "/solidity-survey-2023", + destination: + "https://cryptpad.fr/form/#/2/form/view/pV-DdryeJoYUWvW+gXsFaMNynEY7t5mUsgeD1urgwSE", + permanent: false, }, { source: "/solc-viair", - destination: "/hardhat-runner/docs/reference/solidity-support#support-for-ir-based-codegen", - permanent: false + destination: + "/hardhat-runner/docs/reference/solidity-support#support-for-ir-based-codegen", + permanent: false, + }, + { + source: "/chaining-async-matchers", + destination: + "/plugins/nomicfoundation-hardhat-chai-matchers#chaining-async-matchers", + permanent: false, + }, + { + source: "/ignition-errors", + destination: "/ignition/docs/guides/error-handling", + permanent: false, }, - // top-level component URLs { source: "/hardhat-runner", destination: "/hardhat-runner/docs/getting-started#overview", - permanent: false + permanent: false, }, { source: "/hardhat-runner/docs", destination: "/hardhat-runner/docs/getting-started#overview", - permanent: false + permanent: false, }, { source: "/hardhat-network", destination: "/hardhat-network/docs/overview", - permanent: false + permanent: false, }, { source: "/hardhat-network/docs", destination: "/hardhat-network/docs/overview", - permanent: false + permanent: false, }, { source: "/hardhat-vscode", destination: "/hardhat-vscode/docs/overview", - permanent: false + permanent: false, }, { source: "/hardhat-vscode/docs", destination: "/hardhat-vscode/docs/overview", - permanent: false + permanent: false, }, { source: "/hardhat-chai-matchers", destination: "/hardhat-chai-matchers/docs/overview", - permanent: false + permanent: false, }, { source: "/hardhat-chai-matchers/docs", destination: "/hardhat-chai-matchers/docs/overview", - permanent: false + permanent: false, }, { source: "/hardhat-network-helpers", destination: "/hardhat-network-helpers/docs/overview", - permanent: false + permanent: false, }, { source: "/hardhat-network-helpers/docs", destination: "/hardhat-network-helpers/docs/overview", - permanent: false + permanent: false, + }, + { + source: "/ignition", + destination: "/ignition/docs/getting-started#overview", + permanent: false, + }, + { + source: "/ignition/docs", + destination: "/ignition/docs/getting-started#overview", + permanent: false, }, // legacy URLs { source: "/configuration", destination: "/hardhat-runner/docs/config", - permanent: false + permanent: false, }, { source: "/guides/create-plugin", destination: "/advanced/building-plugins", - permanent: false + permanent: false, }, { source: "/guides/mainnet-forking", destination: "/hardhat-network/docs/guides/forking-other-networks", - permanent: false + permanent: false, }, { source: "/hardhat-network/guides/mainnet-forking", destination: "/hardhat-network/docs/guides/forking-other-networks", - permanent: false + permanent: false, }, { source: "/hardhat-network/reference", destination: "/hardhat-network/docs/reference", - permanent: false + permanent: false, }, { source: "/hardhat-network/explanation/mining-modes", destination: "/hardhat-network/docs/explanation/mining-modes", - permanent: false + permanent: false, }, { source: "/troubleshooting/verbose-logging", destination: "/hardhat-runner/docs/troubleshooting/verbose-logging", - permanent: false + permanent: false, }, { source: "/troubleshooting/common-problems", destination: "/hardhat-runner/docs/troubleshooting/common-problems", - permanent: false + permanent: false, }, { source: "/errors", destination: "/hardhat-runner/docs/errors", - permanent: false + permanent: false, }, { source: "/reference/stability-guarantees", destination: "/hardhat-runner/docs/reference/stability-guarantees", - permanent: false + permanent: false, }, { source: "/reference/solidity-support", destination: "/hardhat-runner/docs/reference/solidity-support", - permanent: false + permanent: false, }, { source: "/plugins/:slug", destination: "/hardhat-runner/plugins/:slug", - permanent: false + permanent: false, }, { source: "/hardhat-runner/docs/guides/shorthand", destination: "/hardhat-runner/docs/guides/command-line-completion", - permanent: false + permanent: false, }, // guides redirects, exceptions go first { - source: "/guides/:slug(hardhat-runtime-environment|create-task|scripts|building-plugins|vscode-tests)", + source: + "/guides/:slug(hardhat-runtime-environment|create-task|scripts|building-plugins|vscode-tests)", destination: "/hardhat-runner/docs/advanced/:slug", - permanent: false + permanent: false, }, { - source: "/guides/:slug(waffle-testing|truffle-testing|truffle-migration|ganache-tests)", + source: + "/guides/:slug(waffle-testing|truffle-testing|truffle-migration|ganache-tests)", destination: "/hardhat-runner/docs/other-guides/:slug", - permanent: false + permanent: false, }, { source: "/guides/parallel-tests", - destination: "/hardhat-runner/docs/guides/test-contracts#running-tests-in-parallel", - permanent: false + destination: + "/hardhat-runner/docs/guides/test-contracts#running-tests-in-parallel", + permanent: false, }, { source: "/guides/:slug", destination: "/hardhat-runner/docs/guides/:slug", - permanent: false + permanent: false, }, { source: "/advanced/:slug", destination: "/hardhat-runner/docs/advanced/:slug", - permanent: false + permanent: false, }, { source: "/chai-matchers", destination: "/hardhat-chai-matchers", - permanent: false + permanent: false, }, { source: "/chai-matchers/:slug", destination: "/hardhat-chai-matchers/docs/:slug", - permanent: false + permanent: false, }, { source: "/network-helpers", destination: "/hardhat-network-helpers", - permanent: false + permanent: false, }, { source: "/network-helpers/:slug", destination: "/hardhat-network-helpers/docs/:slug", - permanent: false + permanent: false, }, { source: "/hardhat-runner/plugins/nomiclabs-hardhat-etherscan", destination: "/hardhat-runner/plugins/nomicfoundation-hardhat-verify", - permanent: false + permanent: false, + }, + { + source: "/hardhat-runner/plugins/nomiclabs-hardhat-ethers", + destination: "/hardhat-runner/plugins/nomicfoundation-hardhat-ethers", + permanent: false, }, - ...loadErrorRedirects() + ...loadErrorRedirects(), ]; - module.exports = customRedirects; function loadErrorRedirects() { diff --git a/docs/scripts/prepare-error-list.ts b/docs/scripts/prepare-error-list.ts deleted file mode 100644 index 6b0725e70b5..00000000000 --- a/docs/scripts/prepare-error-list.ts +++ /dev/null @@ -1,63 +0,0 @@ -import { - ERROR_RANGES, - ErrorDescriptor, - ERRORS, - getErrorCode, -} from "../../packages/hardhat-core/src/internal/core/errors-list"; -import * as fs from "fs"; -import * as path from "path"; - -interface Redirect { - source: string; - destination: string; - permanent: boolean; -} - -let content = `# Hardhat errors -This section contains a list of all the possible errors you may encounter when -using Hardhat and an explanation of each of them.`; - -const errorRedirects: Redirect[] = []; - -for (const [rangeName, range] of Object.entries(ERROR_RANGES)) { - content += ` -## ${range.title} -`; - - for (const errorDescriptor of Object.values( - ERRORS[rangeName] - )) { - const errorCode = getErrorCode(errorDescriptor); - const title = `${errorCode}: ${errorDescriptor.title}`; - - content += `### [${title}](#${errorCode}) -${errorDescriptor.description} -`; - - const shortLink = errorCode; - // TODO: Fix anchor generation - const anchor = shortLink; - - errorRedirects.push({ - source: `/${shortLink}`, - destination: `/errors/#${anchor}`, - permanent: false, - }); - errorRedirects.push({ - source: `/${shortLink.toLowerCase()}`, - destination: `/errors/#${anchor}`, - permanent: false, - }); - } -} - -fs.writeFileSync( - path.join(__dirname, "../src/content/hardhat-runner/docs/errors/index.md"), - content, - "utf-8" -); -fs.writeFileSync( - path.join(__dirname, "../temp/error-redirects.json"), - JSON.stringify(errorRedirects, undefined, 2), - "utf-8" -); diff --git a/docs/src/assets/animation/desktop/he-eyes_open.svg b/docs/src/assets/animation/desktop/he-eyes_open.svg deleted file mode 100755 index 05858cd290a..00000000000 --- a/docs/src/assets/animation/desktop/he-eyes_open.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/src/assets/animation/desktop/he-head.svg b/docs/src/assets/animation/desktop/he-head.svg deleted file mode 100755 index bfdfe81a0ae..00000000000 --- a/docs/src/assets/animation/desktop/he-head.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/src/assets/animation/desktop/hero-back_texture-dark.svg b/docs/src/assets/animation/desktop/hero-back_texture-dark.svg deleted file mode 100644 index d5839a27111..00000000000 --- a/docs/src/assets/animation/desktop/hero-back_texture-dark.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/docs/src/assets/animation/desktop/hero-back_texture.svg b/docs/src/assets/animation/desktop/hero-back_texture.svg deleted file mode 100755 index 67885801fe3..00000000000 --- a/docs/src/assets/animation/desktop/hero-back_texture.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/src/assets/animation/desktop/hero-back_texture_reflect.svg b/docs/src/assets/animation/desktop/hero-back_texture_reflect.svg deleted file mode 100755 index c123d245ba9..00000000000 --- a/docs/src/assets/animation/desktop/hero-back_texture_reflect.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/src/assets/animation/desktop/mascots-ethereum_logo-dark.svg b/docs/src/assets/animation/desktop/mascots-ethereum_logo-dark.svg deleted file mode 100644 index 0c1a1a3e24f..00000000000 --- a/docs/src/assets/animation/desktop/mascots-ethereum_logo-dark.svg +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/docs/src/assets/animation/desktop/mascots-ethereum_logo.svg b/docs/src/assets/animation/desktop/mascots-ethereum_logo.svg deleted file mode 100755 index c3f254313a4..00000000000 --- a/docs/src/assets/animation/desktop/mascots-ethereum_logo.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/src/assets/animation/desktop/shadow-dark.svg b/docs/src/assets/animation/desktop/shadow-dark.svg deleted file mode 100644 index 3a0b0fb4b68..00000000000 --- a/docs/src/assets/animation/desktop/shadow-dark.svg +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - diff --git a/docs/src/assets/animation/desktop/shadow.svg b/docs/src/assets/animation/desktop/shadow.svg deleted file mode 100755 index f07962b37dc..00000000000 --- a/docs/src/assets/animation/desktop/shadow.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/src/assets/animation/desktop/she-eyes_open.svg b/docs/src/assets/animation/desktop/she-eyes_open.svg deleted file mode 100755 index 284e9e246df..00000000000 --- a/docs/src/assets/animation/desktop/she-eyes_open.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/src/assets/animation/desktop/she-head.svg b/docs/src/assets/animation/desktop/she-head.svg deleted file mode 100755 index fc0cbb47521..00000000000 --- a/docs/src/assets/animation/desktop/she-head.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/src/assets/animation/mobile/ethereum_logo-dark.svg b/docs/src/assets/animation/mobile/ethereum_logo-dark.svg deleted file mode 100644 index 13c36319252..00000000000 --- a/docs/src/assets/animation/mobile/ethereum_logo-dark.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/src/assets/animation/mobile/ethereum_logo.svg b/docs/src/assets/animation/mobile/ethereum_logo.svg deleted file mode 100755 index f3a4a14b750..00000000000 --- a/docs/src/assets/animation/mobile/ethereum_logo.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/src/assets/animation/mobile/he-eyes_open.svg b/docs/src/assets/animation/mobile/he-eyes_open.svg deleted file mode 100755 index 76560686ffc..00000000000 --- a/docs/src/assets/animation/mobile/he-eyes_open.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/src/assets/animation/mobile/mascots.svg b/docs/src/assets/animation/mobile/mascots.svg deleted file mode 100755 index d8ae41cfaf1..00000000000 --- a/docs/src/assets/animation/mobile/mascots.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/src/assets/animation/mobile/she-eyes_open.svg b/docs/src/assets/animation/mobile/she-eyes_open.svg deleted file mode 100755 index 2e5ba718baf..00000000000 --- a/docs/src/assets/animation/mobile/she-eyes_open.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/src/assets/buidler-plugin-badge.svg b/docs/src/assets/buidler-plugin-badge.svg deleted file mode 100644 index 94f6a233e0f..00000000000 --- a/docs/src/assets/buidler-plugin-badge.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/docs/src/assets/ethereum-foundation-logo-dark.svg b/docs/src/assets/ethereum-foundation-logo-dark.svg deleted file mode 100644 index 3b4b4b89d5e..00000000000 --- a/docs/src/assets/ethereum-foundation-logo-dark.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/src/assets/ethereum-foundation-logo.svg b/docs/src/assets/ethereum-foundation-logo.svg deleted file mode 100644 index ed3ff8cadd6..00000000000 --- a/docs/src/assets/ethereum-foundation-logo.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/src/assets/feature-cards/Desktop/ExtensibleImage.svg b/docs/src/assets/feature-cards/Desktop/ExtensibleImage.svg deleted file mode 100644 index 00892f49e9c..00000000000 --- a/docs/src/assets/feature-cards/Desktop/ExtensibleImage.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/src/assets/feature-cards/Desktop/ExtensibleImageDark.svg b/docs/src/assets/feature-cards/Desktop/ExtensibleImageDark.svg deleted file mode 100644 index c88fdb45d43..00000000000 --- a/docs/src/assets/feature-cards/Desktop/ExtensibleImageDark.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/src/assets/feature-cards/Desktop/FastIterationImageDark.svg b/docs/src/assets/feature-cards/Desktop/FastIterationImageDark.svg deleted file mode 100644 index 797dfa60493..00000000000 --- a/docs/src/assets/feature-cards/Desktop/FastIterationImageDark.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/src/assets/feature-cards/Desktop/FlexibilityImage.svg b/docs/src/assets/feature-cards/Desktop/FlexibilityImage.svg deleted file mode 100644 index 0a14d67d83d..00000000000 --- a/docs/src/assets/feature-cards/Desktop/FlexibilityImage.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/src/assets/feature-cards/Desktop/FlexibilityImageDark.svg b/docs/src/assets/feature-cards/Desktop/FlexibilityImageDark.svg deleted file mode 100644 index de91a16a7f5..00000000000 --- a/docs/src/assets/feature-cards/Desktop/FlexibilityImageDark.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/src/assets/feature-cards/Desktop/SolidityImage.svg b/docs/src/assets/feature-cards/Desktop/SolidityImage.svg deleted file mode 100644 index 2bcdab2d6d0..00000000000 --- a/docs/src/assets/feature-cards/Desktop/SolidityImage.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/src/assets/feature-cards/Mobile/ExtensibleImage.svg b/docs/src/assets/feature-cards/Mobile/ExtensibleImage.svg deleted file mode 100644 index e9d1ea40554..00000000000 --- a/docs/src/assets/feature-cards/Mobile/ExtensibleImage.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/src/assets/feature-cards/Mobile/ExtensibleImageDark.svg b/docs/src/assets/feature-cards/Mobile/ExtensibleImageDark.svg deleted file mode 100644 index 0ae9045270a..00000000000 --- a/docs/src/assets/feature-cards/Mobile/ExtensibleImageDark.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/src/assets/feature-cards/Mobile/FastIterationImage.svg b/docs/src/assets/feature-cards/Mobile/FastIterationImage.svg deleted file mode 100644 index aefa3a6607a..00000000000 --- a/docs/src/assets/feature-cards/Mobile/FastIterationImage.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/src/assets/feature-cards/Mobile/FastIterationImageDark.svg b/docs/src/assets/feature-cards/Mobile/FastIterationImageDark.svg deleted file mode 100644 index ce3155a2e46..00000000000 --- a/docs/src/assets/feature-cards/Mobile/FastIterationImageDark.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/src/assets/feature-cards/Mobile/FlexibilityImage.svg b/docs/src/assets/feature-cards/Mobile/FlexibilityImage.svg deleted file mode 100644 index 690d63b2e3e..00000000000 --- a/docs/src/assets/feature-cards/Mobile/FlexibilityImage.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/src/assets/feature-cards/Mobile/FlexibilityImageDark.svg b/docs/src/assets/feature-cards/Mobile/FlexibilityImageDark.svg deleted file mode 100644 index 1232f8b9556..00000000000 --- a/docs/src/assets/feature-cards/Mobile/FlexibilityImageDark.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/src/assets/feature-cards/Mobile/SolidityImage.svg b/docs/src/assets/feature-cards/Mobile/SolidityImage.svg deleted file mode 100644 index 6c48b7122e0..00000000000 --- a/docs/src/assets/feature-cards/Mobile/SolidityImage.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/src/assets/feature-cards/Mobile/SolidityImageDark.svg b/docs/src/assets/feature-cards/Mobile/SolidityImageDark.svg deleted file mode 100644 index 07976cb4784..00000000000 --- a/docs/src/assets/feature-cards/Mobile/SolidityImageDark.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/src/assets/get-started/bl.svg b/docs/src/assets/get-started/bl.svg deleted file mode 100644 index fd30b639ae3..00000000000 --- a/docs/src/assets/get-started/bl.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/docs/src/assets/get-started/br.svg b/docs/src/assets/get-started/br.svg deleted file mode 100644 index 58d700585a6..00000000000 --- a/docs/src/assets/get-started/br.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/docs/src/assets/hardhat-logo-dark.svg b/docs/src/assets/hardhat-logo-dark.svg deleted file mode 100644 index ea46980aa22..00000000000 --- a/docs/src/assets/hardhat-logo-dark.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/src/assets/hardhat-logo.svg b/docs/src/assets/hardhat-logo.svg deleted file mode 100644 index 3f1e1c310d0..00000000000 --- a/docs/src/assets/hardhat-logo.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/src/assets/homepage-assets/brett.jpg b/docs/src/assets/homepage-assets/brett.jpg deleted file mode 100644 index 43c0d78070e..00000000000 Binary files a/docs/src/assets/homepage-assets/brett.jpg and /dev/null differ diff --git a/docs/src/assets/homepage-assets/brett.webp b/docs/src/assets/homepage-assets/brett.webp deleted file mode 100644 index 50413804ea5..00000000000 Binary files a/docs/src/assets/homepage-assets/brett.webp and /dev/null differ diff --git a/docs/src/assets/homepage-assets/esteban.png b/docs/src/assets/homepage-assets/esteban.png deleted file mode 100644 index c43346a68c8..00000000000 Binary files a/docs/src/assets/homepage-assets/esteban.png and /dev/null differ diff --git a/docs/src/assets/homepage-assets/esteban.webp b/docs/src/assets/homepage-assets/esteban.webp deleted file mode 100644 index caf8f8490b1..00000000000 Binary files a/docs/src/assets/homepage-assets/esteban.webp and /dev/null differ diff --git a/docs/src/assets/homepage-assets/justin.jpg b/docs/src/assets/homepage-assets/justin.jpg deleted file mode 100644 index 52ed14ec0c9..00000000000 Binary files a/docs/src/assets/homepage-assets/justin.jpg and /dev/null differ diff --git a/docs/src/assets/homepage-assets/justin.webp b/docs/src/assets/homepage-assets/justin.webp deleted file mode 100644 index 7aa14bb5320..00000000000 Binary files a/docs/src/assets/homepage-assets/justin.webp and /dev/null differ diff --git a/docs/src/assets/homepage-assets/rahul.png b/docs/src/assets/homepage-assets/rahul.png deleted file mode 100644 index 8d12781172d..00000000000 Binary files a/docs/src/assets/homepage-assets/rahul.png and /dev/null differ diff --git a/docs/src/assets/homepage-assets/rahul.webp b/docs/src/assets/homepage-assets/rahul.webp deleted file mode 100644 index 88d04215042..00000000000 Binary files a/docs/src/assets/homepage-assets/rahul.webp and /dev/null differ diff --git a/docs/src/assets/homepage-assets/reviews-block.ts b/docs/src/assets/homepage-assets/reviews-block.ts deleted file mode 100644 index ab94bd22aec..00000000000 --- a/docs/src/assets/homepage-assets/reviews-block.ts +++ /dev/null @@ -1,15 +0,0 @@ -import brett from "./brett.webp"; -import esteban from "./esteban.webp"; -import justin from "./justin.webp"; -import rahul from "./rahul.webp"; -import victor from "./victor.webp"; - -const images = { - brett, - esteban, - justin, - rahul, - victor, -}; - -export default images; diff --git a/docs/src/assets/homepage-assets/victor.png b/docs/src/assets/homepage-assets/victor.png deleted file mode 100644 index 65dd09cda53..00000000000 Binary files a/docs/src/assets/homepage-assets/victor.png and /dev/null differ diff --git a/docs/src/assets/homepage-assets/victor.webp b/docs/src/assets/homepage-assets/victor.webp deleted file mode 100644 index 2cafb0f9f63..00000000000 Binary files a/docs/src/assets/homepage-assets/victor.webp and /dev/null differ diff --git a/docs/src/assets/icons/carousel-arrow.tsx b/docs/src/assets/icons/carousel-arrow.tsx deleted file mode 100644 index f99455052e3..00000000000 --- a/docs/src/assets/icons/carousel-arrow.tsx +++ /dev/null @@ -1,21 +0,0 @@ -import * as React from "react"; -import { SVGProps } from "react"; - -const CarouselArrow = (props: SVGProps) => ( - - - -); - -export default CarouselArrow; diff --git a/docs/src/assets/icons/external-link-icon.tsx b/docs/src/assets/icons/external-link-icon.tsx deleted file mode 100644 index 2d0e99ca05a..00000000000 --- a/docs/src/assets/icons/external-link-icon.tsx +++ /dev/null @@ -1,19 +0,0 @@ -import * as React from "react"; -import { SVGProps } from "react"; - -const ExternalLinkIcon = (props: SVGProps) => ( - - - - - -); - -export default ExternalLinkIcon; diff --git a/docs/src/assets/icons/footer-arrow.tsx b/docs/src/assets/icons/footer-arrow.tsx deleted file mode 100644 index 5fd5689f942..00000000000 --- a/docs/src/assets/icons/footer-arrow.tsx +++ /dev/null @@ -1,27 +0,0 @@ -import * as React from "react"; -import { SVGProps } from "react"; - -const FooterArrow = (props: SVGProps) => ( - - - - -); - -export default FooterArrow; diff --git a/docs/src/assets/icons/mobile-menu-arrow-back.tsx b/docs/src/assets/icons/mobile-menu-arrow-back.tsx deleted file mode 100644 index b0a0b8db1a4..00000000000 --- a/docs/src/assets/icons/mobile-menu-arrow-back.tsx +++ /dev/null @@ -1,17 +0,0 @@ -import * as React from "react"; -import { SVGProps } from "react"; - -const MobileMenuArrowBack = (props: SVGProps) => ( - - - - -); - -export default MobileMenuArrowBack; diff --git a/docs/src/assets/icons/mobile-menu-arrow-forward.tsx b/docs/src/assets/icons/mobile-menu-arrow-forward.tsx deleted file mode 100644 index 5a2b835991f..00000000000 --- a/docs/src/assets/icons/mobile-menu-arrow-forward.tsx +++ /dev/null @@ -1,11 +0,0 @@ -import * as React from "react"; -import { SVGProps } from "react"; - -const MobileMenuArrowForward = (props: SVGProps) => ( - - - - -); - -export default MobileMenuArrowForward; diff --git a/docs/src/assets/icons/theme-switcher-dark.svg b/docs/src/assets/icons/theme-switcher-dark.svg deleted file mode 100644 index 67e0d3449f0..00000000000 --- a/docs/src/assets/icons/theme-switcher-dark.svg +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/docs/src/assets/icons/theme-switcher.svg b/docs/src/assets/icons/theme-switcher.svg deleted file mode 100644 index 205b7b8b0c1..00000000000 --- a/docs/src/assets/icons/theme-switcher.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/src/assets/tools/ignition-dark.tsx b/docs/src/assets/tools/ignition-dark.tsx deleted file mode 100644 index 8ecaa87dd71..00000000000 --- a/docs/src/assets/tools/ignition-dark.tsx +++ /dev/null @@ -1,77 +0,0 @@ -import * as React from "react"; -import { SVGProps } from "react"; - -const IgnitionIconDark = (props: SVGProps) => ( - - - - - - - - - - - - - - - - - - - - - - - -); - -export default IgnitionIconDark; diff --git a/docs/src/assets/tools/ignition.tsx b/docs/src/assets/tools/ignition.tsx deleted file mode 100644 index d6ef6f5ebf2..00000000000 --- a/docs/src/assets/tools/ignition.tsx +++ /dev/null @@ -1,77 +0,0 @@ -import * as React from "react"; -import { SVGProps, memo } from "react"; - -const IgnitionIcon = (props: SVGProps) => ( - - - - - - - - - - - - - - - - - - - - - - - -); - -export default memo(IgnitionIcon); diff --git a/docs/src/assets/tools/index.ts b/docs/src/assets/tools/index.ts deleted file mode 100644 index 9e314cf054e..00000000000 --- a/docs/src/assets/tools/index.ts +++ /dev/null @@ -1,19 +0,0 @@ -import RunnerIcon from "./runner"; -import IgnitionIcon from "./ignition"; -import NetworkIcon from "./network"; -import SolidityIcon from "./solidity"; -import RunnerIconDark from "./runner-dark"; -import IgnitionIconDark from "./ignition-dark"; -import NetworkIconDark from "./network-dark"; - -const ToolsIcons = { - RunnerIcon, - IgnitionIcon, - NetworkIcon, - SolidityIcon, - RunnerIconDark, - IgnitionIconDark, - NetworkIconDark, -}; - -export default ToolsIcons; diff --git a/docs/src/assets/tools/network-dark.tsx b/docs/src/assets/tools/network-dark.tsx deleted file mode 100644 index 5e86d1f154d..00000000000 --- a/docs/src/assets/tools/network-dark.tsx +++ /dev/null @@ -1,148 +0,0 @@ -import * as React from "react"; -import { SVGProps } from "react"; - -const NetworkIconDark = (props: SVGProps) => ( - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -); - -export default NetworkIconDark; diff --git a/docs/src/assets/tools/network.tsx b/docs/src/assets/tools/network.tsx deleted file mode 100644 index e9f66729c13..00000000000 --- a/docs/src/assets/tools/network.tsx +++ /dev/null @@ -1,120 +0,0 @@ -import * as React from "react"; -import { SVGProps, memo } from "react"; - -const NetworkIcon = (props: SVGProps) => ( - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -); - -export default memo(NetworkIcon); diff --git a/docs/src/assets/tools/runner-dark.tsx b/docs/src/assets/tools/runner-dark.tsx deleted file mode 100644 index 461657cc754..00000000000 --- a/docs/src/assets/tools/runner-dark.tsx +++ /dev/null @@ -1,83 +0,0 @@ -import * as React from "react"; -import { SVGProps } from "react"; - -const RunnerIconDark = (props: SVGProps) => ( - - - - - - - - - - - - - - - - - - - - - - - - - - - -); - -export default RunnerIconDark; diff --git a/docs/src/assets/tools/runner.tsx b/docs/src/assets/tools/runner.tsx deleted file mode 100644 index baefee40b12..00000000000 --- a/docs/src/assets/tools/runner.tsx +++ /dev/null @@ -1,77 +0,0 @@ -import * as React from "react"; -import { SVGProps, memo } from "react"; - -const RunnerIcon = (props: SVGProps) => ( - - - - - - - - - - - - - - - - - - - - - - - - - -); - -export default memo(RunnerIcon); diff --git a/docs/src/assets/tools/solidity-dark.tsx b/docs/src/assets/tools/solidity-dark.tsx deleted file mode 100644 index bfc692fe229..00000000000 --- a/docs/src/assets/tools/solidity-dark.tsx +++ /dev/null @@ -1,138 +0,0 @@ -import * as React from "react"; -import { SVGProps } from "react"; - -const SolidityIconDark = (props: SVGProps) => ( - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -); - -export default SolidityIconDark; diff --git a/docs/src/assets/tools/solidity.tsx b/docs/src/assets/tools/solidity.tsx deleted file mode 100644 index 468a055af9e..00000000000 --- a/docs/src/assets/tools/solidity.tsx +++ /dev/null @@ -1,129 +0,0 @@ -import * as React from "react"; -import { SVGProps } from "react"; - -const SolidityIcon = (props: SVGProps) => ( - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -); - -export default SolidityIcon; diff --git a/docs/src/assets/trustedTeamsLogos/1inch.png b/docs/src/assets/trustedTeamsLogos/1inch.png deleted file mode 100644 index 49a90acbbf1..00000000000 Binary files a/docs/src/assets/trustedTeamsLogos/1inch.png and /dev/null differ diff --git a/docs/src/assets/trustedTeamsLogos/aave.png b/docs/src/assets/trustedTeamsLogos/aave.png deleted file mode 100644 index 0f4898f106a..00000000000 Binary files a/docs/src/assets/trustedTeamsLogos/aave.png and /dev/null differ diff --git a/docs/src/assets/trustedTeamsLogos/aragonOne.png b/docs/src/assets/trustedTeamsLogos/aragonOne.png deleted file mode 100644 index 9667db1320f..00000000000 Binary files a/docs/src/assets/trustedTeamsLogos/aragonOne.png and /dev/null differ diff --git a/docs/src/assets/trustedTeamsLogos/augur.png b/docs/src/assets/trustedTeamsLogos/augur.png deleted file mode 100644 index 95746d63403..00000000000 Binary files a/docs/src/assets/trustedTeamsLogos/augur.png and /dev/null differ diff --git a/docs/src/assets/trustedTeamsLogos/balancer.png b/docs/src/assets/trustedTeamsLogos/balancer.png deleted file mode 100644 index 496611b8e96..00000000000 Binary files a/docs/src/assets/trustedTeamsLogos/balancer.png and /dev/null differ diff --git a/docs/src/assets/trustedTeamsLogos/celer.png b/docs/src/assets/trustedTeamsLogos/celer.png deleted file mode 100644 index 546c50cf735..00000000000 Binary files a/docs/src/assets/trustedTeamsLogos/celer.png and /dev/null differ diff --git a/docs/src/assets/trustedTeamsLogos/celo.png b/docs/src/assets/trustedTeamsLogos/celo.png deleted file mode 100644 index e90aab53bc6..00000000000 Binary files a/docs/src/assets/trustedTeamsLogos/celo.png and /dev/null differ diff --git a/docs/src/assets/trustedTeamsLogos/chainlink.png b/docs/src/assets/trustedTeamsLogos/chainlink.png deleted file mode 100644 index 0f753145823..00000000000 Binary files a/docs/src/assets/trustedTeamsLogos/chainlink.png and /dev/null differ diff --git a/docs/src/assets/trustedTeamsLogos/connext.png b/docs/src/assets/trustedTeamsLogos/connext.png deleted file mode 100644 index e21e9465105..00000000000 Binary files a/docs/src/assets/trustedTeamsLogos/connext.png and /dev/null differ diff --git a/docs/src/assets/trustedTeamsLogos/dark/1inch-dark.png b/docs/src/assets/trustedTeamsLogos/dark/1inch-dark.png deleted file mode 100644 index 49a90acbbf1..00000000000 Binary files a/docs/src/assets/trustedTeamsLogos/dark/1inch-dark.png and /dev/null differ diff --git a/docs/src/assets/trustedTeamsLogos/dark/aave-dark.png b/docs/src/assets/trustedTeamsLogos/dark/aave-dark.png deleted file mode 100644 index 0f4898f106a..00000000000 Binary files a/docs/src/assets/trustedTeamsLogos/dark/aave-dark.png and /dev/null differ diff --git a/docs/src/assets/trustedTeamsLogos/dark/aragonOne-dark.png b/docs/src/assets/trustedTeamsLogos/dark/aragonOne-dark.png deleted file mode 100644 index 9667db1320f..00000000000 Binary files a/docs/src/assets/trustedTeamsLogos/dark/aragonOne-dark.png and /dev/null differ diff --git a/docs/src/assets/trustedTeamsLogos/dark/augur-dark.png b/docs/src/assets/trustedTeamsLogos/dark/augur-dark.png deleted file mode 100644 index 95746d63403..00000000000 Binary files a/docs/src/assets/trustedTeamsLogos/dark/augur-dark.png and /dev/null differ diff --git a/docs/src/assets/trustedTeamsLogos/dark/balancer-dark.png b/docs/src/assets/trustedTeamsLogos/dark/balancer-dark.png deleted file mode 100644 index 496611b8e96..00000000000 Binary files a/docs/src/assets/trustedTeamsLogos/dark/balancer-dark.png and /dev/null differ diff --git a/docs/src/assets/trustedTeamsLogos/dark/celer-dark.png b/docs/src/assets/trustedTeamsLogos/dark/celer-dark.png deleted file mode 100644 index 546c50cf735..00000000000 Binary files a/docs/src/assets/trustedTeamsLogos/dark/celer-dark.png and /dev/null differ diff --git a/docs/src/assets/trustedTeamsLogos/dark/celo-dark.png b/docs/src/assets/trustedTeamsLogos/dark/celo-dark.png deleted file mode 100644 index e90aab53bc6..00000000000 Binary files a/docs/src/assets/trustedTeamsLogos/dark/celo-dark.png and /dev/null differ diff --git a/docs/src/assets/trustedTeamsLogos/dark/chainlink-dark.png b/docs/src/assets/trustedTeamsLogos/dark/chainlink-dark.png deleted file mode 100644 index 0f753145823..00000000000 Binary files a/docs/src/assets/trustedTeamsLogos/dark/chainlink-dark.png and /dev/null differ diff --git a/docs/src/assets/trustedTeamsLogos/dark/connext-dark.png b/docs/src/assets/trustedTeamsLogos/dark/connext-dark.png deleted file mode 100644 index e21e9465105..00000000000 Binary files a/docs/src/assets/trustedTeamsLogos/dark/connext-dark.png and /dev/null differ diff --git a/docs/src/assets/trustedTeamsLogos/dark/decentraland-dark.png b/docs/src/assets/trustedTeamsLogos/dark/decentraland-dark.png deleted file mode 100644 index f1de5ccbdad..00000000000 Binary files a/docs/src/assets/trustedTeamsLogos/dark/decentraland-dark.png and /dev/null differ diff --git a/docs/src/assets/trustedTeamsLogos/dark/dharma-dark.png b/docs/src/assets/trustedTeamsLogos/dark/dharma-dark.png deleted file mode 100644 index e7f66884c7d..00000000000 Binary files a/docs/src/assets/trustedTeamsLogos/dark/dharma-dark.png and /dev/null differ diff --git a/docs/src/assets/trustedTeamsLogos/dark/ens-dark.png b/docs/src/assets/trustedTeamsLogos/dark/ens-dark.png deleted file mode 100644 index c94a828f812..00000000000 Binary files a/docs/src/assets/trustedTeamsLogos/dark/ens-dark.png and /dev/null differ diff --git a/docs/src/assets/trustedTeamsLogos/dark/gnosis-dark.png b/docs/src/assets/trustedTeamsLogos/dark/gnosis-dark.png deleted file mode 100644 index d798f682e6f..00000000000 Binary files a/docs/src/assets/trustedTeamsLogos/dark/gnosis-dark.png and /dev/null differ diff --git a/docs/src/assets/trustedTeamsLogos/dark/hegic-dark.png b/docs/src/assets/trustedTeamsLogos/dark/hegic-dark.png deleted file mode 100644 index cd83c2da513..00000000000 Binary files a/docs/src/assets/trustedTeamsLogos/dark/hegic-dark.png and /dev/null differ diff --git a/docs/src/assets/trustedTeamsLogos/dark/horizon-dark.png b/docs/src/assets/trustedTeamsLogos/dark/horizon-dark.png deleted file mode 100644 index 802084f8193..00000000000 Binary files a/docs/src/assets/trustedTeamsLogos/dark/horizon-dark.png and /dev/null differ diff --git a/docs/src/assets/trustedTeamsLogos/dark/instadapp-dark.png b/docs/src/assets/trustedTeamsLogos/dark/instadapp-dark.png deleted file mode 100644 index b9578d13343..00000000000 Binary files a/docs/src/assets/trustedTeamsLogos/dark/instadapp-dark.png and /dev/null differ diff --git a/docs/src/assets/trustedTeamsLogos/dark/kleros-dark.png b/docs/src/assets/trustedTeamsLogos/dark/kleros-dark.png deleted file mode 100644 index 9eef23717c1..00000000000 Binary files a/docs/src/assets/trustedTeamsLogos/dark/kleros-dark.png and /dev/null differ diff --git a/docs/src/assets/trustedTeamsLogos/dark/kyber-dark.png b/docs/src/assets/trustedTeamsLogos/dark/kyber-dark.png deleted file mode 100644 index 2d28e8108ec..00000000000 Binary files a/docs/src/assets/trustedTeamsLogos/dark/kyber-dark.png and /dev/null differ diff --git a/docs/src/assets/trustedTeamsLogos/dark/livepeer-dark.png b/docs/src/assets/trustedTeamsLogos/dark/livepeer-dark.png deleted file mode 100644 index ef44a64604f..00000000000 Binary files a/docs/src/assets/trustedTeamsLogos/dark/livepeer-dark.png and /dev/null differ diff --git a/docs/src/assets/trustedTeamsLogos/dark/lodestar-dark.png b/docs/src/assets/trustedTeamsLogos/dark/lodestar-dark.png deleted file mode 100644 index 9be21c1626f..00000000000 Binary files a/docs/src/assets/trustedTeamsLogos/dark/lodestar-dark.png and /dev/null differ diff --git a/docs/src/assets/trustedTeamsLogos/dark/loopring-dark.png b/docs/src/assets/trustedTeamsLogos/dark/loopring-dark.png deleted file mode 100644 index ac2834561d8..00000000000 Binary files a/docs/src/assets/trustedTeamsLogos/dark/loopring-dark.png and /dev/null differ diff --git a/docs/src/assets/trustedTeamsLogos/dark/mainframe-dark.png b/docs/src/assets/trustedTeamsLogos/dark/mainframe-dark.png deleted file mode 100644 index 24774411e8f..00000000000 Binary files a/docs/src/assets/trustedTeamsLogos/dark/mainframe-dark.png and /dev/null differ diff --git a/docs/src/assets/trustedTeamsLogos/dark/melon-dark.png b/docs/src/assets/trustedTeamsLogos/dark/melon-dark.png deleted file mode 100644 index 087dc82518b..00000000000 Binary files a/docs/src/assets/trustedTeamsLogos/dark/melon-dark.png and /dev/null differ diff --git a/docs/src/assets/trustedTeamsLogos/dark/molochdao-dark.png b/docs/src/assets/trustedTeamsLogos/dark/molochdao-dark.png deleted file mode 100644 index e1c5ae11551..00000000000 Binary files a/docs/src/assets/trustedTeamsLogos/dark/molochdao-dark.png and /dev/null differ diff --git a/docs/src/assets/trustedTeamsLogos/dark/mstable-dark.png b/docs/src/assets/trustedTeamsLogos/dark/mstable-dark.png deleted file mode 100644 index 8096265b87f..00000000000 Binary files a/docs/src/assets/trustedTeamsLogos/dark/mstable-dark.png and /dev/null differ diff --git a/docs/src/assets/trustedTeamsLogos/dark/mycrypto-dark.png b/docs/src/assets/trustedTeamsLogos/dark/mycrypto-dark.png deleted file mode 100644 index 16d00e4b46e..00000000000 Binary files a/docs/src/assets/trustedTeamsLogos/dark/mycrypto-dark.png and /dev/null differ diff --git a/docs/src/assets/trustedTeamsLogos/dark/openGSN-dark.png b/docs/src/assets/trustedTeamsLogos/dark/openGSN-dark.png deleted file mode 100644 index 2747ff68eba..00000000000 Binary files a/docs/src/assets/trustedTeamsLogos/dark/openGSN-dark.png and /dev/null differ diff --git a/docs/src/assets/trustedTeamsLogos/dark/openzeppelin-dark.png b/docs/src/assets/trustedTeamsLogos/dark/openzeppelin-dark.png deleted file mode 100644 index 4722d6d035e..00000000000 Binary files a/docs/src/assets/trustedTeamsLogos/dark/openzeppelin-dark.png and /dev/null differ diff --git a/docs/src/assets/trustedTeamsLogos/dark/optimism-dark.png b/docs/src/assets/trustedTeamsLogos/dark/optimism-dark.png deleted file mode 100644 index 50d332f6ae7..00000000000 Binary files a/docs/src/assets/trustedTeamsLogos/dark/optimism-dark.png and /dev/null differ diff --git a/docs/src/assets/trustedTeamsLogos/dark/opyn-dark.png b/docs/src/assets/trustedTeamsLogos/dark/opyn-dark.png deleted file mode 100644 index 6607c22d8db..00000000000 Binary files a/docs/src/assets/trustedTeamsLogos/dark/opyn-dark.png and /dev/null differ diff --git a/docs/src/assets/trustedTeamsLogos/dark/pieDAO-dark.png b/docs/src/assets/trustedTeamsLogos/dark/pieDAO-dark.png deleted file mode 100644 index 6828cd13cd4..00000000000 Binary files a/docs/src/assets/trustedTeamsLogos/dark/pieDAO-dark.png and /dev/null differ diff --git a/docs/src/assets/trustedTeamsLogos/dark/poap-dark.png b/docs/src/assets/trustedTeamsLogos/dark/poap-dark.png deleted file mode 100644 index d908dbed0f3..00000000000 Binary files a/docs/src/assets/trustedTeamsLogos/dark/poap-dark.png and /dev/null differ diff --git a/docs/src/assets/trustedTeamsLogos/dark/pool-dark.png b/docs/src/assets/trustedTeamsLogos/dark/pool-dark.png deleted file mode 100644 index 210cca6d830..00000000000 Binary files a/docs/src/assets/trustedTeamsLogos/dark/pool-dark.png and /dev/null differ diff --git a/docs/src/assets/trustedTeamsLogos/dark/reflexer-dark.png b/docs/src/assets/trustedTeamsLogos/dark/reflexer-dark.png deleted file mode 100644 index 2a01d8819cc..00000000000 Binary files a/docs/src/assets/trustedTeamsLogos/dark/reflexer-dark.png and /dev/null differ diff --git a/docs/src/assets/trustedTeamsLogos/dark/set-dark.png b/docs/src/assets/trustedTeamsLogos/dark/set-dark.png deleted file mode 100644 index db757652c70..00000000000 Binary files a/docs/src/assets/trustedTeamsLogos/dark/set-dark.png and /dev/null differ diff --git a/docs/src/assets/trustedTeamsLogos/dark/skale-dark.png b/docs/src/assets/trustedTeamsLogos/dark/skale-dark.png deleted file mode 100644 index b94c9d3db17..00000000000 Binary files a/docs/src/assets/trustedTeamsLogos/dark/skale-dark.png and /dev/null differ diff --git a/docs/src/assets/trustedTeamsLogos/dark/status-dark.png b/docs/src/assets/trustedTeamsLogos/dark/status-dark.png deleted file mode 100644 index e530e495bda..00000000000 Binary files a/docs/src/assets/trustedTeamsLogos/dark/status-dark.png and /dev/null differ diff --git a/docs/src/assets/trustedTeamsLogos/dark/sushiswap-dark.png b/docs/src/assets/trustedTeamsLogos/dark/sushiswap-dark.png deleted file mode 100644 index b91f3b44ab8..00000000000 Binary files a/docs/src/assets/trustedTeamsLogos/dark/sushiswap-dark.png and /dev/null differ diff --git a/docs/src/assets/trustedTeamsLogos/dark/synthetix-dark.png b/docs/src/assets/trustedTeamsLogos/dark/synthetix-dark.png deleted file mode 100644 index 6aa21e66f32..00000000000 Binary files a/docs/src/assets/trustedTeamsLogos/dark/synthetix-dark.png and /dev/null differ diff --git a/docs/src/assets/trustedTeamsLogos/dark/uma-dark.png b/docs/src/assets/trustedTeamsLogos/dark/uma-dark.png deleted file mode 100644 index 97dee74c972..00000000000 Binary files a/docs/src/assets/trustedTeamsLogos/dark/uma-dark.png and /dev/null differ diff --git a/docs/src/assets/trustedTeamsLogos/dark/uniswap-dark.png b/docs/src/assets/trustedTeamsLogos/dark/uniswap-dark.png deleted file mode 100644 index 4371ecec15a..00000000000 Binary files a/docs/src/assets/trustedTeamsLogos/dark/uniswap-dark.png and /dev/null differ diff --git a/docs/src/assets/trustedTeamsLogos/dark/unlock-dark.png b/docs/src/assets/trustedTeamsLogos/dark/unlock-dark.png deleted file mode 100644 index 7220b93acee..00000000000 Binary files a/docs/src/assets/trustedTeamsLogos/dark/unlock-dark.png and /dev/null differ diff --git a/docs/src/assets/trustedTeamsLogos/dark/yearn-dark.png b/docs/src/assets/trustedTeamsLogos/dark/yearn-dark.png deleted file mode 100644 index df580de62a7..00000000000 Binary files a/docs/src/assets/trustedTeamsLogos/dark/yearn-dark.png and /dev/null differ diff --git a/docs/src/assets/trustedTeamsLogos/dark/zksync-dark.png b/docs/src/assets/trustedTeamsLogos/dark/zksync-dark.png deleted file mode 100644 index c8697d5566d..00000000000 Binary files a/docs/src/assets/trustedTeamsLogos/dark/zksync-dark.png and /dev/null differ diff --git a/docs/src/assets/trustedTeamsLogos/decentraland.png b/docs/src/assets/trustedTeamsLogos/decentraland.png deleted file mode 100644 index f1de5ccbdad..00000000000 Binary files a/docs/src/assets/trustedTeamsLogos/decentraland.png and /dev/null differ diff --git a/docs/src/assets/trustedTeamsLogos/dharma.png b/docs/src/assets/trustedTeamsLogos/dharma.png deleted file mode 100644 index e7f66884c7d..00000000000 Binary files a/docs/src/assets/trustedTeamsLogos/dharma.png and /dev/null differ diff --git a/docs/src/assets/trustedTeamsLogos/ens.png b/docs/src/assets/trustedTeamsLogos/ens.png deleted file mode 100644 index c94a828f812..00000000000 Binary files a/docs/src/assets/trustedTeamsLogos/ens.png and /dev/null differ diff --git a/docs/src/assets/trustedTeamsLogos/gnosis.png b/docs/src/assets/trustedTeamsLogos/gnosis.png deleted file mode 100644 index d798f682e6f..00000000000 Binary files a/docs/src/assets/trustedTeamsLogos/gnosis.png and /dev/null differ diff --git a/docs/src/assets/trustedTeamsLogos/hegic.png b/docs/src/assets/trustedTeamsLogos/hegic.png deleted file mode 100644 index cd83c2da513..00000000000 Binary files a/docs/src/assets/trustedTeamsLogos/hegic.png and /dev/null differ diff --git a/docs/src/assets/trustedTeamsLogos/horizon.png b/docs/src/assets/trustedTeamsLogos/horizon.png deleted file mode 100644 index 802084f8193..00000000000 Binary files a/docs/src/assets/trustedTeamsLogos/horizon.png and /dev/null differ diff --git a/docs/src/assets/trustedTeamsLogos/instadapp.png b/docs/src/assets/trustedTeamsLogos/instadapp.png deleted file mode 100644 index b9578d13343..00000000000 Binary files a/docs/src/assets/trustedTeamsLogos/instadapp.png and /dev/null differ diff --git a/docs/src/assets/trustedTeamsLogos/kleros.png b/docs/src/assets/trustedTeamsLogos/kleros.png deleted file mode 100644 index 9eef23717c1..00000000000 Binary files a/docs/src/assets/trustedTeamsLogos/kleros.png and /dev/null differ diff --git a/docs/src/assets/trustedTeamsLogos/kyber.png b/docs/src/assets/trustedTeamsLogos/kyber.png deleted file mode 100644 index 2d28e8108ec..00000000000 Binary files a/docs/src/assets/trustedTeamsLogos/kyber.png and /dev/null differ diff --git a/docs/src/assets/trustedTeamsLogos/livepeer.png b/docs/src/assets/trustedTeamsLogos/livepeer.png deleted file mode 100644 index ef44a64604f..00000000000 Binary files a/docs/src/assets/trustedTeamsLogos/livepeer.png and /dev/null differ diff --git a/docs/src/assets/trustedTeamsLogos/lodestar.png b/docs/src/assets/trustedTeamsLogos/lodestar.png deleted file mode 100644 index 9be21c1626f..00000000000 Binary files a/docs/src/assets/trustedTeamsLogos/lodestar.png and /dev/null differ diff --git a/docs/src/assets/trustedTeamsLogos/logos.ts b/docs/src/assets/trustedTeamsLogos/logos.ts deleted file mode 100644 index 02750757133..00000000000 --- a/docs/src/assets/trustedTeamsLogos/logos.ts +++ /dev/null @@ -1,342 +0,0 @@ -/* eslint global-require: "off" */ - -export const TrustedTeamsLogos = [ - { - img: require("./lodestar.png"), - alt: "Lodestar company logo", - }, - { - img: require("./connext.png"), - alt: "Connext company logo", - }, - { img: require("./set.png"), alt: "Set company logo" }, - { - img: require("./opyn.png"), - alt: "Opyn company logo", - }, - { - img: require("./balancer.png"), - alt: "Balancer company logo", - }, - { - img: require("./molochdao.png"), - alt: "Molochdao company logo", - }, - { - img: require("./kyber.png"), - alt: "Kyber company logo", - }, - { - img: require("./openzeppelin.png"), - alt: "Openzepellin company logo", - }, - { - img: require("./pieDAO.png"), - alt: "PieDAO company logo", - }, - { - img: require("./optimism.png"), - alt: "Optimism company logo", - }, - { - img: require("./decentraland.png"), - alt: "Decentraland company logo", - }, - { - img: require("./aragonOne.png"), - alt: "ARAGON ONE company logo", - }, - { - img: require("./kleros.png"), - alt: "Kleros company logo", - }, - { - img: require("./mstable.png"), - alt: "M STABLE company logo", - }, - { - img: require("./celo.png"), - alt: "Celo company logo", - }, - { - img: require("./mycrypto.png"), - alt: "MyCrypto company logo", - }, - { - img: require("./poap.png"), - alt: "Poap company logo", - }, - { - img: require("./melon.png"), - alt: "Melon company logo", - }, - { - img: require("./openGSN.png"), - alt: "OpenGSN company logo", - }, - { - img: require("./unlock.png"), - alt: "Unlock company logo", - }, - { - img: require("./status.png"), - alt: "Status company logo", - }, - { - img: require("./pool.png"), - alt: "Pool company logo", - }, - { - img: require("./instadapp.png"), - alt: "Instadapp company logo", - }, - { - img: require("./mainframe.png"), - alt: "Mainframe company logo", - }, - { - img: require("./horizon.png"), - alt: "Horizon company logo", - }, - { - img: require("./aave.png"), - alt: "Aave company logo", - }, - { - img: require("./skale.png"), - alt: "Skale company logo", - }, - { - img: require("./synthetix.png"), - alt: "Synthetix company logo", - }, - { - img: require("./celer.png"), - alt: "Celer company logo", - }, - { img: require("./uma.png"), alt: "Uma company logo" }, - { - img: require("./chainlink.png"), - alt: "Chainlink company logo", - }, - { - img: require("./gnosis.png"), - alt: "Gnosis company logo", - }, - { - img: require("./sushiswap.png"), - alt: "Sushiswap company logo", - }, - { img: require("./ens.png"), alt: "ENS company logo" }, - { - img: require("./yearn.png"), - alt: "Yearn company logo", - }, - { - img: require("./reflexer.png"), - alt: "Reflexer company logo", - }, - { - img: require("./dharma.png"), - alt: "Dharma company logo", - }, - { - img: require("./1inch.png"), - alt: "1inch company logo", - }, - { - img: require("./uniswap.png"), - alt: "Uniswap company logo", - }, - { - img: require("./hegic.png"), - alt: "Hegic company logo", - }, - { - img: require("./augur.png"), - alt: "Augur company logo", - }, - { - img: require("./zksync.png"), - alt: "zkSync company logo", - }, - { - img: require("./livepeer.png"), - alt: "Livepeer company logo", - }, - { - img: require("./loopring.png"), - alt: "Loopring company logo", - }, -]; - -// TODO-LANDING-DARK: Replace images below with correct dark themed images. -export const TrustedTeamsLogosDark = [ - { - img: require("./dark/lodestar-dark.png"), - alt: "Lodestar company logo", - }, - { - img: require("./dark/connext-dark.png"), - alt: "Connext company logo", - }, - { img: require("./dark/set-dark.png"), alt: "Set company logo" }, - { - img: require("./dark/opyn-dark.png"), - alt: "Opyn company logo", - }, - { - img: require("./dark/balancer-dark.png"), - alt: "Balancer company logo", - }, - { - img: require("./dark/molochdao-dark.png"), - alt: "Molochdao company logo", - }, - { - img: require("./dark/kyber-dark.png"), - alt: "Kyber company logo", - }, - { - img: require("./dark/openzeppelin-dark.png"), - alt: "Openzepellin company logo", - }, - { - img: require("./dark/pieDAO-dark.png"), - alt: "PieDAO company logo", - }, - { - img: require("./dark/optimism-dark.png"), - alt: "Optimism company logo", - }, - { - img: require("./dark/decentraland-dark.png"), - alt: "Decentraland company logo", - }, - { - img: require("./dark/aragonOne-dark.png"), - alt: "ARAGON ONE company logo", - }, - { - img: require("./dark/kleros-dark.png"), - alt: "Kleros company logo", - }, - { - img: require("./dark/mstable-dark.png"), - alt: "M STABLE company logo", - }, - { - img: require("./dark/celo-dark.png"), - alt: "Celo company logo", - }, - { - img: require("./dark/mycrypto-dark.png"), - alt: "MyCrypto company logo", - }, - { - img: require("./dark/poap-dark.png"), - alt: "Poap company logo", - }, - { - img: require("./dark/melon-dark.png"), - alt: "Melon company logo", - }, - { - img: require("./dark/openGSN-dark.png"), - alt: "OpenGSN company logo", - }, - { - img: require("./dark/unlock-dark.png"), - alt: "Unlock company logo", - }, - { - img: require("./dark/status-dark.png"), - alt: "Status company logo", - }, - { - img: require("./dark/pool-dark.png"), - alt: "Pool company logo", - }, - { - img: require("./dark/instadapp-dark.png"), - alt: "Instadapp company logo", - }, - { - img: require("./dark/mainframe-dark.png"), - alt: "Mainframe company logo", - }, - { - img: require("./dark/horizon-dark.png"), - alt: "Horizon company logo", - }, - { - img: require("./dark/aave-dark.png"), - alt: "Aave company logo", - }, - { - img: require("./dark/skale-dark.png"), - alt: "Skale company logo", - }, - { - img: require("./dark/synthetix-dark.png"), - alt: "Synthetix company logo", - }, - { - img: require("./dark/celer-dark.png"), - alt: "Celer company logo", - }, - { img: require("./dark/uma-dark.png"), alt: "Uma company logo" }, - { - img: require("./dark/chainlink-dark.png"), - alt: "Chainlink company logo", - }, - { - img: require("./dark/gnosis-dark.png"), - alt: "Gnosis company logo", - }, - { - img: require("./dark/sushiswap-dark.png"), - alt: "Sushiswap company logo", - }, - { img: require("./dark/ens-dark.png"), alt: "ENS company logo" }, - { - img: require("./dark/yearn-dark.png"), - alt: "Yearn company logo", - }, - { - img: require("./dark/reflexer-dark.png"), - alt: "Reflexer company logo", - }, - { - img: require("./dark/dharma-dark.png"), - alt: "Dharma company logo", - }, - { - img: require("./dark/1inch-dark.png"), - alt: "1inch company logo", - }, - { - img: require("./dark/uniswap-dark.png"), - alt: "Uniswap company logo", - }, - { - img: require("./dark/hegic-dark.png"), - alt: "Hegic company logo", - }, - { - img: require("./dark/augur-dark.png"), - alt: "Augur company logo", - }, - { - img: require("./dark/zksync-dark.png"), - alt: "zkSync company logo", - }, - { - img: require("./dark/livepeer-dark.png"), - alt: "Livepeer company logo", - }, - { - img: require("./dark/loopring-dark.png"), - alt: "Loopring company logo", - }, -]; diff --git a/docs/src/assets/trustedTeamsLogos/loopring.png b/docs/src/assets/trustedTeamsLogos/loopring.png deleted file mode 100644 index ac2834561d8..00000000000 Binary files a/docs/src/assets/trustedTeamsLogos/loopring.png and /dev/null differ diff --git a/docs/src/assets/trustedTeamsLogos/mainframe.png b/docs/src/assets/trustedTeamsLogos/mainframe.png deleted file mode 100644 index 24774411e8f..00000000000 Binary files a/docs/src/assets/trustedTeamsLogos/mainframe.png and /dev/null differ diff --git a/docs/src/assets/trustedTeamsLogos/melon.png b/docs/src/assets/trustedTeamsLogos/melon.png deleted file mode 100644 index 087dc82518b..00000000000 Binary files a/docs/src/assets/trustedTeamsLogos/melon.png and /dev/null differ diff --git a/docs/src/assets/trustedTeamsLogos/molochdao.png b/docs/src/assets/trustedTeamsLogos/molochdao.png deleted file mode 100644 index e1c5ae11551..00000000000 Binary files a/docs/src/assets/trustedTeamsLogos/molochdao.png and /dev/null differ diff --git a/docs/src/assets/trustedTeamsLogos/mstable.png b/docs/src/assets/trustedTeamsLogos/mstable.png deleted file mode 100644 index 8096265b87f..00000000000 Binary files a/docs/src/assets/trustedTeamsLogos/mstable.png and /dev/null differ diff --git a/docs/src/assets/trustedTeamsLogos/mycrypto.png b/docs/src/assets/trustedTeamsLogos/mycrypto.png deleted file mode 100644 index 16d00e4b46e..00000000000 Binary files a/docs/src/assets/trustedTeamsLogos/mycrypto.png and /dev/null differ diff --git a/docs/src/assets/trustedTeamsLogos/openGSN.png b/docs/src/assets/trustedTeamsLogos/openGSN.png deleted file mode 100644 index 2747ff68eba..00000000000 Binary files a/docs/src/assets/trustedTeamsLogos/openGSN.png and /dev/null differ diff --git a/docs/src/assets/trustedTeamsLogos/openzeppelin.png b/docs/src/assets/trustedTeamsLogos/openzeppelin.png deleted file mode 100644 index 4722d6d035e..00000000000 Binary files a/docs/src/assets/trustedTeamsLogos/openzeppelin.png and /dev/null differ diff --git a/docs/src/assets/trustedTeamsLogos/optimism.png b/docs/src/assets/trustedTeamsLogos/optimism.png deleted file mode 100644 index 50d332f6ae7..00000000000 Binary files a/docs/src/assets/trustedTeamsLogos/optimism.png and /dev/null differ diff --git a/docs/src/assets/trustedTeamsLogos/opyn.png b/docs/src/assets/trustedTeamsLogos/opyn.png deleted file mode 100644 index 6607c22d8db..00000000000 Binary files a/docs/src/assets/trustedTeamsLogos/opyn.png and /dev/null differ diff --git a/docs/src/assets/trustedTeamsLogos/pieDAO.png b/docs/src/assets/trustedTeamsLogos/pieDAO.png deleted file mode 100644 index 6828cd13cd4..00000000000 Binary files a/docs/src/assets/trustedTeamsLogos/pieDAO.png and /dev/null differ diff --git a/docs/src/assets/trustedTeamsLogos/poap.png b/docs/src/assets/trustedTeamsLogos/poap.png deleted file mode 100644 index d908dbed0f3..00000000000 Binary files a/docs/src/assets/trustedTeamsLogos/poap.png and /dev/null differ diff --git a/docs/src/assets/trustedTeamsLogos/pool.png b/docs/src/assets/trustedTeamsLogos/pool.png deleted file mode 100644 index 210cca6d830..00000000000 Binary files a/docs/src/assets/trustedTeamsLogos/pool.png and /dev/null differ diff --git a/docs/src/assets/trustedTeamsLogos/reflexer.png b/docs/src/assets/trustedTeamsLogos/reflexer.png deleted file mode 100644 index 2a01d8819cc..00000000000 Binary files a/docs/src/assets/trustedTeamsLogos/reflexer.png and /dev/null differ diff --git a/docs/src/assets/trustedTeamsLogos/set.png b/docs/src/assets/trustedTeamsLogos/set.png deleted file mode 100644 index db757652c70..00000000000 Binary files a/docs/src/assets/trustedTeamsLogos/set.png and /dev/null differ diff --git a/docs/src/assets/trustedTeamsLogos/skale.png b/docs/src/assets/trustedTeamsLogos/skale.png deleted file mode 100644 index b94c9d3db17..00000000000 Binary files a/docs/src/assets/trustedTeamsLogos/skale.png and /dev/null differ diff --git a/docs/src/assets/trustedTeamsLogos/status.png b/docs/src/assets/trustedTeamsLogos/status.png deleted file mode 100644 index e530e495bda..00000000000 Binary files a/docs/src/assets/trustedTeamsLogos/status.png and /dev/null differ diff --git a/docs/src/assets/trustedTeamsLogos/sushiswap.png b/docs/src/assets/trustedTeamsLogos/sushiswap.png deleted file mode 100644 index b91f3b44ab8..00000000000 Binary files a/docs/src/assets/trustedTeamsLogos/sushiswap.png and /dev/null differ diff --git a/docs/src/assets/trustedTeamsLogos/synthetix.png b/docs/src/assets/trustedTeamsLogos/synthetix.png deleted file mode 100644 index 6aa21e66f32..00000000000 Binary files a/docs/src/assets/trustedTeamsLogos/synthetix.png and /dev/null differ diff --git a/docs/src/assets/trustedTeamsLogos/uma.png b/docs/src/assets/trustedTeamsLogos/uma.png deleted file mode 100644 index 97dee74c972..00000000000 Binary files a/docs/src/assets/trustedTeamsLogos/uma.png and /dev/null differ diff --git a/docs/src/assets/trustedTeamsLogos/uniswap.png b/docs/src/assets/trustedTeamsLogos/uniswap.png deleted file mode 100644 index 4371ecec15a..00000000000 Binary files a/docs/src/assets/trustedTeamsLogos/uniswap.png and /dev/null differ diff --git a/docs/src/assets/trustedTeamsLogos/unlock.png b/docs/src/assets/trustedTeamsLogos/unlock.png deleted file mode 100644 index 7220b93acee..00000000000 Binary files a/docs/src/assets/trustedTeamsLogos/unlock.png and /dev/null differ diff --git a/docs/src/assets/trustedTeamsLogos/yearn.png b/docs/src/assets/trustedTeamsLogos/yearn.png deleted file mode 100644 index df580de62a7..00000000000 Binary files a/docs/src/assets/trustedTeamsLogos/yearn.png and /dev/null differ diff --git a/docs/src/assets/trustedTeamsLogos/zksync.png b/docs/src/assets/trustedTeamsLogos/zksync.png deleted file mode 100644 index c8697d5566d..00000000000 Binary files a/docs/src/assets/trustedTeamsLogos/zksync.png and /dev/null differ diff --git a/docs/src/assets/vibrantCommunityImage.svg b/docs/src/assets/vibrantCommunityImage.svg deleted file mode 100644 index b3081809de4..00000000000 --- a/docs/src/assets/vibrantCommunityImage.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/src/assets/vibrantCommunityImageDark.svg b/docs/src/assets/vibrantCommunityImageDark.svg deleted file mode 100644 index f60c58fff09..00000000000 --- a/docs/src/assets/vibrantCommunityImageDark.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/src/components/CookiePopUp.stories.tsx b/docs/src/components/CookiePopUp.stories.tsx deleted file mode 100644 index 87e86bf50a1..00000000000 --- a/docs/src/components/CookiePopUp.stories.tsx +++ /dev/null @@ -1,12 +0,0 @@ -import React from "react"; - -import CookiePopUp from "./CookiePopUp"; -import { GDPR } from "../config"; - -export default { - title: "Common/Cookies", -}; - -export const Cookie = () => ( - null} onReject={() => null} /> -); diff --git a/docs/src/components/CookiePopUp.tsx b/docs/src/components/CookiePopUp.tsx deleted file mode 100644 index 1c8f812dad0..00000000000 --- a/docs/src/components/CookiePopUp.tsx +++ /dev/null @@ -1,159 +0,0 @@ -import React from "react"; -import { styled } from "linaria/react"; -import { media, tm, tmDark, tmSelectors } from "../themes"; -import CTA from "./ui/CTA"; - -const Container = styled.section` - z-index: 100; - position: fixed; - bottom: 24px; - right: 0px; - width: auto; - padding: 16px 20px; - border-radius: 4px; - margin: 0px 24px; - background-color: ${tm(({ colors }) => colors.cookiePopUpBackground)}; - box-shadow: 0px 6px 50px ${tm(({ colors }) => colors.cookieShadow)}; - filter: drop-shadow( - 0px 6px 50px ${tm(({ colors }) => colors.cookieDropShadow)} - ); - display: flex; - flex-direction: column; - max-width: 332px; - ${media.md} { - width: 332spx; - margin: 0px 24px; - left: unset; - } - ${tmSelectors.dark} { - background-color: ${tmDark(({ colors }) => colors.cookiePopUpBackground)}; - } - ${media.mqDark} { - ${tmSelectors.auto} { - background-color: ${tmDark(({ colors }) => colors.cookiePopUpBackground)}; - } - } -`; - -const Title = styled.h3` - font-weight: 400; - font-size: 12px; - line-height: 24px; - letter-spacing: 0.2em; - text-transform: uppercase; - color: ${tm(({ colors }) => colors.neutral900)}; - mix-blend-mode: normal; - ${tmSelectors.dark} { - color: ${tmDark(({ colors }) => colors.neutral900)}; - } - - ${media.mqDark} { - ${tmSelectors.auto} { - color: ${tmDark(({ colors }) => colors.neutral900)}; - } - } -`; - -const Text = styled.p` - font-family: ChivoLight, sans-serif; - margin-top: 16px; - font-weight: 400; - font-size: 12px; - line-height: 140%; - color: ${tm(({ colors }) => colors.cookieTextColor)}; - - ${tmSelectors.dark} { - color: ${tmDark(({ colors }) => colors.cookieTextColor)}; - } - - ${media.mqDark} { - ${tmSelectors.auto} { - color: ${tmDark(({ colors }) => colors.cookieTextColor)}; - } - } -`; - -const ButtonsContainer = styled.div` - display: flex; - margin-top: 16px; - - & .secondary { - ${tmSelectors.dark} { - color: ${tmDark(({ colors }) => colors.cookieTextColor)}; - } - - ${media.mqDark} { - ${tmSelectors.auto} { - color: ${tmDark(({ colors }) => colors.cookieTextColor)}; - } - } - } -`; - -const CTAWrapper = styled.div` - & > button { - font-size: 10px; - padding: 10px 12px; - height: 32px; - } - &:first-child { - margin-right: 16px; - } -`; - -const ReadMoreLink = styled.a` - font-family: ChivoRegular, sans-serif; - color: ${tm(({ colors }) => colors.neutral900)}; - font-weight: 800; - margin-left: 6px; - cursor: pointer; - &:hover { - opacity: 0.8; - } - ${tmSelectors.dark} { - color: ${tmDark(({ colors }) => colors.neutral900)}; - } - ${media.mqDark} { - ${tmSelectors.auto} { - color: ${tmDark(({ colors }) => colors.neutral900)}; - } - } -`; - -interface Props { - title: string; - text: string; - readMoreHref: string; - onAccept: () => void; - onReject: () => void; -} - -const CookiePopUp = ({ - title, - text, - readMoreHref, - onAccept, - onReject, -}: Props) => { - return ( - - {title} - - {text} - Read More - - - - - Reject all - - - - Accept all - - - - ); -}; - -export default CookiePopUp; diff --git a/docs/src/components/DesktopAnimation.tsx b/docs/src/components/DesktopAnimation.tsx deleted file mode 100644 index 4539e0ea7f5..00000000000 --- a/docs/src/components/DesktopAnimation.tsx +++ /dev/null @@ -1,252 +0,0 @@ -import React from "react"; -import Image from "next/image"; -import { styled } from "linaria/react"; - -import heroBackTextureReflect from "../assets/animation/desktop/hero-back_texture_reflect.svg"; -import heroBackTexture from "../assets/animation/desktop/hero-back_texture.svg"; -import heroBackTextureDark from "../assets/animation/desktop/hero-back_texture-dark.svg"; -import mascotsEthereumLogo from "../assets/animation/desktop/mascots-ethereum_logo.svg"; -import mascotsEthereumLogoDark from "../assets/animation/desktop/mascots-ethereum_logo-dark.svg"; -import heHead from "../assets/animation/desktop/he-head.svg"; -import sheHead from "../assets/animation/desktop/she-head.svg"; -import heEyesOpen from "../assets/animation/desktop/he-eyes_open.svg"; -import sheEyesOpen from "../assets/animation/desktop/she-eyes_open.svg"; -import shadow from "../assets/animation/desktop/shadow.svg"; -import shadowDark from "../assets/animation/desktop/shadow-dark.svg"; -import { media, tmSelectors } from "../themes"; - -const AnimationContainer = styled.section` - display: none; - width: 580px; - height: 685px; - position: absolute; - ${media.md} { - display: block; - left: -72px; - } - ${media.lg} { - left: 0px; - } - - & > .bounce { - background-color: transparent; - height: 100%; - width: 100%; - & > span { - position: absolute; - } - animation: bounce 8s linear infinite; - } - - & > span { - position: absolute; - z-index: 1; - } - & .back-texture { - z-index: 0; - top: -100px; - left: 50px; - } - - & .back-reflect { - z-index: 0; - ${tmSelectors.dark} { - display: none; - } - ${media.mqDark} { - ${tmSelectors.auto} { - display: none; - } - } - } - - & .mascots-ethereum-logo { - top: 0; - left: 120px; - } - & .he-head { - top: 130px; - left: 293px; - animation: headShake 8s linear infinite; - animation-delay: 1s; - } - & .he-eyes { - top: 240px; - left: 330px; - animation: blink 8s linear infinite; - animation-delay: 1s; - } - & .she-head { - top: 134px; - left: 145.5px; - animation: headShake 8s linear infinite; - } - & .she-eyes { - top: 243px; - left: 198px; - animation: blink 8s linear infinite; - } - & .shadow { - bottom: 30px; - left: 220px; - animation: shadowSpread 8s linear infinite; - z-index: 0; - ${tmSelectors.dark} { - fill: "#111316"; - } - ${media.mqDark} { - ${tmSelectors.auto} { - fill: "#111316"; - } - } - } - @keyframes bounce { - 0% { - transform: translateY(0); - } - 50% { - transform: translateY(40px); - } - 100% { - transform: translateY(0); - } - } - - @keyframes shadowSpread { - 0% { - transform: none; - } - 50% { - transform: scaleX(1.6); - } - 100% { - transform: none; - } - } - - @keyframes blink { - 0% { - transform: none; - } - 39% { - transform: none; - } - 40% { - transform: matrix(1, 0, 0, 0.2, 0, 0); - } - 41% { - transform: none; - } - 100% { - transform: none; - } - } - - @keyframes headShake { - 0% { - transform: none; - } - 39% { - transform: none; - } - 40% { - transform: translateY(2px); - } - 41% { - transform: none; - } - 100% { - transform: none; - } - } - & .light { - display: inline; - } - & .dark { - display: none; - } - ${tmSelectors.dark} { - & .light { - display: none; - } - & .dark { - display: inline; - } - } - ${media.mqDark} { - ${tmSelectors.auto} { - & .light { - display: none; - } - & .dark { - display: inline; - } - } - } -`; - -const DesktopAnimation = () => { - return ( - - - back reflect - - - - back texture - - - back texture dark - - -
- - - mascots ethereum logo - - - mascots ethereum logo dark - - - - he-head - - - he-eyes - - - - she-head - - - she-eyes - -
- - - shadow - - - shadow-dark - - -
- ); -}; - -export default DesktopAnimation; diff --git a/docs/src/components/DocsNavigation.tsx b/docs/src/components/DocsNavigation.tsx deleted file mode 100644 index 262e83a1e16..00000000000 --- a/docs/src/components/DocsNavigation.tsx +++ /dev/null @@ -1,129 +0,0 @@ -import React, { FC, useContext } from "react"; -import { styled } from "linaria/react"; -import Link from "next/link"; -import Image from "next/image"; - -import { media, ThemeContext, tm, tmDark, tmSelectors } from "../themes"; -import logo from "../assets/hardhat-logo.svg"; -import darkLogo from "../assets/hardhat-logo-dark.svg"; -import Hamburger from "./ui/Hamburger"; -import DesktopMenu from "./ui/DesktopMenu"; -import { menuItemsList, socialsItems } from "../config"; -import ThemeSwitchButton from "./ThemeSwitchButton"; - -interface Props { - isSidebarOpen: boolean; - onSidebarOpen: React.Dispatch>; -} - -const NavigationStyled = styled.nav` - position: relative; - width: 100%; - display: flex; - justify-content: center; - align-items: center; - height: 96px; - box-sizing: border-box; - padding: 32px 24px; - transition: all ease-in-out 0.25s; - background-color: ${tm(({ colors }) => colors.neutral0)}; - z-index: 10; - ${media.md} { - padding: 24px; - } - - ${tmSelectors.dark} { - background-color: ${tmDark(({ colors }) => colors.neutral0)}; - } - ${media.mqDark} { - ${tmSelectors.auto} { - background-color: ${tmDark(({ colors }) => colors.neutral0)}; - } - } -`; - -const ControlsContainer = styled.section` - width: 100%; - height: 96px; - display: flex; - justify-content: space-between; - align-items: center; - background-color: ${tm(({ colors }) => colors.transparent)}; - box-sizing: border-box; -`; - -const LogoContainer = styled.a` - display: flex; - justify-content: center; - align-items: center; - padding: 4px 8px; - box-sizing: border-box; - background-color: ${tm(({ colors }) => colors.transparent)}; - border: none; - cursor: pointer; - & .dark-logo { - display: none; - } - ${tmSelectors.dark} { - & .dark-logo { - display: inline; - } - & .light-logo { - display: none; - } - } - ${media.mqDark} { - ${tmSelectors.auto} { - & .dark-logo { - display: inline; - } - & .light-logo { - display: none; - } - } - } -`; - -const HamburgerLogoWrapper = styled.div` - display: flex; - align-items: center; -`; -const HamburgerWrapper = styled.div` - ${media.md} { - display: none; - } -`; - -const DocsNavigation: FC = ({ isSidebarOpen, onSidebarOpen }) => { - const { theme } = useContext(ThemeContext); - - return ( - - - - - - - logo - - - logo - - - - - - - - - onSidebarOpen(!isSidebarOpen)} - /> - - - - ); -}; - -export default DocsNavigation; diff --git a/docs/src/components/DocumentationFooter.tsx b/docs/src/components/DocumentationFooter.tsx deleted file mode 100644 index 73a67e9e8e3..00000000000 --- a/docs/src/components/DocumentationFooter.tsx +++ /dev/null @@ -1,179 +0,0 @@ -import React from "react"; -import Link from "next/link"; -import { styled } from "linaria/react"; -import { media, tm, tmDark, tmSelectors } from "../themes"; -import ExternalLinkIcon from "../assets/icons/external-link-icon"; -import FooterArrow from "../assets/icons/footer-arrow"; -import { FooterNavigation } from "./types"; - -type Props = FooterNavigation; - -const Footer = styled.footer` - display: flex; - width: 100%; - flex-direction: column; - margin-top: 74px; - padding: 0 34px; - font-size: 10px; - - & a { - cursor: pointer; - &:hover { - opacity: 0.8; - } - } - - ${media.md} { - padding: 0 140px; - font-size: 16px; - } -`; - -const PageEdit = styled.div` - display: flex; - width: 100%; - justify-content: space-between; - padding-bottom: 16px; - font-weight: 700; - line-height: 150%; - border-bottom: 1px solid ${tm(({ colors }) => colors.neutral400)}; - color: ${tm(({ colors }) => colors.editPageColor)}; - stroke: ${tm(({ colors }) => colors.editPageColor)}; - - ${tmSelectors.dark} { - stroke: ${tmDark(({ colors }) => colors.editPageColor)}; - color: ${tmDark(({ colors }) => colors.editPageColor)}; - border-color: ${tmDark(({ colors }) => colors.neutral400)}; - } - ${media.mqDark} { - ${tmSelectors.auto} { - stroke: ${tmDark(({ colors }) => colors.editPageColor)}; - color: ${tmDark(({ colors }) => colors.editPageColor)}; - border-color: ${tmDark(({ colors }) => colors.neutral400)}; - } - } -`; - -const PageNavigation = styled.div` - display: flex; - width: 100%; - justify-content: space-between; - padding: 16px 0 48px; -`; - -const PageNavigationLinkWrapper = styled.div` - & .arrow-reversed { - transform: scaleX(-1); - margin-right: 12px; - } - & > a { - display: inline-flex; - align-items: center; - & > span { - margin-right: 12px; - } - } - font-weight: 700; - color: ${tm(({ colors }) => colors.accent700)}; - ${tmSelectors.dark} { - color: ${tmDark(({ colors }) => colors.accent700)}; - } - ${media.mqDark} { - ${tmSelectors.auto} { - color: ${tmDark(({ colors }) => colors.accent700)}; - } - } -`; - -const ImprovePageLinkWrapper = styled.div` - & > a { - & > span { - max-width: 100px; - display: flex; - align-items: center; - & > svg { - min-width: 20px; - ${media.sm} { - margin-left: 10px; - } - } - ${media.sm} { - max-width: unset; - } - } - } -`; - -const LastUpdatedWrapper = styled.div` - display: flex; - flex-wrap: wrap; - justify-content: flex-end; - align-items: center; - max-width: 80px; - & > span:last-child { - font-weight: 300; - margin-left: 8px; - } - ${media.sm} { - max-width: unset; - } -`; - -const DocumentationFooter = ({ next, prev, lastEditDate, editLink }: Props) => { - const date = lastEditDate ? new Date(lastEditDate).toLocaleString() : ""; - return ( -
- ); -}; - -export default DocumentationFooter; diff --git a/docs/src/components/DocumentationLayout.tsx b/docs/src/components/DocumentationLayout.tsx deleted file mode 100644 index 667cf21df5e..00000000000 --- a/docs/src/components/DocumentationLayout.tsx +++ /dev/null @@ -1,328 +0,0 @@ -import React, { useEffect, useRef, useState } from "react"; -import { styled } from "linaria/react"; -import { useRouter } from "next/router"; -import { MDXRemote, MDXRemoteSerializeResult } from "next-mdx-remote"; - -import SEO from "./SEO"; -import DocsNavigation from "./DocsNavigation"; -import Banner, { DefaultBanner } from "./ui/Banner"; -import { tm, tmSelectors, tmDark, media, ThemeProvider } from "../themes"; -import { DefaultBannerProps } from "./ui/types"; -import { - FooterNavigation, - IDocumentationSidebarStructure, - ISeo, -} from "./types"; -import Sidebar from "./Sidebar"; -import { menuItemsList, socialsItems, bannerContent } from "../config"; -import MobileSidebarMenu from "./MobileSidebarMenu"; -import DocumentationFooter from "./DocumentationFooter"; -import Title from "./mdxComponents/Title"; -import Paragraph from "./mdxComponents/Paragraph"; -import CodeBlocks from "./mdxComponents/CodeBlocks"; -import Admonition from "./mdxComponents/Admonition"; -import UnorderedList from "./mdxComponents/UnorderedList"; -import HorizontalRule from "./mdxComponents/HorizontalRule"; -import MDLink from "./mdxComponents/MDLink"; -import Table from "./mdxComponents/Table"; -import MDImage from "./mdxComponents/MDImage"; -import OrderedList from "./mdxComponents/OrderedList"; -import TabsGroup from "./mdxComponents/TabsGroup"; -import Tab from "./mdxComponents/Tab"; -import GDPRNotice from "./GDPRNotice"; - -const Container = styled.div` - position: relative; - display: flex; - flex-direction: column; - justify-content: flex-start; - align-items: center; - font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, - Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", sans-serif; - -webkit-font-smoothing: antialiased; - height: 100vh; - min-width: 320px; -`; - -const Main = styled.main` - padding-top: 136px; - flex: 1 1 auto; - display: flex; - justify-content: flex-start; - align-items: center; - background-color: ${tm(({ colors }) => colors.neutral0)}; - width: 100%; - position: relative; - transition: background-color ease-in-out 0.25s; - - ${tmSelectors.dark} { - background-color: ${tmDark(({ colors }) => colors.neutral0)}; - } - ${media.mqDark} { - ${tmSelectors.auto} { - background-color: ${tmDark(({ colors }) => colors.neutral0)}; - } - } -`; - -export const SidebarMask = styled.div` - display: flex; - flex-direction: column; - height: 100%; -`; -export const MobileSidebarMenuMask = styled.div` - display: flex; - flex-direction: column; - height: 100%; - position: absolute; - width: 100%; - left: -100%; - top: 0; - transition: all 0.25s ease-in-out; - &[data-open="true"] { - left: 0; - } -`; - -export const SidebarContainer = styled.aside<{ isSidebarOpen: boolean }>` - flex-direction: column; - width: min(366px, 100%); - position: fixed; - top: 136px; - left: ${({ isSidebarOpen }) => (isSidebarOpen ? "0px" : "-120vw")}; - height: calc(100vh - 136px); - display: flex; - overflow-y: auto; - transition: all ease-out 0.25s; - z-index: 50; - background-color: ${tm(({ colors }) => colors.neutral0)}; - - ${media.md} { - left: 0; - } - - .landing & { - ${media.md} { - display: none; - } - pointer-events: ${({ isSidebarOpen }) => (isSidebarOpen ? "auto" : "none")}; - } - - ${tmSelectors.dark} { - background-color: ${tmDark(({ colors }) => colors.neutral0)}; - } - ${media.mqDark} { - ${tmSelectors.auto} { - background-color: ${tmDark(({ colors }) => colors.neutral0)}; - } - } - - :not(&[data-no-border="true"]) { - border-right: 1px solid ${tm(({ colors }) => colors.neutral400)}; - ${tmSelectors.dark} { - border-right: 1px solid ${tmDark(({ colors }) => colors.border)}; - background-color: ${tmDark(({ colors }) => colors.neutral0)}; - } - ${media.mqDark} { - ${tmSelectors.auto} { - border-right: 1px solid ${tmDark(({ colors }) => colors.border)}; - background-color: ${tmDark(({ colors }) => colors.neutral0)}; - } - } - } - - ${SidebarMask} { - display: none; - ${media.md} { - display: flex; - } - } - ${MobileSidebarMenuMask} { - display: flex; - ${media.md} { - display: none; - } - } - - &[data-no-border="true"] { - border-right: none; - } -`; - -export const Header = styled.header` - position: fixed; - width: 100%; - top: 0; - left: 0; - display: flex; - flex-direction: column; - z-index: 199; -`; - -const View = styled.section` - display: flex; - flex-direction: column; - align-items: center; - justify-content: space-between; - padding-top: 24px; - width: 100%; - height: calc(100vh - 136px); - overflow-y: scroll; - scroll-behavior: smooth; - ${media.md} { - padding-left: 366px; - } -`; -const Content = styled.section` - width: 100%; - max-width: 774px; - padding: 0 34px; - color: ${tm(({ colors }) => colors.neutral900)}; - - & h2 + p { - margin-top: 32px; - } - - color: ${tm(({ colors }) => colors.neutral900)}; - - ${tmSelectors.dark} { - color: ${tmDark(({ colors }) => colors.neutral900)}; - } - - ${media.mqDark} { - ${tmSelectors.auto} { - color: ${tmDark(({ colors }) => colors.neutral900)}; - } - } -`; - -export const components = { - h1: Title.H1, - h2: Title.H2, - h3: Title.H3, - h4: Title.H4, - h5: Title.H5, - p: Paragraph, - code: CodeBlocks.Code, - pre: CodeBlocks.Pre, - tip: Admonition.Tip, - warning: Admonition.Warning, - ul: UnorderedList, - ol: OrderedList, - hr: HorizontalRule, - a: MDLink, - table: Table, - img: MDImage, - tabsgroup: TabsGroup, - tab: Tab, -}; - -interface Props { - seo: ISeo; - sidebarLayout: IDocumentationSidebarStructure; - footerNavigation?: FooterNavigation; - mdxSource: MDXRemoteSerializeResult; -} - -const DocumentationLayout = ({ - mdxSource, - seo, - sidebarLayout, - footerNavigation, -}: Props) => { - const [isSidebarOpen, setIsSidebarOpen] = useState(false); - const router = useRouter(); - const docViewRef = useRef() as React.MutableRefObject; - - useEffect(() => { - docViewRef.current.scrollTo(0, 0); - }, [router.asPath]); - - useEffect(() => { - const body = document.querySelector("body"); - if (!body) return; - - if (isSidebarOpen) { - // Disable scroll - body.style.overflow = "hidden"; - } else { - // Enable scroll - body.style.overflow = "auto"; - } - }, [isSidebarOpen]); - - useEffect(() => { - const listener = () => { - if (isSidebarOpen) { - setIsSidebarOpen(false); - } - }; - - document.addEventListener("click", listener); - - return () => document.removeEventListener("click", listener); - }, [isSidebarOpen]); - - return ( - - -
- ( - - )} - /> - -
- - - -
- { - e.stopPropagation(); - }} - isSidebarOpen={isSidebarOpen} - > - - setIsSidebarOpen(false)} - /> - - - setIsSidebarOpen(false)} - isDocumentation - /> - - - - - {/* @ts-ignore */} - - - {footerNavigation ? ( - - ) : null} - -
-
- -
- ); -}; - -export default DocumentationLayout; diff --git a/docs/src/components/GDPRNotice.model.ts b/docs/src/components/GDPRNotice.model.ts deleted file mode 100644 index f8c5f8f81b4..00000000000 --- a/docs/src/components/GDPRNotice.model.ts +++ /dev/null @@ -1,15 +0,0 @@ -/* eslint-disable import/prefer-default-export */ -const MeasurementID = process.env.NEXT_PUBLIC_MEASUREMENT_ID as string; - -export const loadAnalyticsScript = () => { - const existingScript = document.querySelector("#google-tag-manager"); - if (existingScript) { - return; - } - - const script = document.createElement("script"); - script.id = "google-tag-manager"; - script.async = true; - script.src = `https://www.googletagmanager.com/gtag/js?id=${MeasurementID}`; - document.head.appendChild(script); -}; diff --git a/docs/src/components/GDPRNotice.tsx b/docs/src/components/GDPRNotice.tsx deleted file mode 100644 index f637bc8e4bf..00000000000 --- a/docs/src/components/GDPRNotice.tsx +++ /dev/null @@ -1,72 +0,0 @@ -import React from "react"; -import { styled } from "linaria/react"; -import CookiePopUp from "./CookiePopUp"; -import { GDPR } from "../config"; -import { loadAnalyticsScript } from "./GDPRNotice.model"; - -enum GDPRStatus { - ACCEPTED = "accepted", - REJECTED = "rejected", - UNKNOWN = "unknown", -} - -const ITEM_KEY = "GDPR_ACCEPTED"; - -const Container = styled.div` - position: fixed; - bottom: 30px; - right: 30px; - z-index: 101; -`; - -const useGDPR = () => { - const [isOpen, setIsOpen] = React.useState(false); - - React.useEffect(() => { - const acceptedStatus = (localStorage.getItem(ITEM_KEY) ?? - GDPRStatus.UNKNOWN) as GDPRStatus; - if (acceptedStatus === GDPRStatus.UNKNOWN) { - setIsOpen(true); - } - if (acceptedStatus === GDPRStatus.ACCEPTED) { - loadAnalyticsScript(); - } - }, []); - - const handleAccept = () => { - localStorage.setItem(ITEM_KEY, GDPRStatus.ACCEPTED); - setIsOpen(false); - loadAnalyticsScript(); - }; - - const handleReject = () => { - localStorage.setItem(ITEM_KEY, GDPRStatus.REJECTED); - setIsOpen(false); - }; - - return { - isOpen, - handleAccept, - handleReject, - }; -}; - -const GDPRNotice = () => { - const manageGDPR = useGDPR(); - - if (!manageGDPR.isOpen) { - return null; - } - - return ( - - - - ); -}; - -export default GDPRNotice; diff --git a/docs/src/components/LandingFooter.tsx b/docs/src/components/LandingFooter.tsx deleted file mode 100644 index 58605160db4..00000000000 --- a/docs/src/components/LandingFooter.tsx +++ /dev/null @@ -1,153 +0,0 @@ -import React from "react"; -import { styled } from "linaria/react"; -import Image from "next/image"; -import Link from "next/link"; -import ethereumFoundationLogo from "../assets/ethereum-foundation-logo.svg"; -import ethereumFoundationLogoDark from "../assets/ethereum-foundation-logo-dark.svg"; -import { media, tm, tmDark, tmSelectors } from "../themes"; -import { PRIVACY_POLICY_PATH } from "../config"; - -const Footer = styled.footer` - padding: 80px 24px 120px; - width: 100%; - display: flex; - flex-direction: column; - align-items: center; - background-color: ${tm(({ colors }) => colors.neutral900)}; - ${media.md} { - padding: 64px 24px 40px; - } - & .light { - display: inline; - } - & .dark { - display: none; - } - ${tmSelectors.dark} { - background-color: ${tmDark(({ colors }) => colors.neutral900)}; - - & .light { - display: none; - } - & .dark { - display: inline; - } - } - ${media.mqDark} { - ${tmSelectors.auto} { - background-color: ${tmDark(({ colors }) => colors.neutral900)}; - - & .light { - display: none; - } - & .dark { - display: inline; - } - } - } -`; - -const SupportedBy = styled.section` - display: flex; - flex-direction: column; - align-items: center; - ${media.md} { - flex-direction: row; - } -`; - -const Subtitle = styled.h2` - color: ${tm(({ colors }) => colors.footerText)}; - font-size: 18px; - font-weight: normal; - line-height: 40px; - letter-spacing: 0; - text-align: center; - margin-bottom: 16px; - font-family: ChivoLight, sans-serif; - ${media.md} { - margin-bottom: unset; - margin-right: 24px; - font-size: 24px; - } - ${tmSelectors.dark} { - color: ${tmDark(({ colors }) => colors.footerText)}; - } - ${media.mqDark} { - ${tmSelectors.auto} { - color: ${tmDark(({ colors }) => colors.footerText)}; - } - } -`; - -const Legal = styled.section` - margin-top: 80px; - padding-top: 21px; - position: relative; - font-size: 12px; - line-height: 12px; - letter-spacing: 0; - text-align: center; - color: ${tm(({ colors }) => colors.footerText2)}; - &:before { - content: " "; - height: 1px; - width: 186px; - position: absolute; - top: 0; - left: 50%; - transform: translateX(-50%); - background-color: ${tm(({ colors }) => colors.footerText2)}; - } - ${media.md} { - font-size: 15px; - line-height: 24px; - margin-top: 96px; - } - ${tmSelectors.dark} { - color: ${tmDark(({ colors }) => colors.footerText2)}; - &:before { - background-color: ${tmDark(({ colors }) => colors.footerText2)}; - } - } - ${media.mqDark} { - ${tmSelectors.auto} { - &:before { - background-color: ${tmDark(({ colors }) => colors.footerText2)}; - } - color: ${tmDark(({ colors }) => colors.footerText2)}; - } - } -`; - -const PrivacyPolicyLink = styled.a` - cursor: pointer; - margin-left: 4px; - &:hover { - opacity: 0.8; - } -`; - -const LandingFooter = () => { - return ( -
- - Supported by - - logo - - - logo dark - - - - Copyright {new Date().getFullYear()} Nomic Foundation | - - Privacy Policy - - -
- ); -}; - -export default LandingFooter; diff --git a/docs/src/components/LandingLayout.tsx b/docs/src/components/LandingLayout.tsx deleted file mode 100644 index f5144b4876c..00000000000 --- a/docs/src/components/LandingLayout.tsx +++ /dev/null @@ -1,127 +0,0 @@ -import React, { useEffect, useState } from "react"; -import { styled } from "linaria/react"; - -import SEO from "./SEO"; -import LandingFooter from "./LandingFooter"; -import Banner, { DefaultBanner } from "./ui/Banner"; -import { media, ThemeProvider, tm, tmDark, tmSelectors } from "../themes"; -import { DefaultBannerProps } from "./ui/types"; -import { bannerContent, menuItemsList, socialsItems } from "../config"; -import GDPRNotice from "./GDPRNotice"; -import DocsNavigation from "./DocsNavigation"; -import { - Header, - MobileSidebarMenuMask, - SidebarContainer, -} from "./DocumentationLayout"; -import MobileSidebarMenu from "./MobileSidebarMenu"; -import { IDocumentationSidebarStructure, ISeo } from "./types"; - -const Container = styled.div` - position: relative; - display: flex; - flex-direction: column; - justify-content: flex-start; - align-items: center; - -webkit-font-smoothing: antialiased; - background-color: ${tm(({ colors }) => colors.neutral0)}; - transition: all ease-in-out 0.25s; - min-width: 320px; - ${tmSelectors.dark} { - background-color: ${tmDark(({ colors }) => colors.neutral0)}; - } - ${media.mqDark} { - ${tmSelectors.auto} { - background-color: ${tmDark(({ colors }) => colors.neutral0)}; - } - } -`; - -const Main = styled.main` - overflow-x: hidden; - padding-top: 136px; - flex: 1 1 auto; - display: flex; - flex-direction: column; - justify-content: flex-start; - align-items: center; - width: 100%; -`; - -type Props = React.PropsWithChildren<{ - seo: ISeo; - sidebarLayout: IDocumentationSidebarStructure; -}>; - -const LandingLayout = ({ children, seo, sidebarLayout }: Props) => { - const [isSidebarOpen, setIsSidebarOpen] = useState(false); - - useEffect(() => { - const body = document.querySelector("body"); - if (!body) return; - - if (isSidebarOpen) { - // Disable scroll - body.style.overflow = "hidden"; - } else { - // Enable scroll - body.style.overflow = "auto"; - } - }, [isSidebarOpen]); - - useEffect(() => { - const listener = () => { - if (isSidebarOpen) { - setIsSidebarOpen(false); - } - }; - - document.addEventListener("click", listener); - - return () => document.removeEventListener("click", listener); - }, [isSidebarOpen]); - return ( - - -
- ( - - )} - /> - -
- - -
- { - e.stopPropagation(); - }} - isSidebarOpen={isSidebarOpen} - data-no-border={!isSidebarOpen && sidebarLayout.length === 0} - > - - setIsSidebarOpen(false)} - isDocumentation={false} - /> - - - {children} - -
-
- -
- ); -}; - -export default LandingLayout; diff --git a/docs/src/components/MobileAnimation.tsx b/docs/src/components/MobileAnimation.tsx deleted file mode 100644 index 15939cc0fec..00000000000 --- a/docs/src/components/MobileAnimation.tsx +++ /dev/null @@ -1,183 +0,0 @@ -import React, { useEffect, useRef, useState } from "react"; -import Image from "next/image"; -import { styled } from "linaria/react"; - -import ethereumLogo from "../assets/animation/mobile/ethereum_logo.svg"; -import ethereumLogoDark from "../assets/animation/mobile/ethereum_logo-dark.svg"; -import mascots from "../assets/animation/mobile/mascots.svg"; -import heEyesOpen from "../assets/animation/mobile/he-eyes_open.svg"; -import sheEyesOpen from "../assets/animation/mobile/she-eyes_open.svg"; -import { media, tmSelectors } from "../themes"; - -const AnimationContainer = styled.section` - width: 300px; - height: 152px; - position: fixed; - bottom: 0; - left: 50%; - z-index: 1; - transform: translateX(-30%) scale(0.7); - pointer-events: none; - transform-origin: bottom center; - - ${media.xxs} { - transform: translateX(-50%) scale(0.85); - } - ${media.sm} { - transform: translateX(-50%) scale(1.2); - } - ${media.smd} { - transform: translateX(-50%) scale(1.7); - } - ${media.md} { - display: none; - } - & .light { - display: inline; - } - & .dark { - display: none; - } - ${tmSelectors.dark} { - & .light { - display: none; - } - & .dark { - display: inline; - } - } - ${media.mqDark} { - ${tmSelectors.auto} { - & .light { - display: none; - } - & .dark { - display: inline; - } - } - } -`; - -const Anchor = styled.span` - height: 0; - width: 0; - visibility: hidden; - position: absolute; - top: 0; - left: 0; - ${media.md} { - display: block; - } -`; - -const EthereumLogoContainer = styled.span<{ anchorPosition: number }>` - position: absolute; - bottom: -20px; - left: 55px; - opacity: ${({ anchorPosition }) => (100 + anchorPosition * 0.8) / 100}; -`; -const MascotsContainer = styled.span<{ anchorPosition: number }>` - position: absolute; - bottom: ${({ anchorPosition }) => `${anchorPosition}px`}; - left: 5px; - & .he-eyes { - bottom: 48px; - left: 182px; - animation: blink 8s linear infinite; - animation-delay: 1s; - position: absolute; - } - & .she-eyes { - bottom: 60px; - left: 48px; - animation: blink 8s linear infinite; - position: absolute; - } - @keyframes blink { - 0% { - transform: none; - } - 39% { - transform: none; - } - 40% { - transform: matrix(1, 0, 0, 0.2, 0, 0); - } - 41% { - transform: none; - } - 100% { - transform: none; - } - } -`; - -const defaultTopPosition = 140; - -const validateAnchorPosition = ( - anchorPosition: number, - defaultAnchorPosition: number -) => { - return anchorPosition - defaultAnchorPosition > 0 - ? 0 - : anchorPosition - defaultAnchorPosition; -}; - -const MobileAnimation = () => { - const [anchorPosition, setAnchorPosition] = useState(0); - const anchorRef = useRef(null); - - useEffect(() => { - const listener = () => { - const anchorTopPosition = - anchorRef.current?.getBoundingClientRect()?.top ?? 0; - - const validatedAnchorPosition = validateAnchorPosition( - anchorTopPosition, - defaultTopPosition - ); - - setAnchorPosition(validatedAnchorPosition); - }; - document.addEventListener("scroll", listener); - - // eslint-disable-next-line - return () => { - document.removeEventListener("scroll", listener); - }; - }, []); - - return ( - <> - { - e.preventDefault(); - }} - > - - - ethereum logo - - - ethereum logo dark - - - - mascots - - he-eyes - - - she-eyes - - - - - - ); -}; - -export default MobileAnimation; diff --git a/docs/src/components/MobileSidebarMenu.tsx b/docs/src/components/MobileSidebarMenu.tsx deleted file mode 100644 index 5bd8de634bb..00000000000 --- a/docs/src/components/MobileSidebarMenu.tsx +++ /dev/null @@ -1,482 +0,0 @@ -import React, { - Dispatch, - FC, - SetStateAction, - useEffect, - useMemo, - useState, -} from "react"; -import Link from "next/link"; -import { useRouter } from "next/router"; -import { styled } from "linaria/react"; -import { media, tm, tmDark, tmSelectors } from "../themes"; -import Sidebar from "./Sidebar"; -import { menuItemsList, socialsItems as defaultSocialItems } from "../config"; -import ExternalLinkIcon from "../assets/icons/external-link-icon"; -import { IDocumentationSidebarStructure } from "./types"; -import { MenuItemType, NavigationPagesPaths, SocialsEnum } from "./ui/types"; -import MobileMenuArrowForward from "../assets/icons/mobile-menu-arrow-forward"; -import { SocialsList } from "./ui/DesktopMenu"; -import ThemeSwitchButton from "./ThemeSwitchButton"; -import MobileMenuArrowBack from "../assets/icons/mobile-menu-arrow-back"; - -interface Props { - sidebarElementsList: IDocumentationSidebarStructure; - menuItems: typeof menuItemsList; - socialsItems: typeof defaultSocialItems; - closeSidebar: () => void; - isDocumentation: boolean; -} - -interface ModalProps { - modalState: MenuItemType | null; - setModalState: Dispatch>; - closeSidebar: () => void; - sidebarElementsList: IDocumentationSidebarStructure; - socialsItems: typeof defaultSocialItems; -} - -const MobileSidebarContainer = styled.section` - display: flex; - flex-direction: column; -`; - -const MobileNavigationContainer = styled.ul` - list-style-type: none; - display: flex; - flex-direction: column; - padding: 16px 0; - color: ${tm(({ colors }) => colors.neutral900)}; - ${tmSelectors.dark} { - color: ${tmDark(({ colors }) => colors.neutral900)}; - } - ${media.mqDark} { - ${tmSelectors.auto} { - color: ${tmDark(({ colors }) => colors.neutral900)}; - } - } -`; - -const MenuItem = styled.li` - padding: 8px 32px; - display: flex; - align-items: center; - font-size: 24px; - font-weight: 400; - text-transform: uppercase; - font-family: ChivoRegular, sans-serif; - cursor: pointer; - margin-top: 8px; - - &:first-child { - margin-top: unset; - } - &:hover { - color: ${tm(({ colors }) => colors.accent700)}; - & svg { - stroke: ${tm(({ colors }) => colors.accent700)}; - fill: ${tm(({ colors }) => colors.accent700)}; - } - & a:after { - background-color: ${tm(({ colors }) => colors.accent700)}; - } - - ${tmSelectors.dark} { - color: ${tmDark(({ colors }) => colors.accent700)}; - & svg { - stroke: ${tmDark(({ colors }) => colors.accent700)}; - fill: ${tmDark(({ colors }) => colors.accent700)}; - } - & a:after { - background-color: ${tmDark(({ colors }) => colors.accent700)}; - } - } - ${media.mqDark} { - ${tmSelectors.auto} { - color: ${tmDark(({ colors }) => colors.accent700)}; - & svg { - stroke: ${tmDark(({ colors }) => colors.accent700)}; - fill: ${tmDark(({ colors }) => colors.accent700)}; - } - & a:after { - background-color: ${tmDark(({ colors }) => colors.accent700)}; - } - } - } - } - & > a { - position: relative; - &:after { - transition: all ease-in-out 0.2s; - position: absolute; - bottom: -8px; - left: 0; - content: " "; - width: 0; - height: 1px; - background-color: ${tm(({ colors }) => colors.neutral800)}; - - ${tmSelectors.dark} { - background-color: ${tmDark(({ colors }) => colors.neutral800)}; - } - ${media.mqDark} { - ${tmSelectors.auto} { - background-color: ${tmDark(({ colors }) => colors.neutral800)}; - } - } - } - } - &[data-current="true"] { - & > a { - &:after { - width: 100%; - } - } - } - & svg { - margin-left: 4px; - stroke: ${tm(({ colors }) => colors.neutral900)}; - fill: ${tm(({ colors }) => colors.neutral900)}; - - ${tmSelectors.dark} { - stroke: ${tmDark(({ colors }) => colors.neutral900)}; - fill: ${tmDark(({ colors }) => colors.neutral900)}; - } - ${media.mqDark} { - ${tmSelectors.auto} { - stroke: ${tmDark(({ colors }) => colors.neutral900)}; - fill: ${tmDark(({ colors }) => colors.neutral900)}; - } - } - } -`; - -const MobileMenuFooter = styled.div<{ isRelative?: boolean }>` - display: flex; - justify-content: space-between; - align-items: center; - width: 100%; - padding: 16px 40px 32px; - position: ${({ isRelative }) => (isRelative ? "relative" : "absolute")}; - bottom: 0; - &::before { - content: " "; - height: 1px; - width: 200px; - position: absolute; - top: 0; - left: 32px; - background-color: ${tm(({ colors }) => colors.border)}; - ${tmSelectors.dark} { - background-color: ${tmDark(({ colors }) => colors.border)}; - } - ${media.mqDark} { - ${tmSelectors.auto} { - background-color: ${tmDark(({ colors }) => colors.border)}; - } - } - } -`; - -const ModalContainer = styled.div<{ isModalOpen: boolean }>` - display: flex; - flex-direction: column; - height: calc(100vh - 136px); - padding: 32px 0; - position: absolute; - width: 100%; - top: 0px; - transition: all ease-out 0.25s; - font-family: ChivoRegular, sans-serif; - z-index: 50; - left: ${({ isModalOpen }) => (isModalOpen ? "0px" : "-120vw")}; - color: ${tm(({ colors }) => colors.neutral800)}; - background-color: ${tm(({ colors }) => colors.neutral0)}; - - ${tmSelectors.dark} { - color: ${tmDark(({ colors }) => colors.neutral800)}; - background-color: ${tmDark(({ colors }) => colors.neutral0)}; - } - ${media.mqDark} { - ${tmSelectors.auto} { - color: ${tmDark(({ colors }) => colors.neutral800)}; - background-color: ${tmDark(({ colors }) => colors.neutral0)}; - } - } -`; - -const ModalBackToMenuButton = styled.button` - margin-left: 32px; - display: flex; - align-items: center; - font-size: 15px; - line-height: 20px; - width: fit-content; - background-color: ${tm(({ colors }) => colors.transparent)}; - border: none; - color: ${tm(({ colors }) => colors.backButton)}; - cursor: pointer; - &:hover { - opacity: 0.8; - } - & svg { - margin-right: 6px; - stroke: ${tm(({ colors }) => colors.backButton)}; - fill: ${tm(({ colors }) => colors.backButton)}; - } - ${tmSelectors.dark} { - color: ${tmDark(({ colors }) => colors.backButton)}; - & svg { - stroke: ${tmDark(({ colors }) => colors.backButton)}; - fill: ${tmDark(({ colors }) => colors.backButton)}; - } - } - ${media.mqDark} { - ${tmSelectors.auto} { - color: ${tmDark(({ colors }) => colors.backButton)}; - & svg { - stroke: ${tmDark(({ colors }) => colors.backButton)}; - fill: ${tmDark(({ colors }) => colors.backButton)}; - } - } - } -`; - -const ModalTitle = styled.h4` - margin: 16px 32px 8px; - font-size: 24px; - font-weight: 400; - width: fit-content; - text-transform: uppercase; - position: relative; - color: ${tm(({ colors }) => colors.neutral900)}; - ${tmSelectors.dark} { - color: ${tmDark(({ colors }) => colors.neutral900)}; - } - ${media.mqDark} { - ${tmSelectors.auto} { - color: ${tmDark(({ colors }) => colors.neutral900)}; - } - } - &:after { - transition: all ease-in-out 0.2s; - position: absolute; - bottom: -8px; - left: 0; - content: " "; - width: 100%; - height: 1px; - background-color: ${tm(({ colors }) => colors.neutral900)}; - - ${tmSelectors.dark} { - background-color: ${tmDark(({ colors }) => colors.neutral900)}; - } - ${media.mqDark} { - ${tmSelectors.auto} { - background-color: ${tmDark(({ colors }) => colors.neutral900)}; - } - } - } -`; - -const ToolsList = styled.ul` - display: flex; - flex-direction: column; - user-select: none; - list-style-type: none; - font-size: 16.5px; - line-height: 150%; - font-weight: 400; - padding: 19.5px 32px; -`; - -const ToolsListItem = styled.li` - margin-top: 15px; - &:first-child { - margin-top: unset; - } -`; - -const SocialItem = ({ name, href }: { name: SocialsEnum; href: string }) => { - return ( - - - {name.toLowerCase()} - - - - ); -}; - -const getCurrentSection = ({ - isDocumentation, - currentLocation, -}: { - isDocumentation: boolean; - currentLocation: string; -}): NavigationPagesPaths => { - if (isDocumentation) { - if (currentLocation.startsWith(NavigationPagesPaths.TUTORIAL)) - return NavigationPagesPaths.TUTORIAL; - return NavigationPagesPaths.DOCUMENTATION; - } - return currentLocation as NavigationPagesPaths; -}; - -const MobileSidebarMenuModal: FC = ({ - modalState, - setModalState, - sidebarElementsList, - closeSidebar, - socialsItems, -}) => { - const renderModalContent = ( - selectedSection: NavigationPagesPaths | string - ) => { - if (selectedSection === NavigationPagesPaths.TOOLS) { - return ( - - {modalState?.subItems?.map((subItem) => { - return ( - - - {/* eslint-disable-next-line */} - {`${subItem.prefix as string} ${ - subItem.label - }`} - - - ); - })} - - ); - } - return ( - - ); - }; - - return ( - - setModalState(null)}> - - Back - - {modalState?.label} - {modalState !== null && renderModalContent(modalState.href)} - - - - - - ); -}; - -const MobileSidebarMenu: FC = ({ - sidebarElementsList, - closeSidebar, - menuItems, - socialsItems, - isDocumentation = false, -}) => { - const router = useRouter(); - const [modalState, setModalState] = useState(null); - const gitHubSocial = socialsItems.find( - (socialsItem) => socialsItem.name === SocialsEnum.GITHUB - ); - const currentSection = getCurrentSection({ - isDocumentation, - currentLocation: router?.asPath, - }); - const isModal = useMemo( - () => - [ - NavigationPagesPaths.DOCUMENTATION, - NavigationPagesPaths.TUTORIAL, - NavigationPagesPaths.TOOLS, - ].includes(currentSection), - [currentSection] - ); - - useEffect(() => { - if (isModal) { - setModalState( - menuItems.find((menuItem) => menuItem.href === currentSection) || null - ); - } - }, [currentSection, menuItems, isModal]); - - const handleClick = ( - event: React.MouseEvent, - menuItem: MenuItemType - ) => { - if ( - menuItem.href === NavigationPagesPaths.TOOLS || - ([ - NavigationPagesPaths.DOCUMENTATION, - NavigationPagesPaths.TUTORIAL, - ].includes(currentSection) && - currentSection === menuItem.href) - ) { - event.preventDefault(); - setModalState(menuItem); - } else { - closeSidebar(); - } - }; - - return ( - - - {menuItems.map((menuItem) => { - return ( - handleClick(e, menuItem)} - > - - {/* eslint-disable-next-line */} - { - if ( - menuItem.href === NavigationPagesPaths.TOOLS || - ([ - NavigationPagesPaths.DOCUMENTATION, - NavigationPagesPaths.TUTORIAL, - ].includes(currentSection) && - currentSection === menuItem.href) - ) { - e.preventDefault(); - } - }} - > - {menuItem.label} - - - {sidebarElementsList.length > 0 && - currentSection === menuItem.href && ( - - )} - - ); - })} - {gitHubSocial && } - - - - - - - - - ); -}; - -export default MobileSidebarMenu; diff --git a/docs/src/components/Navigation.mocks.json b/docs/src/components/Navigation.mocks.json index f542795d7e1..a49aacc90de 100644 --- a/docs/src/components/Navigation.mocks.json +++ b/docs/src/components/Navigation.mocks.json @@ -169,6 +169,10 @@ "label": "@nomiclabs/hardhat-web3", "href": "/plugins/nomiclabs-hardhat-web3" }, + { + "label": "@nomicfoundation/hardhat-web3-v4", + "href": "/plugins/nomicfoundation-hardhat-web3-v4" + }, { "label": "@nomiclabs/hardhat-truffle5", "href": "/plugins/nomiclabs-hardhat-truffle5" diff --git a/docs/src/components/Navigation.stories.tsx b/docs/src/components/Navigation.stories.tsx deleted file mode 100644 index 32b54e31865..00000000000 --- a/docs/src/components/Navigation.stories.tsx +++ /dev/null @@ -1,42 +0,0 @@ -import React, { useState } from "react"; -import { menuItemsList, socialsItems } from "../config"; -import DocumentationSidebarStructure from "./Navigation.mocks.json"; -import MobileSidebarMenu from "./MobileSidebarMenu"; - -import DocumentationNavigation from "./DocsNavigation"; -import Sidebar from "./Sidebar"; -import { IDocumentationSidebarStructure } from "./types"; - -export default { - title: "Documentation/ Navigation", -}; - -export const MobileSidebar = () => ( - {}} - isDocumentation={false} - /> -); - -export const SidebarMenu = () => ( - -); - -export const Navigation = () => { - const [isSidebarOpen, setIsSidebarOpen] = useState(false); - return ( - - ); -}; diff --git a/docs/src/components/PluginSnippet.tsx b/docs/src/components/PluginSnippet.tsx deleted file mode 100644 index a49a3cf69c5..00000000000 --- a/docs/src/components/PluginSnippet.tsx +++ /dev/null @@ -1,141 +0,0 @@ -import React from "react"; -import Link from "next/link"; -import { styled } from "linaria/react"; -import { media, tm, tmDark, tmSelectors } from "../themes"; -import { IPlugin } from "../model/types"; - -const StyledPluginSnippetContainer = styled.div` - width: 100%; - display: flex; - flex-direction: column; - margin-bottom: 50px; -`; - -const PluginNameAuthorContainer = styled.div` - display: flex; - flex-direction: column; - ${media.md} { - flex-direction: row; - align-items: center; - } -`; - -const PluginName = styled.a` - font-size: 20px; - line-height: 150%; - font-weight: 700; - color: ${tm(({ colors }) => colors.accent900)}; - margin-right: 18px; - &:hover { - opacity: 0.8; - } -`; - -const Author = styled.a` - font-size: 16px; - line-height: 150%; - color: ${tm(({ colors }) => colors.autoThemeButton)}; - - &:hover { - opacity: 0.8; - } - - ${media.md} { - padding-left: 8px; - border-left: 1px solid ${tm(({ colors }) => colors.autoThemeButton)}; - } - - ${tmSelectors.dark} { - color: ${tmDark(({ colors }) => colors.autoThemeButton)}; - border-color: ${tmDark(({ colors }) => colors.autoThemeButton)}; - } - ${media.mqDark} { - ${tmSelectors.auto} { - color: ${tmDark(({ colors }) => colors.autoThemeButton)}; - border-color: ${tmDark(({ colors }) => colors.autoThemeButton)}; - } - } -`; - -const Description = styled.p` - font-size: 16; - line-height: 150%; - width: 100%; - margin-top: 12px; - color: ${tm(({ colors }) => colors.neutral800)}; - - ${tmSelectors.dark} { - color: ${tmDark(({ colors }) => colors.neutral800)}; - } - ${media.mqDark} { - ${tmSelectors.auto} { - color: ${tmDark(({ colors }) => colors.neutral800)}; - } - } -`; - -const TagsContainer = styled.div` - display: flex; - flex-wrap: wrap; - margin-top: 16px; -`; - -const Tag = styled.div` - padding: 4px 16px; - margin: 8px 8px 0 0; - border-radius: 5px; - font-size: 13px; - line-height: 19.5px; - background-color: ${tm(({ colors }) => colors.tagBackground)}; - color: ${tm(({ colors }) => colors.codeColor)}; - - ${tmSelectors.dark} { - background-color: ${tmDark(({ colors }) => colors.tagBackground)}; - color: ${tmDark(({ colors }) => colors.codeColor)}; - } - ${media.mqDark} { - ${tmSelectors.auto} { - background-color: ${tmDark(({ colors }) => colors.tagBackground)}; - color: ${tmDark(({ colors }) => colors.codeColor)}; - } - } -`; - -const PluginSnippet = ({ - name, - author, - authorUrl, - description, - tags, - href, -}: IPlugin & { href: string }) => { - const isExternalLink = href.startsWith("http"); - - return ( - - - {isExternalLink ? ( - - {name} - - ) : ( - - {/* eslint-disable-next-line */} - {name} - - )} - - {author} - - - {description} - - {tags.map((tagName) => ( - {tagName} - ))} - - - ); -}; - -export default PluginSnippet; diff --git a/docs/src/components/PluginsLayout.tsx b/docs/src/components/PluginsLayout.tsx deleted file mode 100644 index 9ded21ac613..00000000000 --- a/docs/src/components/PluginsLayout.tsx +++ /dev/null @@ -1,179 +0,0 @@ -import React, { useEffect, useRef, useState } from "react"; -import { styled } from "linaria/react"; -import { useRouter } from "next/router"; - -import SEO from "./SEO"; -import DocsNavigation from "./DocsNavigation"; -import Banner, { DefaultBanner } from "./ui/Banner"; -import { tm, tmSelectors, tmDark, media, ThemeProvider } from "../themes"; -import { DefaultBannerProps } from "./ui/types"; -import { IDocumentationSidebarStructure, ISeo } from "./types"; -import { bannerContent, menuItemsList, socialsItems } from "../config"; -import { - Header, - MobileSidebarMenuMask, - SidebarContainer, -} from "./DocumentationLayout"; -import MobileSidebarMenu from "./MobileSidebarMenu"; - -const Container = styled.div` - position: relative; - display: flex; - flex-direction: column; - justify-content: flex-start; - align-items: center; - font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, - Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", sans-serif; - -webkit-font-smoothing: antialiased; - height: 100vh; - min-width: 320px; -`; - -const Main = styled.main` - padding-top: 136px; - flex: 1 1 auto; - display: flex; - justify-content: flex-start; - align-items: center; - background-color: ${tm(({ colors }) => colors.neutral0)}; - width: 100%; - position: relative; - transition: background-color ease-in-out 0.25s; - - ${tmSelectors.dark} { - background-color: ${tmDark(({ colors }) => colors.neutral0)}; - } - ${media.mqDark} { - ${tmSelectors.auto} { - background-color: ${tmDark(({ colors }) => colors.neutral0)}; - } - } - ${media.md} { - & aside { - display: none; - } - } -`; - -const View = styled.section` - display: flex; - flex-direction: column; - align-items: center; - padding-top: 24px; - width: 100%; - height: calc(100vh - 136px); - overflow-y: scroll; -`; -const Content = styled.section` - display: flex; - flex-direction: column; - width: 100%; - max-width: 774px; - padding: 0 34px; - color: ${tm(({ colors }) => colors.neutral900)}; - & h2:not(:first-of-type) { - padding-top: 80px; - } - - & h2 + p { - margin-top: 32px; - } - - color: ${tm(({ colors }) => colors.neutral900)}; - - ${tmSelectors.dark} { - color: ${tmDark(({ colors }) => colors.neutral900)}; - } - - ${media.mqDark} { - ${tmSelectors.auto} { - color: ${tmDark(({ colors }) => colors.neutral900)}; - } - } -`; - -type Props = React.PropsWithChildren<{ - seo: ISeo; - sidebarLayout: IDocumentationSidebarStructure; -}>; - -const PluginsLayout = ({ children, seo, sidebarLayout }: Props) => { - const [isSidebarOpen, setIsSidebarOpen] = useState(false); - const router = useRouter(); - const pluginsViewRef = useRef() as React.MutableRefObject; - - useEffect(() => { - pluginsViewRef.current.scrollTo(0, 0); - }, [router.asPath]); - - useEffect(() => { - const body = document.querySelector("body"); - if (!body) return; - - if (isSidebarOpen) { - // Disable scroll - body.style.overflow = "hidden"; - } else { - // Enable scroll - body.style.overflow = "auto"; - } - }, [isSidebarOpen]); - - useEffect(() => { - const listener = () => { - if (isSidebarOpen) { - setIsSidebarOpen(false); - } - }; - - document.addEventListener("click", listener); - - return () => document.removeEventListener("click", listener); - }, [isSidebarOpen]); - - return ( - - -
- ( - - )} - /> - -
- - - -
- { - e.stopPropagation(); - }} - isSidebarOpen={isSidebarOpen} - data-no-border={!isSidebarOpen && sidebarLayout.length === 0} - > - - setIsSidebarOpen(false)} - isDocumentation={false} - /> - - - - {children} - -
-
-
- ); -}; - -export default PluginsLayout; diff --git a/docs/src/components/SEO.tsx b/docs/src/components/SEO.tsx deleted file mode 100644 index 9b233ab776d..00000000000 --- a/docs/src/components/SEO.tsx +++ /dev/null @@ -1,31 +0,0 @@ -import React from "react"; -import Head from "next/head"; - -interface Props { - seo: { - title: string; - description: string; - }; -} - -const commonTitlePart = - " | Ethereum development environment for professionals by Nomic Foundation"; - -const SEO = ({ seo }: Props) => { - const title = `${seo.title}${commonTitlePart}`; - return ( - - {title} - - - - - - - - - - ); -}; - -export default SEO; diff --git a/docs/src/components/Searching.tsx b/docs/src/components/Searching.tsx deleted file mode 100644 index 13138675d65..00000000000 --- a/docs/src/components/Searching.tsx +++ /dev/null @@ -1,97 +0,0 @@ -import React from "react"; -import Head from "next/head"; -import { DocSearch } from "@docsearch/react"; -import "@docsearch/css"; -import { styled } from "linaria/react"; -import { media, tm, tmDark, tmSelectors } from "../themes"; - -const appId = process.env.NEXT_PUBLIC_ALGOLIA_APP_ID as string; -const apiKey = process.env.NEXT_PUBLIC_ALGOLIA_API_KEY as string; -const indexName = process.env.NEXT_PUBLIC_ALGOLIA_INDEX_NAME as string; - -const Container = styled.div` - .DocSearch-Button { - border-radius: 4px; - border: 1px solid ${tm(({ colors }) => colors.codeBlockBorder)}; - width: 200px; - font-size: 15px; - font-weight: 300; - } - - .DocSearch-Button-Keys { - display: none; - } - - display: flex; - --docsearch-searchbox-shadow-custom: ${tm( - ({ colors }) => colors.searchShadow - )}; - --docsearch-searchbox-background: ${tm(({ colors }) => colors.neutral0)}; - --docsearch-primary-color: ${tm(({ colors }) => colors.accent700)}; - --docsearch-text-color: ${tm(({ colors }) => colors.neutral800)}; - --docsearch-searchbox-focus-background: ${tm( - ({ colors }) => colors.neutral0 - )}; - --docsearch-highlight-color: var(--docsearch-primary-color); - --docsearch-muted-color: var(--docsearch-text-color); - --docsearch-searchbox-shadow: inset 0 0 0 2px - var(--docsearch-searchbox-shadow-custom); - --docsearch-spacing: 12px; - - ${tmSelectors.dark} { - --docsearch-searchbox-background: ${tmDark( - ({ colors }) => colors.neutral0 - )}; - --docsearch-primary-color: ${tmDark(({ colors }) => colors.accent700)}; - --docsearch-text-color: ${tmDark(({ colors }) => colors.neutral800)}; - --docsearch-searchbox-focus-background: ${tmDark( - ({ colors }) => colors.neutral0 - )}; - --docsearch-searchbox-shadow-custom: ${tmDark( - ({ colors }) => colors.searchShadow - )}; - } - ${media.mqDark} { - ${tmSelectors.auto} { - --docsearch-searchbox-background: ${tmDark( - ({ colors }) => colors.neutral0 - )}; - --docsearch-primary-color: ${tmDark(({ colors }) => colors.accent700)}; - --docsearch-text-color: ${tmDark(({ colors }) => colors.neutral800)}; - --docsearch-searchbox-focus-background: ${tmDark( - ({ colors }) => colors.neutral0 - )}; - --docsearch-searchbox-shadow-custom: ${tmDark( - ({ colors }) => colors.searchShadow - )}; - } - } - .landing & { - visibility: hidden; - } -`; - -const Searching = () => { - return ( - - - {/** - * By adding this snippet to the head, we can hint the browser that the website will load data from Algolia, - * and allows it to preconnect to the DocSearch cluster. It makes the first query faster, - * especially on mobile. - * - * But we don't want to affect landing pages where we don't use searching. So we adding this only on pages - * where we actually using this - */} - - - - - ); -}; - -export default Searching; diff --git a/docs/src/components/Section.tsx b/docs/src/components/Section.tsx deleted file mode 100644 index 1c531dfc8e5..00000000000 --- a/docs/src/components/Section.tsx +++ /dev/null @@ -1,42 +0,0 @@ -import React from "react"; -import { styled } from "linaria/react"; -import { media } from "../themes"; - -const Container = styled.section` - width: 100%; - box-sizing: border-box; - position: relative; - padding: 0 24px; - max-width: 960px; - ${media.md} { - padding: 0; - } - &.clear-padding { - padding: unset; - max-width: unset; - } -`; - -type Props = React.PropsWithChildren<{ - clearPadding?: boolean; - id?: string | number; -}>; - -const Section = ({ children, clearPadding = false, id }: Props) => { - const containerProps = { - // eslint-disable-next-line - [id ? "id" : ""]: id, - }; - delete containerProps[""]; - - return ( - - {children} - - ); -}; - -export default Section; diff --git a/docs/src/components/Sidebar.tsx b/docs/src/components/Sidebar.tsx deleted file mode 100644 index 7e6516f780b..00000000000 --- a/docs/src/components/Sidebar.tsx +++ /dev/null @@ -1,214 +0,0 @@ -import React from "react"; -import { useRouter } from "next/router"; -import Link from "next/link"; - -import { styled } from "linaria/react"; -import { media, tm, tmDark, tmSelectors } from "../themes"; -import { IDocumentationSidebarStructure } from "./types"; - -interface Props { - elementsList: IDocumentationSidebarStructure; - closeSidebar?: () => void; -} - -const Container = styled.ul` - padding: 16px 0; - width: 100%; - display: flex; - flex-direction: column; - list-style-type: none; - color: ${tm(({ colors }) => colors.neutral800)}; - font-weight: 400; - font-size: 15px; - line-height: 28px; - letter-spacing: 0em; - - ${tmSelectors.dark} { - color: ${tmDark(({ colors }) => colors.neutral800)}; - } - ${media.mqDark} { - ${tmSelectors.auto} { - color: ${tmDark(({ colors }) => colors.neutral800)}; - } - } -`; - -const SidebarLinkWrapper = styled.a` - cursor: pointer; - width: 100%; - - &:hover { - color: ${tm(({ colors }) => colors.accent700)}; - } - - &[data-active="true"] { - color: ${tm(({ colors }) => colors.accent700)}; - &.heading { - border-left: 4px solid ${tm(({ colors }) => colors.transparent)}; - } - } - &[data-anchor="true"][data-active="true"] { - color: ${tm(({ colors }) => colors.accent700)}; - background-color: ${tm(({ colors }) => colors.accent200)}; - } - - ${tmSelectors.dark} { - &[data-active="true"] { - color: ${tmDark(({ colors }) => colors.accent700)}; - border-color: ${tmDark(({ colors }) => colors.accent700)}; - } - &[data-anchor="true"][data-active="true"] { - color: ${tmDark(({ colors }) => colors.accent700)}; - background-color: ${tmDark(({ colors }) => colors.accent200)}; - } - } - ${media.mqDark} { - ${tmSelectors.auto} { - &[data-active="true"] { - color: ${tmDark(({ colors }) => colors.accent700)}; - border-color: ${tmDark(({ colors }) => colors.accent700)}; - } - &[data-anchor="true"][data-active="true"] { - color: ${tmDark(({ colors }) => colors.accent700)}; - background-color: ${tmDark(({ colors }) => colors.accent200)}; - } - } - } -`; - -const SidebarItem = styled.li` - display: flex; - flex-direction: column; - & ${SidebarLinkWrapper} { - padding: 4px 28px; - &[data-active="true"] { - background-color: ${tm(({ colors }) => colors.accent200)}; - &.heading { - background-color: unset; - } - ${tmSelectors.dark} { - background-color: ${tmDark(({ colors }) => colors.accent200)}; - &.heading { - background-color: unset; - } - } - ${media.mqDark} { - ${tmSelectors.auto} { - background-color: ${tmDark(({ colors }) => colors.accent200)}; - &.heading { - background-color: unset; - } - } - } - } - } - &.group { - margin-top: 16px; - } -`; - -const SidebarHeading = styled.p` - font-weight: 700; - font-size: 17px; - line-height: 25px; - padding: 4px 32px; - border-left: 4px solid ${tm(({ colors }) => colors.transparent)}; - - &[data-child-active="true"] { - color: ${tm(({ colors }) => colors.accent700)}; - border-color: ${tm(({ colors }) => colors.accent700)}; - - ${tmSelectors.dark} { - color: ${tmDark(({ colors }) => colors.accent700)}; - border-color: ${tmDark(({ colors }) => colors.accent700)}; - } - ${media.mqDark} { - ${tmSelectors.auto} { - color: ${tmDark(({ colors }) => colors.accent700)}; - border-color: ${tmDark(({ colors }) => colors.accent700)}; - } - } - } -`; - -const SidebarSubLinksList = styled.ul` - display: flex; - flex-direction: column; - line-height: 28px; - list-style-type: none; - & li > a { - width: 100%; - display: block; - } - & ${SidebarLinkWrapper} { - padding: 0.5px 16px 0.5px 64px; - } -`; - -const Sidebar = ({ elementsList, closeSidebar }: Props) => { - const router = useRouter(); - return ( - - {elementsList?.map((sidebarItem) => { - const isLinkActive: boolean = - sidebarItem.href !== undefined && - router?.asPath.indexOf(sidebarItem.href) > -1; - const hasActiveChild = - sidebarItem?.children?.find( - (child) => - router?.asPath.replace(/\//g, "") === - child.href.replace(/\//g, "") - ) !== undefined; - return ( - - {sidebarItem.href !== undefined ? ( - - - {sidebarItem.label} - - - ) : ( - - {sidebarItem.label} - - )} - - {sidebarItem?.children && ( - - {sidebarItem.children.map((subItem) => { - const isSubLinkActive = - router?.asPath.replace(/\//g, "") === - subItem.href.replace(/\//g, ""); - - const isAnchor = subItem.href.includes("#"); - return ( - // eslint-disable-next-line -
  • - - - {subItem.label} - - -
  • - ); - })} -
    - )} -
    - ); - })} -
    - ); -}; - -export default Sidebar; diff --git a/docs/src/components/ThemeSwitchButton.tsx b/docs/src/components/ThemeSwitchButton.tsx deleted file mode 100644 index e473bde3395..00000000000 --- a/docs/src/components/ThemeSwitchButton.tsx +++ /dev/null @@ -1,101 +0,0 @@ -import React, { useContext } from "react"; -import { styled } from "linaria/react"; -import Image from "next/image"; -import { - media, - ThemeContext, - ThemesEnum, - tm, - tmDark, - tmSelectors, -} from "../themes"; -import ThemeSwitcher from "../assets/icons/theme-switcher.svg"; -import ThemeSwitcherDark from "../assets/icons/theme-switcher-dark.svg"; - -const ThemeButton = styled.button` - font-size: 15px; - line-height: 13px; - display: none; - justify-content: flex-end; - align-items: center; - background-color: ${tm(({ colors }) => colors.transparent)}; - color: ${tm(({ colors }) => colors.neutral900)}; - border: none; - cursor: pointer; - transform-origin: center; - min-width: 45px; - transition: transform ease-in-out 0.25s; - &:hover { - opacity: 0.8; - } - ${tmSelectors.dark} { - color: ${tmDark(({ colors }) => colors.autoThemeButton)}; - } - ${media.mqDark} { - ${tmSelectors.auto} { - color: ${tmDark(({ colors }) => colors.autoThemeButton)}; - } - } - ${media.md} { - display: flex; - } - &[data-mobile="true"] { - display: flex; - } -`; - -const ThemeIconWrapper = styled.div` - transition: transform ease-in-out 0.25s; - & > span { - display: none; - } - & > .theme-switcher { - position: relative; - bottom: -3px; - } - & > .light { - display: inline; - } - ${tmSelectors.dark} { - & > .light { - display: none; - } - & > .dark { - display: inline; - } - } - ${media.mqDark} { - ${tmSelectors.auto} { - & > .light { - display: none; - } - & > .dark { - display: inline; - } - } - } -`; - -const ThemeSwitchButton = ({ isMobile = false }: { isMobile?: boolean }) => { - const { theme, changeTheme } = useContext(ThemeContext); - - return ( - - {theme === ThemesEnum.AUTO && "A"} - - - theme-switcher - - - theme-switcher - - - - ); -}; - -export default ThemeSwitchButton; diff --git a/docs/src/components/landingBlocks/BuiltByBlock.stories.tsx b/docs/src/components/landingBlocks/BuiltByBlock.stories.tsx deleted file mode 100644 index c2bd776aa61..00000000000 --- a/docs/src/components/landingBlocks/BuiltByBlock.stories.tsx +++ /dev/null @@ -1,12 +0,0 @@ -import React from "react"; - -import BuiltByBlock from "./BuiltByBlock"; -import homepageContent from "../../content/home"; - -export default { - title: "Landing Blocks/Built by", -}; - -export const Default = () => ( - -); diff --git a/docs/src/components/landingBlocks/BuiltByBlock.tsx b/docs/src/components/landingBlocks/BuiltByBlock.tsx deleted file mode 100644 index d8fd9f3340a..00000000000 --- a/docs/src/components/landingBlocks/BuiltByBlock.tsx +++ /dev/null @@ -1,94 +0,0 @@ -import React from "react"; -import { styled } from "linaria/react"; -import Image from "next/image"; - -import Section from "../Section"; -import { media, tm, tmDark, tmSelectors } from "../../themes"; - -interface Props { - content: { title: string; imageUrl: string; imageDarkUrl: string }; -} - -const Container = styled.div` - margin-bottom: 234px; - text-align: center; - - ${media.md} { - margin-bottom: 195px; - display: flex; - justify-content: center; - align-items: center; - } - & .dark { - display: none; - } - ${tmSelectors.dark} { - & .light { - display: none; - } - & .dark { - display: inline; - } - } - ${media.mqDark} { - ${tmSelectors.auto} { - & .light { - display: none; - } - & .dark { - display: inline; - } - } - } -`; - -const Title = styled.h2` - margin-bottom: 16px; - font-size: 18px; - line-height: 40px; - font-weight: 400; - font-family: ChivoLight, sans-serif; - color: ${tm(({ colors }) => colors.neutral900)}; - ${tmSelectors.dark} { - color: ${tmDark(({ colors }) => colors.neutral900)}; - } - ${media.mqDark} { - ${tmSelectors.auto} { - color: ${tmDark(({ colors }) => colors.neutral900)}; - } - } - - ${media.md} { - margin-right: 22px; - margin-top: 10px; - font-size: 24px; - } -`; - -const BuiltByBlock = ({ content }: Props) => { - return ( -
    - - {content.title} - - Nomic Foundation logo - - - Nomic Foundation logo - - -
    - ); -}; - -export default BuiltByBlock; diff --git a/docs/src/components/landingBlocks/GetStartedBlock.stories.tsx b/docs/src/components/landingBlocks/GetStartedBlock.stories.tsx deleted file mode 100644 index 7f3293a7370..00000000000 --- a/docs/src/components/landingBlocks/GetStartedBlock.stories.tsx +++ /dev/null @@ -1,12 +0,0 @@ -import React from "react"; - -import homepageContent from "../../content/home"; -import GetStartedBlock from "./GetStartedBlock"; - -export default { - title: "Landing Blocks/Get Started", -}; - -export const Default = () => ( - -); diff --git a/docs/src/components/landingBlocks/GetStartedBlock.tsx b/docs/src/components/landingBlocks/GetStartedBlock.tsx deleted file mode 100644 index 5499267c3c7..00000000000 --- a/docs/src/components/landingBlocks/GetStartedBlock.tsx +++ /dev/null @@ -1,216 +0,0 @@ -import React from "react"; -import { styled } from "linaria/react"; -import Image from "next/image"; - -import { breakpoints, media, tm, tmDark, tmSelectors } from "../../themes"; -import useWindowSize from "../../hooks/useWindowSize"; -import CTA from "../ui/CTA"; -import Section from "../Section"; -import { CTAType } from "../ui/types"; -import bl from "../../assets/get-started/bl.svg"; -import br from "../../assets/get-started/br.svg"; - -interface Props { - content: { - title: string; - subtitle: string; - cta: CTAType; - }; -} - -const GetStartedBlockStyled = styled.section` - width: 100%; - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - padding: 64px 16px; - height: 724px; - overflow: hidden; - background-color: ${tm(({ colors }) => colors.neutral0)}; - position: relative; - margin: 48px 0; - ${media.md} { - margin: unset; - height: 792px; - } - ${tmSelectors.dark} { - background-color: ${tmDark(({ colors }) => colors.neutral0)}; - } - ${media.mqDark} { - ${tmSelectors.auto} { - background-color: ${tmDark(({ colors }) => colors.neutral0)}; - } - } -`; - -const StyledBackground = styled.div` - position: absolute; - left: 0; - top: 0; - background: ${tm( - ({ colors }) => - `linear-gradient(254.24deg, ${colors.complementary600} 0%, ${colors.accent100} 100%, ${colors.accent100} 100%)` - )}; - height: 100%; - width: 100%; - ${tmSelectors.dark} { - mix-blend-mode: color-dodge; - background: ${tmDark( - ({ colors }) => - `linear-gradient(254.24deg, ${colors.complementary600} 0%, ${colors.accent100} 100%, ${colors.accent100} 100%)` - )}; - } - ${media.mqDark} { - ${tmSelectors.auto} { - mix-blend-mode: color-dodge; - background: ${tmDark( - ({ colors }) => - `linear-gradient(254.24deg, ${colors.complementary600} 0%, ${colors.accent100} 100%, ${colors.accent100} 100%)` - )}; - } - } -`; - -const StyledTopGradient = styled.div` - width: 100%; - height: 50%; - top: 0; - left: 0; - position: absolute; - background: ${tm(({ colors }) => colors.getStartedTopBackground)}; - ${tmSelectors.dark} { - background: ${tmDark(({ colors }) => colors.getStartedTopBackground)}; - } - ${media.mqDark} { - ${tmSelectors.auto} { - background: ${tmDark(({ colors }) => colors.getStartedTopBackground)}; - } - } -`; - -const StyledBottomGradient = styled.div` - width: 100%; - height: 50%; - bottom: 0; - left: 0; - position: absolute; - background: ${tm(({ colors }) => colors.getStartedBottomBackground)}; - transform: rotate(180deg); - ${tmSelectors.dark} { - background: ${tmDark(({ colors }) => colors.getStartedBottomBackground)}; - } - ${media.mqDark} { - ${tmSelectors.auto} { - background: ${tmDark(({ colors }) => colors.getStartedBottomBackground)}; - } - } -`; - -const TextureBrickWrapper = styled.div` - position: absolute; - right: 0; - &.left { - left: 0; - right: auto; - } - ${tmSelectors.dark} { - filter: invert(0.5); - } - ${media.mqDark} { - ${tmSelectors.auto} { - filter: invert(0.5); - } - } -`; - -const ContentBlock = styled.section` - display: flex; - flex-direction: column; - align-items: center; - z-index: 1; - color: ${tm(({ colors }) => colors.neutral900)}; - ${tmSelectors.dark} { - color: ${tmDark(({ colors }) => colors.neutral900)}; - } - ${media.mqDark} { - ${tmSelectors.auto} { - color: ${tmDark(({ colors }) => colors.neutral900)}; - } - } -`; - -const Title = styled.h1` - font-family: ChivoBold, sans-serif; - font-weight: normal; - font-size: 39px; - line-height: 41px; - letter-spacing: -0.01em; - text-align: center; - max-width: 642px; - - ${media.md} { - font-size: 45px; - line-height: 50px; - letter-spacing: 0; - } -`; - -const Subtitle = styled.p` - font-family: ChivoLight, sans-serif; - font-size: 20px; - line-height: 31px; - letter-spacing: 0; - text-align: center; - margin-top: 24px; - margin-bottom: 48px; - ${media.md} { - font-size: 24px; - line-height: 40px; - margin-top: 32px; - margin-bottom: 64px; - } -`; - -const CTAWrapper = styled.div` - filter: drop-shadow(0px 1px 2px rgba(10, 10, 10, 0.1)) - drop-shadow(0px 8px 30px rgba(184, 113, 255, 0.1)); -`; - -const Background = () => { - const windowSize = useWindowSize(); - const isDesktop = breakpoints.md <= windowSize.width; - return ( - - {isDesktop && ( - - decorations - - )} - - decorations - - - - - ); -}; - -const GetStartedBlock = ({ content }: Props) => { - return ( -
    - - - - {content.title} - {content.subtitle} - - {content.cta.title} - - - -
    - ); -}; - -export default GetStartedBlock; diff --git a/docs/src/components/landingBlocks/HeroBlock.stories.tsx b/docs/src/components/landingBlocks/HeroBlock.stories.tsx deleted file mode 100644 index ae283d837e6..00000000000 --- a/docs/src/components/landingBlocks/HeroBlock.stories.tsx +++ /dev/null @@ -1,13 +0,0 @@ -import React from "react"; -import HeroBlock from "./HeroBlock"; -import homepageContent from "../../content/home"; - -const { heroBlockContent } = homepageContent; - -export default { - title: "Landing Blocks/Hero", -}; - -export const Default = () => { - return ; -}; diff --git a/docs/src/components/landingBlocks/HeroBlock.tsx b/docs/src/components/landingBlocks/HeroBlock.tsx deleted file mode 100644 index 5b30532280e..00000000000 --- a/docs/src/components/landingBlocks/HeroBlock.tsx +++ /dev/null @@ -1,118 +0,0 @@ -import React from "react"; -import { styled } from "linaria/react"; -import Section from "../Section"; -import CTA from "../ui/CTA"; -import { media, tm, tmDark, tmSelectors } from "../../themes"; -import { CTAType } from "../ui/types"; -import DesktopAnimation from "../DesktopAnimation"; -import MobileAnimation from "../MobileAnimation"; - -interface Props { - content: { - title: string; - tagline: string; - cta: CTAType; - }; -} - -const Container = styled.section` - width: 100%; - display: flex; - flex-direction: column; - margin-top: 40px; - color: ${tm(({ colors }) => colors.neutral900)}; - margin-bottom: 300px; - ${media.md} { - flex-direction: row; - justify-content: space-between; - margin-bottom: 280px; - } - ${tmSelectors.dark} { - color: ${tmDark(({ colors }) => colors.neutral900)}; - } - - ${media.mqDark} { - ${tmSelectors.auto} { - color: ${tmDark(({ colors }) => colors.neutral900)}; - } - } -`; - -const Block = styled.div` - width: 100%; - display: flex; - flex-direction: column; - padding: 0 0 24px; - min-height: 100px; - &.content { - z-index: 2; - } - & svg { - margin: 0 auto; - } - &.animation-container { - height: calc(100vh - 700px); - } - ${media.md} { - width: 40%; - &:first-child { - width: 60%; - } - padding: 0; - position: relative; - &.animation-container { - height: auto; - } - } -`; - -const TagLine = styled.span` - font-family: ChivoLight, sans-serif; - margin-bottom: 24px; - font-size: 22px; - line-height: 32px; - letter-spacing: -0.02em; - text-align: left; - ${media.md} { - font-size: 32px; - line-height: 32px; - letter-spacing: 0; - text-align: left; - margin-top: 32px; - } -`; - -const Title = styled.h1` - margin-bottom: 48px; - font-size: 40px; - line-height: 45px; - letter-spacing: -0.01em; - font-family: ChivoBold, sans-serif; - font-weight: normal; - ${media.md} { - margin-bottom: 64px; - font-size: 72px; - line-height: 72px; - letter-spacing: 0; - } -`; - -const HeroBlock = ({ content }: Props) => { - return ( -
    - - - {content.tagline} - {content.title} - {content.cta.title} - - - - - - -
    - ); -}; - -export default HeroBlock; diff --git a/docs/src/components/landingBlocks/ReviewsBlock.stories.tsx b/docs/src/components/landingBlocks/ReviewsBlock.stories.tsx deleted file mode 100644 index ae8360c59a4..00000000000 --- a/docs/src/components/landingBlocks/ReviewsBlock.stories.tsx +++ /dev/null @@ -1,12 +0,0 @@ -import React from "react"; - -import ReviewsBlock from "./ReviewsBlock"; -import homepageContent from "../../content/home"; - -export default { - title: "Landing Blocks/Reviews", -}; - -export const Default = () => ( - -); diff --git a/docs/src/components/landingBlocks/ReviewsBlock.tsx b/docs/src/components/landingBlocks/ReviewsBlock.tsx index 6d985676c2a..7845448c840 100644 --- a/docs/src/components/landingBlocks/ReviewsBlock.tsx +++ b/docs/src/components/landingBlocks/ReviewsBlock.tsx @@ -1,5 +1,5 @@ import React from "react"; -import Image from "next/image"; +import Image, { StaticImageData } from "next/image"; import { Carousel } from "react-responsive-carousel"; import { styled } from "linaria/react"; diff --git a/docs/src/components/landingBlocks/ToolsBlock.stories.tsx b/docs/src/components/landingBlocks/ToolsBlock.stories.tsx deleted file mode 100644 index ca7369c35ef..00000000000 --- a/docs/src/components/landingBlocks/ToolsBlock.stories.tsx +++ /dev/null @@ -1,12 +0,0 @@ -import React from "react"; - -import homepageContent from "../../content/home"; -import ToolsBlock from "./ToolsBlock"; - -export default { - title: "Landing Blocks/Hero", -}; - -export const Default = () => ( - -); diff --git a/docs/src/components/landingBlocks/ToolsBlock.styled.tsx b/docs/src/components/landingBlocks/ToolsBlock.styled.tsx deleted file mode 100644 index b19b643578b..00000000000 --- a/docs/src/components/landingBlocks/ToolsBlock.styled.tsx +++ /dev/null @@ -1,485 +0,0 @@ -import { styled } from "linaria/react"; -import { media, tm, tmDark, tmSelectors } from "../../themes"; - -const Container = styled.div` - margin-bottom: 162px; - display: flex; - flex-direction: column; - position: relative; - margin-top: 150px; - &:before { - width: 100%; - height: 32px; - top: -32px; - content: ""; - position: absolute; - background: ${tm(({ colors }) => colors.transparent)}; - border-top: 1px solid ${tm(({ colors }) => colors.toolsBlockBorder)}; - border-right: 1px solid ${tm(({ colors }) => colors.toolsBlockBorder)}; - ${tmSelectors.dark} { - border-color: ${tmDark(({ colors }) => colors.toolsBlockBorder)}; - } - ${media.mqDark} { - ${tmSelectors.auto} { - border-color: ${tmDark(({ colors }) => colors.toolsBlockBorder)}; - } - } - } - - &:after { - content: ""; - position: absolute; - height: 32px; - width: 100%; - right: 0; - bottom: -44px; - border-top: 1px solid ${tm(({ colors }) => colors.toolsBlockBorder)}; - border-right: 1px solid ${tm(({ colors }) => colors.toolsBlockBorder)}; - transform: rotate(180deg); - ${tmSelectors.dark} { - border-color: ${tmDark(({ colors }) => colors.toolsBlockBorder)}; - } - ${media.mqDark} { - ${tmSelectors.auto} { - border-color: ${tmDark(({ colors }) => colors.toolsBlockBorder)}; - } - } - } - - ${media.md} { - flex-direction: row; - margin-bottom: 200px; - margin-top: 150px; - - &:before { - width: 36px; - height: 100%; - border-left: 1px solid ${tm(({ colors }) => colors.toolsBlockBorder)}; - border-bottom: 1px solid ${tm(({ colors }) => colors.toolsBlockBorder)}; - border-right: none; - top: 0; - ${tmSelectors.dark} { - border-color: ${tmDark(({ colors }) => colors.toolsBlockBorder)}; - } - ${media.mqDark} { - ${tmSelectors.auto} { - border-color: ${tmDark(({ colors }) => colors.toolsBlockBorder)}; - } - } - } - - &:after { - top: 0; - width: 36px; - height: 100%; - bottom: unset; - border-left: 1px solid ${tm(({ colors }) => colors.toolsBlockBorder)}; - border-bottom: 1px solid ${tm(({ colors }) => colors.toolsBlockBorder)}; - border-right: none; - ${tmSelectors.dark} { - border-color: ${tmDark(({ colors }) => colors.toolsBlockBorder)}; - } - ${media.mqDark} { - ${tmSelectors.auto} { - border-color: ${tmDark(({ colors }) => colors.toolsBlockBorder)}; - } - } - } - } -`; - -const ToolsIconsBlock = styled.div` - position: relative; - padding-bottom: 40px; - - &:before { - position: absolute; - content: ""; - width: 172px; - height: 1px; - left: calc(50% - 86px); - bottom: 0; - background: ${tm(({ colors }) => colors.toolsBlockBorder)}; - ${tmSelectors.dark} { - background: ${tmDark(({ colors }) => colors.toolsBlockBorder)}; - } - ${media.mqDark} { - ${tmSelectors.auto} { - background: ${tmDark(({ colors }) => colors.toolsBlockBorder)}; - } - } - } - - &:after { - position: absolute; - content: ""; - bottom: -5px; - right: calc(50% - 5px); - width: 10px; - height: 10px; - background: ${tm(({ colors }) => colors.neutral0)}; - border-top: 1px solid ${tm(({ colors }) => colors.toolsBlockBorder)}; - border-left: 1px solid ${tm(({ colors }) => colors.toolsBlockBorder)}; - transform: translateY(0) rotate(225deg); - ${tmSelectors.dark} { - background: ${tmDark(({ colors }) => colors.neutral0)}; - border-color: ${tmDark(({ colors }) => colors.toolsBlockBorder)}; - } - ${media.mqDark} { - ${tmSelectors.auto} { - background: ${tmDark(({ colors }) => colors.neutral0)}; - border-color: ${tmDark(({ colors }) => colors.toolsBlockBorder)}; - } - } - } - - ${media.md} { - width: 50%; - padding: 40px; - - &:before { - right: 0; - top: calc(50% - 116px); - left: unset; - height: 232px; - width: 1px; - background: ${tm(({ colors }) => colors.toolsBlockBorder)}; - ${tmSelectors.dark} { - background: ${tmDark(({ colors }) => colors.toolsBlockBorder)}; - } - ${media.mqDark} { - ${tmSelectors.auto} { - background: ${tmDark(({ colors }) => colors.toolsBlockBorder)}; - } - } - } - - &:after { - top: calc(50% - 5px); - right: -5px; - bottom: unset; - transform: rotate(135deg); - } - } -`; - -const IconsBlockTitle = styled.h2` - margin-bottom: 24px; - font-family: ChivoRegular, sans-serif; - font-weight: 400; - font-size: 20px; - line-height: 24px; - letter-spacing: 4px; - text-transform: uppercase; - color: ${tm(({ colors }) => colors.neutral900)}; - ${tmSelectors.dark} { - color: ${tmDark(({ colors }) => colors.neutral900)}; - } - ${media.mqDark} { - ${tmSelectors.auto} { - color: ${tmDark(({ colors }) => colors.neutral900)}; - } - } -`; - -const ButtonsContainer = styled.div` - height: 208px; - display: grid; - grid-template-columns: 1fr 1fr; - grid-row-gap: 12px; - justify-content: space-around; -`; - -const ButtonContainer = styled.div` - position: relative; - height: 88px; - max-width: 162px; - width: 100%; - justify-self: center; - padding: 12px 0 12px 6px; - display: flex; - border-radius: 4px; - align-items: center; - white-space: nowrap; - cursor: pointer; - transition: all 0.1s ease-in-out; - - &.active { - box-shadow: 6px -2px 10px ${tm(({ colors }) => colors.toolsBoxShadow1)}, - -6px 2px 10px ${tm(({ colors }) => colors.toolsBoxShadow2)}; - } - - & svg { - width: 48px; - height: 48px; - transition: all 0.2s ease-out; - border-radius: 8px; - padding: 8px; - box-shadow: 0 1px 2px ${tm(({ colors }) => colors.sliderButtonHoverShadow)}; - - &.active { - transform-origin: center; - transform: scale(1.15); - box-shadow: 0 1px 2px ${tm(({ colors }) => colors.transparent)}; - padding: 0px; - } - } - - ${media.md} { - & svg { - width: 72px; - height: 72px; - &.active { - width: 72px; - height: 72px; - padding: 0px; - transform: scale(1); - } - } - } - .dark { - display: none; - } - - ${tmSelectors.dark} { - .light { - display: none; - } - .dark { - display: inline; - } - &.active { - box-shadow: 0px 1px 8px ${tm(({ colors }) => colors.toolsBoxShadowDark)}; - } - & svg { - box-shadow: 0px 1px 8px ${tm(({ colors }) => colors.toolsBoxShadowDark)}; - &.active { - box-shadow: 0 1px 2px ${tm(({ colors }) => colors.transparent)}; - } - } - } - ${media.mqDark} { - ${tmSelectors.auto} { - .light { - display: none; - } - .dark { - display: inline; - } - &.active { - box-shadow: 0px 1px 8px ${tm(({ colors }) => colors.toolsBoxShadowDark)}; - } - & svg { - box-shadow: 0px 1px 8px ${tm(({ colors }) => colors.toolsBoxShadowDark)}; - &.active { - box-shadow: 0 1px 2px ${tm(({ colors }) => colors.transparent)}; - } - } - } - } -`; - -const ButtonNameContainer = styled.div` - margin-left: 16px; -`; - -const ButtonCompanyName = styled.span` - font-size: 14px; - font-family: ChivoLight, sans-serif; - color: ${tm(({ colors }) => colors.neutral600)}; - font-weight: 800; - ${tmSelectors.dark} { - color: ${tmDark(({ colors }) => colors.neutral600)}; - } - ${media.mqDark} { - ${tmSelectors.auto} { - color: ${tmDark(({ colors }) => colors.neutral600)}; - } - } -`; - -const ButtonToolName = styled.span` - height: 24px; - font-size: 15px; - font-family: ChivoLight, sans-serif; - color: ${tm(({ colors }) => colors.neutral900)}; - line-height: 24px; - font-weight: 800; - ${tmSelectors.dark} { - color: ${tmDark(({ colors }) => colors.neutral900)}; - } - ${media.mqDark} { - ${tmSelectors.auto} { - color: ${tmDark(({ colors }) => colors.neutral900)}; - } - } -`; - -const DescriptionContainer = styled.div` - margin-top: 52px; - padding: 0 24px; - - ${media.md} { - width: 50%; - padding: 0 50px; - } -`; - -const DescriptionHeaderContainer = styled.div` - display: flex; - flex-direction: column; - align-items: flex-start; - margin-bottom: 16px; - font-family: ChivoLight, sans-serif; - font-weight: 600; - - ${media.md} { - flex-direction: row; - } -`; - -const DescriptionTitle = styled.h3` - margin-bottom: 8px; - font-size: 24px; - white-space: nowrap; - line-height: 32px; - color: ${tm(({ colors }) => colors.neutral600)}; - ${tmSelectors.dark} { - color: ${tmDark(({ colors }) => colors.neutral600)}; - } - ${media.mqDark} { - ${tmSelectors.auto} { - color: ${tmDark(({ colors }) => colors.neutral600)}; - } - } -`; - -const DescriptionTitleTool = styled.span` - color: ${tm(({ colors }) => colors.neutral900)}; - ${tmSelectors.dark} { - color: ${tmDark(({ colors }) => colors.neutral900)}; - } - ${media.mqDark} { - ${tmSelectors.auto} { - color: ${tmDark(({ colors }) => colors.neutral900)}; - } - } -`; - -const DescriptionMottoContainer = styled.div` - padding: 0 12px; - height: 27px; - font-size: 13px; - text-transform: uppercase; - line-height: 27px; - letter-spacing: 1px; - font-family: ChivoLight, sans-serif; - font-weight: 600; - color: ${tm(({ colors }) => colors.neutral600)}; - border-radius: 8px 0; - ${tmSelectors.dark} { - color: ${tmDark(({ colors }) => colors.neutral600)}; - } - ${media.mqDark} { - ${tmSelectors.auto} { - color: ${tmDark(({ colors }) => colors.neutral600)}; - } - } - - &.runner { - background-color: ${tm(({ colors }) => colors.mottoRunnerBackground)}; - } - - &.network { - background-color: ${tm(({ colors }) => colors.mottoNetworkBackground)}; - } - - &.ignition { - background-color: ${tm(({ colors }) => colors.mottoIgnitionBackground)}; - } - - &.vscode { - background-color: ${tm(({ colors }) => colors.mottoVscodeBackground)}; - } - - ${media.md} { - margin-left: 24px; - } -`; - -const DescriptionText = styled.p` - margin-bottom: 24px; - width: 100%; - font-size: 15px; - line-height: 28px; - font-family: ChivoLight, sans-serif; - color: ${tm(({ colors }) => colors.neutral600)}; - ${tmSelectors.dark} { - color: ${tmDark(({ colors }) => colors.neutral600)}; - } - ${media.mqDark} { - ${tmSelectors.auto} { - color: ${tmDark(({ colors }) => colors.neutral600)}; - } - } -`; - -const DescriptionLink = styled.a` - position: relative; - font-size: 15px; - font-weight: 500; - color: ${tm(({ colors }) => colors.neutral600)}; - &:hover { - opacity: 0.8; - } - ${tmSelectors.dark} { - color: ${tmDark(({ colors }) => colors.neutral600)}; - } - ${media.mqDark} { - ${tmSelectors.auto} { - color: ${tmDark(({ colors }) => colors.neutral600)}; - } - } - - &:after { - content: ""; - position: absolute; - width: 7px; - height: 7px; - background: ${tm(({ colors }) => colors.transparent)}; - border-top: 1px solid ${tm(({ colors }) => colors.neutral600)}; - border-left: 1px solid ${tm(({ colors }) => colors.neutral600)}; - right: -18px; - top: calc(50% - 3px); - transform: rotate(135deg); - transition: all 0.1s ease-in-out; - ${tmSelectors.dark} { - border-color: ${tmDark(({ colors }) => colors.neutral600)}; - } - ${media.mqDark} { - ${tmSelectors.auto} { - border-color: ${tmDark(({ colors }) => colors.neutral600)}; - } - } - } -`; - -const ToolsBlockStyled = { - Container, - ToolsIconsBlock, - IconsBlockTitle, - ButtonsContainer, - ButtonContainer, - ButtonNameContainer, - ButtonCompanyName, - ButtonToolName, - DescriptionContainer, - DescriptionHeaderContainer, - DescriptionTitle, - DescriptionTitleTool, - DescriptionMottoContainer, - DescriptionText, - DescriptionLink, -}; - -export default ToolsBlockStyled; diff --git a/docs/src/components/landingBlocks/ToolsBlock.tsx b/docs/src/components/landingBlocks/ToolsBlock.tsx deleted file mode 100644 index e45c498f65c..00000000000 --- a/docs/src/components/landingBlocks/ToolsBlock.tsx +++ /dev/null @@ -1,184 +0,0 @@ -import { useRouter } from "next/router"; -import React, { useEffect, useState } from "react"; -import { toolRegExp } from "../../config"; - -import Section from "../Section"; -import { Tools } from "../ui/types"; -import ToolsBlockStyled from "./ToolsBlock.styled"; - -const { - Container, - ButtonContainer, - ButtonNameContainer, - ButtonCompanyName, - ButtonToolName, - ButtonsContainer, - DescriptionContainer, - DescriptionHeaderContainer, - DescriptionTitle, - DescriptionMottoContainer, - DescriptionTitleTool, - DescriptionText, - ToolsIconsBlock, - IconsBlockTitle, - DescriptionLink, -} = ToolsBlockStyled; - -interface InfoItem { - icon: React.FC; - iconDark: React.FC; - title: string; - value: Tools; - mottos: string[]; - description: string; - link: string; -} -interface BlockProps { - content: { - title: string; - companyName: string; - infoItems: InfoItem[]; - }; -} - -interface ToolProps { - content: - | { - icon: React.FC; - iconDark: React.FC; - title: string; - value: Tools; - mottos: string[]; - description: string; - link: string; - } - | undefined; - companyName: string; -} - -const ToolDescription = ({ content, companyName }: ToolProps) => { - const [currentMotto, setCurrentMotto] = useState( - (content && content.mottos[0]) || "" - ); - const [currentMottoClassname, setCurrentMottoClassname] = useState("runner"); - - useEffect(() => { - const timer = setTimeout(() => { - if (currentMotto && content) { - let currentIndex = content.mottos.findIndex( - (item) => item === currentMotto - ); - if (currentIndex + 1 === content.mottos.length) { - currentIndex = 0; - } else { - currentIndex += 1; - } - setCurrentMotto(content.mottos[currentIndex]); - } - }, 2000); - return () => { - clearTimeout(timer); - }; - // eslint-disable-next-line - }, [currentMotto]); - - useEffect(() => { - if (content) { - setCurrentMotto(content.mottos[0]); - switch (content.value) { - case Tools.RUNNER: { - setCurrentMottoClassname("runner"); - break; - } - case Tools.NETWORK: { - setCurrentMottoClassname("network"); - break; - } - case Tools.IGNITION: { - setCurrentMottoClassname("ignition"); - break; - } - case Tools.SOLIDITY: { - setCurrentMottoClassname("vscode"); - break; - } - default: { - setCurrentMottoClassname("runner"); - } - } - } - }, [content]); - - return content ? ( - - - - {companyName} - {` ${content.title}`} - - - # {currentMotto} - - -
    - {content.description} - Learn more -
    -
    - ) : null; -}; - -const ToolsBlock = ({ content }: BlockProps) => { - const [selectedTool, setSelectedTool] = useState(Tools.RUNNER); - const router = useRouter(); - - useEffect(() => { - const queryTool = toolRegExp.exec(router.asPath); - if (!queryTool) return; - const tool = queryTool[0].replace("tool=", "") as Tools; - setSelectedTool(tool); - }, [router.asPath]); - - return ( -
    - - - {content.title} - - {content.infoItems.map((button) => ( - setSelectedTool(button.value)} - key={button.value} - className={selectedTool === button.value ? "active" : ""} - > - - - - {content.companyName} -
    - {button.title} -
    -
    - ))} -
    -
    - item.value === selectedTool - )} - companyName={content.companyName} - /> -
    -
    - ); -}; - -export default ToolsBlock; diff --git a/docs/src/components/landingBlocks/TrustedTeamsBlock.stories.tsx b/docs/src/components/landingBlocks/TrustedTeamsBlock.stories.tsx deleted file mode 100644 index 940240a9064..00000000000 --- a/docs/src/components/landingBlocks/TrustedTeamsBlock.stories.tsx +++ /dev/null @@ -1,12 +0,0 @@ -import React from "react"; - -import TrustedTeamsBlock from "./TrustedTeamsBlock"; -import homepageContent from "../../content/home"; - -export default { - title: "Landing Blocks/Trusted teams", -}; - -export const Default = () => ( - -); diff --git a/docs/src/components/landingBlocks/TrustedTeamsBlock.tsx b/docs/src/components/landingBlocks/TrustedTeamsBlock.tsx deleted file mode 100644 index 0cdc6b3a68b..00000000000 --- a/docs/src/components/landingBlocks/TrustedTeamsBlock.tsx +++ /dev/null @@ -1,216 +0,0 @@ -import React, { useMemo } from "react"; -import { styled } from "linaria/react"; -import Image from "next/image"; - -import { - TrustedTeamsLogos, - TrustedTeamsLogosDark, -} from "../../assets/trustedTeamsLogos/logos"; - -import { media, tm, tmDark, tmSelectors } from "../../themes"; -import Section from "../Section"; - -interface Props { - content: { title: string }; -} - -const Container = styled.section` - width: 100%; - margin-bottom: 120px; - display: flex; - flex-direction: column; - overflow: hidden; - ${media.md} { - margin-top: 40px; - } -`; - -const Title = styled.h2` - padding: 16px 20px; - margin-bottom: 48px; - text-align: center; - font-size: 28px; - line-height: 32px; - font-weight: 400; - letter-spacing: -0.01em; - font-family: ChivoBold, sans-serif; - font-weight: normal; - color: ${tm(({ colors }) => colors.neutral900)}; - ${tmSelectors.dark} { - color: ${tmDark(({ colors }) => colors.neutral900)}; - } - ${media.mqDark} { - ${tmSelectors.auto} { - color: ${tmDark(({ colors }) => colors.neutral900)}; - } - } - - ${media.md} { - margin-bottom: 88px; - font-size: 45px; - line-height: 50px; - letter-spacing: initial; - } -`; - -const LogosContainer = styled.div` - display: flex; - flex-direction: column; - &.dark { - display: none; - } - ${tmSelectors.dark} { - &.dark { - display: flex; - } - &.light { - display: none; - } - } - ${media.mqDark} { - ${tmSelectors.auto} { - &.dark { - display: flex; - } - &.light { - display: none; - } - } - } -`; - -const LogosRowContainer = styled.div` - display: flex; - width: 10000px; - - &:nth-child(-n + 3) { - display: none; - } - - ${media.md} { - &:nth-child(-n + 3) { - display: initial; - } - &:nth-last-child(-n + 5) { - display: none; - } - } -`; - -const LogosSubrowContainer = styled.div` - height: 72px; - display: flex; - align-items: center; - animation-duration: 50s; - animation-name: marquee; - animation-timing-function: linear; - animation-iteration-count: infinite; - animation-direction: initial; - float: left; - - &[data-reverted="true"] { - animation-direction: reverse; - } - - &.changed-speed { - animation-duration: 32s; - } - - ${media.md} { - height: 67px; - margin-bottom: 32px; - } - - .image-wrapper { - width: 100%; - margin: 0 20px; - height: 67px; - - ${media.md} { - height: initial; - margin: 0 50px; - } - } - - @keyframes marquee { - 0% { - transform: translateX(0); - } - - 100% { - transform: translateX(-100%); - } - } -`; - -const createLogosRows = ( - logosArray: Array<{ img: string; alt: string }>, - rowsAmount: number -) => { - const logosInRowAmount = Math.floor(logosArray.length / rowsAmount); - const logosRows = []; - - for (let i = 0; i < rowsAmount; i += 1) { - const rowImages = logosArray - .slice( - i * logosInRowAmount, - (i + 1) * logosInRowAmount - // eslint-disable-next-line - ) - .map((logo) => ( -
    - {logo.alt} -
    - )); - - logosRows.push( - - - {rowImages} - - - {rowImages} - - - ); - } - return logosRows; -}; - -const TrustedTeamsBlock = ({ content }: Props) => { - const threeRows = useMemo(() => createLogosRows(TrustedTeamsLogos, 3), []); - const fiveRows = useMemo(() => createLogosRows(TrustedTeamsLogos, 5), []); - - const threeRowsDark = useMemo( - () => createLogosRows(TrustedTeamsLogosDark, 3), - [] - ); - const fiveRowsDark = useMemo( - () => createLogosRows(TrustedTeamsLogosDark, 5), - [] - ); - - return ( -
    - - {content.title} - - {threeRows} - {fiveRows} - - - {threeRowsDark} - {fiveRowsDark} - - -
    - ); -}; - -export default TrustedTeamsBlock; diff --git a/docs/src/components/landingBlocks/VibrantCommunityBlock.stories.tsx b/docs/src/components/landingBlocks/VibrantCommunityBlock.stories.tsx deleted file mode 100644 index 0b73ca4c51b..00000000000 --- a/docs/src/components/landingBlocks/VibrantCommunityBlock.stories.tsx +++ /dev/null @@ -1,14 +0,0 @@ -import React from "react"; - -import VibrantCommunityBlock from "./VibrantCommunityBlock"; -import homepageContent from "../../content/home"; - -export default { - title: "Landing Blocks/Vibrant community", -}; - -export const Default = () => ( - -); diff --git a/docs/src/components/landingBlocks/VibrantCommunityBlock.tsx b/docs/src/components/landingBlocks/VibrantCommunityBlock.tsx deleted file mode 100644 index 9fa23b02589..00000000000 --- a/docs/src/components/landingBlocks/VibrantCommunityBlock.tsx +++ /dev/null @@ -1,228 +0,0 @@ -import React from "react"; -import { styled } from "linaria/react"; -import Image from "next/image"; - -import { media, tm, tmDark, tmSelectors } from "../../themes"; -import CTA from "../ui/CTA"; -import Section from "../Section"; -import { CTAType } from "../ui/types"; - -interface Props { - content: { - title: string; - text: string; - imageUrl: string; - imageDarkUrl: string; - cta: CTAType; - }; -} - -const CardWrapper = styled.section` - margin: 96px 24px 0; - - ${media.md} { - margin: 0 75px 50px 85px; - } -`; - -const Container = styled.div` - padding-top: 72%; - width: 100%; - display: flex; - position: relative; - flex-direction: column; - ${media.md} { - padding: 0; - flex-direction: row-reverse; - justify-content: space-between; - padding: 0 150px; - } - box-shadow: 0 6px 50px ${tm(({ colors }) => colors.vibrantBoxShadow)}; - background-color: ${tm(({ colors }) => colors.vibrantBackground)}; - ${tmSelectors.dark} { - box-shadow: 0 6px 50px ${tmDark(({ colors }) => colors.vibrantBoxShadow)}; - background-color: ${tmDark(({ colors }) => colors.vibrantBackground)}; - } - ${media.mqDark} { - ${tmSelectors.auto} { - box-shadow: 0 6px 50px ${tmDark(({ colors }) => colors.vibrantBoxShadow)}; - background-color: ${tmDark(({ colors }) => colors.vibrantBackground)}; - } - } -`; - -const Wrapper = styled.div` - display: flex; - flex-direction: column; - ${media.md} { - width: 477px; - margin: 110px 0 40px; - } -`; - -const ImageContainer = styled.div` - width: 110%; - height: 100%; - position: absolute; - height: auto; - transform: translateX(-4%); - top: -16px; - & .img { - position: relative !important; - height: unset !important; - } - & span { - padding: 0 !important; - } - - ${media.md} { - margin-top: 43px; - width: 530px; - max-height: none; - height: 366px; - position: relative; - top: 0; - left: 0; - transform: scale(1); - } - &.dark { - display: none; - } - ${tmSelectors.dark} { - &.dark { - display: block; - } - &.light { - display: none; - } - } - ${media.mqDark} { - ${tmSelectors.auto} { - &.dark { - display: block; - } - &.light { - display: none; - } - } - } -`; - -const Title = styled.h2` - margin-top: 36px; - margin-bottom: 24px; - text-align: center; - font-size: 20px; - line-height: 24px; - text-transform: uppercase; - letter-spacing: 0.2em; - font-weight: 400; - color: ${tm(({ colors }) => colors.neutral900)}; - ${media.md} { - margin-top: 0px; - text-align: left; - } - ${tmSelectors.dark} { - color: ${tmDark(({ colors }) => colors.neutral900)}; - } - ${media.mqDark} { - ${tmSelectors.auto} { - color: ${tmDark(({ colors }) => colors.neutral900)}; - } - } -`; - -const Text = styled.p` - margin: 0 8px 32px; - text-align: center; - font-size: 18px; - line-height: 28px; - font-weight: 400; - font-family: ChivoLight, sans-serif; - color: ${tm(({ colors }) => colors.neutral600)}; - - ${media.md} { - margin: 0 0 82px; - text-align: left; - } - ${tmSelectors.dark} { - color: ${tmDark(({ colors }) => colors.neutral600)}; - } - ${media.mqDark} { - ${tmSelectors.auto} { - color: ${tm(({ colors }) => colors.neutral600)}; - } - } -`; - -const ButtonWrapper = styled.div` - width: 232px; - margin-bottom: 48px; - align-self: center; - font-size: 15px; - line-height: 24px; - font-weight: 400; - font-family: ChivoRegular, sans-serif; - color: ${tm(({ colors }) => colors.neutral900)}; - & > a { - font-size: 15px; - } - - ${media.md} { - align-self: start; - } - ${tmSelectors.dark} { - color: ${tmDark(({ colors }) => colors.neutral900)}; - } - ${media.mqDark} { - ${tmSelectors.auto} { - color: ${tm(({ colors }) => colors.neutral900)}; - } - } -`; - -const VibrantCommunityBlock = ({ content }: Props) => { - return ( -
    - - - - Vibrant community image - - - Vibrant community image - - - {content.title} - {content.text} - - - {content.cta.title} - - - - - -
    - ); -}; - -export default VibrantCommunityBlock; diff --git a/docs/src/components/landingBlocks/WhyHardhatBlock.stories.tsx b/docs/src/components/landingBlocks/WhyHardhatBlock.stories.tsx deleted file mode 100644 index 94a3a4c0312..00000000000 --- a/docs/src/components/landingBlocks/WhyHardhatBlock.stories.tsx +++ /dev/null @@ -1,12 +0,0 @@ -import React from "react"; - -import homepageContent from "../../content/home"; -import WhyHardhatBlock from "./WhyHardhatBlock"; - -export default { - title: "Landing Blocks/Why Hardhat", -}; - -export const Default = () => ( - -); diff --git a/docs/src/components/landingBlocks/WhyHardhatBlock.tsx b/docs/src/components/landingBlocks/WhyHardhatBlock.tsx deleted file mode 100644 index 76a10813147..00000000000 --- a/docs/src/components/landingBlocks/WhyHardhatBlock.tsx +++ /dev/null @@ -1,114 +0,0 @@ -import React from "react"; -import { styled } from "linaria/react"; - -import Section from "../Section"; -import { media, tm, tmDark, tmSelectors } from "../../themes"; - -type Props = React.PropsWithChildren<{ - content: { title: string }; -}>; - -const Container = styled.section` - width: 100%; - position: relative; - display: flex; - flex-direction: column; - border-left: 1px solid ${tm(({ colors }) => colors.neutral400)}; - padding-top: 52px; - ${media.md} { - border-left: unset; - border-top: 1px solid ${tm(({ colors }) => colors.neutral400)}; - } - ${tmSelectors.dark} { - border-color: ${tmDark(({ colors }) => colors.neutral400)}; - } - ${media.mqDark} { - ${tmSelectors.auto} { - border-color: ${tmDark(({ colors }) => colors.neutral400)}; - } - } -`; - -const Title = styled.h2` - position: absolute; - padding: 24px; - background-color: ${tm(({ colors }) => colors.neutral0)}; - color: ${tm(({ colors }) => colors.neutral900)}; - left: 0; - top: 0; - transform: translateY(-50%); - text-transform: uppercase; - font-size: 20px; - font-style: normal; - font-weight: 400; - line-height: 24px; - letter-spacing: 0.2em; - margin-bottom: 32px; - ${media.md} { - left: 50%; - transform: translate(-50%, -50%); - font-size: 24px; - } - ${tmSelectors.dark} { - background-color: ${tmDark(({ colors }) => colors.neutral0)}; - color: ${tmDark(({ colors }) => colors.neutral900)}; - } - ${media.mqDark} { - ${tmSelectors.auto} { - background-color: ${tmDark(({ colors }) => colors.neutral0)}; - color: ${tmDark(({ colors }) => colors.neutral900)}; - } - } -`; - -const TopBrackets = styled.div` - position: absolute; - top: 0; - left: 24px; - width: calc(100% - 24px); - height: 32px; - border-top: 1px solid ${tm(({ colors }) => colors.neutral400)}; - border-left: 1px solid ${tm(({ colors }) => colors.neutral400)}; - border-right: 1px solid ${tm(({ colors }) => colors.neutral400)}; - ${media.md} { - height: 36px; - border-top: none; - width: 100%; - border-top: none; - left: 0; - } - ${tmSelectors.dark} { - border-color: ${tmDark(({ colors }) => colors.neutral400)}; - } - ${media.mqDark} { - ${tmSelectors.auto} { - border-color: ${tmDark(({ colors }) => colors.neutral400)}; - } - } -`; -const BottomBrackets = styled.div` - position: absolute; - left: 0px; - bottom: 0; - width: 32px; - height: 32px; - border-bottom: 1px solid ${tm(({ colors }) => colors.neutral400)}; - ${media.md} { - display: none; - } -`; - -const WhyHardhatBlock = ({ content, children }: Props) => { - return ( -
    - - - {content.title} - {children} - - -
    - ); -}; - -export default WhyHardhatBlock; diff --git a/docs/src/components/mdxComponents/Admonition.tsx b/docs/src/components/mdxComponents/Admonition.tsx deleted file mode 100644 index 0d90f98b344..00000000000 --- a/docs/src/components/mdxComponents/Admonition.tsx +++ /dev/null @@ -1,93 +0,0 @@ -import React from "react"; -import { styled } from "linaria/react"; -import { NextComponentType } from "next"; -import { tm, tmDark, tmSelectors, media } from "../../themes"; - -const StyledAdmonition = styled.div` - display: flex; - flex-direction: column; - width: 100%; - margin: 16px 0; - padding: 16px 24px; - background-color: ${tm(({ colors }) => colors.tipBackgroundColor)}; - border-left: 0.5rem solid ${tm(({ colors }) => colors.tipBorderColor)}; - font-size: 14px; - font-weight: 400; - line-height: 1.7; - color: ${tm(({ colors }) => colors.neutral800)}; - & .title { - font-size: 16px; - font-weight: 700; - } - &.warning { - & .title { - color: ${tm(({ colors }) => colors.warningColorTitle)}; - } - & p { - color: ${tm(({ colors }) => colors.warningColorText)}; - } - border-color: ${tm(({ colors }) => colors.warningBorderColor)}; - background-color: ${tm(({ colors }) => colors.warningBackgroundColor)}; - } - - ${tmSelectors.dark} { - background-color: ${tmDark(({ colors }) => colors.tipBackgroundColor)}; - color: ${tmDark(({ colors }) => colors.neutral900)}; - &.warning { - & .title { - color: ${tmDark(({ colors }) => colors.warningColorTitle)}; - } - & p { - color: ${tmDark(({ colors }) => colors.warningColorText)}; - } - border-color: ${tmDark(({ colors }) => colors.warningBorderColor)}; - background-color: ${tmDark( - ({ colors }) => colors.warningBackgroundColor - )}; - } - } - - ${media.mqDark} { - ${tmSelectors.auto} { - background-color: ${tmDark(({ colors }) => colors.tipBackgroundColor)}; - color: ${tmDark(({ colors }) => colors.neutral900)}; - &.warning { - & .title { - color: ${tmDark(({ colors }) => colors.warningColorTitle)}; - } - & p { - color: ${tmDark(({ colors }) => colors.warningColorText)}; - } - border-color: ${tmDark(({ colors }) => colors.warningBorderColor)}; - background-color: ${tmDark( - ({ colors }) => colors.warningBackgroundColor - )}; - } - } - } -`; - -const Tip: NextComponentType = ({ children }) => { - return ( - -

    TIP

    - {children} -
    - ); -}; - -const Warning: NextComponentType = ({ children }) => { - return ( - -

    WARNING

    - {children} -
    - ); -}; - -const Admonition = { - Tip, - Warning, -}; - -export default Admonition; diff --git a/docs/src/components/mdxComponents/Admonitions.stories.tsx b/docs/src/components/mdxComponents/Admonitions.stories.tsx deleted file mode 100644 index 8845f8386f5..00000000000 --- a/docs/src/components/mdxComponents/Admonitions.stories.tsx +++ /dev/null @@ -1,27 +0,0 @@ -import React from "react"; -import Admonition from "./Admonition"; -import { mdWrapper } from "../../../.storybook/common-decorators"; - -export default { - title: "MDX components/Admonition", - decorators: [mdWrapper], -}; - -export const Tip = () => ( - - Hardhat will let you know how, but, in case you missed it, you can install - them with - -); - -export const Warning = () => ( - - Do not send mainnet Ether to the addresses above. Those addresses are - deterministic: they are the same for all Hardhat users. Accordingly, the - private keys for these addresses are well known, so there are probably bots - monitoring those addresses on mainnet, waiting to withdraw any funds sent to - them. If you add any of these accounts to a wallet (eg Metamask), be very - careful to avoid sending any mainnet Ether to them: consider naming the - account something like Hardhat - Unsafe in order to prevent any mistakes. - -); diff --git a/docs/src/components/mdxComponents/CodeBlocks.stories.tsx b/docs/src/components/mdxComponents/CodeBlocks.stories.tsx index 6113bbb8032..b4c27ce3180 100644 --- a/docs/src/components/mdxComponents/CodeBlocks.stories.tsx +++ b/docs/src/components/mdxComponents/CodeBlocks.stories.tsx @@ -13,7 +13,7 @@ export const Pre = () => ( {` - $ npx hardhat + $ npx hardhat init 888 888 888 888 888 888 888 888 888 888 888 888 888 888 888 diff --git a/docs/src/components/mdxComponents/CodeBlocks.tsx b/docs/src/components/mdxComponents/CodeBlocks.tsx deleted file mode 100644 index 1ad8d9b3d5a..00000000000 --- a/docs/src/components/mdxComponents/CodeBlocks.tsx +++ /dev/null @@ -1,138 +0,0 @@ -import React from "react"; -import { styled } from "linaria/react"; -import { media, tm, tmDark, tmSelectors } from "../../themes"; - -export interface CodeProps { - children: string | JSX.Element[] | JSX.Element; -} - -export interface PreProps { - children: React.ReactElement; - className: string; -} - -const StyledCode = styled.code` - padding: 4px 8px; - background-color: ${tm(({ colors }) => colors.codeBackground)}; - border-radius: 3px; - font-size: 13.6px; - font-weight: 400; - line-height: 1; - color: ${tm(({ colors }) => colors.codeColor)}; - letter-spacing: 0.05em; - - &[data-language=""] { - font-family: source-code-pro, Menlo, Monaco, Consolas, Courier New, - monospace; - font-weight: normal; - } - - h1 &, - h2 &, - h3 &, - h4 &, - h5 & { - font-size: inherit; - font-family: inherit; - font-weight: inherit; - line-height: inherit; - } - - ${tmSelectors.dark} { - background-color: ${tmDark(({ colors }) => colors.codeBlockBackground)}; - color: ${tmDark(({ colors }) => colors.codeColor)}; - } - - ${media.mqDark} { - ${tmSelectors.auto} { - background-color: ${tmDark(({ colors }) => colors.codeBlockBackground)}; - color: ${tmDark(({ colors }) => colors.codeColor)}; - } - } -`; - -const StyledPre = styled.pre` - margin: 16px 0; - padding: 20px 24px; - background-color: ${tm(({ colors }) => colors.codeBlockBackground)}; - border-radius: 6px; - overflow: auto; - border: 1px solid ${tm(({ colors }) => colors.transparent)}; - & code { - padding: 0; - color: ${tm(({ colors }) => colors.preCodeColor)}; - line-height: 1.4; - font-size: 0.85em; - font-family: "Menlo", monospace; - font-weight: 300; - } - - & .remark-highlight-code-line { - display: block; - min-width: 100%; - background-color: ${tm(({ colors }) => colors.codeLineHighlight)}; - position: relative; - &::after { - content: " "; - width: 1.2em; - position: absolute; - top: 0; - right: -1.2em; - background-color: ${tm(({ colors }) => colors.codeLineHighlight)}; - } - &::before { - content: " "; - width: 1.2em; - position: absolute; - top: 0; - left: -1.2em; - background-color: ${tm(({ colors }) => colors.codeLineHighlight)}; - } - } - - ${tmSelectors.dark} { - background-color: ${tmDark(({ colors }) => colors.codeBlockBackground)}; - border: 1px solid ${tmDark(({ colors }) => colors.codeBlockBorder)}; - & code { - color: ${tmDark(({ colors }) => colors.preCodeColor)}; - } - } - - ${media.mqDark} { - ${tmSelectors.auto} { - background-color: ${tmDark(({ colors }) => colors.codeBlockBackground)}; - border: 1px solid ${tmDark(({ colors }) => colors.codeBlockBorder)}; - & code { - color: ${tmDark(({ colors }) => colors.preCodeColor)}; - } - } - } -`; - -const ContentWrapper = styled.span` - position: relative; - width: max-content; - min-width: 100%; - pre > code & { - display: block; - } -`; - -const Code = ({ children }: CodeProps) => { - return ( - - {children} - - ); -}; - -const Pre = ({ children, className }: PreProps) => { - return {children}; -}; - -const CodeBlocks = { - Code, - Pre, -}; - -export default CodeBlocks; diff --git a/docs/src/components/mdxComponents/HorizontalRule.tsx b/docs/src/components/mdxComponents/HorizontalRule.tsx deleted file mode 100644 index ea04172e2a8..00000000000 --- a/docs/src/components/mdxComponents/HorizontalRule.tsx +++ /dev/null @@ -1,28 +0,0 @@ -import React from "react"; -import { styled } from "linaria/react"; -import { media, tm, tmDark, tmSelectors } from "../../themes"; - -export interface Props { - children: string; -} - -const StyledHorizontalRule = styled.ul` - margin: 8px 0; - border-top: 1px solid ${tm(({ colors }) => colors.neutral400)}; - - ${tmSelectors.dark} { - border-top: 1px solid ${tmDark(({ colors }) => colors.neutral400)}; - } - - ${media.mqDark} { - ${tmSelectors.auto} { - border-top: 1px solid ${tmDark(({ colors }) => colors.neutral400)}; - } - } -`; - -const HorizontalRule = ({ children }: Props) => { - return {children}; -}; - -export default HorizontalRule; diff --git a/docs/src/components/mdxComponents/Lists.stories.tsx b/docs/src/components/mdxComponents/Lists.stories.tsx deleted file mode 100644 index 6fe6d7ae748..00000000000 --- a/docs/src/components/mdxComponents/Lists.stories.tsx +++ /dev/null @@ -1,28 +0,0 @@ -import React from "react"; -import OrderedList from "./OrderedList"; -import UnorderedList from "./UnorderedList"; -import { mdWrapper } from "../../../.storybook/common-decorators"; - -export default { - title: "MDX components/Lists", - decorators: [mdWrapper], -}; - -export const Ordered = () => ( - -
  • Lorem ipsum dolor sit amet consectetur adipisicing elit..
  • -
  • Lorem ipsum dolor sit amet consectetur elit.
  • -
  • Lorem ipsum dolor sit amet adipisicing elit.
  • -
  • Lorem ipsum dolor sit amet consectetur adipisicing elit.
  • -
  • Lorem dolor sit consectetur adipisicing elit.
  • -
    -); -export const Unordered = () => ( - -
  • Lorem ipsum dolor sit amet consectetur adipisicing elit..
  • -
  • Lorem ipsum dolor sit amet consectetur elit.
  • -
  • Lorem ipsum dolor sit amet adipisicing elit.
  • -
  • Lorem ipsum dolor sit amet consectetur adipisicing elit.
  • -
  • Lorem dolor sit consectetur adipisicing elit.
  • -
    -); diff --git a/docs/src/components/mdxComponents/MDImage.stories.tsx b/docs/src/components/mdxComponents/MDImage.stories.tsx deleted file mode 100644 index 70d79aa7987..00000000000 --- a/docs/src/components/mdxComponents/MDImage.stories.tsx +++ /dev/null @@ -1,13 +0,0 @@ -import React from "react"; -import MDImage from "./MDImage"; -import { mdWrapper } from "../../../.storybook/common-decorators"; - -export default { - title: "MDX components/Media", - decorators: [mdWrapper], -}; - -export const Image = () => ( - -); -export const Gif = () => ; diff --git a/docs/src/components/mdxComponents/MDImage.tsx b/docs/src/components/mdxComponents/MDImage.tsx deleted file mode 100644 index 9f83f676244..00000000000 --- a/docs/src/components/mdxComponents/MDImage.tsx +++ /dev/null @@ -1,65 +0,0 @@ -// @ts-nocheck -import React from "react"; -import Image from "next/image"; -import { styled } from "linaria/react"; - -export interface Props { - src: string; - alt: string; -} - -// TODO: solve the issue with badges -const ImageContainer = styled.div` - max-width: 100%; - position: relative; - width: ${({ width }) => width}; - img { - width: ${({ width }) => width}; - height: auto; - } - & .md-img { - position: relative !important; - height: unset !important; - } - & span { - padding: 0 !important; - } - - span & div { - width: 120px !important; - } -`; - -const isShellBadge = (src: string): boolean => /img\.shields\.io/.test(src); -const isHardhatBadge = (alt: string): boolean => alt === "hardhat"; - -const calcImgWidth = ({ isShellBdg, isHardhatBdg }) => { - if (isHardhatBdg) return "140px"; - if (isShellBdg) return "80px"; - return null; -}; - -const MDImage = ({ src, alt }: Props) => { - const isHardhatBdg = isHardhatBadge(alt); - const isShellBdg = isShellBadge(src); - - return ( - - {alt} - - ); -}; - -export default MDImage; diff --git a/docs/src/components/mdxComponents/MDLink.stories.tsx b/docs/src/components/mdxComponents/MDLink.stories.tsx deleted file mode 100644 index 47564b08381..00000000000 --- a/docs/src/components/mdxComponents/MDLink.stories.tsx +++ /dev/null @@ -1,22 +0,0 @@ -import React from "react"; -import MDLink from "./MDLink"; -import { mdWrapper } from "../../../.storybook/common-decorators"; -import Paragraph from "./Paragraph"; - -export default { - title: "MDX components/Links", - decorators: [mdWrapper], -}; - -export const External = () => ( - - Here is a link to - hardhat.org - -); -export const Internal = () => ( - - Here is a link to - some internal path - -); diff --git a/docs/src/components/mdxComponents/MDLink.tsx b/docs/src/components/mdxComponents/MDLink.tsx deleted file mode 100644 index c3324b222ba..00000000000 --- a/docs/src/components/mdxComponents/MDLink.tsx +++ /dev/null @@ -1,157 +0,0 @@ -import React, { ReactElement } from "react"; -import { styled } from "linaria/react"; -import Link from "next/link"; -import { useRouter } from "next/router"; -import { media, tm, tmDark, tmSelectors } from "../../themes"; -import ExternalLinkIcon from "../../assets/icons/external-link-icon"; - -export interface Props { - children: string | ReactElement; - href: string; -} - -const StyledMdLinkContainer = styled.span` - & > a { - color: ${tm(({ colors }) => colors.link)}; - } - margin: 0 2px; - cursor: pointer; - &:hover { - text-decoration: underline; - } - - & > a { - display: inline-flex; - align-items: center; - } - - & .hardhat-badge + svg { - margin-left: -30px; - } - - & code { - color: ${tm(({ colors }) => colors.link)}; - } - & svg { - margin-left: 2px; - stroke: ${tmDark(({ colors }) => colors.neutral800)}; - } - - ${tmSelectors.dark} { - & svg { - stroke: ${tmDark(({ colors }) => colors.neutral800)}; - } - & code { - color: ${tm(({ colors }) => colors.link)}; - } - } - ${media.mqDark} { - ${tmSelectors.auto} { - & svg { - stroke: ${tmDark(({ colors }) => colors.neutral800)}; - } - & code { - color: ${tm(({ colors }) => colors.link)}; - } - } - } -`; - -const getAbsoluteHrefFromAbsolutePath = (href: string): string => { - return ( - href - // the lookahead is to prevent links like /indexing.md from being broken - .replace(/\/index(?=\.)/, "") - // remove the .md/.mdx extension but preserve the anchor - .replace(/\.mdx?(#.*)?$/, "$1") - ); -}; - -const getAbsoluteHrefFromRelativePath = (href: string, currentHref: string) => { - const pathSegments = currentHref - .split("/") - .filter((segment) => segment !== ""); - const pathSegmentsCount = pathSegments.length; - - let hrefSegments = href.split("/").filter((segment) => segment !== "."); - const upperLevelsCount = hrefSegments.filter( - (segment) => segment === ".." - ).length; - - // remove the ".." segments after counting them - hrefSegments = hrefSegments.filter((segment) => segment !== ".."); - - const baseSegmentsCount = Math.max( - pathSegmentsCount - 1 - upperLevelsCount, - 0 - ); - - const baseSegments = pathSegments.slice(0, baseSegmentsCount); - - const newSegments = ["", ...baseSegments, ...hrefSegments]; - - return getAbsoluteHrefFromAbsolutePath(newSegments.join("/")); -}; - -const renderLinkByType = ({ - children, - href, - isExternalLink, - isAnchor, - isAbsoluteLink, - currentHref, -}: Props & { - isExternalLink: boolean; - isAnchor: boolean; - isAbsoluteLink: boolean; - currentHref: string; -}) => { - if (isExternalLink) { - return ( - - {children} - - - ); - } - if (isAnchor) { - return {children}; - } - if (isAbsoluteLink) { - return ( - - {/* eslint-disable-next-line */} - {children} - - ); - } - - return ( - - {/* eslint-disable-next-line */} - {children} - - ); -}; - -const MDLink = ({ children, href }: Props) => { - const router = useRouter(); - const isExternalLink = href.startsWith("http"); - const isAbsoluteLink = href.startsWith("/"); - const isAnchor = href.startsWith("#"); - - return ( - - {renderLinkByType({ - href, - children, - isAnchor, - isExternalLink, - isAbsoluteLink, - currentHref: router.asPath, - })} - - ); -}; - -export default MDLink; diff --git a/docs/src/components/mdxComponents/OrderedList.tsx b/docs/src/components/mdxComponents/OrderedList.tsx deleted file mode 100644 index d6f8e7c2bb4..00000000000 --- a/docs/src/components/mdxComponents/OrderedList.tsx +++ /dev/null @@ -1,35 +0,0 @@ -import React from "react"; -import { styled } from "linaria/react"; -import { media, tm, tmDark, tmSelectors } from "../../themes"; - -export interface Props { - children: JSX.Element[] | JSX.Element; -} - -const StyledOrderedList = styled.ol` - padding-left: 1.2em; - margin-top: 16px; - font-weight: normal; - line-height: 1.7; - color: ${tm(({ colors }) => colors.neutral800)}; - - & code { - line-height: 1.2; - } - - ${tmSelectors.dark} { - color: ${tmDark(({ colors }) => colors.neutral800)}; - } - - ${media.mqDark} { - ${tmSelectors.auto} { - color: ${tmDark(({ colors }) => colors.neutral800)}; - } - } -`; - -const OrderedList = ({ children }: Props) => { - return {children}; -}; - -export default OrderedList; diff --git a/docs/src/components/mdxComponents/Paragraph.tsx b/docs/src/components/mdxComponents/Paragraph.tsx deleted file mode 100644 index dbd8e485e39..00000000000 --- a/docs/src/components/mdxComponents/Paragraph.tsx +++ /dev/null @@ -1,31 +0,0 @@ -import React from "react"; -import { styled } from "linaria/react"; - -import { media, tm, tmDark, tmSelectors } from "../../themes"; - -export interface Props { - children: string | JSX.Element[] | JSX.Element; -} - -const StyledP = styled.p` - margin: 16px 0; - line-height: 1.7; - font-size: 16px; - color: ${tm(({ colors }) => colors.neutral800)}; - - ${tmSelectors.dark} { - color: ${tmDark(({ colors }) => colors.neutral800)}; - } - - ${media.mqDark} { - ${tmSelectors.auto} { - color: ${tmDark(({ colors }) => colors.neutral800)}; - } - } -`; - -const Paragraph = ({ children }: Props) => { - return {children}; -}; - -export default Paragraph; diff --git a/docs/src/components/mdxComponents/Tab.tsx b/docs/src/components/mdxComponents/Tab.tsx deleted file mode 100644 index 23571949f5f..00000000000 --- a/docs/src/components/mdxComponents/Tab.tsx +++ /dev/null @@ -1,27 +0,0 @@ -import React, { useContext } from "react"; -import { styled } from "linaria/react"; -import { GlobalTabsContext } from "../../global-tabs"; - -export interface ITab { - children: JSX.Element[] | JSX.Element; - value: string; - type: string; -} - -const StyledTab = styled.div<{ value: string; selectedTab: string }>` - display: ${({ value, selectedTab }) => - value === selectedTab ? "block" : "none"}; -`; - -const Tab = ({ children, value, type }: ITab) => { - const { tabsState } = useContext(GlobalTabsContext); - const selectedTab = tabsState[type]; - - return ( - - {children} - - ); -}; - -export default Tab; diff --git a/docs/src/components/mdxComponents/Table.stories.tsx b/docs/src/components/mdxComponents/Table.stories.tsx deleted file mode 100644 index 2381c068a01..00000000000 --- a/docs/src/components/mdxComponents/Table.stories.tsx +++ /dev/null @@ -1,27 +0,0 @@ -import React from "react"; -import Table from "./Table"; -import { mdWrapper } from "../../../.storybook/common-decorators"; - -export default { - title: "MDX components/Table", - decorators: [mdWrapper], -}; - -export const MDTable = () => ( - - - - - - - - - - - - - - - -
    ExampleExample
    Lorem ipsum Lorem ipsum, dolor sit amet consectetur adipisicing
    Lorem ipsum Lorem ipsum, dolor sit amet consectetur adipisicing
    -); diff --git a/docs/src/components/mdxComponents/Table.tsx b/docs/src/components/mdxComponents/Table.tsx deleted file mode 100644 index 7b61bd88aec..00000000000 --- a/docs/src/components/mdxComponents/Table.tsx +++ /dev/null @@ -1,44 +0,0 @@ -import React from "react"; -import { styled } from "linaria/react"; -import { media, tm, tmDark, tmSelectors } from "../../themes"; - -export interface Props { - children: JSX.Element[] | JSX.Element; -} - -const StyledTable = styled.table` - margin: 16px 0; - width: 100%; - border-collapse: collapse; - color: ${tm(({ colors }) => colors.neutral800)}; - border-color: ${tm(({ colors }) => colors.neutral800)}; - overflow-x: auto; - & thead { - vertical-align: middle; - } - & th { - font-weight: bold; - } - & th, - & td { - border: 1px solid ${tm(({ colors }) => colors.tableBorder)}; - padding: 9.6px 16px; - color: inherit; - } - - ${tmSelectors.dark} { - color: ${tmDark(({ colors }) => colors.neutral800)}; - } - - ${media.mqDark} { - ${tmSelectors.auto} { - color: ${tmDark(({ colors }) => colors.neutral800)}; - } - } -`; - -const Table = ({ children }: Props) => { - return {children}; -}; - -export default Table; diff --git a/docs/src/components/mdxComponents/TabsGroup.tsx b/docs/src/components/mdxComponents/TabsGroup.tsx deleted file mode 100644 index 9247364fafd..00000000000 --- a/docs/src/components/mdxComponents/TabsGroup.tsx +++ /dev/null @@ -1,120 +0,0 @@ -import React, { useContext, useMemo } from "react"; -import { styled } from "linaria/react"; -import { media, tm, tmDark, tmSelectors } from "../../themes"; -import { generateTabsGroupType, GlobalTabsContext } from "../../global-tabs"; - -export interface ITabsGroup { - children: React.ReactNode[]; - options: string; -} - -const StyledTabButton = styled.div<{ value: string }>` - padding: 6px 10px; - border-radius: 2px; - font-size: 10px; - line-height: 15px; - height: 27px; - letter-spacing: 0.05em; - cursor: pointer; - color: ${tm(({ colors }) => colors.neutral600)}; - background-color: ${tm(({ colors }) => colors.tabBackground)}; - &:hover { - background-color: ${tm(({ colors }) => colors.tabBackgroundHover)}; - color: ${tm(({ colors }) => colors.neutral400)}; - } - &[data-selected="true"] { - background-color: ${tm(({ colors }) => colors.tabBackgroundSelected)}; - color: ${tm(({ colors }) => colors.neutral400)}; - } - ${tmSelectors.dark} { - color: ${tmDark(({ colors }) => colors.neutral600)}; - background-color: ${tmDark(({ colors }) => colors.tabBackground)}; - &:hover { - background-color: ${tmDark(({ colors }) => colors.tabBackgroundHover)}; - color: ${tmDark(({ colors }) => colors.neutral400)}; - } - &[data-selected="true"] { - background-color: ${tmDark(({ colors }) => colors.tabBackgroundSelected)}; - color: ${tmDark(({ colors }) => colors.neutral400)}; - } - } - - ${media.mqDark} { - ${tmSelectors.auto} { - color: ${tmDark(({ colors }) => colors.neutral600)}; - background-color: ${tmDark(({ colors }) => colors.tabBackground)}; - &:hover { - background-color: ${tmDark(({ colors }) => colors.tabBackgroundHover)}; - color: ${tmDark(({ colors }) => colors.neutral400)}; - } - &[data-selected="true"] { - background-color: ${tmDark( - ({ colors }) => colors.tabBackgroundSelected - )}; - color: ${tmDark(({ colors }) => colors.neutral400)}; - } - } - } -`; - -const StyledTabsContainer = styled.div` - display: flex; - width: 100%; - overflow-x: scroll; - &::-webkit-scrollbar { - display: none; - } - & > div { - margin-right: 8px; - &:last-child { - margin-right: unset; - } - } -`; - -const StyledTabsGroup = styled.div<{ selectedTab: string }>` - margin-top: 28px; - width: 100%; - position: relative; -`; - -const TabsGroup = ({ children, options }: ITabsGroup) => { - const { tabsState, changeTab } = useContext(GlobalTabsContext); - const type = useMemo(() => generateTabsGroupType(options), [options]); - const selectedTab = tabsState[type]; - const childrenWithProps = React.Children.map(children, (child) => { - // Checking isValidElement is the safe way and avoids a typescript - // error too. - if (React.isValidElement(child)) { - return React.cloneElement(child, { type }); - } - return child; - }); - - return ( - - - {options - .split(",") - .map((option) => option.trim()) - .map((option: string) => { - return ( - { - changeTab(type, option); - }} - > - {option} - - ); - })} - - {childrenWithProps} - - ); -}; - -export default TabsGroup; diff --git a/docs/src/components/mdxComponents/Title.stories.tsx b/docs/src/components/mdxComponents/Title.stories.tsx deleted file mode 100644 index 6f327388b24..00000000000 --- a/docs/src/components/mdxComponents/Title.stories.tsx +++ /dev/null @@ -1,14 +0,0 @@ -import React from "react"; -import Title from "./Title"; -import { mdWrapper } from "../../../.storybook/common-decorators"; - -export default { - title: "MDX components/Headings", - decorators: [mdWrapper], -}; - -export const H1 = () => Lorem Ipsum; -export const H2 = () => Lorem Ipsum; -export const H3 = () => Lorem Ipsum; -export const H4 = () => Lorem Ipsum; -export const H5 = () => Lorem Ipsum; diff --git a/docs/src/components/mdxComponents/Title.tsx b/docs/src/components/mdxComponents/Title.tsx deleted file mode 100644 index c7b445b198f..00000000000 --- a/docs/src/components/mdxComponents/Title.tsx +++ /dev/null @@ -1,270 +0,0 @@ -import React, { ReactElement } from "react"; -import { styled } from "linaria/react"; -import { media, tm, tmDark, tmSelectors } from "../../themes"; -import MDLink from "./MDLink"; - -export interface Props { - children: ReactElement | string; -} - -const StyledH1 = styled.h1` - margin-top: 48px; - margin-bottom: 16px; - font-size: 32px; - font-weight: 600; - line-height: 1.25; - letter-spacing: 0.5px; - color: ${tm(({ colors }) => colors.neutral800)}; - & .hash { - margin-left: -30px; - margin-right: 7px; - opacity: 0; - cursor: pointer; - color: ${tm(({ colors }) => colors.accent700)}; - } - &:hover .hash { - opacity: 1; - - &:hover { - text-decoration: underline; - } - } - ${tmSelectors.dark} { - border-bottom-color: ${tmDark(({ colors }) => colors.border)}; - color: ${tmDark(({ colors }) => colors.neutral800)}; - } - - ${media.mqDark} { - ${tmSelectors.auto} { - border-bottom-color: ${tmDark(({ colors }) => colors.border)}; - color: ${tmDark(({ colors }) => colors.neutral800)}; - } - } -`; - -const StyledH2 = styled.h2` - display: block; - padding-top: 40px; - padding-bottom: 16px; - border-bottom: 1px solid ${tm(({ colors }) => colors.neutral400)}; - font-weight: 600; - font-size: 24px; - line-height: 1.25; - letter-spacing: 0.5px; - color: ${tm(({ colors }) => colors.neutral800)}; - & .hash { - margin-left: -24px; - opacity: 0; - cursor: pointer; - color: ${tm(({ colors }) => colors.accent700)}; - } - &:hover .hash { - opacity: 1; - &:hover { - text-decoration: underline; - } - } - ${tmSelectors.dark} { - border-bottom-color: ${tmDark(({ colors }) => colors.border)}; - color: ${tmDark(({ colors }) => colors.neutral800)}; - } - - ${media.mqDark} { - ${tmSelectors.auto} { - border-bottom-color: ${tmDark(({ colors }) => colors.border)}; - color: ${tmDark(({ colors }) => colors.neutral800)}; - } - } -`; - -const StyledH3 = styled.h3` - margin-top: 32px; - font-weight: 600; - font-size: 21.6px; - line-height: 1.25; - letter-spacing: 0.5px; - color: ${tm(({ colors }) => colors.neutral800)}; - & .hash { - margin-left: -24px; - margin-right: 8px; - opacity: 0; - cursor: pointer; - color: ${tm(({ colors }) => colors.accent700)}; - } - &:hover .hash { - opacity: 1; - &:hover { - text-decoration: underline; - } - } - ${tmSelectors.dark} { - color: ${tmDark(({ colors }) => colors.neutral800)}; - } - - ${media.mqDark} { - ${tmSelectors.auto} { - color: ${tmDark(({ colors }) => colors.neutral800)}; - } - } - & > span:hover { - text-decoration: inherit; - } - & a { - font-size: inherit; - font-family: inherit; - font-weight: inherit; - line-height: inherit; - color: inherit; - } -`; -const StyledH4 = styled.h4` - font-size: 16px; - margin-top: 32px; - font-weight: 600; - font-size: 16px; - line-height: 1.25; - letter-spacing: 0.5px; - color: ${tm(({ colors }) => colors.neutral800)}; - & .hash { - margin-left: -16px; - margin-right: 4px; - opacity: 0; - cursor: pointer; - color: ${tm(({ colors }) => colors.accent700)}; - } - &:hover .hash { - opacity: 1; - &:hover { - text-decoration: underline; - } - } - ${tmSelectors.dark} { - color: ${tmDark(({ colors }) => colors.neutral800)}; - } - - ${media.mqDark} { - ${tmSelectors.auto} { - color: ${tmDark(({ colors }) => colors.neutral800)}; - } - } -`; -const StyledH5 = styled.h5` - margin-top: 24px; - font-weight: 600; - font-size: 13.2px; - line-height: 1.25; - letter-spacing: 0.5px; - color: ${tm(({ colors }) => colors.neutral800)}; - & .hash { - margin-left: -16px; - margin-right: 4px; - opacity: 0; - cursor: pointer; - color: ${tm(({ colors }) => colors.accent700)}; - } - &:hover .hash { - opacity: 1; - &:hover { - text-decoration: underline; - } - } - ${tmSelectors.dark} { - color: ${tmDark(({ colors }) => colors.neutral800)}; - } - - ${media.mqDark} { - ${tmSelectors.auto} { - color: ${tmDark(({ colors }) => colors.neutral800)}; - } - } -`; - -const buildIdFromChildren = function getId( - children: string | ReactElement -): string { - if (typeof children === "string") { - return children.toString().toLowerCase().replace(/\s+/g, "-"); - } - if (Array.isArray(children)) { - return children - .map((child) => { - return getId(child); - }) - .join("-"); - } - - return getId(children.props.children); -}; - -const H1 = ({ children }: Props): JSX.Element => { - return ( - - - # - {children} - - - ); -}; - -const H2 = ({ children }: Props) => { - return ( - - - # {children} - - - ); -}; - -const H3 = ({ children }: Props) => { - if (typeof children !== "string" && children.type === MDLink) { - return ( - - # - {children} - - ); - } - - return ( - - - # - {children} - - - ); -}; - -const H4 = ({ children }: Props) => { - return ( - - - # - {children} - - - ); -}; - -const H5 = ({ children }: Props) => { - return ( - - - # - {children} - - - ); -}; - -const Title = { - H1, - H2, - H3, - H4, - H5, -}; - -export default Title; diff --git a/docs/src/components/mdxComponents/UnorderedList.tsx b/docs/src/components/mdxComponents/UnorderedList.tsx deleted file mode 100644 index aefc9ab8579..00000000000 --- a/docs/src/components/mdxComponents/UnorderedList.tsx +++ /dev/null @@ -1,34 +0,0 @@ -import React from "react"; -import { styled } from "linaria/react"; -import { media, tm, tmDark, tmSelectors } from "../../themes"; - -export interface Props { - children: JSX.Element[] | JSX.Element; -} - -const StyledUnorderedList = styled.ul` - padding-left: 1.2em; - margin-top: 16px; - line-height: 1.7; - color: ${tm(({ colors }) => colors.neutral800)}; - - & code { - line-height: 1.2; - } - - ${tmSelectors.dark} { - color: ${tmDark(({ colors }) => colors.neutral800)}; - } - - ${media.mqDark} { - ${tmSelectors.auto} { - color: ${tmDark(({ colors }) => colors.neutral800)}; - } - } -`; - -const UnorderedList = ({ children }: Props) => { - return {children}; -}; - -export default UnorderedList; diff --git a/docs/src/components/types.ts b/docs/src/components/types.ts deleted file mode 100644 index 2712f1b58ee..00000000000 --- a/docs/src/components/types.ts +++ /dev/null @@ -1,34 +0,0 @@ -export interface ISeo { - title: string; - description: string; -} - -interface IDocumentationSidebarSectionChild { - label: string; - href: string; -} -interface IDocumentationSidebarSection { - label: string; - href?: string; - type: "single" | "group"; - children?: IDocumentationSidebarSectionChild[]; -} - -export interface NavOption { - href: string; - label: string; -} - -export interface FooterNavigation { - next?: NavOption | false; - prev?: NavOption | false; - lastEditDate: string; - editLink: string; -} - -export type IDocumentationSidebarStructure = IDocumentationSidebarSection[]; - -export interface IFooterNavigation { - href: string; - label: string; -} diff --git a/docs/src/components/ui/Banner.tsx b/docs/src/components/ui/Banner.tsx deleted file mode 100644 index a0322210b25..00000000000 --- a/docs/src/components/ui/Banner.tsx +++ /dev/null @@ -1,137 +0,0 @@ -import React from "react"; -import { styled } from "linaria/react"; -import { breakpoints, media, tm, tmDark, tmSelectors } from "../../themes"; -import useWindowSize, { WindowSizeState } from "../../hooks/useWindowSize"; -import { BannerProps, DefaultBannerProps } from "./types"; - -const BannerContainer = styled.section` - font-family: ChivoRegular, sans-serif; - user-select: none; - z-index: 100; - width: 100%; - height: 40px; - display: flex; - padding: 8px; - flex-direction: column; - justify-content: center; - align-items: center; - background-color: ${tm(({ colors }) => colors.neutral900)}; - color: ${tm(({ colors }) => colors.neutral0)}; - font-size: 13px; - font-weight: 400; - line-height: 15px; - letter-spacing: 0.03em; - white-space: nowrap; - cursor: pointer; - & span { - margin-right: 2px; - } - ${media.md} { - font-size: 15px; - line-height: 12px; - } - ${tmSelectors.dark} { - background-color: ${tmDark(({ colors }) => colors.neutral900)}; - color: ${tmDark(({ colors }) => colors.neutral0)}; - } - ${media.mqDark} { - ${tmSelectors.auto} { - background-color: ${tmDark(({ colors }) => colors.neutral900)}; - color: ${tmDark(({ colors }) => colors.neutral0)}; - } - } -`; - -const BracesContainer = styled.div` - display: flex; - flex-wrap: nowrap; - align-items: baseline; - & > .braces { - color: ${tm(({ colors }) => colors.accent900)}; - display: inline; - transition: color ease-out 0.5s; - margin: 0 4px; - } - & .reversed { - transform: rotate(180deg); - } - & .text { - ${media.md} { - padding: 0px 16px; - } - } -`; - -const Brace = styled.div<{ - fullAnimationDuration: number; - braceNumber: number; -}>` - display: inline; - animation: highlight ease-out ${(props) => `${props.fullAnimationDuration}s`}; - animation-iteration-count: 3; - animation-delay: ${(props) => `${props.braceNumber * 0.5}s`}; - @keyframes highlight { - 10% { - opacity: 0; - } - - 20% { - opacity: 1; - } - } ; -`; - -const getBracesCount = (windowSize: WindowSizeState) => { - if (windowSize.width >= breakpoints.md) return 6; - if (windowSize.width >= breakpoints.sm) return 3; - return 2; -}; - -const BracesAnimation: React.FC> = ({ - children, -}) => { - const windowSize = useWindowSize(); - const bracesCount = getBracesCount(windowSize); - - const bracesString = Array(bracesCount) - .fill(">") - .map((brace: string, index: number) => { - return ( - - {brace} - - ); - }); - - return ( - -
    {bracesString}
    -
    {children}
    -
    {bracesString}
    -
    - ); -}; - -export const DefaultBanner = ({ content }: DefaultBannerProps) => { - const windowSize = useWindowSize(); - const isDesktop = breakpoints.md <= windowSize.width; - return isDesktop ? ( - {content.text} - ) : ( - {content.shortText} - ); -}; - -const Banner = ({ content, renderContent }: BannerProps) => { - return ( - - {renderContent({ content })} - - ); -}; - -export default Banner; diff --git a/docs/src/components/ui/CTA.stories.tsx b/docs/src/components/ui/CTA.stories.tsx deleted file mode 100644 index 340bf6d9902..00000000000 --- a/docs/src/components/ui/CTA.stories.tsx +++ /dev/null @@ -1,60 +0,0 @@ -import React from "react"; -import { styled } from "linaria/react"; -import CTA from "./CTA"; - -export default { - title: "UI components/CTA", -}; - -const Row = styled.div` - display: flex; - justify-content: flex-start; - column-gap: 50px; - - h4 { - margin: 50px 0 30px; - } -`; - -const onClick = () => null; - -export const Buttons = () => ( -
    - -

    Links

    -
    - - Primary CTA - - Primary CTA - - - Secondary CTA - - - Secondary CTA - - - -

    Buttons

    -
    - - Primary CTA - - Primary CTA - - - Secondary CTA - - - Secondary CTA - - -
    -); - -export const Secondary = () => ( - - secondary button - -); diff --git a/docs/src/components/ui/CTA.tsx b/docs/src/components/ui/CTA.tsx deleted file mode 100644 index 56e1accd7dd..00000000000 --- a/docs/src/components/ui/CTA.tsx +++ /dev/null @@ -1,112 +0,0 @@ -import React from "react"; -import { styled } from "linaria/react"; -import { media, tm, tmDark, tmSelectors } from "../../themes"; - -const A = styled.a` - display: inline-flex; - justify-content: center; - align-items: center; - padding: 10px 22px; - border: none; - border-radius: 4px; - width: fit-content; - font-size: 12px; - font-weight: 500; - line-height: 24px; - letter-spacing: 0; - white-space: nowrap; - text-align: center; - color: ${tm(({ colors }) => colors.neutral900)}; - background-color: ${tm(({ colors }) => colors.accent800)}; - transition: all ease-out 0.3s; - cursor: pointer; - &:hover { - background-color: ${tm(({ colors }) => colors.accent300)}; - ${tmSelectors.dark} { - background-color: ${tmDark(({ colors }) => colors.accent300)}; - } - ${media.mqDark} { - ${tmSelectors.auto} { - background-color: ${tmDark(({ colors }) => colors.accent300)}; - } - } - } - ${media.md} { - font-size: 15px; - line-height: 24px; - letter-spacing: 0; - text-align: center; - padding: 12px 28px; - } - - ${tmSelectors.dark} { - background-color: ${tmDark(({ colors }) => colors.accent800)}; - } - ${media.mqDark} { - ${tmSelectors.auto} { - background-color: ${tmDark(({ colors }) => colors.accent800)}; - } - } - - &.secondary { - width: 100%; - border: 1px solid ${tm(({ colors }) => colors.neutral700)}; - text-align: center; - background-color: ${tm(({ colors }) => colors.transparent)}; - transition: 0.3s; - - ${tmSelectors.dark} { - color: ${tmDark(({ colors }) => colors.neutral900)}; - border-color: ${tmDark(({ colors }) => colors.neutral700)}; - background-color: ${tmDark(({ colors }) => colors.transparent)}; - } - ${media.mqDark} { - ${tmSelectors.auto} { - color: ${tmDark(({ colors }) => colors.neutral900)}; - border-color: ${tmDark(({ colors }) => colors.neutral700)}; - background-color: ${tmDark(({ colors }) => colors.transparent)}; - } - } - - &:hover { - border-color: ${tm(({ colors }) => colors.transparent)}; - background-color: ${tm(({ colors }) => colors.secondaryCTAHover)}; - ${tmSelectors.dark} { - background-color: ${tmDark(({ colors }) => colors.secondaryCTAHover)}; - } - ${media.mqDark} { - ${tmSelectors.auto} { - background-color: ${tmDark(({ colors }) => colors.secondaryCTAHover)}; - } - } - } - } - - &.full-padding { - padding: 12px 28px; - } -`; - -type Props = React.PropsWithChildren<{ - href?: string; - variant?: string; - onClick?: () => void; -}>; - -const CTA = ({ children, href, variant = "", onClick }: Props) => { - if ((href === "" || href === undefined || href === null) && !onClick) { - throw new Error("CTA should have a href prop or a onClick prop"); - } - return ( - - {children} - - ); -}; - -export default CTA; diff --git a/docs/src/components/ui/DesktopMenu.tsx b/docs/src/components/ui/DesktopMenu.tsx deleted file mode 100644 index b925d571e4e..00000000000 --- a/docs/src/components/ui/DesktopMenu.tsx +++ /dev/null @@ -1,371 +0,0 @@ -import React, { useState } from "react"; -import { styled } from "linaria/react"; -import { useRouter } from "next/router"; -import Link from "next/link"; -import { MenuProps, MenuItemType, SocialsItem } from "./types"; -import { media, tm, tmDark, tmSelectors } from "../../themes"; -import Searching from "../Searching"; - -const MenuContainer = styled.section` - font-family: ChivoRegular, sans-serif; - user-select: none; - display: none; - background-color: ${tm(({ colors }) => colors.transparent)}; - - ${media.md} { - display: flex; - align-items: center; - justify-content: space-evenly; - margin-left: -130px; - } -`; - -const MenuList = styled.ul` - display: flex; - list-style-type: none; - align-items: center; - margin-right: 65px; -`; - -const MenuItem = styled.li` - margin-left: 32px; - padding: 8px 0; - position: relative; - &:first-child { - margin-left: unset; - } -`; - -const MenuButton = styled.a` - text-transform: uppercase; - text-align: center; - border: none; - color: ${tm(({ colors }) => colors.neutral900)}; - background-color: ${tm(({ colors }) => colors.transparent)}; - font-size: 15px; - line-height: 15px; - letter-spacing: 0.07em; - position: relative; - cursor: pointer; - &:after { - transition: all ease-in-out 0.2s; - position: absolute; - bottom: -8px; - left: 0; - content: " "; - width: 0; - height: 1px; - background-color: ${tm(({ colors }) => colors.neutral900)}; - } - &:hover { - &:after { - width: 100%; - } - } - &[data-current="true"] { - &:after { - width: 100%; - } - } - - ${tmSelectors.dark} { - color: ${tmDark(({ colors }) => colors.neutral900)}; - &:after { - background-color: ${tmDark(({ colors }) => colors.neutral900)}; - } - } - ${media.mqDark} { - ${tmSelectors.auto} { - color: ${tmDark(({ colors }) => colors.neutral900)}; - &:after { - background-color: ${tmDark(({ colors }) => colors.neutral900)}; - } - } - } -`; - -const MenuSocialsList = styled.ul` - min-width: 80px; - width: 80px; - display: flex; - height: 32px; - align-items: center; - list-style-type: none; - justify-content: space-between; -`; - -const SocialLink = styled.a` - display: flex; - align-items: center; - & svg { - fill: ${tm(({ colors }) => colors.neutral900)}; - ${tmSelectors.dark} { - fill: ${tmDark(({ colors }) => colors.neutral900)}; - } - ${media.mqDark} { - ${tmSelectors.auto} { - fill: ${tmDark(({ colors }) => colors.neutral900)}; - } - } - } - &:hover svg { - cursor: pointer; - opacity: 0.8; - } - &:focus svg { - cursor: pointer; - opacity: 0.5; - } -`; - -const SocialLinksItem = styled.li` - display: flex; - align-items: center; - justify-content: center; - & svg { - width: 22px; - height: 22px; - } - &[data-mobile="true"] { - width: 30px; - height: 30px; - } -`; - -const MenuItemDropDownWrapper = styled.div` - width: 494px; - height: 200px; - position: absolute; - top: 25px; - left: 50%; - transform: translateX(-50%); -`; - -const MenuItemDropdown = styled.div` - width: 494px; - height: 176px; - box-shadow: 0px 9px 28px 8px rgba(0, 0, 0, 0.05); - filter: drop-shadow(0px 6px 50px rgba(10, 11, 13, 0.41)); - border-radius: 4px; - background-color: ${tm(({ colors }) => colors.neutral0)}; - padding: 24px 32px; - position: relative; - top: 25px; - left: 50%; - transform: translateX(-50%); - display: flex; - flex-wrap: wrap; - z-index: 1; - & svg { - border-radius: 4px; - width: 42px; - height: 42px; - } - &::after { - z-index: -1; - position: absolute; - top: -6px; - left: 50%; - transform: translateX(-50%) rotate(45deg); - transform-origin: center; - content: " "; - width: 16px; - height: 16px; - background-color: inherit; - } - - ${tmSelectors.dark} { - background-color: ${tmDark(({ colors }) => colors.neutral0)}; - } - ${media.mqDark} { - ${tmSelectors.auto} { - background-color: ${tmDark(({ colors }) => colors.neutral0)}; - } - } -`; - -const DropdownItem = styled.a` - width: 214px; - height: 58px; - padding: 10.5px 20.5px; - display: flex; - align-items: center; - .icon.dark { - display: none; - } - - ${tmSelectors.dark} { - .light { - display: none; - } - .dark { - display: inline; - } - } - ${media.mqDark} { - ${tmSelectors.auto} { - .light { - display: none; - } - .dark { - display: inline; - } - } - } -`; - -const ButtonNameContainer = styled.div` - display: flex; - align-items: center; - margin-left: 12px; - position: relative; - color: ${tm(({ colors }) => colors.neutral900)}; - &:after { - transition: all ease-in-out 0.2s; - position: absolute; - bottom: -8px; - left: 0; - content: " "; - width: 0; - height: 1px; - background-color: ${tm(({ colors }) => colors.neutral900)}; - } - ${DropdownItem}:hover > &:after { - width: 100%; - } - - ${tmSelectors.dark} { - color: ${tmDark(({ colors }) => colors.neutral900)}; - &:after { - background-color: ${tmDark(({ colors }) => colors.neutral900)}; - } - } - ${media.mqDark} { - ${tmSelectors.auto} { - color: ${tmDark(({ colors }) => colors.neutral900)}; - &:after { - background-color: ${tmDark(({ colors }) => colors.neutral900)}; - } - } - } -`; - -const ButtonCompanyName = styled.span` - font-size: 15px; - font-family: ChivoLight, sans-serif; - color: ${tm(({ colors }) => colors.neutral600)}; - font-weight: 800; -`; - -const ButtonToolName = styled.span` - margin-left: 4px; - font-size: 15px; - font-family: ChivoLight, sans-serif; - color: inherit; - line-height: 24px; - font-weight: 800; - white-space: nowrap; -`; - -export const SocialsList = ({ - socialsItems, - isMobile = false, -}: { - socialsItems: SocialsItem[]; - isMobile?: boolean; -}) => { - return ( - - {socialsItems.map((social: SocialsItem) => { - const { Icon } = social; - return ( - - - - - - ); - })} - - ); -}; - -const DesktopMenu = ({ menuItems, socialsItems }: MenuProps) => { - const router = useRouter(); - const [shownDropdown, setShownDropdown] = useState(null); - - return ( - - - - - - - {menuItems.map((menuItem: MenuItemType) => { - const isSelected = - menuItem.href === "/" - ? router?.asPath === menuItem.href - : router?.asPath.includes(menuItem.href); - return ( - { - if (!menuItem.subItems) return; - setShownDropdown(menuItem.label); - }} - onMouseLeave={() => { - if (!menuItem.subItems) return; - setShownDropdown(null); - }} - key={menuItem.label} - > - - - {menuItem.label} - - - {menuItem.subItems && shownDropdown === menuItem.label && ( - - - {menuItem.subItems.map((subItem) => { - return ( - - - {subItem.icon && ( - - )} - {subItem.iconDark && ( - - )} - - - {subItem.prefix} - - {subItem.label} - - - - ); - })} - - - )} - - ); - })} - - - - ); -}; - -export default DesktopMenu; diff --git a/docs/src/components/ui/FeatureCard.tsx b/docs/src/components/ui/FeatureCard.tsx index 2ca726d4f86..f02fce74e31 100644 --- a/docs/src/components/ui/FeatureCard.tsx +++ b/docs/src/components/ui/FeatureCard.tsx @@ -1,5 +1,5 @@ import React from "react"; -import Image from "next/image"; +import Image, { StaticImageData } from "next/image"; import { styled } from "linaria/react"; import { CTAType } from "./types"; import CTA from "./CTA"; diff --git a/docs/src/components/ui/Hamburger.tsx b/docs/src/components/ui/Hamburger.tsx deleted file mode 100644 index 9031851a7f2..00000000000 --- a/docs/src/components/ui/Hamburger.tsx +++ /dev/null @@ -1,69 +0,0 @@ -import React from "react"; -import { styled } from "linaria/react"; -import { media, tm, tmDark, tmSelectors } from "../../themes"; - -interface HamburgerProps { - isOpen: boolean; - onClick: () => void; -} - -const HamburgerContainer = styled.button` - width: 44px; - height: 32px; - display: flex; - flex-direction: column; - justify-content: space-between; - padding: 8px; - border: none; - border-radius: 4px; - background-color: ${tm(({ colors }) => colors.transparent)}; - cursor: pointer; - ${media.md} { - display: none; - } -`; - -const HamburgerLine = styled.div<{ isOpen: boolean }>` - background-color: ${tm(({ colors }) => colors.neutral900)}; - height: 2px; - width: 28px; - transform-origin: left; - user-select: none; - transition: all 0.25s ease-in-out; - &.mid { - width: 19px; - transition: all 0.1s ease-out; - } - &.top { - transform: ${({ isOpen }: { isOpen: boolean }) => - isOpen ? "rotate(45deg) translate(1px, -5px)" : "none"}; - } - &.mid { - opacity: ${({ isOpen }: { isOpen: boolean }) => (isOpen ? "0" : "1")}; - } - &.bot { - transform: ${({ isOpen }: { isOpen: boolean }) => - isOpen ? "rotate(-45deg) translate(1px, 5px)" : "none"}; - } - - ${tmSelectors.dark} { - background-color: ${tmDark(({ colors }) => colors.neutral900)}; - } - ${media.mqDark} { - ${tmSelectors.auto} { - background-color: ${tmDark(({ colors }) => colors.neutral900)}; - } - } -`; - -const Hamburger = ({ onClick, isOpen }: HamburgerProps) => { - return ( - onClick()} aria-label="navigation-menu"> - - - - - ); -}; - -export default Hamburger; diff --git a/docs/src/components/ui/types.ts b/docs/src/components/ui/types.ts deleted file mode 100644 index 941862dd89f..00000000000 --- a/docs/src/components/ui/types.ts +++ /dev/null @@ -1,65 +0,0 @@ -import React from "react"; - -export enum NavigationPagesPaths { - HOME = "/", - TOOLS = "/#tools", - PLUGINS = "/plugins", - DOCUMENTATION = "/docs", - TUTORIAL = "/tutorial", -} -export interface MenuItemType { - label: string; - href: NavigationPagesPaths | string; - subItems?: MenuItemType[]; - prefix?: string; - icon?: React.FC; - iconDark?: React.FC; -} - -export enum SocialsEnum { - GITHUB = "GITHUB", - TWITTER = "TWITTER", - DISCORD = "DISCORD", -} - -export interface SocialsItem { - name: SocialsEnum; - href: string; - Icon: React.FC; -} - -export interface MenuProps { - menuItems: MenuItemType[]; - isOpen?: boolean; - socialsItems: SocialsItem[]; - isDocumentation?: boolean; -} - -export interface CTAType { - title: string; - url: string; -} - -export enum Tools { - RUNNER = "RUNNER", - IGNITION = "IGNITION", - NETWORK = "NETWORK", - SOLIDITY = "SOLIDITY", -} - -interface DefaultBannerContent { - text: string; - shortText: string; - href: string; -} -export interface BannerProps { - content: DefaultBannerContent; - renderContent: ({ - content, - }: { - content: DefaultBannerContent; - }) => JSX.Element; -} -export interface DefaultBannerProps { - content: DefaultBannerContent; -} diff --git a/docs/src/config.ts b/docs/src/config.ts index ea1caf8246d..3a837ada8a0 100644 --- a/docs/src/config.ts +++ b/docs/src/config.ts @@ -13,9 +13,8 @@ import NetworkIcon from "./assets/tools/network"; import RunnerIconDark from "./assets/tools/runner-dark"; import NetworkIconDark from "./assets/tools/network-dark"; import SolidityIconDark from "./assets/tools/solidity-dark"; -// TODO: Re-enable Ignition section -// import IgnitionIcon from "./assets/tools/ignition"; -// import IgnitionIconDark from "./assets/tools/ignition-dark"; +import IgnitionIcon from "./assets/tools/ignition"; +import IgnitionIconDark from "./assets/tools/ignition-dark"; export const SOCIALS_LINKS = { [SocialsEnum.GITHUB]: "https://github.com/NomicFoundation/hardhat", @@ -23,13 +22,14 @@ export const SOCIALS_LINKS = { [SocialsEnum.DISCORD]: "/discord", }; -export const BANNER_LINK = "https://nomic.foundation/hiring"; +export const BANNER_LINK = + "https://cryptpad.fr/form/#/2/form/view/pV-DdryeJoYUWvW+gXsFaMNynEY7t5mUsgeD1urgwSE"; export const PRIVACY_POLICY_PATH = "/privacy-policy.html"; export const bannerContent = { - text: "Join the Hardhat team! Nomic Foundation is hiring", - shortText: "Join the Hardhat team! We are hiring", + text: "Please take a few minutes to complete the 2023 Solidity Survey", + shortText: "Complete the 2023 Solidity Survey here", href: BANNER_LINK, }; @@ -65,14 +65,13 @@ export const menuItemsList: MenuItemType[] = [ icon: RunnerIcon, iconDark: RunnerIconDark, }, - // TODO: Re-enable Ignition section - // { - // prefix: "Hardhat", - // label: "Ignition", - // href: "/?tool=IGNITION#tools", - // icon: IgnitionIcon, - // iconDark: IgnitionIconDark, - // }, + { + prefix: "Hardhat", + label: "Ignition", + href: "/ignition", + icon: IgnitionIcon, + iconDark: IgnitionIconDark, + }, { prefix: "Hardhat", label: "Network", @@ -105,8 +104,7 @@ export const menuItemsList: MenuItemType[] = [ export enum Tools { RUNNER = "RUNNER", - // TODO: Re-enable Ignition section - // IGNITION = "IGNITION", + IGNITION = "IGNITION", NETWORK = "NETWORK", SOLIDITY = "SOLIDITY", } diff --git a/docs/src/content/docs-landing/index.md b/docs/src/content/docs-landing/index.md index 027a0891386..fa208f6acb8 100644 --- a/docs/src/content/docs-landing/index.md +++ b/docs/src/content/docs-landing/index.md @@ -27,6 +27,10 @@ Hardhat Runner is the main component you interact with when using Hardhat. It's Hardhat comes built-in with Hardhat Network, a local Ethereum network node designed for development. It allows you to deploy your contracts, run your tests and debug your code, all within the confines of your local machine. [Learn more.](/hardhat-network) +### Hardhat Ignition + +Hardhat Ignition is a declarative deployment system that enables you to deploy your smart contracts without navigating the mechanics of the deployment process. [Learn more.](/ignition) + ### Hardhat for Visual Studio Code Hardhat for Visual Studio Code is a VS Code extension that adds language support for Solidity and provides editor integration for Hardhat projects. [Learn more.](/hardhat-vscode) diff --git a/docs/src/content/hardhat-chai-matchers/docs/_dirinfo.yaml b/docs/src/content/hardhat-chai-matchers/docs/_dirinfo.yaml deleted file mode 100644 index 1e802581755..00000000000 --- a/docs/src/content/hardhat-chai-matchers/docs/_dirinfo.yaml +++ /dev/null @@ -1,7 +0,0 @@ -section-type: group -section-title: Hardhat Chai Matchers -order: - - title: Overview - href: /overview - - /migrate-from-waffle - - /reference diff --git a/docs/src/content/hardhat-chai-matchers/docs/migrate-from-waffle.md b/docs/src/content/hardhat-chai-matchers/docs/migrate-from-waffle.md deleted file mode 100644 index 485704db0dc..00000000000 --- a/docs/src/content/hardhat-chai-matchers/docs/migrate-from-waffle.md +++ /dev/null @@ -1,97 +0,0 @@ -# Migrating from Waffle - -If you want to replace Waffle with Hardhat Chai Matchers, we recommend you [migrate to the Hardhat Toolbox](/hardhat-runner/docs/guides/migrating-from-hardhat-waffle). If for some reason you want to migrate without using the Toolbox, read on. - -## How to migrate - -The `@nomicfoundation/hardhat-chai-matchers` plugin is meant to be a drop-in replacement for the `@nomiclabs/hardhat-waffle` plugin. To migrate, follow these instructions: - -1. Uninstall the `@nomiclabs/hardhat-waffle` and `ethereum-waffle` packages: - - ::::tabsgroup{options="npm 7+,npm 6,yarn"} - - :::tab{value="npm 7+"} - - ``` - npm uninstall @nomiclabs/hardhat-waffle ethereum-waffle - ``` - - ::: - - :::tab{value="npm 6"} - - ``` - npm uninstall @nomiclabs/hardhat-waffle ethereum-waffle - ``` - - ::: - - :::tab{value=yarn} - - ``` - yarn remove @nomiclabs/hardhat-waffle ethereum-waffle - ``` - - ::: - - :::: - -2. Then install the Hardhat Chai Matchers plugin: - - ::::tabsgroup{options="npm 7+,npm 6,yarn"} - - :::tab{value="npm 7+"} - - ``` - npm install --save-dev @nomicfoundation/hardhat-chai-matchers - ``` - - ::: - - :::tab{value="npm 6"} - - ``` - npm install --save-dev @nomicfoundation/hardhat-chai-matchers - ``` - - ::: - - :::tab{value=yarn} - - ``` - yarn add --dev @nomicfoundation/hardhat-chai-matchers - ``` - - ::: - - :::: - -3. In your Hardhat config, import the Hardhat Chai Matchers plugin and remove the `hardhat-waffle` one: - - ::::tabsgroup{options=TypeScript,JavaScript} - - :::tab{value=TypeScript} - - ```diff - - import "@nomiclabs/hardhat-waffle"; - + import "@nomicfoundation/hardhat-chai-matchers"; - ``` - - ::: - - :::tab{value=JavaScript} - - ```diff - - require("@nomiclabs/hardhat-waffle"); - + require("@nomicfoundation/hardhat-chai-matchers"); - ``` - - ::: - - :::: - -:::tip - -Looking for a replacement for Waffle's `loadFixture`? You can find our version of it in [Hardhat Network Helpers](/hardhat-network-helpers/docs/reference#fixtures). - -::: diff --git a/docs/src/content/hardhat-chai-matchers/docs/other-components/_dirinfo.yaml b/docs/src/content/hardhat-chai-matchers/docs/other-components/_dirinfo.yaml index 2a4a770f9ee..475844db129 100644 --- a/docs/src/content/hardhat-chai-matchers/docs/other-components/_dirinfo.yaml +++ b/docs/src/content/hardhat-chai-matchers/docs/other-components/_dirinfo.yaml @@ -5,6 +5,8 @@ order: title: Hardhat Runner - href: /../../../hardhat-network/docs title: Hardhat Network + - href: /../../../ignition/docs + title: Hardhat Ignition - href: /../../../hardhat-vscode/docs title: Hardhat VSCode - href: /../../../hardhat-network-helpers/docs diff --git a/docs/src/content/hardhat-chai-matchers/docs/overview.md b/docs/src/content/hardhat-chai-matchers/docs/overview.md index a61f57b0c80..c27acf7bb83 100644 --- a/docs/src/content/hardhat-chai-matchers/docs/overview.md +++ b/docs/src/content/hardhat-chai-matchers/docs/overview.md @@ -90,8 +90,8 @@ This package provides the predicates `anyValue` and `anyUint`, but you can easil ```js -function isEven(x: BigNumber): boolean { - return x.mod(2).isZero(); +function isEven(x: bigint): boolean { + return x % 2n === 0n; } await expect(contract.emitUint(2)) @@ -175,7 +175,7 @@ This package enhances the standard numerical equality matchers (`equal`, `above` expect(await token.balanceOf(someAddress)).to.equal(1); ``` -These matchers support not just [ethers' `BigNumber`](https://docs.ethers.io/v5/single-page/#/v5/api/utils/bignumber/) and the native JavaScript `Number`, but also [`BigInt`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/BigInt), [bn.js](https://github.com/indutny/bn.js/), and [bignumber.js](https://github.com/MikeMcl/bignumber.js/). +These matchers support not just the native JavaScript `Number`, but also [`BigInt`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/BigInt), [bn.js](https://github.com/indutny/bn.js/), and [bignumber.js](https://github.com/MikeMcl/bignumber.js/). ### Balance Changes @@ -236,6 +236,10 @@ Finally, the `hexEqual` matcher accepts two hexadecimal strings and compares the expect("0x00012AB").to.hexEqual("0x12ab"); ``` +## Known limitations + +At the moment, some of these chai matchers only work correctly when Hardhat is running in [automine mode](/hardhat-network/docs/explanation/mining-modes). See [this issue](https://github.com/NomicFoundation/hardhat/issues/3203) for more details. + ## Dig Deeper For a full listing of all of the matchers supported by this package, see [the reference documentation](./reference.md). diff --git a/docs/src/content/hardhat-chai-matchers/docs/reference.md b/docs/src/content/hardhat-chai-matchers/docs/reference.md index 42f99a9c649..9b9f5f866e8 100644 --- a/docs/src/content/hardhat-chai-matchers/docs/reference.md +++ b/docs/src/content/hardhat-chai-matchers/docs/reference.md @@ -10,13 +10,12 @@ When `@nomicfoundation/hardhat-chai-matchers` is used, equality comparisons of n expect(await token.totalSupply()).to.equal(1_000_000); ``` -will work. These assertions don't normally work because the value returned by `totalSupply()` is an [ethers BigNumber](https://docs.ethers.io/v5/single-page/#/v5/api/utils/bignumber/), and an instance of a `BigNumber` will always be different than a plain number. +will work. These assertions don't normally work because the value returned by `totalSupply()` is a [bigint](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/BigInt), and a bigint value will always be different than a plain number. The supported types are: - Plain javascript numbers - [BigInts](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/BigInt) -- [Ethers BigNumbers](https://docs.ethers.io/v5/single-page/#/v5/api/utils/bignumber/) - [`bn.js`](https://github.com/indutny/bn.js/) instances - [`bignumber.js`](https://github.com/MikeMcl/bignumber.js/) instances @@ -129,7 +128,7 @@ If the event has arguments, the `.withArgs` matcher can be added: ```ts await expect(token.transfer(address, 0)) - .to.be.revertedWithCustomError(token, "InvalidTransferValue") + .to.emit(token, "Transfer") .withArgs(100); ``` @@ -204,7 +203,7 @@ Can be used after a `.emit` or a `.revertedWithCustomError` matcher to assert th ```ts // events await expect(token.transfer(address, 0)) - .to.be.revertedWithCustomError(token, "InvalidTransferValue") + .to.emit(token, "Transfer") .withArgs(100); // errors @@ -226,8 +225,8 @@ await expect(factory.create(9999)) Predicates are just functions that return true if the value is correct, and return false if it isn't, so you can create your own predicates: ```ts -function isEven(x: BigNumber): boolean { - return x.mod(2).isZero(); +function isEven(x: bigint): boolean { + return x % 2n === 0n; } await expect(token.transfer(100)).to.emit(token, "Transfer").withArgs(isEven); diff --git a/docs/src/content/hardhat-network-helpers/_dirinfo.yaml b/docs/src/content/hardhat-network-helpers/_dirinfo.yaml deleted file mode 100644 index 9ec3f9e8a0f..00000000000 --- a/docs/src/content/hardhat-network-helpers/_dirinfo.yaml +++ /dev/null @@ -1 +0,0 @@ -section-type: hidden diff --git a/docs/src/content/hardhat-network-helpers/docs/_dirinfo.yaml b/docs/src/content/hardhat-network-helpers/docs/_dirinfo.yaml deleted file mode 100644 index 4695387b0ce..00000000000 --- a/docs/src/content/hardhat-network-helpers/docs/_dirinfo.yaml +++ /dev/null @@ -1,6 +0,0 @@ -section-type: group -section-title: Hardhat Network Helpers -order: - - title: Overview - href: /overview - - /reference diff --git a/docs/src/content/hardhat-network-helpers/docs/other-components/_dirinfo.yaml b/docs/src/content/hardhat-network-helpers/docs/other-components/_dirinfo.yaml index de33f52bc13..d6016041afc 100644 --- a/docs/src/content/hardhat-network-helpers/docs/other-components/_dirinfo.yaml +++ b/docs/src/content/hardhat-network-helpers/docs/other-components/_dirinfo.yaml @@ -5,6 +5,8 @@ order: title: Hardhat Runner - href: /../../../hardhat-network/docs title: Hardhat Network + - href: /../../../ignition/docs + title: Hardhat Ignition - href: /../../../hardhat-vscode/docs title: Hardhat VSCode - href: /../../../hardhat-chai-matchers/docs diff --git a/docs/src/content/hardhat-network-helpers/docs/overview.md b/docs/src/content/hardhat-network-helpers/docs/overview.md deleted file mode 100644 index 5730f9a16d0..00000000000 --- a/docs/src/content/hardhat-network-helpers/docs/overview.md +++ /dev/null @@ -1,80 +0,0 @@ ---- -title: Hardhat Network Helpers -description: Hardhat Network Helpers is a library that provides a set of utility functions to interact with the Hardhat Network. ---- - -# Overview - -[@nomicfoundation/hardhat-network-helpers](https://www.npmjs.com/package/@nomicfoundation/hardhat-network-helpers) provides a convenient JavaScript interface to the JSON-RPC functionality of [Hardhat Network](/hardhat-network). - -Hardhat Network exposes its custom functionality primarily through its JSON-RPC API. See the extensive set of methods available in [its reference documentation](/hardhat-network/docs/reference#hardhat-network-methods). However, for easy-to-read tests and short scripts, interfacing with the JSON-RPC API is too noisy, requiring a verbose syntax and extensive conversions of both input and output data. - -This package provides convenience functions for quick and easy interaction with Hardhat Network. Facilities include the ability to mine blocks up to a certain timestamp or block number, the ability to manipulate attributes of accounts (balance, code, nonce, storage), the ability to impersonate specific accounts, and the ability to take and restore snapshots. - -## Installation - -::::tabsgroup{options="npm 7+,npm 6,yarn"} - -:::tab{value="npm 7+"} - -``` -npm install --save-dev @nomicfoundation/hardhat-network-helpers -``` - -::: - -:::tab{value="npm 6"} - -``` -npm install --save-dev @nomicfoundation/hardhat-network-helpers -``` - -::: - -:::tab{value=yarn} - -``` -yarn add --dev @nomicfoundation/hardhat-network-helpers -``` - -::: - -:::: - -## Usage - -To use a network helper, simply import it where you want to use it: - -::::tabsgroup{options=TypeScript,JavaScript} - -:::tab{value=TypeScript} - -```ts -import { mine } from "@nomicfoundation/hardhat-network-helpers"; - -async function main() { - // instantly mine 1000 blocks - await mine(1000); -} -``` - -::: - -:::tab{value=JavaScript} - -```js -const { mine } = require("@nomicfoundation/hardhat-network-helpers"); - -async function main() { - // instantly mine 1000 blocks - await mine(1000); -} -``` - -::: - -:::: - -Since this is not a Hardhat plugin, you don’t need to import the whole package in your config. You can simply import each specific helper function where you need to use them. - -For a full listing of all the helpers provided by this package, see [the reference documentation](./reference). diff --git a/docs/src/content/hardhat-network-helpers/docs/reference.md b/docs/src/content/hardhat-network-helpers/docs/reference.md index 19562c8a5f8..627ece392bd 100644 --- a/docs/src/content/hardhat-network-helpers/docs/reference.md +++ b/docs/src/content/hardhat-network-helpers/docs/reference.md @@ -307,8 +307,6 @@ Parameters: - `prevRandao`: The new PREVRANDAO value to use. -## Other helpers - ### `reset([url], [blockNumber])` Resets the Hardhat Network. The result of calling this method depends on which arguments are provided: diff --git a/docs/src/content/hardhat-network/_dirinfo.yaml b/docs/src/content/hardhat-network/_dirinfo.yaml deleted file mode 100644 index 9ec3f9e8a0f..00000000000 --- a/docs/src/content/hardhat-network/_dirinfo.yaml +++ /dev/null @@ -1 +0,0 @@ -section-type: hidden diff --git a/docs/src/content/hardhat-network/docs/_dirinfo.yaml b/docs/src/content/hardhat-network/docs/_dirinfo.yaml deleted file mode 100644 index c5337958cfb..00000000000 --- a/docs/src/content/hardhat-network/docs/_dirinfo.yaml +++ /dev/null @@ -1,8 +0,0 @@ -section-type: group -section-title: Hardhat Network -order: - - title: Overview - href: /overview - - /guides/forking-other-networks - - /explanation/mining-modes - - /reference diff --git a/docs/src/content/hardhat-network/docs/explanation/mining-modes.md b/docs/src/content/hardhat-network/docs/explanation/mining-modes.md index 3a2a7a6b293..6c6cfea2d42 100644 --- a/docs/src/content/hardhat-network/docs/explanation/mining-modes.md +++ b/docs/src/content/hardhat-network/docs/explanation/mining-modes.md @@ -27,6 +27,18 @@ const pendingBlock = await network.provider.send("eth_getBlockByNumber", [ ]); ``` +### Mining multiple transactions in one block + +Note that for the special case of the Hardhat Network, the transaction `gas`-limit config [defaults to the fixed `blockGasLimit`](../reference/index.md#gas), not to [`auto`](/hardhat-runner/docs/config) (gas-estimation). This [speeds things up](https://github.com/NomicFoundation/hardhat/issues/4090#issuecomment-1622155314), but consequently limits the transactions per block to a maximum of 1. So to mine multiple transactions in a single block on the Hardhat Network, in addition to disabling automine, either specify the transaction `gasLimit` explicitly for each of the transactions, or force automatic gas-estimation in your config with: + +``` +networks: { + hardhat: { + gas: "auto", + }, +}, +``` + ### Mining transactions in FIFO order The way Hardhat Network's mempool orders transactions is customizable. By default, they are prioritized following Geth's rules, but you can enable a FIFO behavior instead, which ensures that transactions are added to blocks in the same order they are sent, and which is useful to recreate blocks from other networks. diff --git a/docs/src/content/hardhat-network/docs/guides/forking-other-networks.md b/docs/src/content/hardhat-network/docs/guides/forking-other-networks.md index e987e66e87c..af7402898f7 100644 --- a/docs/src/content/hardhat-network/docs/guides/forking-other-networks.md +++ b/docs/src/content/hardhat-network/docs/guides/forking-other-networks.md @@ -167,7 +167,7 @@ await impersonatedSigner.sendTransaction(...); Alternatively, you can use the [`impersonateAccount`]() helper and then obtain the signer for that address: ```js -const helpers = require("@nomicfoundation/hardhat-network-helpers"); +const helpers = require("@nomicfoundation/hardhat-toolbox/network-helpers"); const address = "0x1234567890123456789012345678901234567890"; await helpers.impersonateAccount(address); @@ -183,7 +183,7 @@ Once you've got a local instance of the mainnet chain state, setting that state You can reset the network with the [`reset`]() network helper: ```js -const helpers = require("@nomicfoundation/hardhat-network-helpers"); +const helpers = require("@nomicfoundation/hardhat-toolbox/network-helpers"); await helpers.reset(url, blockNumber); ``` diff --git a/docs/src/content/hardhat-network/docs/metamask-issue/_dirinfo.yaml b/docs/src/content/hardhat-network/docs/metamask-issue/_dirinfo.yaml deleted file mode 100644 index 9ec3f9e8a0f..00000000000 --- a/docs/src/content/hardhat-network/docs/metamask-issue/_dirinfo.yaml +++ /dev/null @@ -1 +0,0 @@ -section-type: hidden diff --git a/docs/src/content/hardhat-network/docs/metamask-issue/index.md b/docs/src/content/hardhat-network/docs/metamask-issue/index.md deleted file mode 100644 index ade466ab9b7..00000000000 --- a/docs/src/content/hardhat-network/docs/metamask-issue/index.md +++ /dev/null @@ -1,28 +0,0 @@ ---- -next: false -prev: false ---- - -# MetaMask chainId issue - -If you are using MetaMask with Hardhat Network, you might get an error like this when you send a transaction: - -``` -Incompatible EIP155-based V 2710 and chain id 31337. See the second parameter of the Transaction constructor to set the chain id. -``` - -This is because MetaMask mistakenly assumes all networks in `http://127.0.0.1:8545` to have a chain id of `1337`, but Hardhat uses a different number by default. **Please upvote [the MetaMask issue about it](https://github.com/MetaMask/metamask-extension/issues/10290) if you want this fixed.** - -In the meantime, consider using an alternative wallet that doesn't have this problem, like [Coinbase Wallet](https://www.coinbase.com/wallet). - -If you want to use MetaMask, you can work around this issue by setting the `chainId` of Hardhat Network to `1337` in your Hardhat config: - -``` -networks: { - hardhat: { - chainId: 1337 - }, -} -``` - -Note that if your setup or any of your plugins depends on the chain id being `31337`, you might need to clean your cache or make further adaptations in your config. diff --git a/docs/src/content/hardhat-network/docs/other-components/_dirinfo.yaml b/docs/src/content/hardhat-network/docs/other-components/_dirinfo.yaml index 2abe014d465..4ad6471b254 100644 --- a/docs/src/content/hardhat-network/docs/other-components/_dirinfo.yaml +++ b/docs/src/content/hardhat-network/docs/other-components/_dirinfo.yaml @@ -3,6 +3,8 @@ section-title: Other Hardhat components order: - href: /../../../hardhat-runner/docs title: Hardhat Runner + - href: /../../../ignition/docs + title: Hardhat Ignition - href: /../../../hardhat-vscode/docs title: Hardhat VSCode - href: /../../../hardhat-chai-matchers/docs diff --git a/docs/src/content/hardhat-network/docs/overview/index.md b/docs/src/content/hardhat-network/docs/overview/index.md index 4ef156214cc..0d35fe2d419 100644 --- a/docs/src/content/hardhat-network/docs/overview/index.md +++ b/docs/src/content/hardhat-network/docs/overview/index.md @@ -15,7 +15,7 @@ It runs as either an in-process or stand-alone daemon, servicing JSON-RPC and We By default, it mines a block with each transaction that it receives, in order and with no delay. -It's backed by the `@ethereumjs/vm` EVM implementation, the same one used by ganache, Remix and Ethereum Studio. +It's backed by the `@ethereumjs/vm` EVM implementation, the same one used by ganache and Remix. ## How can I use it? diff --git a/docs/src/content/hardhat-network/docs/reference/index.md b/docs/src/content/hardhat-network/docs/reference/index.md index 45dde36436c..e72b2a083f0 100644 --- a/docs/src/content/hardhat-network/docs/reference/index.md +++ b/docs/src/content/hardhat-network/docs/reference/index.md @@ -117,7 +117,9 @@ The minimum `gasPrice` that a transaction must have. This field must not be pres The `baseFeePerGas` of the first block. Note that when forking a remote network, the "first block" is the one immediately after the block you forked from. This field must not be present if the `"hardfork"` is not `"london"` or a later one. Default value: `"1000000000"` if not forking. When forking a remote network, if the remote network uses EIP-1559, the first local block will use the right `baseFeePerGas` according to the EIP, otherwise `"10000000000"` is used. -- `coinbase`: The address used as coinbase in new blocks. Default value: `"0xc014ba5ec014ba5ec014ba5ec014ba5ec014ba5e"`. +#### `coinbase` + +The address used as coinbase in new blocks. Default value: `"0xc014ba5ec014ba5ec014ba5ec014ba5ec014ba5e"`. ### Mining modes @@ -251,6 +253,50 @@ To customise it, take a look at [the configuration section](/config/index.md#har ### Standard methods +#### `debug_traceCall` + +Traces the execution of an `eth_call` within the context of a specific block's execution. See the [Geth's documentation](https://geth.ethereum.org/docs/interacting-with-geth/rpc/ns-debug#debugtracecall) for more info. + +Arguments: + +- transaction object +- blockTag: optional, default value is "latest" +- traceConfig: optional object with the following properties: + - disableMemory: optional boolean, default value is false + - disableStack: optional boolean, default value is false + - disableStorage: optional boolean, default value is false + +Example without traceConfig: + +```js +const result = await network.provider.send("debug_traceCall", [ + { + from: "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + to: "0x4b23ad35Da73fEe8154CDc8b291c814028A4E743", + data: "0xc0129d43", + }, + "latest", +]); +``` + +Example with traceConfig: + +```js +const trace = await network.provider.send("debug_traceCall", [ + { + from: "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + to: "0x4b23ad35Da73fEe8154CDc8b291c814028A4E743", + data: "0xc0129d43", + }, + "latest", + { + disableMemory: true, + disableStack: true, + disableStorage: true, + }, +]); +``` + #### `debug_traceTransaction` Get debug traces of already-mined transactions. @@ -287,6 +333,44 @@ const trace = await hre.network.provider.send("debug_traceTransaction", [ #### `eth_call` +This method allows you to simulate a transaction without actually executing it. See the [Geth's documentation](https://geth.ethereum.org/docs/interacting-with-geth/rpc/ns-eth) for more info. + +Example: + +```js +const result = await network.provider.send("eth_call", [ + { + from: "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + to: "0x4b23ad35Da73fEe8154CDc8b291c814028A4E743", + data: "0xc0129d43", + }, + "latest", +]); +``` + +You can optionally pass a state override object to modify the chain before running the call: + +```js +const result = await network.provider.send("eth_call", [ + { + from: "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + to: "0x4b23ad35Da73fEe8154CDc8b291c814028A4E743", + data: "0xc0129d43", + }, + "latest", + { + "0x6eE6DE5a56910E5353933761305AEF6a414d97BA": { + balance: "0xde0b6b3a7640000", + nonce: "0x123", + stateDiff: { + "0x0000000000000000000000000000000000000000000000000000000000000002": + "0x000000000000000000000000000000000000000000000000000000000000000c", + }, + }, + }, +]); +``` + #### `eth_chainId` #### `eth_coinbase` diff --git a/docs/src/content/hardhat-runner/_dirinfo.yaml b/docs/src/content/hardhat-runner/_dirinfo.yaml deleted file mode 100644 index 9ec3f9e8a0f..00000000000 --- a/docs/src/content/hardhat-runner/_dirinfo.yaml +++ /dev/null @@ -1 +0,0 @@ -section-type: hidden diff --git a/docs/src/content/hardhat-runner/docs/_dirinfo.yaml b/docs/src/content/hardhat-runner/docs/_dirinfo.yaml deleted file mode 100644 index 9ec3f9e8a0f..00000000000 --- a/docs/src/content/hardhat-runner/docs/_dirinfo.yaml +++ /dev/null @@ -1 +0,0 @@ -section-type: hidden diff --git a/docs/src/content/hardhat-runner/docs/advanced/_dirinfo.yaml b/docs/src/content/hardhat-runner/docs/advanced/_dirinfo.yaml index 6365297f039..9b6ec2234d2 100644 --- a/docs/src/content/hardhat-runner/docs/advanced/_dirinfo.yaml +++ b/docs/src/content/hardhat-runner/docs/advanced/_dirinfo.yaml @@ -12,3 +12,6 @@ order: - href: /vscode-tests title: Running tests in VS Code - /using-esm + - /using-viem + - title: Migrating away from hardhat-waffle + href: /migrating-from-hardhat-waffle diff --git a/docs/src/content/hardhat-runner/docs/advanced/artifacts.md b/docs/src/content/hardhat-runner/docs/advanced/artifacts.md deleted file mode 100644 index 4a2c84b9912..00000000000 --- a/docs/src/content/hardhat-runner/docs/advanced/artifacts.md +++ /dev/null @@ -1,64 +0,0 @@ -# Compilation artifacts - -Compiling with Hardhat generates two files per compiled contract (not each `.sol` file): an artifact and a debug file. - -An **artifact** has all the information that is necessary to deploy and interact with the contract. These are compatible with most tools, including Truffle's artifact format. Each artifact consists of a json with the following properties: - -- `contractName`: A string with the contract's name. - -- `abi`: A [JSON description of the contract's ABI](https://solidity.readthedocs.io/en/latest/abi-spec.html#abi-json). - -- `bytecode`: A `"0x"`-prefixed hex string of the unlinked deployment bytecode. If the contract is not deployable, this has the string `"0x"`. - -- `deployedBytecode`: A `"0x"`-prefixed hex string of the unlinked runtime/deployed bytecode. If the contract is not deployable, this has the string `"0x"`. - -- `linkReferences`: The bytecode's link references object [as returned by solc](https://solidity.readthedocs.io/en/latest/using-the-compiler.html). If the contract doesn't need to be linked, this value contains an empty object. - -- `deployedLinkReferences`: The deployed bytecode's link references object [as returned by solc](https://solidity.readthedocs.io/en/latest/using-the-compiler.html). If the contract doesn't need to be linked, this value contains an empty object. - -The **debug file** has all the information that is necessary to reproduce the compilation and to debug the contracts: this includes the original solc input and output, and the solc version used to compile it. - -## Build info files - -Hardhat optimizes compilation by compiling the smallest possible set of files at a time. Files that are compiled together have the same solc input and output. Since having this in each debug file would be meaningfully wasteful, this information is deduplicated in build info files that are placed in `artifacts/build-info`. Each contract debug file contains a relative path to its build info file, and each build info file contains the solc input, solc output and the solc version used. - -You shouldn't interact with these files directly. - -## Reading artifacts - -The [HRE] has an `artifacts` object with helper methods. For example, you can get a list with the paths to all artifacts by calling `hre.artifacts.getArtifactPaths()`. - -You can also read an artifact using the name of the contract by calling `hre.artifacts.readArtifact("Bar")`, which will return the content of the artifact for the `Bar` contract. This would only work if there was just one contract named `Bar` in the whole project; it would throw an error if there were two. To disambiguate this case, you would have to use the **Fully Qualified Name** of the contract: `hre.artifacts.readArtifact("contracts/Bar.sol:Bar")`. - -## Directory structure - -The `artifacts/` directory has a structure that follows the original directory structure of the contracts. For example, if your contracts look like this: - -``` -contracts -├── Foo.sol -├── Bar.sol -└── Qux.sol -``` - -then the structure of your artifact directory would look like this: - -``` -artifacts -└── contracts -    ├── Foo.sol -    │   ├── Foo.json -    │   ├── Foo.dbg.json -    │   ├── Foo2.json -    │   └── Foo2.dbg.json -    ├── Bar.sol -    │   ├── Bar.json -    │   └── Bar.dbg.json -    └── Qux.sol -    ├── Foo.json -    └── Foo.dbg.json -``` - -Each Solidity file in your source will get a directory in the artifacts structure. Each of these directories contains one artifact (`.json`) file and one debug (`.dbg.json`) file for each _contract_ in that file. `Foo.sol`, for example, contains two contracts inside. - -Two Solidity files can have contracts with the same name, and this structure allows for that. diff --git a/docs/src/content/hardhat-runner/docs/advanced/building-plugins.md b/docs/src/content/hardhat-runner/docs/advanced/building-plugins.md index c1aa605b85e..e905353de00 100644 --- a/docs/src/content/hardhat-runner/docs/advanced/building-plugins.md +++ b/docs/src/content/hardhat-runner/docs/advanced/building-plugins.md @@ -47,6 +47,62 @@ Hello, Hardhat! This is literally all it takes to put together a plugin for Hardhat. Now `hi` is available to be used in the Hardhat console, your tasks, tests and other plugins. +## Extending the Hardhat provider + +Next, we can take a look at how to add features on top of the default provider offered by Hardhat, found on `hre.network.provider`. Doing this, any extra functionality you add will be available everywhere, just as it would if you extend the [Hardhat Runtime Environment](#extending-the-hardhat-runtime-environment). + +The Hardhat provider is configured through a queue of extension functions that you can add to by using the `extendProvider()` function. It receives one parameter which is a callback to be executed after the first call to `hre.network.provider.request()` is made. This happens only once. If `extendProvider` is called multiple times, its callbacks will be executed in order, and Hardhat will wait on each one to finish before executing the next one. Returning an entirely new provider is possible but not advisable. + +These callbacks can be `async`, and they will be `await`ed until they finish, so you should be careful when adding any functionality that might take a long time to resolve. + +It's important to keep in mind that after all callbacks are executed, the provider will be wrapped by Hardhat's built-in extenders. This means that the object returned by `extendProvider` is not the same as the one found on `hre.network.provider`, but its funcionality is included there. + +For example, adding the following to `hardhat.config.js`: + +```js +import { ProviderWrapper } from 'hardhat/plugins' + +class FixedGasProvider extends ProviderWrapper { + constructor( + public readonly gasPrice, + protected readonly _wrappedProvider + ) { + super(_wrappedProvider); + } + + public async request(args) { + if (args.method === "eth_estimateGas") { + return this.gasPrice; + } else if (args.method === "eth_sendTransaction") { + const params = this._getParams(args); + const tx = params[0]; + + // let's pretend that EIP-1559 never happened + tx.gasPrice = this.gasPrice; + } + + return this._wrappedProvider.request(args); + } +} + +extendProvider(async (provider, config, network) => { + // We fix the gas price to be set by the config or to a random high value + const gasPrice = config.fixedGasPrice || "0x1000000" + const newProvider = new FixedGasProvider(gasPrice, provider); + return newProvider; +}); +``` + +Will make the `hre` provider use that gas price value everywhere it's used: + +```js +task("request", async (args, hre) => { + await hre.network.request(/*{ method arguments }*/); // this will run FixedGasProvider's request method above +}); + +module.exports = {}; +``` + ## Using the Hardhat TypeScript plugin boilerplate For a complete example of a plugin you can take a look at the [Hardhat TypeScript plugin boilerplate project](https://github.com/NomicFoundation/hardhat-ts-plugin-boilerplate/). diff --git a/docs/src/content/hardhat-runner/docs/advanced/create-task.md b/docs/src/content/hardhat-runner/docs/advanced/create-task.md index 33c7972df11..b14e3f80355 100644 --- a/docs/src/content/hardhat-runner/docs/advanced/create-task.md +++ b/docs/src/content/hardhat-runner/docs/advanced/create-task.md @@ -48,7 +48,7 @@ Let’s go through the process of creating one to interact with a smart contract Tasks in Hardhat are asynchronous JavaScript functions that get access to the [Hardhat Runtime Environment](../advanced/hardhat-runtime-environment.md), which exposes its configuration and parameters, as well as programmatic access to other tasks and any plugin objects that may have been injected. -For our example, we will use the [`@nomicfoundation/hardhat-toolbox`](/hardhat-runner/plugins/nomicfoundation-hardhat-toolbox), which includes the [ethers.js](https://docs.ethers.io/v5/) library to interact with our contracts. +For our example, we will use the [`@nomicfoundation/hardhat-toolbox`](/hardhat-runner/plugins/nomicfoundation-hardhat-toolbox), which includes the [ethers.js](https://docs.ethers.org/v6/) library to interact with our contracts. ::::tabsgroup{options="npm 7+,npm 6,yarn"} @@ -63,7 +63,7 @@ npm install --save-dev @nomicfoundation/hardhat-toolbox :::tab{value="npm 6"} ``` -npm install --save-dev @nomicfoundation/hardhat-toolbox @nomicfoundation/hardhat-network-helpers @nomicfoundation/hardhat-chai-matchers @nomiclabs/hardhat-ethers @nomiclabs/hardhat-etherscan chai ethers hardhat-gas-reporter solidity-coverage @typechain/hardhat typechain @typechain/ethers-v5 @ethersproject/abi @ethersproject/providers +npm install --save-dev @nomicfoundation/hardhat-toolbox @nomicfoundation/hardhat-network-helpers @nomicfoundation/hardhat-chai-matchers @nomicfoundation/hardhat-ethers @nomicfoundation/hardhat-verify chai ethers hardhat-gas-reporter solidity-coverage @typechain/hardhat typechain @typechain/ethers-v6 ``` ::: @@ -71,7 +71,7 @@ npm install --save-dev @nomicfoundation/hardhat-toolbox @nomicfoundation/hardhat :::tab{value="yarn"} ``` -yarn add --dev @nomicfoundation/hardhat-toolbox @nomicfoundation/hardhat-network-helpers @nomicfoundation/hardhat-chai-matchers @nomiclabs/hardhat-ethers @nomiclabs/hardhat-etherscan chai ethers hardhat-gas-reporter solidity-coverage @typechain/hardhat typechain @typechain/ethers-v5 @ethersproject/abi @ethersproject/providers +yarn add --dev @nomicfoundation/hardhat-toolbox @nomicfoundation/hardhat-network-helpers @nomicfoundation/hardhat-chai-matchers @nomicfoundation/hardhat-ethers @nomicfoundation/hardhat-verify chai ethers hardhat-gas-reporter solidity-coverage @typechain/hardhat typechain @typechain/ethers-v6 ``` ::: @@ -93,7 +93,7 @@ task("balance", "Prints an account's balance").setAction(async () => {}); /** @type import('hardhat/config').HardhatUserConfig */ module.exports = { - solidity: "0.8.9", + solidity: "{RECOMMENDED_SOLC_VERSION}", }; ``` @@ -154,7 +154,7 @@ task("balance", "Prints an account's balance") .setAction(async (taskArgs) => { const balance = await ethers.provider.getBalance(taskArgs.account); - console.log(ethers.utils.formatEther(balance), "ETH"); + console.log(ethers.formatEther(balance), "ETH"); }); ``` @@ -325,3 +325,28 @@ subtask("print", "Prints a message") console.log(taskArgs.message); }); ``` + +### Scoped tasks + +You can group tasks under a _scope_. This is useful when you have several tasks that are related to each other in some way. + +```js +const myScope = scope("my-scope", "Scope description"); + +myScope.task("my-task", "Do something") + .setAction(async () => { ... }); + +myScope.task("my-other-task", "Do something else") + .setAction(async () => { ... }); +``` + +In this case, you can run these tasks with `npx hardhat my-scope my-task` and `npx hardhat my-scope my-other-task`. + +Scoped tasks can also be run programmatically: + +```js +await hre.run({ + scope: "my-scope", + task: "my-task", +}); +``` diff --git a/docs/src/content/hardhat-runner/docs/advanced/flattening.md b/docs/src/content/hardhat-runner/docs/advanced/flattening.md deleted file mode 100644 index cbc7f8cd4ad..00000000000 --- a/docs/src/content/hardhat-runner/docs/advanced/flattening.md +++ /dev/null @@ -1,64 +0,0 @@ -# Flattening your contracts - -Hardhat comes with a built-in `flatten` task that lets you combine the source code of multiple Solidity files. - -## Flattening all your files - -If you use the `flatten` task without passing any other arguments, all the Solidity files in your project will be combined: - -``` -$ npx hardhat flatten -// Sources flattened with hardhat v2.12.3 https://hardhat.org - -// File contracts/Bar.sol - -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -contract Bar {} - -// File contracts/Qux.sol - -... -``` - -The result will be printed to stdout. You can create a file with the flattened sources using the `>` redirection operator: - -``` -$ npx hardhat flatten > Flattened.sol - -$ cat Flattened.sol -// Sources flattened with hardhat v2.12.3 https://hardhat.org - -// File contracts/Bar.sol - -... -``` - -## Flattening specific files - -The `flatten` task can receive a path to the file you want to flatten: - -``` -npx hardhat flatten contracts/Foo.sol -``` - -In this case, the result will contain the source code of `Foo.sol` and all its transitive dependencies (the files that it imports, and the files that those files import, and so on). - -You can also use multiple files: - -``` -npx hardhat flatten contracts/Foo.sol contracts/Bar.sol -``` - -But if `Bar.sol` is a dependency of `Foo.sol`, then the result will be the same as in the previous example. - -As explained in the previous section, you can redirect the output to some file: - -``` -npx hardhat flatten contracts/Foo.sol > Flattened.sol -``` - -## Circular dependencies - -Projects with circular dependencies cannot be flattened at the moment. If this is something you need, please upvote or comment [this issue](https://github.com/NomicFoundation/hardhat/issues/1486). diff --git a/docs/src/content/hardhat-runner/docs/advanced/hardhat-and-foundry.md b/docs/src/content/hardhat-runner/docs/advanced/hardhat-and-foundry.md index 189e422f324..075d64387bb 100644 --- a/docs/src/content/hardhat-runner/docs/advanced/hardhat-and-foundry.md +++ b/docs/src/content/hardhat-runner/docs/advanced/hardhat-and-foundry.md @@ -108,7 +108,7 @@ yarn add --dev hardhat @nomicfoundation/hardhat-foundry :::: -After that, initialize a Hardhat project with `npx hardhat`. Choose the "Create an empty hardhat.config.js" option, and then import the plugin in `hardhat.config.js`: +After that, initialize a Hardhat project with `npx hardhat init`. Choose the "Create an empty hardhat.config.js" option, and then import the plugin in `hardhat.config.js`: ```javascript require("@nomicfoundation/hardhat-foundry"); diff --git a/docs/src/content/hardhat-runner/docs/advanced/hardhat-runtime-environment.md b/docs/src/content/hardhat-runner/docs/advanced/hardhat-runtime-environment.md index 6f9d550920c..9902915702d 100644 --- a/docs/src/content/hardhat-runner/docs/advanced/hardhat-runtime-environment.md +++ b/docs/src/content/hardhat-runner/docs/advanced/hardhat-runtime-environment.md @@ -51,7 +51,7 @@ This way, tests written for Hardhat are just normal Mocha tests. This enables yo The HRE only provides the core functionality that users and plugin developers need to start building on top of Hardhat. Using it to interface directly with Ethereum in your project can be somewhat harder than expected. -Everything gets easier when you use higher-level libraries, like [Ethers.js](https://docs.ethers.io/) or [ethereum-waffle](https://www.npmjs.com/package/ethereum-waffle), but these libraries need some initialization to work, and that could get repetitive. +Everything gets easier when you use higher-level libraries, like [Ethers.js](https://docs.ethers.org/v6/) or [ethereum-waffle](https://www.npmjs.com/package/ethereum-waffle), but these libraries need some initialization to work, and that could get repetitive. Hardhat lets you hook into the HRE construction, and extend it with new functionality. This way, you only have to initialize everything once, and your new features or libraries will be available everywhere the HRE is used. diff --git a/docs/src/content/hardhat-runner/docs/guides/migrating-from-hardhat-waffle.md b/docs/src/content/hardhat-runner/docs/advanced/migrating-from-hardhat-waffle.md similarity index 77% rename from docs/src/content/hardhat-runner/docs/guides/migrating-from-hardhat-waffle.md rename to docs/src/content/hardhat-runner/docs/advanced/migrating-from-hardhat-waffle.md index 5d2a12c1306..b80fbcdbd81 100644 --- a/docs/src/content/hardhat-runner/docs/guides/migrating-from-hardhat-waffle.md +++ b/docs/src/content/hardhat-runner/docs/advanced/migrating-from-hardhat-waffle.md @@ -17,7 +17,7 @@ Follow these steps to migrate your project to Hardhat Toolbox. :::tab{value="npm 7+"} ``` - npm uninstall @nomiclabs/hardhat-waffle ethereum-waffle @nomiclabs/hardhat-ethers @nomiclabs/hardhat-etherscan chai ethers hardhat-gas-reporter solidity-coverage @typechain/hardhat typechain @typechain/ethers-v5 @ethersproject/abi @ethersproject/providers + npm uninstall @nomiclabs/hardhat-waffle ethereum-waffle @nomiclabs/hardhat-ethers @nomiclabs/hardhat-etherscan chai@4 ethers hardhat-gas-reporter solidity-coverage @typechain/hardhat typechain @typechain/ethers-v5 @ethersproject/abi @ethersproject/providers ``` ::: @@ -25,7 +25,7 @@ Follow these steps to migrate your project to Hardhat Toolbox. :::tab{value="npm 6"} ``` - npm uninstall @nomiclabs/hardhat-waffle ethereum-waffle @nomiclabs/hardhat-ethers @nomiclabs/hardhat-etherscan chai ethers hardhat-gas-reporter solidity-coverage @typechain/hardhat typechain @typechain/ethers-v5 @ethersproject/abi @ethersproject/providers + npm uninstall @nomiclabs/hardhat-waffle ethereum-waffle @nomiclabs/hardhat-ethers @nomiclabs/hardhat-etherscan chai@4 ethers hardhat-gas-reporter solidity-coverage @typechain/hardhat typechain @typechain/ethers-v5 @ethersproject/abi @ethersproject/providers ``` ::: @@ -55,7 +55,7 @@ Follow these steps to migrate your project to Hardhat Toolbox. :::tab{value="npm 6"} ``` - npm install --save-dev @nomicfoundation/hardhat-toolbox @nomicfoundation/hardhat-network-helpers @nomicfoundation/hardhat-chai-matchers @nomiclabs/hardhat-ethers @nomiclabs/hardhat-etherscan chai ethers hardhat-gas-reporter solidity-coverage @typechain/hardhat typechain @typechain/ethers-v5 @ethersproject/abi @ethersproject/providers + npm install --save-dev @nomicfoundation/hardhat-toolbox @nomicfoundation/hardhat-network-helpers @nomicfoundation/hardhat-chai-matchers @nomicfoundation/hardhat-ethers @nomicfoundation/hardhat-verify chai@4 ethers hardhat-gas-reporter solidity-coverage @typechain/hardhat typechain @typechain/ethers-v6 ``` ::: @@ -63,7 +63,7 @@ Follow these steps to migrate your project to Hardhat Toolbox. :::tab{value="yarn"} ``` - yarn add --dev @nomicfoundation/hardhat-toolbox @nomicfoundation/hardhat-network-helpers @nomicfoundation/hardhat-chai-matchers @nomiclabs/hardhat-ethers @nomiclabs/hardhat-etherscan chai ethers hardhat-gas-reporter solidity-coverage @typechain/hardhat typechain @typechain/ethers-v5 @ethersproject/abi @ethersproject/providers + yarn add --dev @nomicfoundation/hardhat-toolbox @nomicfoundation/hardhat-network-helpers @nomicfoundation/hardhat-chai-matchers@1 @nomiclabs/hardhat-ethers @nomiclabs/hardhat-etherscan chai@4 ethers@5 hardhat-gas-reporter solidity-coverage @typechain/hardhat typechain @typechain/ethers-v6 ``` ::: @@ -96,8 +96,8 @@ Follow these steps to migrate your project to Hardhat Toolbox. Adding the Toolbox will make many other imports redundant, so you can remove any of these if you want: - - `@nomiclabs/hardhat-ethers` - - `@nomiclabs/hardhat-etherscan` + - `@nomicfoundation/hardhat-ethers` + - `@nomicfoundation/hardhat-verify` - `hardhat-gas-reporter` - `solidity-coverage` - `@typechain/hardhat` diff --git a/docs/src/content/hardhat-runner/docs/advanced/multiple-solidity-versions.md b/docs/src/content/hardhat-runner/docs/advanced/multiple-solidity-versions.md deleted file mode 100644 index e313e03b870..00000000000 --- a/docs/src/content/hardhat-runner/docs/advanced/multiple-solidity-versions.md +++ /dev/null @@ -1,44 +0,0 @@ -# Multiple Solidity versions - -Hardhat supports projects that use different, incompatible versions of solc. For example, if you have a project where some files use Solidity 0.5 and others use 0.6, you can configure Hardhat to use compiler versions compatible with those files like this: - -```js -module.exports = { - solidity: { - compilers: [ - { - version: "0.5.5", - }, - { - version: "0.6.7", - settings: {}, - }, - ], - }, -}; -``` - -This setup means that a file with a `pragma solidity ^0.5.0` will be compiled with solc 0.5.5 and a file with a `pragma solidity ^0.6.0` will be compiled with solc 0.6.7. - -It might happen that a file can be compiled with more than one of your configured compilers, for example a file with `pragma solidity >=0.5.0`. In that case, the compatible compiler with the highest version will be used (0.6.7 in this example). If you don't want that to happen, you can specify for each file which compiler should be used by using overrides: - -```js{4-7} -module.exports = { - solidity: { - compilers: [...], - overrides: { - "contracts/Foo.sol": { - version: "0.5.5", - settings: { } - } - } - } -} -``` - -In this case, `contracts/Foo.sol` will be compiled with solc 0.5.5, no matter what's inside the `solidity.compilers` entry. - -Keep in mind that: - -- Overrides are full compiler configurations, so if you have any additional settings you're using you should set them for the override as well. -- You have to use forward slashes (`/`) even if you are on Windows. diff --git a/docs/src/content/hardhat-runner/docs/advanced/scripts.md b/docs/src/content/hardhat-runner/docs/advanced/scripts.md index e29e47e01bc..e36a8b004b9 100644 --- a/docs/src/content/hardhat-runner/docs/advanced/scripts.md +++ b/docs/src/content/hardhat-runner/docs/advanced/scripts.md @@ -24,7 +24,7 @@ const hre = require("hardhat"); You can get access to all your tasks and plugins. To run these scripts you simply go through node: `node script.js`. -To try this out, let's look at [a fresh Hardhat project](../guides/project-setup.md). Run `npx hardhat` and go through the steps to create a JavaScript project. When you're done, your project directory should look like this: +To try this out, let's look at [a fresh Hardhat project](../guides/project-setup.md). Run `npx hardhat init` and go through the steps to create a JavaScript project. When you're done, your project directory should look like this: ``` $ ls -l @@ -65,7 +65,7 @@ Lock with 1 ETH deployed to: 0x5FbDB2315678afecb367f032d93F642f64180aa3 ### Hardhat arguments -You can still pass arguments to Hardhat when running a standalone script. This is done by setting environment variables. These are: +You can still pass arguments to Hardhat when running a standalone script. This is done by setting environment variables. Some of these are: - `HARDHAT_NETWORK`: Sets the network to connect to. @@ -75,4 +75,4 @@ You can still pass arguments to Hardhat when running a standalone script. This i - `HARDHAT_MAX_MEMORY`: Sets the maximum amount of memory that Hardhat can use. -For example, instead of doing `npx hardhat --network localhost run script.js`, you can do `HARDHAT_NETWORK=localhost node script.js`. +For example, instead of doing `npx hardhat --network localhost run script.js`, you can do `HARDHAT_NETWORK=localhost node script.js`. Check our [Environment variables](/hardhat-runner/docs/reference/environment-variables) reference to learn more about this. diff --git a/docs/src/content/hardhat-runner/docs/advanced/using-esm.md b/docs/src/content/hardhat-runner/docs/advanced/using-esm.md index 291a4cf4f64..ce6c7e40022 100644 --- a/docs/src/content/hardhat-runner/docs/advanced/using-esm.md +++ b/docs/src/content/hardhat-runner/docs/advanced/using-esm.md @@ -80,7 +80,7 @@ yarn add --dev hardhat :::: -and run `npx hardhat` to create a Hardhat project: +and run `npx hardhat init` to create a Hardhat project: ``` 888 888 888 888 888 @@ -92,7 +92,7 @@ and run `npx hardhat` to create a Hardhat project: 888 888 888 888 888 Y88b 888 888 888 888 888 Y88b. 888 888 "Y888888 888 "Y88888 888 888 "Y888888 "Y888 -Welcome to Hardhat v2.13.0 +Welcome to Hardhat v{HARDHAT_VERSION} ? What do you want to do? … ▸ Create a JavaScript project diff --git a/docs/src/content/hardhat-runner/docs/advanced/using-viem.md b/docs/src/content/hardhat-runner/docs/advanced/using-viem.md new file mode 100644 index 00000000000..95a39380028 --- /dev/null +++ b/docs/src/content/hardhat-runner/docs/advanced/using-viem.md @@ -0,0 +1,229 @@ +# Using Viem + +## Overview + +Most of this documentation assumes that you are using [ethers](https://docs.ethers.org/v6/) as your connection library, but you can also use Hardhat with [Viem](https://viem.sh/docs/introduction.html), a more lightweight and type-safe alternative. This guide explains how to setup a project that uses [the Viem-based Toolbox](/hardhat-runner/plugins/nomicfoundation-hardhat-toolbox-viem) instead of the main one. + +## Quick start + +To create a new Hardhat project with Viem, initialize a project as [you normally do](/hardhat-runner/docs/guides/project-setup), but select the _“Create a TypeScript project (with Viem)”_ option. + +You can also try `hardhat-viem` in an existing project, even if it uses `hardhat-ethers`, since both plugins are compatible. To do this, just install the `@nomicfoundation/hardhat-viem` package and add it to your config. + +### Clients + +Viem provides a set of interfaces to interact with the blockchain. `hardhat-viem` wraps and auto-configures these based on your Hardhat project settings for a seamless experience. + +These **clients** are tailored for specific interactions: + +- **Public Client** fetches node information from the “public” JSON-RPC API. +- **Wallet Client** interacts with Ethereum Accounts for tasks like transactions and message signing. +- **Test Client** performs actions that are only available in development nodes. + +You can access clients via `hre.viem`. Read our documentation to learn more about the [HRE](/hardhat-runner/docs/advanced/hardhat-runtime-environment). Find below an example of how to use the public and wallet clients: + +1. Create a `scripts/clients.ts` inside your project directory. +2. Add this code to `scripts/clients.ts`: + + ```tsx + import { parseEther, formatEther } from "viem"; + import hre from "hardhat"; + + async function main() { + const [bobWalletClient, aliceWalletClient] = + await hre.viem.getWalletClients(); + + const publicClient = await hre.viem.getPublicClient(); + const bobBalance = await publicClient.getBalance({ + address: bobWalletClient.account.address, + }); + + console.log( + `Balance of ${bobWalletClient.account.address}: ${formatEther( + bobBalance + )} ETH` + ); + + const hash = await bobWalletClient.sendTransaction({ + to: aliceWalletClient.account.address, + value: parseEther("1"), + }); + await publicClient.waitForTransactionReceipt({ hash }); + } + + main() + .then(() => process.exit()) + .catch((error) => { + console.error(error); + process.exit(1); + }); + ``` + +3. Run `npx hardhat run scripts/clients.ts`. + +For more detailed documentation on clients, you can visit the [hardhat-viem plugin site](/hardhat-runner/plugins/nomicfoundation-hardhat-viem#clients) and [Viem's official site](https://viem.sh/docs/clients/intro.html). + +### Contracts + +Viem also provides functionality for interacting with contracts, and `hardhat-viem` provides wrappers for the most useful methods. Plus, it generates types for your contracts, enhancing type-checking and IDE suggestions. + +Use the `hre.viem` object to get these helpers, similar to how clients are used. The next example shows how to get a contract instance and call one of its methods: + +1. Create a `MyToken.sol` file inside your project’s `contracts` directory: + + ```solidity + // SPDX-License-Identifier: MIT + pragma solidity ^{RECOMMENDED_SOLC_VERSION}; + + contract MyToken { + uint256 public totalSupply; + + constructor(uint256 _initialSupply) { + totalSupply = _initialSupply; + } + + function increaseSupply(uint256 _amount) public { + require(_amount > 0, "Amount must be greater than 0"); + totalSupply += _amount; + } + + function getCurrentSupply() public view returns (uint256) { + return totalSupply; + } + } + ``` + +2. Run `npx hardhat compile` to compile your contracts and produce types in the `artifacts` directory. +3. Create a `contracts.ts` inside the `scripts` directory: + + ```tsx + import hre from "hardhat"; + + async function main() { + const myToken = await hre.viem.deployContract("MyToken", [1_000_000n]); + + const initialSupply = await myToken.read.getCurrentSupply(); + console.log(`Initial supply of MyToken: ${initialSupply}`); + + const hash = await myToken.write.increaseSupply([500_000n]); + // increaseSupply sends a tx, so we need to wait for it to be mined + const publicClient = await hre.viem.getPublicClient(); + await publicClient.waitForTransactionReceipt({ hash }); + + const newSupply = await myToken.read.getCurrentSupply(); + console.log(`New supply of MyToken: ${newSupply}`); + } + + main() + .then(() => process.exit(0)) + .catch((error) => { + console.error(error); + process.exit(1); + }); + ``` + +4. Open your terminal and run `npx hardhat run scripts/contracts.ts`. This will deploy the `MyToken` contract, call the `increaseSupply()` function, and display the new supply in your terminal. + +#### Contract Type Generation + +The proper types for each contract are generated during compilation. These types are used to overload the `hardhat-viem` types and improve type checking and suggestions. For example, if you copy and paste the following code at the end of the `main()` function of `scripts/contracts.ts`, TypeScript would highlight it as an error: + +```tsx +// The amount is required as a parameter +// TS Error: Expected 1-2 arguments, but got 0. +await myToken.write.increaseSupply(); + +// There is no setSupply function in the MyToken contract +// TS Error: Property 'setSupply' does not exist on type... +const tokenPrice = await myToken.write.setSupply([5000000n]); + +// The first argument of the constructor arguments is expected to be an bigint +// TS Error: No overload matches this call. +const myToken2 = await hre.viem.deployContract("MyToken", ["1000000"]); +``` + +If you want to learn more about working with contracts, you can visit the [`hardhat-viem` plugin site](/hardhat-runner/plugins/nomicfoundation-hardhat-viem#contracts) and [Viem's official site](https://viem.sh/docs/contract/getContract.html). + +### Testing + +In this example, we’ll test the `MyToken` contract, covering scenarios like supply increase and expected operation reverts. + +1. Create a `test/my-token.ts` file: + + ```tsx + import hre from "hardhat"; + import { assert, expect } from "chai"; + import { loadFixture } from "@nomicfoundation/hardhat-toolbox-viem/network-helpers"; + + // A deployment function to set up the initial state + const deploy = async () => { + const myToken = await hre.viem.deployContract("MyToken", [1_000_000n]); + + return { myToken }; + }; + + describe("MyToken Contract Tests", function () { + it("should increase supply correctly", async function () { + // Load the contract instance using the deployment function + const { myToken } = await loadFixture(deploy); + + // Get the initial supply + const initialSupply = await myToken.read.getCurrentSupply(); + + // Increase the supply + await myToken.write.increaseSupply([500_000n]); + + // Get the new supply after the increase + const newSupply = await myToken.read.getCurrentSupply(); + + // Assert that the supply increased as expected + assert.equal(initialSupply + 500_000n, newSupply); + }); + + it("should revert when increasing supply by less than 1", async function () { + // Load the contract instance using the deployment function + const { myToken } = await loadFixture(deploy); + + // Attempt to increase supply by 0 (which should fail) + await expect(myToken.write.increaseSupply([0n])).to.be.rejectedWith( + "Amount must be greater than 0" + ); + }); + }); + ``` + +2. Open your terminal and run `npx hardhat test` to run these tests. + +### Managing Types and Version Stability + +Viem adopts a particular [approach to handling changes in types within their codebase](https://viem.sh/docs/typescript.html#typescript). They consider these changes as non-breaking and typically release them as patch version updates. This approach has implications for users of both `hardhat-viem` and `hardhat-toolbox-viem`. + +**Option 1: Pinning Versions (Recommended for Stability)** + +Viem recommends pinning their package version in your project. However, it's important to note that if you choose to follow this recommendation, you should also pin the versions of `hardhat-viem` and `hardhat-toolbox-viem`. This ensures version compatibility and stability for your project. However, it's worth mentioning that by pinning versions, you may miss out on potential improvements and updates shipped with our plugins. + +To pin the versions, follow these steps: + +1. Explicitly install `hardhat-viem`, `hardhat-toolbox-viem`, and `viem`. This will add these dependencies to your `package.json` file: + + ```tsx + npm i @nomicfoundation/hardhat-toolbox-viem @nomicfoundation/hardhat-viem viem + ``` + +2. Open your `package.json` file and remove the caret character (**`^`**) from the versions of the three packages: + + ```json + { + "dependencies": { + "@nomicfoundation/hardhat-toolbox-viem": "X.Y.Z", + "@nomicfoundation/hardhat-viem": "X.Y.Z", + "viem": "X.Y.Z" + } + } + ``` + +**Option 2: Stay Updated (Recommended for Features)** + +Alternatively, you can choose not to pin versions and remain aware that your project's types may break if a newer version of `viem` is installed. By opting for this approach, you won't miss out on important upgrades and features, but you might need to address type errors occasionally. + +Both options have their merits, and your choice depends on whether you prioritize stability or staying up-to-date with the latest features and improvements. diff --git a/docs/src/content/hardhat-runner/docs/advanced/vscode-tests.md b/docs/src/content/hardhat-runner/docs/advanced/vscode-tests.md deleted file mode 100644 index dcb5d14407c..00000000000 --- a/docs/src/content/hardhat-runner/docs/advanced/vscode-tests.md +++ /dev/null @@ -1,68 +0,0 @@ -# Running tests in Visual Studio Code - -:::tip - -[Hardhat for Visual Studio Code](/hardhat-vscode) is the official Hardhat extension that adds advanced support for Solidity to VSCode. If you use Visual Studio Code, give it a try! - -::: - -You can run your tests from [Visual Studio Code](https://code.visualstudio.com) by using one of its Mocha integration extensions. We recommend using [Mocha Test Explorer](https://marketplace.visualstudio.com/items?itemName=hbenl.vscode-mocha-test-adapter). - -To use Mocha Test Explorer, you need to install it and follow these instructions. - -Install Mocha locally by running this: - -::::tabsgroup{options="npm 7+,npm 6,yarn"} - -:::tab{value="npm 7+"} - -``` -npm install --save-dev mocha -``` - -::: - -:::tab{value="npm 6"} - -``` -npm install --save-dev mocha -``` - -::: - -:::tab{value=yarn} - -``` -yarn add --dev mocha -``` - -::: - -:::: - -Then, you just need to create a file named `.mocharc.json` in your project's root directory with the following contents: - -```json -{ - "require": "hardhat/register", - "timeout": 40000 -} -``` - -:::warning - -Running test directly from Visual Studio Code won't compile your contracts automatically. Make sure to compile them manually. - -::: - -## Running TypeScript tests - -If you are writing your tests in TypeScript, you should use this `.mocharc.json` instead: - -```json -{ - "require": "hardhat/register", - "timeout": 40000, - "_": ["test/**/*.ts"] -} -``` diff --git a/docs/src/content/hardhat-runner/docs/config/index.md b/docs/src/content/hardhat-runner/docs/config/index.md index 0b818c2c6b6..f43eaf8c185 100644 --- a/docs/src/content/hardhat-runner/docs/config/index.md +++ b/docs/src/content/hardhat-runner/docs/config/index.md @@ -26,7 +26,7 @@ module.exports = { } }, solidity: { - version: "0.5.15", + version: "{RECOMMENDED_SOLC_VERSION}", settings: { optimizer: { enabled: true, @@ -62,7 +62,7 @@ module.exports = { } }, solidity: { - version: "0.5.15", + version: "{RECOMMENDED_SOLC_VERSION}", settings: { optimizer: { enabled: true, @@ -176,13 +176,13 @@ module.exports = { The `solidity` config is an optional field that can be one of the following: -- A solc version to use, e.g. `"0.7.3"`. +- A solc version to use, e.g. `"{RECOMMENDED_SOLC_VERSION}"`. - An object which describes the configuration for a single compiler. It contains the following keys: - `version`: The solc version to use. - - `settings`: An object with the same schema as the `settings` entry in the [Input JSON](https://solidity.readthedocs.io/en/v0.7.4/using-the-compiler.html#input-description). + - `settings`: An object with the same schema as the `settings` entry in the [Input JSON](https://docs.soliditylang.org/en/latest/using-the-compiler.html#input-description). - An object which describes multiple compilers and their respective configurations. It contains the following: @@ -208,3 +208,20 @@ You can configure how your tests are run using the `mocha` entry, which accepts ## Quickly integrating other tools from Hardhat's config Hardhat's config file will always run before any task, so you can use it to integrate with other tools, like importing `@babel/register`. + +## Default EVM Version + +The default EVM version is determined by solc's choice for a given compiler version. To specify a different EVM version, modify your `hardhat.config.js`: + +```js +module.exports = { + solidity: { + version: "0.8.21", + settings: { + evmVersion: "shanghai", + }, + }, +}; +``` + +Since version `0.8.20`, solc's EVM default is `shanghai`, which can lead to issues in chains that don't support the `PUSH0` opcode. To address this, starting from `0.8.20` Hardhat defaults to `paris`. This value can be overridden by using the above configuration. diff --git a/docs/src/content/hardhat-runner/docs/errors/_dirinfo.yaml b/docs/src/content/hardhat-runner/docs/errors/_dirinfo.yaml deleted file mode 100644 index 9ec3f9e8a0f..00000000000 --- a/docs/src/content/hardhat-runner/docs/errors/_dirinfo.yaml +++ /dev/null @@ -1 +0,0 @@ -section-type: hidden diff --git a/docs/src/content/hardhat-runner/docs/getting-started/_dirinfo.yaml b/docs/src/content/hardhat-runner/docs/getting-started/_dirinfo.yaml deleted file mode 100644 index 136d530308b..00000000000 --- a/docs/src/content/hardhat-runner/docs/getting-started/_dirinfo.yaml +++ /dev/null @@ -1,9 +0,0 @@ -section-type: group -section-title: Hardhat Runner -order: - - href: "#overview" - title: Overview - - href: "#installation" - title: Installation - - href: "#quick-start" - title: Quick start diff --git a/docs/src/content/hardhat-runner/docs/getting-started/index.md b/docs/src/content/hardhat-runner/docs/getting-started/index.md index b1bc062debe..d21a5f4c8cc 100644 --- a/docs/src/content/hardhat-runner/docs/getting-started/index.md +++ b/docs/src/content/hardhat-runner/docs/getting-started/index.md @@ -55,7 +55,7 @@ yarn add --dev hardhat :::: -To use your local installation of Hardhat, you need to use `npx` to run it (i.e. `npx hardhat`). +To use your local installation of Hardhat, you need to use `npx` to run it (i.e. `npx hardhat init`). ## Quick Start @@ -67,10 +67,10 @@ If you are using Windows, we **strongly recommend** using [WSL 2](https://docs.m We will explore the basics of creating a Hardhat project with a sample contract, tests of that contract, and a script to deploy it. -To create the sample project, run `npx hardhat` in your project folder: +To create the sample project, run `npx hardhat init` in your project folder: ``` -$ npx hardhat +$ npx hardhat init 888 888 888 888 888 888 888 888 888 888 888 888 888 888 888 @@ -80,11 +80,12 @@ $ npx hardhat 888 888 888 888 888 Y88b 888 888 888 888 888 Y88b. 888 888 "Y888888 888 "Y88888 888 888 "Y888888 "Y888 -👷 Welcome to Hardhat v2.9.9 👷‍ +👷 Welcome to Hardhat v{HARDHAT_VERSION} 👷‍ ? What do you want to do? … ❯ Create a JavaScript project Create a TypeScript project + Create a TypeScript project (with Viem) Create an empty hardhat.config.js Quit ``` @@ -150,7 +151,7 @@ If you created a TypeScript project, this task will also generate TypeScript bin ### Testing your contracts -Your project comes with tests that use [Mocha](https://mochajs.org), [Chai](https://www.chaijs.com), and [Ethers.js](https://docs.ethers.io/v5). +Your project comes with tests that use [Mocha](https://mochajs.org), [Chai](https://www.chaijs.com), and [Ethers.js](https://docs.ethers.org/v6/). If you take a look in the `test/` folder, you'll see a test file: @@ -178,7 +179,7 @@ You can run your tests with `npx hardhat test`: ``` $ npx hardhat test -Generating typings for: 2 artifacts in dir: typechain-types for target: ethers-v5 +Generating typings for: 2 artifacts in dir: typechain-types for target: ethers-v6 Successfully generated 6 typings! Compiled 2 Solidity files successfully @@ -238,6 +239,12 @@ Compiled 2 Solidity files successfully ### Deploying your contracts +:::tip + +Try [Hardhat Ignition](/ignition) for your deployments! Our new declarative system for deploying smart contracts without getting caught up in execution details. + +::: + Next, to deploy the contract we will use a Hardhat script. Inside the `scripts/` folder you will find a file with the following code: diff --git a/docs/src/content/hardhat-runner/docs/guides/_dirinfo.yaml b/docs/src/content/hardhat-runner/docs/guides/_dirinfo.yaml index 9d3b2adfa2f..d45c59fac74 100644 --- a/docs/src/content/hardhat-runner/docs/guides/_dirinfo.yaml +++ b/docs/src/content/hardhat-runner/docs/guides/_dirinfo.yaml @@ -10,6 +10,5 @@ order: - /hardhat-console - /typescript - /command-line-completion - - title: Migrating away from hardhat-waffle - href: /migrating-from-hardhat-waffle + - /configuration-variables - /getting-help diff --git a/docs/src/content/hardhat-runner/docs/guides/command-line-completion.md b/docs/src/content/hardhat-runner/docs/guides/command-line-completion.md index 15417e731e2..4fa85c26209 100644 --- a/docs/src/content/hardhat-runner/docs/guides/command-line-completion.md +++ b/docs/src/content/hardhat-runner/docs/guides/command-line-completion.md @@ -48,3 +48,16 @@ This approach has the downside of there being no way to provide autocomplete sug First, make sure you installed the autocompletion script with `hardhat-completion install`, then either reload your shell or open a new terminal to try again. If you still have problems, make sure that your Hardhat config doesn't have any issues. You can do this by just running `hh`. If the command prints the help message, then your config is fine. If not, you'll see what the problem is. + +If you are using zsh, these are some other things you can try: + +- Run `declare -f _hh_completion`. If you don't get any output, then the completion script is not being loaded. +- Check that your `.zshrc` has a line that loads a `__tabtab.zsh` file. This is the file that in turn should load the `hh` completion. +- Check that this `__tabtab.zsh` exists, and that there is a `hh.zsh` file in that same directory. +- Make sure that your `.zshrc` is autoloading `compinit`. This means that you should have something like `autoload -U compinit && compinit` before the `__tabtab.zsh` line. + +If you are using bash, try this: + +- Run `complete -p hh`. You should get `complete -o default -F _hh_completion hh` as the output. +- Check that your `.bashrc` has a line that loads a `__tabtab.bash` file. This is the file that in turn should load the `hh` completion. +- Check that this `__tabtab.bash` exists, and that there is a `hh.bash` file in that same directory. diff --git a/docs/src/content/hardhat-runner/docs/guides/compile-contracts.md b/docs/src/content/hardhat-runner/docs/guides/compile-contracts.md deleted file mode 100644 index f7cb9a426fb..00000000000 --- a/docs/src/content/hardhat-runner/docs/guides/compile-contracts.md +++ /dev/null @@ -1,72 +0,0 @@ -# Compiling your contracts - -To compile your contracts in your Hardhat project, use the built-in `compile` task: - -``` -$ npx hardhat compile -Compiling... -Compiled 1 contract successfully -``` - -The compiled artifacts will be saved in the `artifacts/` directory by default, or whatever your configured artifacts path is. Look at the [paths configuration section](../config/index.md#path-configuration) to learn how to change it. This directory will be created if it doesn't exist. - -After the initial compilation, Hardhat will try to do the least amount of work possible the next time you compile. For example, if you didn't change any files since the last compilation, nothing will be compiled: - -``` -$ npx hardhat compile -Nothing to compile -``` - -If you only modified one file, only that file and others affected by it will be recompiled. - -To force a compilation you can use the `--force` argument, or run `npx hardhat clean` to clear the cache and delete the artifacts. - -## Configuring the compiler - -If you need to customize the Solidity compiler options, then you can do so through the `solidity` field in your `hardhat.config.js`. The simplest way to use this field is via the shorthand for setting the compiler version, which we recommend always doing: - -```js -module.exports = { - solidity: "0.8.9", -}; -``` - -We recommend always setting a compiler version in order to avoid unexpected behavior or compiling errors as new releases of Solidity are published. - -:::warning - -Hardhat will automatically download the versions of `solc` that you set up. If you are behind an HTTP proxy, you may need to set the `HTTP_PROXY` or `HTTPS_PROXY` environment variable to the URL of your proxy. - -::: - -The expanded usage allows for more control of the compiler: - -```js -module.exports = { - solidity: { - version: "0.8.9", - settings: { - optimizer: { - enabled: true, - runs: 1000, - }, - }, - }, -}; -``` - -`settings` has the same schema as the `settings` entry in the [Input JSON](https://solidity.readthedocs.io/en/v0.7.2/using-the-compiler.html#input-description) that can be passed to the compiler. Some commonly used settings are: - -- `optimizer`: an object with `enabled` and `runs` keys. Default value: `{ enabled: false, runs: 200 }`. - -- `evmVersion`: a string controlling the target evm version. For example: `istanbul`, `berlin` or `london`. Default value: managed by `solc`. - -If any of your contracts have a version pragma that is not satisfied by the compiler version you configured, then Hardhat will throw an error. - -:::tip - -Read [this guide](../advanced/multiple-solidity-versions.md) if you need to use multiple versions of Solidity. - -::: - -[hre]: ../advanced/hardhat-runtime-environment.md diff --git a/docs/src/content/hardhat-runner/docs/guides/configuration-variables.md b/docs/src/content/hardhat-runner/docs/guides/configuration-variables.md new file mode 100644 index 00000000000..782c035335b --- /dev/null +++ b/docs/src/content/hardhat-runner/docs/guides/configuration-variables.md @@ -0,0 +1,156 @@ +# Configuration variables + +A Hardhat project can use configuration variables for user-specific values or for data that shouldn't be included in the code repository. + +These variables are set via tasks in the `vars` scope and can be retrieved in the config using the `vars` object. For example, if you do this in your config: + +```js +const INFURA_API_KEY = vars.get("INFURA_API_KEY"); + +module.exports = { + networks: { + sepolia: { + url: `https://sepolia.infura.io/v3/${INFURA_API_KEY}`, + }, + }, +}; +``` + +And then you set the `INFURA_API_KEY` with: + +``` +$ npx hardhat vars set INFURA_API_KEY +✔ Enter value: ******************************** +``` + +Then the URL for the `sepolia` network will be formed with the configuration variable you set. + +:::warning + +Configuration variables are stored in plain text on your disk. Avoid using this feature for data you wouldn’t normally save in an unencrypted file. Run `npx hardhat vars path` to find the storage's file location. + +::: + +## Managing configuration variables + +Use the tasks under the `vars` scope to manage your configuration variables. + +### `vars set` + +Assigns a value to a configuration variable, or creates one if it doesn't exist: + +``` +$ npx hardhat vars set TEST_API_KEY +``` + +### `vars get` + +Displays a configuration variable's value: + +``` +$ npx hardhat vars get TEST_API_KEY +1234abcd1234abcd1234abcd1234abcd +``` + +### `vars list` + +Prints all the configuration variables stored on your machine: + +``` +$ npx hardhat vars list +TEST_API_KEY +TEST_PK +``` + +### `vars delete` + +Removes a configuration variable: + +``` +$ npx hardhat vars delete TEST_API_KEY +``` + +## Using variables in your configuration file + +Configuration variables that you have previously stored can be retrieved within your Hardhat configuration file. Use the `vars.get` method to obtain them: + +```js +const { vars } = require("hardhat/config"); + +const INFURA_API_KEY = vars.get("INFURA_API_KEY"); + +module.exports = { + sepolia: { + url: `https://sepolia.infura.io/v3/${INFURA_API_KEY}`, + accounts: [vars.get("TEST_PK")], + }, +}; +``` + +For variables that may not exist, you can specify a default value as the second parameter: + +```js +const salt = vars.get("DEPLOY_SALT", "12345"); +``` + +You can also use `vars.has` to check if a variable exists: + +```js +const accounts = vars.has("TEST_PK") ? [vars.get("TEST_PK")] : []; +``` + +## Setting up variables for a project + +The `vars setup` task lists all the configuration variables used by the project. This is useful to know which ones you need to set up before running the project. + +### Mandatory vs. optional variables + +The output of `vars setup` separates mandatory variables from optional ones. + +A variable is considered mandatory if the configuration cannot be loaded without it. This happens when you retrieve the variable without a default value: + +```js +vars.get("MANDATORY_VARIABLE"); +``` + +However, when combined with `vars.has`, the variable is considered optional: + +```js +vars.has("OPTIONAL_VARIABLE") ? [vars.get("OPTIONAL_VARIABLE")] : []; +``` + +Variables always used with a default value are also considered optional: + +```js +vars.get("ANOTHER_OPTIONAL_VARIABLE", "DEFAULT_VALUE"); +``` + +## Migrating from `dotenv` + +If you are using `dotenv`, we recommend you migrate to our built-in configuration variables manager. This will make it easier to share values across various Hardhat projects, and will minimize the risk of exposing sensitive data by accidentally uploading a `.env` file to a public repository. + +To migrate from `dotenv`, follow these steps: + +1. Replace `process.env.KEY` references in your configuration with `vars.get("KEY")`. Replace conditions like `process.env.KEY !== undefined` with `vars.has("KEY")` +2. Run `npx hardhat vars setup` to identify all the variables that are used by your project. +3. Use `npx hardhat vars set` for each variable as indicated by the setup task. +4. After substituting all instances of `process.env`, you may uninstall the `dotenv` package and remove its import from your configuration. + +## Overriding configuration variables with environment variables + +Environment variables prefixed with `HARDHAT_VAR_` can be used to override the values of configuration variables. + +For example, if your config uses `vars.get("MY_KEY")` and you run Hardhat with the environment variable `HARDHAT_VAR_MY_KEY` set to some value, then that value is going to be used: + +```sh +HARDHAT_VAR_MY_KEY=123 npx hardhat some-task +``` + +Keep in mind that changes to environment variables during the configuration execution are not recognized. For example, if you do this: + +```js +process.env.HARDHAT_VAR_MY_KEY = "123"; +console.log(vars.get("MY_KEY")); +``` + +Then the value of `MY_KEY` _won't_ be `"123"`. diff --git a/docs/src/content/hardhat-runner/docs/guides/deploying.md b/docs/src/content/hardhat-runner/docs/guides/deploying.md index c16c9ba40f4..9c93208e5e5 100644 --- a/docs/src/content/hardhat-runner/docs/guides/deploying.md +++ b/docs/src/content/hardhat-runner/docs/guides/deploying.md @@ -1,8 +1,12 @@ # Deploying your contracts -When it comes to deploying, there are no official plugins that implement a deployment system for Hardhat yet. We are working on it. +:::tip -In the meantime, we recommend deploying your smart contracts using scripts, or using [the hardhat-deploy community plugin](https://github.com/wighawag/hardhat-deploy/tree/master). You can deploy the `Lock` contract from the sample project with a deployment script like this: +Try [Hardhat Ignition](/ignition) for your deployments! Our new declarative system for deploying smart contracts without getting caught up in execution details. + +::: + +When it comes to deploying, you can use a deployment system like [Hardhat Ignition](/ignition) or you can deploy your smart contracts using scripts. You can deploy the `Lock` contract from the sample project with a deployment script like this: ::::tabsgroup{options="TypeScript,JavaScript"} diff --git a/docs/src/content/hardhat-runner/docs/guides/getting-help.md b/docs/src/content/hardhat-runner/docs/guides/getting-help.md deleted file mode 100644 index 01a63fd1f99..00000000000 --- a/docs/src/content/hardhat-runner/docs/guides/getting-help.md +++ /dev/null @@ -1,30 +0,0 @@ -# Getting help - -Hardhat has a strong community of users willing to help you in times of trouble. Please read this entire guide to learn where and how to ask for help more effectively. - -The first place to look for answers is the [GitHub Discussions section in the Hardhat repository.](https://github.com/NomicFoundation/hardhat) We recommend you search there first, as the answer may already exist. - -If you can't find what you are looking for on GitHub Discussions, you can [create a new Discussion](https://github.com/NomicFoundation/hardhat/discussions/new). - -If you didn't have any luck on GitHub, or if you prefer a real-time chat, you can join our [Discord Server](https://hardhat.org/discord). Please read its rules and ask for help in the right channel. - -## Asking an effective question - -To increase the chances of getting an answer quickly on GitHub Discussions and Discord, you need to make sure you write a good question first. To do so, you need to include: - -1. A clear description of what you are trying to do. -2. The results you are getting, and how they differ from what you expect. -3. Which version of Hardhat you are running, and which plugins and their versions you are using. -4. Very specific and concise instructions on how to reproduce your problem. Ideally, provide a [minimal reproducible example](https://stackoverflow.com/help/minimal-reproducible-example). Another good option is to provide a link to a public repository that provides an easy environment to reproduce the problem. - -## Reporting a bug - -If you think you've found a bug in Hardhat, please [report it](https://github.com/NomicFoundation/hardhat/issues). - -However, _before_ reporting a bug, please follow these steps to ensure that a new bug report is actually warranted: - -1. Make sure you are using the latest version of Hardhat and its plugins. Your problem may already be fixed. -2. Try to determine whether the issue is coming from a plugin by running your project with some of them disabled. We only accept bug reports for plugins published by us, all of which start with either `@nomiclabs/` or `@nomicfoundation/`. If you find an issue with a plugin published by someone else, you may be able to raise it with that publisher. -3. Use the search on GitHub to try to find other reports of the same problem. If you find one, please comment on the existing issue instead of creating a new one. - -Whenever reporting a bug, and ideally whenever commenting on an existing Issue, please include all the information described in [Asking an effective question](#asking-an-effective-question). By providing as much information as possible, you greatly increase the chances of your problem getting fixed quickly. diff --git a/docs/src/content/hardhat-runner/docs/guides/hardhat-console.md b/docs/src/content/hardhat-runner/docs/guides/hardhat-console.md index 7bf0def7a47..451a30a51e8 100644 --- a/docs/src/content/hardhat-runner/docs/guides/hardhat-console.md +++ b/docs/src/content/hardhat-runner/docs/guides/hardhat-console.md @@ -25,7 +25,7 @@ For example, you'll have access in the global scope to the `config` object: > ``` -And if you followed the [Getting started guide](../getting-started) or installed `@nomiclabs/hardhat-ethers`, the `ethers` object: +And if you followed the [Getting started guide](../getting-started) or installed `@nomicfoundation/hardhat-ethers`, the `ethers` object: ``` > ethers diff --git a/docs/src/content/hardhat-runner/docs/guides/project-setup.md b/docs/src/content/hardhat-runner/docs/guides/project-setup.md index 0751641054f..dff9cc1bde2 100644 --- a/docs/src/content/hardhat-runner/docs/guides/project-setup.md +++ b/docs/src/content/hardhat-runner/docs/guides/project-setup.md @@ -68,10 +68,10 @@ yarn add --dev hardhat :::: -If you run `npx hardhat` now, you will be shown some options to facilitate project creation: +If you run `npx hardhat init` now, you will be shown some options to facilitate project creation: ``` -$ npx hardhat +$ npx hardhat init 888 888 888 888 888 888 888 888 888 888 888 888 888 888 888 @@ -81,11 +81,12 @@ $ npx hardhat 888 888 888 888 888 Y88b 888 888 888 888 888 Y88b. 888 888 "Y888888 888 "Y88888 888 888 "Y888888 "Y888 -Welcome to Hardhat v2.10.0 +Welcome to Hardhat v{HARDHAT_VERSION} ? What do you want to do? … ▸ Create a JavaScript project Create a TypeScript project + Create a TypeScript project (with Viem) Create an empty hardhat.config.js Quit ``` @@ -95,7 +96,7 @@ If you select _Create an empty hardhat.config.js_, Hardhat will create a `hardha ```js /** @type import('hardhat/config').HardhatUserConfig */ module.exports = { - solidity: "0.8.9", + solidity: "{RECOMMENDED_SOLC_VERSION}", }; ``` @@ -128,7 +129,7 @@ When it comes to testing your contracts, the sample project comes with some usef - The built-in [Hardhat Network](/hardhat-network/docs) as the development network to test on, along with the [Hardhat Network Helpers](/hardhat-network-helpers) library to manipulate this network. - [Mocha](https://mochajs.org/) as the test runner, [Chai](https://chaijs.com/) as the assertion library, and the [Hardhat Chai Matchers](/hardhat-chai-matchers) to extend Chai with contracts-related functionality. -- The [`ethers.js`](https://docs.ethers.io/v5/) library to interact with the network and with contracts. +- The [`ethers.js`](https://docs.ethers.org/v6/) library to interact with the network and with contracts. As well as other useful plugins. You can learn more about this in the [Testing contracts guide](./test-contracts.md). @@ -154,7 +155,7 @@ To use a plugin, the first step is always to install it using npm or yarn, follo import "@nomicfoundation/hardhat-toolbox"; export default { - solidity: "0.8.9", + solidity: "{RECOMMENDED_SOLC_VERSION}", }; ``` @@ -166,7 +167,7 @@ export default { require("@nomicfoundation/hardhat-toolbox"); module.exports = { - solidity: "0.8.9", + solidity: "{RECOMMENDED_SOLC_VERSION}", }; ``` diff --git a/docs/src/content/hardhat-runner/docs/guides/tasks-and-scripts.md b/docs/src/content/hardhat-runner/docs/guides/tasks-and-scripts.md deleted file mode 100644 index cfe62336976..00000000000 --- a/docs/src/content/hardhat-runner/docs/guides/tasks-and-scripts.md +++ /dev/null @@ -1,85 +0,0 @@ -# Writing tasks and scripts - -At its core, Hardhat is a task runner that allows you to automate your development workflow. It comes with some built-in tasks, like `compile` and `test`, but you can add your own custom tasks as well. - -This guide will show you how to extend Hardhat's functionality using tasks and scripts. It assumes you have initialized a sample project. If you haven't done it, please read [this guide](./project-setup.md) first. - -## Writing Hardhat Tasks - -Let's write a very simple task that prints the list of available accounts, and explore how it works. - -Copy this task definition and paste it into your hardhat config file: - -```js -task("accounts", "Prints the list of accounts", async (taskArgs, hre) => { - const accounts = await hre.ethers.getSigners(); - - for (const account of accounts) { - console.log(account.address); - } -}); -``` - -Now you should be able to run it: - -``` -npx hardhat accounts -``` - -We are using the `task` function to define our new task. Its first argument is the name of the task, and it's what we use in the command line to run it. The second argument is the description of the task, which is printed when you use `npx hardhat help`. - -The third argument is an async function that gets executed when you run the task. It receives two arguments: - -1. An object with the arguments for the task. We didn't define any yet. -2. The [Hardhat Runtime Environment](../advanced/hardhat-runtime-environment.md) or HRE, which contains all the functionality of Hardhat and its plugins. You can also find all of its properties injected into the `global` namespace during the task execution. - -You are free to do anything you want in this function. In this case, we use `ethers.getSigners()` to obtain all the configured accounts and print each of their addresses. - -You can add parameters to your tasks, and Hardhat will handle their parsing and validation for you. - -You can also override existing tasks, which allows you to change how different parts of Hardhat work. - -To learn more about tasks, please read [this guide](../advanced/create-task). - -## Writing Hardhat scripts - -You can write scripts and run them with Hardhat. They can take advantage of the [Hardhat Runtime Environment](../advanced/hardhat-runtime-environment.md) to access all of Hardhat's functionality, including the task runner. - -Here's a script that does the same as our `accounts` task. Create an `accounts.js` file in the `scripts` directory with this content: - -```js -async function main() { - const accounts = await ethers.getSigners(); - - for (const account of accounts) { - console.log(account.address); - } -} - -main().catch((error) => { - console.error(error); - process.exitCode = 1; -}); -``` - -And run it using the built-in `run` task: - -``` -npx hardhat run scripts/accounts.js -``` - -Note that we are using `ethers` without importing it. This is possible because everything that is available in the Hardhat Runtime Environment is also globally available in the script. - -To learn more about scripts, including how to run them without using Hardhat's CLI, please read [this guide](../advanced/scripts). - -## Choosing between tasks and scripts - -Choosing between tasks and scripts is up to you. If you are in doubt which one you should use, you may find this useful: - -1. If you want to automate a workflow that requires no parameters, a script is probably the best choice. - -2. If the workflow you are automating requires some parameters, consider creating a Hardhat task. - -3. If you need to access the Hardhat Runtime Environment from another tool which has its own CLI, like [`jest`](https://jestjs.io/) or [`ndb`](https://www.npmjs.com/package/ndb), you should write a script. Make sure to import the Hardhat runtime environment explicitly, so it can be [run with that tool instead of Hardhat's CLI](../advanced/scripts#standalone-scripts:-using-hardhat-as-a-library). - -4. If you feel Hardhat's parameter handling is falling short of your needs, you should write a script. Just import the Hardhat runtime environment explicitly, use your own argument parsing logic (e.g. using [`yargs`](https://yargs.js.org/)), and [run it as a standalone Node.js script](../advanced/scripts#standalone-scripts:-using-hardhat-as-a-library). diff --git a/docs/src/content/hardhat-runner/docs/guides/test-contracts.md b/docs/src/content/hardhat-runner/docs/guides/test-contracts.md index d7e4e935520..f967343d767 100644 --- a/docs/src/content/hardhat-runner/docs/guides/test-contracts.md +++ b/docs/src/content/hardhat-runner/docs/guides/test-contracts.md @@ -2,7 +2,7 @@ After [compiling your contracts](./compile-contracts.md), the next step is to write some tests to verify that they work as intended. -This guide explains our recommended approach for testing contracts in Hardhat. It relies on [ethers](https://docs.ethers.io/v5/) to connect to [Hardhat Network](/hardhat-network) and on [Mocha](https://mochajs.org/) and [Chai](https://www.chaijs.com/) for the tests. It also uses our custom [Chai matchers](/hardhat-chai-matchers) and our [Hardhat Network Helpers](/hardhat-network-helpers) to make it easier to write clean test code. These packages are part of the Hardhat Toolbox plugin; if you followed the previous guides, you should already have them installed. +This guide explains our recommended approach for testing contracts in Hardhat. It relies on [ethers](https://docs.ethers.org/v6/) to connect to [Hardhat Network](/hardhat-network) and on [Mocha](https://mochajs.org/) and [Chai](https://www.chaijs.com/) for the tests. It also uses our custom [Chai matchers](/hardhat-chai-matchers) and our [Hardhat Network Helpers](/hardhat-network-helpers) to make it easier to write clean test code. These packages are part of the Hardhat Toolbox plugin; if you followed the previous guides, you should already have them installed. While this is our recommended test setup, Hardhat is flexible: you can customize the approach or take a completely different path with other tools. @@ -27,7 +27,7 @@ For our first test we’ll deploy the `Lock` contract and assert that the unlock ```tsx import { expect } from "chai"; import hre from "hardhat"; -import { time } from "@nomicfoundation/hardhat-network-helpers"; +import { time } from "@nomicfoundation/hardhat-toolbox/network-helpers"; describe("Lock", function () { it("Should set the right unlockTime", async function () { @@ -37,8 +37,9 @@ describe("Lock", function () { // deploy a lock contract where funds can be withdrawn // one year in the future - const Lock = await hre.ethers.getContractFactory("Lock"); - const lock = await Lock.deploy(unlockTime, { value: lockedAmount }); + const lock = await ethers.deployContract("Lock", [unlockTime], { + value: lockedAmount, + }); // assert that the value is correct expect(await lock.unlockTime()).to.equal(unlockTime); @@ -53,7 +54,7 @@ describe("Lock", function () { ```js const { expect } = require("chai"); const hre = require("hardhat"); -const { time } = require("@nomicfoundation/hardhat-network-helpers"); +const { time } = require("@nomicfoundation/hardhat-toolbox/network-helpers"); describe("Lock", function () { it("Should set the right unlockTime", async function () { @@ -63,8 +64,9 @@ describe("Lock", function () { // deploy a lock contract where funds can be withdrawn // one year in the future - const Lock = await hre.ethers.getContractFactory("Lock"); - const lock = await Lock.deploy(unlockTime, { value: lockedAmount }); + const lock = await ethers.deployContract("Lock", [unlockTime], { + value: lockedAmount, + }); // assert that the value is correct expect(await lock.unlockTime()).to.equal(unlockTime); @@ -78,7 +80,7 @@ describe("Lock", function () { First we import the things we are going to use: the [`expect`](https://www.chaijs.com/api/bdd/) function from `chai` to write our assertions, the [Hardhat Runtime Environment](../advanced/hardhat-runtime-environment.md) (`hre`), and the [network helpers](/hardhat-network-helpers) to interact with the Hardhat Network. After that we use the `describe` and `it` functions, which are global Mocha functions used to describe and group your tests. (You can read more about Mocha [here](https://mochajs.org/#getting-started).) -The test itself is what’s inside the callback argument to the `it` function. First we set the values for the amount we want to lock (in [wei](https://ethereum.org/en/glossary/#wei)) and the unlock time. For the latter we use [`time.latest`](), a network helper that returns the timestamp of the last mined block. Then we deploy the contract itself: first we get a [`ContractFactory`](https://docs.ethers.io/v5/single-page/#/v5/api/contract/contract-factory/) for the `Lock` contract and then we deploy it, passing the unlock time as its constructor argument. We also pass an object with the transaction parameters. This is optional, but we'll use it to send some ETH by setting its `value` field. +The test itself is what’s inside the callback argument to the `it` function. First we set the values for the amount we want to lock (in [wei](https://ethereum.org/en/glossary/#wei)) and the unlock time. For the latter we use [`time.latest`](), a network helper that returns the timestamp of the last mined block. Then we deploy the contract itself: we call `ethers.deployContract` with the name of the contract we want to deploy and an array of constructor arguments that has the unlock time. We also pass an object with the transaction parameters. This is optional, but we'll use it to send some ETH by setting its `value` field. Finally, we check that the value returned by the `unlockTime()` [getter](https://docs.soliditylang.org/en/v0.8.13/contracts.html#getter-functions) in the contract matches the value that we used when we deployed it. Since all the functions on a contract are async, we have to use the `await` keyword to get its value; otherwise, we would be comparing a promise with a number and this would always fail. @@ -171,8 +173,9 @@ describe("Lock", function () { const ONE_YEAR_IN_SECS = 365 * 24 * 60 * 60; unlockTime = (await helpers.time.latest()) + ONE_YEAR_IN_SECS; - const Lock = await ethers.getContractFactory("Lock"); - lock = await Lock.deploy(unlockTime, { value: lockedAmount }); + lock = await ethers.deployContract("Lock", [unlockTime], { + value: lockedAmount, + }); }); it("some test", async function () { @@ -195,8 +198,9 @@ describe("Lock", function () { const ONE_YEAR_IN_SECS = 365 * 24 * 60 * 60; unlockTime = (await helpers.time.latest()) + ONE_YEAR_IN_SECS; - const Lock = await ethers.getContractFactory("Lock"); - lock = await Lock.deploy(unlockTime, { value: lockedAmount }); + lock = await ethers.deployContract("Lock", [unlockTime], { + value: lockedAmount, + }); }); it("some test", async function () { @@ -216,17 +220,25 @@ However, there are two problems with this approach: The `loadFixture` helper in the Hardhat Network Helpers fixes both of these problems. This helper receives a _fixture_, a function that sets up the chain to some desired state. The first time `loadFixture` is called, the fixture is executed. But the second time, instead of executing the fixture again, `loadFixture` will reset the state of the network to the point where it was right after the fixture was executed. This is faster, and it undoes any state changes done by the previous test. -This is how our two first tests look like when a fixture is used: +This is how our tests look like when a fixture is used: ```tsx +const { expect } = require("chai"); +const hre = require("hardhat"); +const { + loadFixture, + time, +} = require("@nomicfoundation/hardhat-toolbox/network-helpers"); + describe("Lock", function () { async function deployOneYearLockFixture() { const lockedAmount = 1_000_000_000; const ONE_YEAR_IN_SECS = 365 * 24 * 60 * 60; const unlockTime = (await time.latest()) + ONE_YEAR_IN_SECS; - const Lock = await ethers.getContractFactory("Lock"); - const lock = await Lock.deploy(unlockTime, { value: lockedAmount }); + const lock = await ethers.deployContract("Lock", [unlockTime], { + value: lockedAmount, + }); return { lock, unlockTime, lockedAmount }; } @@ -243,6 +255,29 @@ describe("Lock", function () { await expect(lock.withdraw()).to.be.revertedWith("You can't withdraw yet"); }); + + it("Should transfer the funds to the owner", async function () { + const { lock, unlockTime } = await loadFixture(deployOneYearLockFixture); + + await time.increaseTo(unlockTime); + + // this will throw if the transaction reverts + await lock.withdraw(); + }); + + it("Should revert with the right error if called from another account", async function () { + const { lock, unlockTime } = await loadFixture(deployOneYearLockFixture); + + const [owner, otherAccount] = await ethers.getSigners(); + + // we increase the time of the chain to pass the first check + await time.increaseTo(unlockTime); + + // We use lock.connect() to send a transaction from another account + await expect(lock.connect(otherAccount).withdraw()).to.be.revertedWith( + "You aren't the owner" + ); + }); }); ``` diff --git a/docs/src/content/hardhat-runner/docs/guides/typescript.md b/docs/src/content/hardhat-runner/docs/guides/typescript.md index d54671b9e89..29afc3a69e4 100644 --- a/docs/src/content/hardhat-runner/docs/guides/typescript.md +++ b/docs/src/content/hardhat-runner/docs/guides/typescript.md @@ -80,7 +80,7 @@ yarn add --dev chai @types/node @types/mocha @types/chai You can easily turn a JavaScript Hardhat config file into a TypeScript one. Let's see how this is done starting with a fresh Hardhat project. -Open your terminal, go to an empty folder, run `npx hardhat`, and go through the steps to create a JavaScript project. When you're done your project directory should look something like this: +Open your terminal, go to an empty folder, run `npx hardhat init`, and go through the steps to create a JavaScript project. When you're done your project directory should look something like this: ``` $ ls -l diff --git a/docs/src/content/hardhat-runner/docs/guides/verifying.md b/docs/src/content/hardhat-runner/docs/guides/verifying.md deleted file mode 100644 index 35e91c571e1..00000000000 --- a/docs/src/content/hardhat-runner/docs/guides/verifying.md +++ /dev/null @@ -1,158 +0,0 @@ -# Verifying your contracts - -Once your contract is ready, the next step is to deploy it to a live network and verify its source code. - -Verifying a contract means making its source code public, along with the compiler settings you used, which allows anyone to compile it and compare the generated bytecode with the one that is deployed on-chain. Doing this is extremely important in an open platform like Ethereum. - -In this guide we'll explain how to do this in the [Etherscan](https://etherscan.io/) explorer, but there are other ways to verify a contract, for example with [Sourcify](https://sourcify.dev/). - -## Getting an API key from Etherscan - -The first thing you need is an API key from Etherscan. To get one, go to [their site](https://etherscan.io/login), sign in (or create an account if you don't have one) and open the "API Keys" tab. Then click the "Add" button and give a name (like "Hardhat") to the API key you are creating. After that you'll see the newly created key in the list. - -Open your Hardhat config and add the API key you just created: - -::::tabsgroup{options=TypeScript,JavaScript} - -:::tab{value=TypeScript} - -```ts -export default { - // ...rest of the config... - etherscan: { - apiKey: "ABCDE12345ABCDE12345ABCDE123456789", - }, -}; -``` - -::: - -:::tab{value=JavaScript} - -```js -module.exports = { - // ...rest of the config... - etherscan: { - apiKey: "ABCDE12345ABCDE12345ABCDE123456789", - }, -}; -``` - -::: - -:::: - -## Deploying and verifying a contract in the Sepolia testnet - -We are going to use the [Sepolia testnet](https://ethereum.org/en/developers/docs/networks/#sepolia) to deploy and verify our contract, so you need to add this network in your Hardhat config. Here we are using [Infura](https://infura.io/) to connect to the network, but you can use an alternative JSON-RPC URL like [Alchemy](https://alchemy.com/) if you want. - -::::tabsgroup{options=Infura,Alchemy} - -:::tab{value=Infura} - -```js -// Go to https://infura.io, sign up, create a new API key -// in its dashboard, and replace "KEY" with it -const INFURA_API_KEY = "KEY"; - -// Replace this private key with your Sepolia account private key -// To export your private key from Coinbase Wallet, go to -// Settings > Developer Settings > Show private key -// To export your private key from Metamask, open Metamask and -// go to Account Details > Export Private Key -// Beware: NEVER put real Ether into testing accounts -const SEPOLIA_PRIVATE_KEY = "YOUR SEPOLIA PRIVATE KEY"; - -module.exports = { - // ...rest of your config... - networks: { - sepolia: { - url: `https://sepolia.infura.io/v3/${INFURA_API_KEY}`, - accounts: [SEPOLIA_PRIVATE_KEY], - }, - }, -}; -``` - -::: - -:::tab{value=Alchemy} - -```js -// Go to https://alchemy.com, sign up, create a new App in -// its dashboard, and replace "KEY" with its key -const ALCHEMY_API_KEY = "KEY"; - -// Replace this private key with your Sepolia account private key -// To export your private key from Coinbase Wallet, go to -// Settings > Developer Settings > Show private key -// To export your private key from Metamask, open Metamask and -// go to Account Details > Export Private Key -// Beware: NEVER put real Ether into testing accounts -const SEPOLIA_PRIVATE_KEY = "YOUR SEPOLIA PRIVATE KEY"; - -module.exports = { - // ...rest of your config... - networks: { - sepolia: { - url: `https://eth-sepolia.g.alchemy.com/v2/${ALCHEMY_API_KEY}`, - accounts: [SEPOLIA_PRIVATE_KEY], - }, - }, -}; -``` - -::: - -:::: - -To deploy on Sepolia you need to send some Sepolia ether to the address that's going to be making the deployment. You can get testnet ether from a faucet, a service that distributes testing-ETH for free. Here is one for Sepolia: - -- [Alchemy Sepolia Faucet](https://sepoliafaucet.com/) - -Now you are ready to deploy your contract, but first we are going to make the source code of our contract unique. The reason we need to do this is that the sample code from the previous section is already verified in Sepolia, so if you try to verify it you'll get an error. - -Open your contract and add a comment with something unique, like your GitHub's username. Keep in mind that whatever you include here will be, like the rest of the code, publicly available on Etherscan: - -```solidity -// Author: @janedoe -contract Lock { -``` - -You can now run the deploy script using the newly added Sepolia network: - -::::tabsgroup{options=TypeScript,JavaScript} - -:::tab{value=TypeScript} - -``` -npx hardhat run scripts/deploy.ts --network sepolia -``` - -::: - -:::tab{value=JavaScript} - -``` -npx hardhat run scripts/deploy.js --network sepolia -``` - -::: - -:::: - -Take note of the address and the unlock time and run the `verify` task with them: - -``` -npx hardhat verify --network sepolia
    -``` - -:::tip - -If you get an error saying that the address does not have bytecode, it probably means that Etherscan has not indexed your contract yet. In that case, wait for a minute and then try again. - -::: - -After the task is successfully executed, you'll see a link to the publicly verified code of your contract. - -To learn more about verifying, read the [hardhat-verify](/hardhat-runner/plugins/nomicfoundation-hardhat-verify) documentation. diff --git a/docs/src/content/hardhat-runner/docs/other-components/_dirinfo.yaml b/docs/src/content/hardhat-runner/docs/other-components/_dirinfo.yaml index 193d21e2335..c0e2946e019 100644 --- a/docs/src/content/hardhat-runner/docs/other-components/_dirinfo.yaml +++ b/docs/src/content/hardhat-runner/docs/other-components/_dirinfo.yaml @@ -3,6 +3,8 @@ section-title: Other Hardhat components order: - href: /../../../hardhat-network/docs title: Hardhat Network + - href: /../../../ignition/docs + title: Hardhat Ignition - href: /../../../hardhat-vscode/docs title: Hardhat VSCode - href: /../../../hardhat-chai-matchers/docs diff --git a/docs/src/content/hardhat-runner/docs/other-guides/_dirinfo.yaml b/docs/src/content/hardhat-runner/docs/other-guides/_dirinfo.yaml deleted file mode 100644 index 0e880b91642..00000000000 --- a/docs/src/content/hardhat-runner/docs/other-guides/_dirinfo.yaml +++ /dev/null @@ -1,2 +0,0 @@ -section-type: hidden -section-title: Other guides diff --git a/docs/src/content/hardhat-runner/docs/other-guides/ganache-tests.md b/docs/src/content/hardhat-runner/docs/other-guides/ganache-tests.md deleted file mode 100644 index 6ff3ba1524e..00000000000 --- a/docs/src/content/hardhat-runner/docs/other-guides/ganache-tests.md +++ /dev/null @@ -1,43 +0,0 @@ -# Running tests with Ganache - -:::warning - -Rather than using Ganache, we recommend using the built-in [Hardhat Network](../../../hardhat-network/docs/overview/index.md) network to test your smart contracts, as it generates [combined JavaScript and Solidity stack traces](../../../hardhat-network/docs/overview/index.md#solidity-stack-traces), making debugging easier. - -If you still want to run your tests using Ganache, you can do it in one of the following two ways. - -::: - -## Manually running Ganache - -You don't need to do anything special to use Ganache if you don't want to. - -Just start Ganache and then run Hardhat with - -``` -npx hardhat --network localhost test -``` - -## Using the `hardhat-ganache` plugin - -If you don't want to manually start and stop Ganache every time, you can use the `hardhat-ganache` plugin. - -This plugin creates a network called `ganache`, and automatically starts and stops Ganache before and after running your tests and scripts. - -To use it, you have to install it with npm - -``` -npm install --save-dev @nomiclabs/hardhat-ganache -``` - -and add this line at the beginning of your `hardhat.config.js` - -```js -require("@nomiclabs/hardhat-ganache"); -``` - -Finally, you can run your tests with - -``` -npx hardhat --network ganache test -``` diff --git a/docs/src/content/hardhat-runner/docs/other-guides/truffle-migration.md b/docs/src/content/hardhat-runner/docs/other-guides/truffle-migration.md index 097f60400e3..1bb1a9eb557 100644 --- a/docs/src/content/hardhat-runner/docs/other-guides/truffle-migration.md +++ b/docs/src/content/hardhat-runner/docs/other-guides/truffle-migration.md @@ -4,7 +4,129 @@ Hardhat is a task runner that facilitates building Ethereum smart contracts. It The bulk of Hardhat's functionality comes from plugins, and as a developer you're free to choose the ones you want to use. There are plugins for Truffle 4 and 5 that make migrating to Hardhat easy. -To migrate an existing Truffle project to Hardhat there are two main things to consider: testing and deployment. +To migrate an existing Truffle project to Hardhat you need to install the proper dependencies and adapt three parts of your project: the configuration, the tests, and the deployments. + +### Installation + +The first thing you need to do is to install Hardhat and the proper plugin. This guide assumes that you'll be using the `@nomiclabs/hardhat-truffle5` plugin. + +::::tabsgroup{options="npm 7+,npm 6,yarn"} + +:::tab{value="npm 7+"} + +``` +npm install --save-dev hardhat @nomiclabs/hardhat-truffle5 +``` + +::: + +:::tab{value="npm 6"} + +``` +npm install --save-dev hardhat @nomiclabs/hardhat-truffle5 @nomiclabs/hardhat-web3 'web3@^1.0.0-beta.36' +``` + +::: + +:::tab{value=yarn} + +``` +yarn add --dev hardhat @nomiclabs/hardhat-truffle5 @nomiclabs/hardhat-web3 'web3@^1.0.0-beta.36' +``` + +::: + +:::: + +### Configuration + +After installing the necessary dependencies, you need to create a `hardhat.config.js` file. This file is the equivalent of Truffle's `truffle-config.js` file, and it's where you configure Hardhat and its plugins. We'll be using JavaScript in this guide, but you can learn how to use Hardhat with TypeScript in [this guide](/hardhat-runner/docs/guides/typescript). + +Create a `hardhat.config.js` file with the following contents: + +```js +require("@nomiclabs/hardhat-truffle5"); + +module.exports = { + solidity: { + // ... + }, + networks: { + // ... + }, +}; +``` + +We'll explain how to adapt the compiler and the networks configurations. For other entries in your `truffle-config.js` file, you can compare [Truffle's](https://trufflesuite.com/docs/truffle/reference/configuration/) and [Hardhat's](/hardhat-runner/docs/config) configuration references. Keep in mind that some features might not be portable. + +#### Compiler configuration + +The compiler configuration is the easiest to migrate. You just need to copy the content of the `compilers.solc` object from your `truffle-config.js` file to the `solidity` entry in your `hardhat.config.js` file. For example, if your Truffle config is: + +```js +module.exports = { + compilers: { + solc: { + version: "0.8.20", + settings: { + optimizer: { + enabled: true, + runs: 200, + }, + }, + }, + }, +}; +``` + +then your Hardhat config should be: + +```js +module.exports = { + solidity: { + version: "0.8.20", + settings: { + optimizer: { + enabled: true, + runs: 200, + }, + }, + }, +}; +``` + +Keep in mind that only the `version` and `settings` keys are supported. + +#### Network configuration + +The network configuration is a bit more complex. You need to copy the content of the `networks` object from your `truffle-config.js` file to the `networks` entry in your `hardhat.config.js` file and adapt some fields. For example, if your Truffle config is: + +```js +module.exports = { + networks: { + sepolia: { + host: "http://sepolia.example.com", + port: 8545, + network_id: 11155111, + }, + }, +}; +``` + +then your Hardhat config should be: + +```js +module.exports = { + networks: { + sepolia: { + url: "http://sepolia.example.com:8545", + chainId: 11155111, + }, + }, +}; +``` + +Again, not every field is supported. Compare the [Truffle config reference](https://trufflesuite.com/docs/truffle/reference/configuration/#networks) and the [Hardhat config reference](/hardhat-runner/docs/config#json-rpc-based-networks) to learn more. ### Testing diff --git a/docs/src/content/hardhat-runner/docs/other-guides/truffle-testing.md b/docs/src/content/hardhat-runner/docs/other-guides/truffle-testing.md index e291fd71f62..1d0cdf2e34a 100644 --- a/docs/src/content/hardhat-runner/docs/other-guides/truffle-testing.md +++ b/docs/src/content/hardhat-runner/docs/other-guides/truffle-testing.md @@ -21,12 +21,12 @@ npm init --yes npm install --save-dev hardhat ``` -Now run `npx hardhat` inside your project folder and select `Create an empty hardhat.config.js`. +Now run `npx hardhat init` inside your project folder and select `Create an empty hardhat.config.js`. Let's now install the `Truffle` and `Web3.js` plugins, as well as `web3.js` itself. ``` -npm install --save-dev @nomiclabs/hardhat-truffle5 @nomiclabs/hardhat-web3 web3 +npm install --save-dev @nomiclabs/hardhat-truffle5 @nomiclabs/hardhat-web3 'web3@^1.0.0-beta.36' ``` Enable the Truffle 5 plugin on your Hardhat config file by requiring it: diff --git a/docs/src/content/hardhat-runner/docs/other-guides/waffle-testing.md b/docs/src/content/hardhat-runner/docs/other-guides/waffle-testing.md index 1c8521bd047..94a9c3332d8 100644 --- a/docs/src/content/hardhat-runner/docs/other-guides/waffle-testing.md +++ b/docs/src/content/hardhat-runner/docs/other-guides/waffle-testing.md @@ -8,7 +8,7 @@ Read [this guide](/hardhat-runner/docs/guides/test-contracts.md) to learn about Writing smart contract tests in Hardhat is done using JavaScript or TypeScript. -In this guide, we'll show you how to use [Ethers.js](https://docs.ethers.io/), a JavaScript library to interact with Ethereum, and [Waffle](https://getwaffle.io/) a simple smart contract testing library built on top of it. +In this guide, we'll show you how to use [Ethers.js](https://docs.ethers.org/v6/), a JavaScript library to interact with Ethereum, and [Waffle](https://getwaffle.io/) a simple smart contract testing library built on top of it. Let's see how to use it starting from an empty Hardhat project. @@ -20,10 +20,10 @@ Ethers and Waffle support TypeScript. Learn how to set up Hardhat with TypeScrip ## Setting up -[Install Hardhat](/hardhat-runner/docs/getting-started/index.md#installation) on an empty directory. When done, run `npx hardhat`: +[Install Hardhat](/hardhat-runner/docs/getting-started/index.md#installation) on an empty directory. When done, run `npx hardhat init`: ``` -$ npx hardhat +$ npx hardhat init 888 888 888 888 888 888 888 888 888 888 888 888 888 888 888 @@ -33,11 +33,12 @@ $ npx hardhat 888 888 888 888 888 Y88b 888 888 888 888 888 Y88b. 888 888 "Y888888 888 "Y88888 888 888 "Y888888 "Y888 -Welcome to Hardhat v2.10.0 +Welcome to Hardhat v{HARDHAT_VERSION} ? What do you want to do? … ▸ Create a JavaScript project Create a TypeScript project + Create a TypeScript project (with Viem) Create an empty hardhat.config.js Quit ``` @@ -59,7 +60,7 @@ npm install --save-dev chai @nomiclabs/hardhat-waffle :::tab{value="npm 6"} ``` -npm install --save-dev chai @nomiclabs/hardhat-waffle ethereum-waffle @nomiclabs/hardhat-ethers ethers +npm install --save-dev chai @nomiclabs/hardhat-waffle ethereum-waffle @nomiclabs/hardhat-ethers ethers@5 ``` ::: @@ -67,7 +68,7 @@ npm install --save-dev chai @nomiclabs/hardhat-waffle ethereum-waffle @nomiclabs :::tab{value="yarn"} ``` -yarn add --dev chai @nomiclabs/hardhat-waffle ethereum-waffle @nomiclabs/hardhat-ethers ethers +yarn add --dev chai @nomiclabs/hardhat-waffle ethereum-waffle @nomiclabs/hardhat-ethers ethers@5 ``` ::: @@ -229,7 +230,7 @@ A `Signer` in Ethers.js is an object that represents an Ethereum account. It's u :::tip -To learn more about `Signer`, you can look at the [Signers documentation](https://docs.ethers.io/v5/api/signer/#Wallet). +To learn more about `Signer`, you can look at the [Signers documentation](https://docs.ethers.org/v6/api/providers/#Signer). ::: diff --git a/docs/src/content/hardhat-runner/docs/reference/_dirinfo.yaml b/docs/src/content/hardhat-runner/docs/reference/_dirinfo.yaml index 0fddad6ee85..8bdc4f093a0 100644 --- a/docs/src/content/hardhat-runner/docs/reference/_dirinfo.yaml +++ b/docs/src/content/hardhat-runner/docs/reference/_dirinfo.yaml @@ -3,3 +3,4 @@ section-title: Reference order: - /stability-guarantees - /solidity-support + - /environment-variables diff --git a/docs/src/content/hardhat-runner/docs/reference/environment-variables.md b/docs/src/content/hardhat-runner/docs/reference/environment-variables.md new file mode 100644 index 00000000000..78345a5b054 --- /dev/null +++ b/docs/src/content/hardhat-runner/docs/reference/environment-variables.md @@ -0,0 +1,38 @@ +# Environment variables + +You can use certain environment variables to configure Hardhat's behavior. + +## Setting parameters with environment variables + +Every global flag or parameter accepted by Hardhat can also be specified using an environment variable. For example, to select the network you normally do: + +```bash +npx hardhat --network localhost run scripts/deploy.js +``` + +But you can get the same behavior by setting the `HARDHAT_NETWORK` environment variable: + +```bash +HARDHAT_NETWORK=localhost npx hardhat run scripts/deploy.js +``` + +In general, each flag or parameter of the form `--some-option` can be set using the `HARDHAT_SOME_OPTION` environment variable. For flags, which don't accept values, you can enable or disable them by setting them to `true` or `false`: + +```bash +HARDHAT_VERBOSE=true npx hardhat run scripts/deploy.js +``` + +Options specified with the `--some-option` form have precedence over environment variables. That is, if you run: + +```bash +HARDHAT_NETWORK=mainnet npx hardhat run --network localhost scripts/deploy.js +``` + +then the `localhost` network is going to be used. + +## Other environment variables + +Besides the environment variables that correspond to global parameters, there are some special environment variables that affect how Hardhat works. Variables starting with `HARDHAT_EXPERIMENTAL_` are experimental and could be removed in future versions. + +- `HARDHAT_DISABLE_TELEMETRY_PROMPT`: if set to `true`, Hardhat won't prompt the user asking for telemetry consent. This prompt is already not shown in CIs or when the output is not a TTY, but in some cases (like automated scripts that write to stdout) you might want to set this variable. +- `HARDHAT_EXPERIMENTAL_ALLOW_NON_LOCAL_INSTALLATION`: if set to `true`, Hardhat won't check if the `hardhat` package is locally installed. diff --git a/docs/src/content/hardhat-runner/docs/reference/solidity-support.md b/docs/src/content/hardhat-runner/docs/reference/solidity-support.md index 39516b2ded5..d0aa7b42597 100644 --- a/docs/src/content/hardhat-runner/docs/reference/solidity-support.md +++ b/docs/src/content/hardhat-runner/docs/reference/solidity-support.md @@ -13,7 +13,7 @@ These are the versions of Solidity that you can expect to fully work with Hardha - Any 0.5.x version starting from 0.5.1 - Any 0.6.x version - Any 0.7.x version -- Any 0.8.x version up to and including 0.8.18 +- Any 0.8.x version up to and including 0.8.23 We recommend against using Hardhat with newer, unsupported versions of Solidity. But if you need to do so; please read on. @@ -35,7 +35,7 @@ If you use the `viaIR` option, we recommend you set the [optimization step seque ``` solidity: { - version: "0.8.17", // any version you want + version: "{RECOMMENDED_SOLC_VERSION}", // any version you want settings: { viaIR: true, optimizer: { diff --git a/docs/src/content/hardhat-runner/docs/reference/stability-guarantees.md b/docs/src/content/hardhat-runner/docs/reference/stability-guarantees.md index d925abdda29..825d5c247f3 100644 --- a/docs/src/content/hardhat-runner/docs/reference/stability-guarantees.md +++ b/docs/src/content/hardhat-runner/docs/reference/stability-guarantees.md @@ -17,7 +17,7 @@ We will only introduce these changes when a hardfork activates on Mainnet. This Hardhat supports every currently maintained LTS Node.js version, up to two months after its end-of-life. After that period of time, we will stop testing against it, and print a warning when trying to use it. At that point, we will release a new minor version. -We recommend running Hardhat using the current LTS Node.js version. You can learn about it [here](https://nodejs.org/en/about/releases/). +We recommend running Hardhat using the current LTS Node.js version. You can learn about it [here](https://nodejs.org/en/about/previous-releases). ## How to avoid the breaking changes introduced by Hardhat diff --git a/docs/src/content/hardhat-runner/docs/supporter-guides/_dirinfo.yaml b/docs/src/content/hardhat-runner/docs/supporter-guides/_dirinfo.yaml deleted file mode 100644 index a524a210d2f..00000000000 --- a/docs/src/content/hardhat-runner/docs/supporter-guides/_dirinfo.yaml +++ /dev/null @@ -1,5 +0,0 @@ -section-type: group -section-title: Supporter guides -order: - - title: Working with oracles - href: /oracles diff --git a/docs/src/content/hardhat-runner/docs/supporter-guides/oracles.md b/docs/src/content/hardhat-runner/docs/supporter-guides/oracles.md index 4a1c7e90ca0..79d4f400d23 100644 --- a/docs/src/content/hardhat-runner/docs/supporter-guides/oracles.md +++ b/docs/src/content/hardhat-runner/docs/supporter-guides/oracles.md @@ -144,7 +144,7 @@ require("@chainlink/hardhat-chainlink"); :::: -Then you can just expand the deployment script which will deploy the above `VRFv2Consumer` smart contract and do the VRF Managment part. +Then you can just expand the deployment script which will deploy the above `VRFv2Consumer` smart contract and do the VRF Management part. To do so, first prepare the `hardhat.config` file for the deployment on the Goerli network: diff --git a/docs/src/content/hardhat-runner/docs/troubleshooting/_dirinfo.yaml b/docs/src/content/hardhat-runner/docs/troubleshooting/_dirinfo.yaml deleted file mode 100644 index 32f25f84939..00000000000 --- a/docs/src/content/hardhat-runner/docs/troubleshooting/_dirinfo.yaml +++ /dev/null @@ -1,7 +0,0 @@ -section-type: group -section-title: Troubleshooting -order: - - /verbose-logging - - /common-problems - - href: /../errors - title: Error codes diff --git a/docs/src/content/hardhat-runner/docs/troubleshooting/common-problems.md b/docs/src/content/hardhat-runner/docs/troubleshooting/common-problems.md deleted file mode 100644 index 56eecfe38a9..00000000000 --- a/docs/src/content/hardhat-runner/docs/troubleshooting/common-problems.md +++ /dev/null @@ -1,21 +0,0 @@ -# Common problems - -This section describes common problems with working with Hardhat and how to solve them. - -## Out of memory errors when compiling large projects - -If your project has lots of smart contracts, compiling them may require more memory than what Node allows by default and crash. - -If you are experiencing this problem, you can use Hardhat's `--max-memory` argument: - -``` -npx hardhat --max-memory 4096 compile -``` - -If you find yourself using this all the time, you can set it with an environment variable in your `.bashrc` (if using bash) or `.zshrc` (if using zsh): `export HARDHAT_MAX_MEMORY=4096`. - -## Using Hardhat with a proxy server - -Hardhat supports the `http_proxy` environment variable. When this variable is set, Hardhat will send its requests through the given proxy for things like JSON-RPC requests, mainnet forking and downloading compilers. - -There's also support for the `no_proxy` variable, which accepts a comma separated list of hosts or `"*"`. Any host included in this list will not be proxied. Note that requests to `"localhost"` or `"127.0.0.1"` are never proxied. diff --git a/docs/src/content/hardhat-runner/docs/troubleshooting/verbose-logging.md b/docs/src/content/hardhat-runner/docs/troubleshooting/verbose-logging.md deleted file mode 100644 index af6da932891..00000000000 --- a/docs/src/content/hardhat-runner/docs/troubleshooting/verbose-logging.md +++ /dev/null @@ -1,50 +0,0 @@ -# Verbose logging - -You can enable Hardhat's verbose mode by running it with its `--verbose` flag, or by setting the `HARDHAT_VERBOSE` environment variable to `true`. - -This mode will print a lot of output that can be super useful for debugging. An example of a Hardhat run in verbose mode is: - -``` -$ npx hardhat test --verbose - hardhat:core:hre Creating HardhatRuntimeEnvironment +0ms - hardhat:core:hre Running task test +93ms - hardhat:core:hre Running task compile +1ms - hardhat:core:hre Running task compile:get-compilation-tasks +0ms - hardhat:core:hre Running task compile:solidity +0ms - hardhat:core:hre Running task compile:solidity:get-source-paths +0ms - hardhat:core:hre Running task compile:solidity:get-source-names +9ms - hardhat:core:hre Running task compile:solidity:get-dependency-graph +4ms - hardhat:core:hre Running task compile:solidity:get-compilation-jobs +10ms - hardhat:core:tasks:compile The dependency graph was dividied in '1' connected components +0ms - hardhat:core:hre Running task compile:solidity:get-compilation-job-for-file +1ms - hardhat:core:compilation-job File '/tmp/hardhat-project/contracts/Greeter.sol' will be compiled with version '0.7.3' +0ms - hardhat:core:compilation-job File '/tmp/hardhat-project/node_modules/hardhat/console.sol' added as dependency of '/tmp/hardhat-project/contracts/Greeter.sol' +0ms - hardhat:core:hre Running task compile:solidity:get-compilation-job-for-file +13ms - hardhat:core:compilation-job File '/tmp/hardhat-project/node_modules/hardhat/console.sol' will be compiled with version '0.7.3' +1ms - hardhat:core:hre Running task compile:solidity:handle-compilation-jobs-failures +1ms - hardhat:core:hre Running task compile:solidity:filter-compilation-jobs +0ms - hardhat:core:tasks:compile '1' jobs were filtered out +15ms - hardhat:core:hre Running task compile:solidity:merge-compilation-jobs +1ms - hardhat:core:hre Running task compile:solidity:compile-jobs +1ms - hardhat:core:tasks:compile No compilation jobs to compile +1ms - hardhat:core:hre Running task compile:solidity:log:nothing-to-compile +0ms - hardhat:core:hre Running task compile:solidity:log:compilation-result +6ms - hardhat:core:hre Running task test:get-test-files +1ms - hardhat:core:hre Running task test:setup-test-environment +0ms - hardhat:core:hre Running task test:show-fork-recommendations +0ms - hardhat:core:hre Running task test:run-mocha-tests +0ms - - - Greeter - hardhat:core:hre Creating provider for network hardhat +78ms -Deploying a Greeter with greeting: Hello, world! -Changing greeting from 'Hello, world!' to 'Hola, mundo!' - ✓ Should return the new greeting once it's changed (769ms) - - - 1 passing (771ms) - - hardhat:core:cli Killing Hardhat after successfully running task test +0ms -``` - -Hardhat uses the [debug](https://github.com/visionmedia/debug) package to manage logging. The `DEBUG` environment variable can be used to turn on the verbose logging and filter it using a simple wildcard pattern. diff --git a/docs/src/content/hardhat-runner/plugins/_dirinfo.yaml b/docs/src/content/hardhat-runner/plugins/_dirinfo.yaml index 1728c8daffb..36210f01728 100644 --- a/docs/src/content/hardhat-runner/plugins/_dirinfo.yaml +++ b/docs/src/content/hardhat-runner/plugins/_dirinfo.yaml @@ -2,10 +2,14 @@ section-type: plugins section-title: Plugins order: - "@nomicfoundation/hardhat-toolbox" + - "@nomicfoundation/hardhat-toolbox-viem" - "@nomicfoundation/hardhat-chai-matchers" - - "@nomiclabs/hardhat-ethers" + - "@nomicfoundation/hardhat-ethers" + - "@nomicfoundation/hardhat-viem" - "@nomicfoundation/hardhat-verify" - "@nomicfoundation/hardhat-foundry" + - "@nomicfoundation/hardhat-ledger" + - "@nomicfoundation/hardhat-web3-v4" - "@nomiclabs/hardhat-vyper" - "@nomiclabs/hardhat-solhint" - "@nomiclabs/hardhat-solpp" diff --git a/docs/src/content/hardhat-runner/plugins/index.md b/docs/src/content/hardhat-runner/plugins/index.md deleted file mode 100644 index c627933b836..00000000000 --- a/docs/src/content/hardhat-runner/plugins/index.md +++ /dev/null @@ -1,3 +0,0 @@ -Plugins are the backbone of Hardhat, and they're built using the same config API that you use in your Hardhat configuration. Read the [Building plugins](/advanced/building-plugins) guide to learn how to create your own, and [send a pull request](https://github.com/NomicFoundation/hardhat/blob/main/docs/src/content/hardhat-runner/plugins/plugins.ts#L9) to get it listed here. - -Extend Hardhat's functionality with the plugins below. diff --git a/docs/src/content/hardhat-runner/plugins/plugins.ts b/docs/src/content/hardhat-runner/plugins/plugins.ts index 435cf481ea6..e75d9d25fa4 100644 --- a/docs/src/content/hardhat-runner/plugins/plugins.ts +++ b/docs/src/content/hardhat-runner/plugins/plugins.ts @@ -226,7 +226,14 @@ const communityPlugins: IPlugin[] = [ authorUrl: "https://github.com/symfoni/", description: "A Hardhat plugin that generates a React hook component from your smart contracts. Hot reloaded into your React app. Deployed or not deployed. And everything typed and initialized.", - tags: ["Ethers", "React", "Deploy", "Typechain", "Frontend", "Web3modal"], + tags: [ + "Ethers.js", + "React", + "Deploy", + "Typechain", + "Frontend", + "Web3modal", + ], }, { name: "hardhat-etherscan-abi", @@ -264,6 +271,14 @@ const communityPlugins: IPlugin[] = [ description: "Exporting solidity contract storage layout", tags: ["solidity", "storage-layout"], }, + { + name: "hardhat-storage-layout-json", + npmPackage: "hardhat-storage-layout-json", + author: "(Aurora Labs, mostly!) + 3obby", + authorUrl: "https://github.com/3obby/hardhat-storage-layout-json", + description: "View contracts' layouts with CLI and .json output", + tags: ["solidity", "storage"], + }, { name: "hardhat-change-network", author: "David Mihal", @@ -640,7 +655,7 @@ const communityPlugins: IPlugin[] = [ tags: ["Tooling", "Testing", "Tasks", "Scripts", "Solc", "Compiler"], }, { - name: "@dlsl/hardhat-migrate", + name: "@solarity/hardhat-migrate", author: "Distributed Lab", authorUrl: "https://distributedlab.com/", description: @@ -663,7 +678,7 @@ const communityPlugins: IPlugin[] = [ tags: ["Deployment", "Testing", "Jest", "Smart Contracts", "Solidity"], }, { - name: "@dlsl/hardhat-gobind", + name: "@solarity/hardhat-gobind", author: "Distributed Lab", authorUrl: "https://distributedlab.com/", description: @@ -709,7 +724,7 @@ const communityPlugins: IPlugin[] = [ tags: ["chainlink", "hardhat"], }, { - name: "@dlsl/hardhat-markup", + name: "@solarity/hardhat-markup", author: "Distributed Lab", authorUrl: "https://distributedlab.com/", description: @@ -773,6 +788,81 @@ const communityPlugins: IPlugin[] = [ "Enable project-specific features inside Truffle Dashboard, including advanced calldata decoding and more", tags: ["truffle-dashboard", "transaction", "signing", "decoding"], }, + { + name: "hardhat-w3f", + author: "Gelato Network", + npmPackage: "@gelatonetwork/web3-functions-sdk", + authorUrl: "https://github.com/gelatodigital/web3-functions-sdk", + description: + "The hardhat-w3f plugin allows builders to build & run Web3 Functions connecting smart off-chain data with smart contracts ", + tags: ["Gelato", "w3f", "offchain", "functions"], + }, + { + name: "hardhat-publish-typechain", + author: "xiaosongfu", + npmPackage: "hardhat-publish-typechain", + authorUrl: "https://github.com/xiaosongfu", + description: "Publish generated typechain-types to NPM", + tags: ["typechain-types", "npm registry"], + }, + { + name: "hardhat-deployed-records", + author: "xiaosongfu", + npmPackage: "hardhat-deployed-records", + authorUrl: "https://github.com/xiaosongfu", + description: "Recording deployed contracts address to json file", + tags: ["deployed history"], + }, + { + name: "hardhat-generate-function-selectors", + author: "3obby", + npmPackage: "hardhat-generate-function-selectors", + authorUrl: "https://github.com/3obby/function-selectors-plugin", + description: + "generate an output file of organized function selectors for all ABI/.json files within ./artifacts/contracts", + tags: ["function", "selectors", "tooling", "router"], + }, + { + name: "hardhat-gasless-deployer", + author: "Ahmed Ali", + authorUrl: "https://twitter.com/0xAhmedAli", + npmPackage: "https://www.npmjs.com/package/hardhat-gasless-deployer", + description: "Deploy contracts with Hardhat using Gas Station Network", + tags: ["GSN", "Gasless", "Deployment"], + }, + { + name: "hardhat-generate-storage-namespace", + npmPackage: "hardhat-generate-storage-namespace", + author: "3obby", + authorUrl: "https://github.com/3obby/hardhat-generate-storage-namespace", + description: "Generate unique storage namespaces within a script/task", + tags: ["solidity", "storage", "namespace", "router"], + }, + { + name: "@solarity/hardhat-smart-compare", + author: "Distributed Lab", + authorUrl: "https://distributedlab.com/", + description: "Hardhat plugin to deeply compare smart contracts", + tags: ["Storage Layout", "Bytecode", "Diff", "Compare"], + }, + { + name: "hardhat-logger", + author: "kruglay", + npmPackage: "hardhat-logger", + authorUrl: "https://github.com/kruglay/hardhat-logger", + description: + "Show transaction params before hardhat send transaction to network", + tags: ["log", "logger", "transaction"], + }, + { + name: "hardhat-contract-signatures", + author: "Axel Loupias", + npmPackage: "hardhat-contract-signatures", + authorUrl: "https://github.com/AxelLoupias", + description: + "Display different signatures that have the methods, events and errors of your contracts by console", + tags: ["functions", "errors", "events", "tooling", "selectorss"], + }, ]; const officialPlugins: IPlugin[] = [ @@ -780,8 +870,17 @@ const officialPlugins: IPlugin[] = [ name: "@nomicfoundation/hardhat-toolbox", author: "Nomic Foundation", authorUrl: "https://twitter.com/NomicFoundation", - description: "Nomic Foundation's recommended bundle of Hardhat plugins", - tags: ["Hardhat", "Setup"], + description: + "Nomic Foundation's recommended bundle of Hardhat plugins (ethers based)", + tags: ["Hardhat", "Setup", "Ethers.js"], + }, + { + name: "@nomicfoundation/hardhat-toolbox-viem", + author: "Nomic Foundation", + authorUrl: "https://twitter.com/NomicFoundation", + description: + "Nomic Foundation's recommended bundle of Hardhat plugins (viem based)", + tags: ["Hardhat", "Setup", "viem"], }, { name: "@nomicfoundation/hardhat-chai-matchers", @@ -791,12 +890,19 @@ const officialPlugins: IPlugin[] = [ tags: ["Chai", "Testing"], }, { - name: "@nomiclabs/hardhat-ethers", + name: "@nomicfoundation/hardhat-ethers", author: "Nomic Foundation", authorUrl: "https://twitter.com/NomicFoundation", description: "Injects ethers.js into the Hardhat Runtime Environment", tags: ["Ethers.js", "Testing", "Tasks", "Scripts"], }, + { + name: "@nomicfoundation/hardhat-viem", + author: "Nomic Foundation", + authorUrl: "https://twitter.com/NomicFoundation", + description: "Makes it easier to use viem in a Hardhat project", + tags: ["viem", "Testing", "Tasks", "Scripts"], + }, { name: "@nomicfoundation/hardhat-verify", author: "Nomic Foundation", @@ -812,6 +918,13 @@ const officialPlugins: IPlugin[] = [ "Makes it easier to use Hardhat and Foundry in the same project", tags: ["Foundry"], }, + { + name: "@nomicfoundation/hardhat-ledger", + author: "Nomic Foundation", + authorUrl: "https://twitter.com/NomicFoundation", + description: "Hardhat plugin for the Ledger hardware wallet", + tags: ["Ledger", "Wallet"], + }, { name: "@nomiclabs/hardhat-vyper", author: "Nomic Foundation", @@ -849,6 +962,14 @@ const officialPlugins: IPlugin[] = [ description: "Injects Web3 1.x into the Hardhat Runtime Environment", tags: ["Web3.js", "Testing", "Tasks", "Scripts"], }, + { + name: "@nomicfoundation/hardhat-web3-v4", + author: "ChainSafe and Nomic Foundation", + npmPackage: "@nomicfoundation/hardhat-web3-v4", + authorUrl: "https://twitter.com/ChainSafeth", + description: "Injects Web3 4.x into the Hardhat Runtime Environment", + tags: ["Web3.js", "Testing", "Tasks", "Scripts"], + }, { name: "@nomiclabs/hardhat-truffle5", author: "Nomic Foundation", diff --git a/docs/src/content/hardhat-vscode/_dirinfo.yaml b/docs/src/content/hardhat-vscode/_dirinfo.yaml deleted file mode 100644 index 9ec3f9e8a0f..00000000000 --- a/docs/src/content/hardhat-vscode/_dirinfo.yaml +++ /dev/null @@ -1 +0,0 @@ -section-type: hidden diff --git a/docs/src/content/hardhat-vscode/docs/_dirinfo.yaml b/docs/src/content/hardhat-vscode/docs/_dirinfo.yaml deleted file mode 100644 index 0c53d7fc7b4..00000000000 --- a/docs/src/content/hardhat-vscode/docs/_dirinfo.yaml +++ /dev/null @@ -1,7 +0,0 @@ -section-type: group -section-title: Hardhat VSCode -order: - - title: Overview - href: /overview - - /hardhat-projects - - /formatting diff --git a/docs/src/content/hardhat-vscode/docs/features.md b/docs/src/content/hardhat-vscode/docs/features.md deleted file mode 100644 index ead022319c1..00000000000 --- a/docs/src/content/hardhat-vscode/docs/features.md +++ /dev/null @@ -1 +0,0 @@ -# Features diff --git a/docs/src/content/hardhat-vscode/docs/formatting.md b/docs/src/content/hardhat-vscode/docs/formatting.md deleted file mode 100644 index 52b3ae8b734..00000000000 --- a/docs/src/content/hardhat-vscode/docs/formatting.md +++ /dev/null @@ -1,46 +0,0 @@ -# Formatting - -Hardhat for Visual Studio Code provides formatting support for `.sol` files, by leveraging [prettier-plugin-solidity](https://github.com/prettier-solidity/prettier-plugin-solidity). - -## Setting it up as the default Solidity formatter - -If you currently have other solidity extensions installed, or have had previously, they may be set as your default formatter for solidity files. - -To set Hardhat for Visual Studio Code as your default formatter for solidity files: - -1. Within a Solidity file run the _Format Document With_ command, either through the Command Palette, or by right clicking and selecting through the context menu: - - ![Format Document With](/hardhat-vscode-images/format_document_with.png "Format Document With") - -2. Select `Configure Default Formatter...` - - ![Format Document With](/hardhat-vscode-images/configure_default_formatter.png "Configure default formatter") - -3. Select `Hardhat + Solidity` as the default formatter for solidity files - - ![Format Document With](/hardhat-vscode-images/select_solidity_plus_hardhat.png "Confiure default formatter") - -## Formatting Configuration - -The default formatting rules that will be applied are taken from [prettier-plugin-solidity](https://github.com/prettier-solidity/prettier-plugin-solidity#configuration-file), with the exception that `explicitTypes` are preserved (rather than forced). - -To override the settings, add a `prettierrc` configuration file at the root of your project. Add a `*.sol` file override to the prettier configuration file and change from the defaults shown: - -```javascript -// .prettierrc.json -{ - "overrides": [ - { - "files": "*.sol", - "options": { - "printWidth": 80, - "tabWidth": 4, - "useTabs": false, - "singleQuote": false, - "bracketSpacing": false, - "explicitTypes": "preserve" - } - } - ] -} -``` diff --git a/docs/src/content/hardhat-vscode/docs/hardhat-projects.md b/docs/src/content/hardhat-vscode/docs/hardhat-projects.md deleted file mode 100644 index f3d91f4fc5f..00000000000 --- a/docs/src/content/hardhat-vscode/docs/hardhat-projects.md +++ /dev/null @@ -1,15 +0,0 @@ -# Hardhat projects support - -Hardhat for Visual Studio Code provides enhanced functionality for Solidity files within a Hardhat project, including inline validation and quick fixes. - -To take advantage of these features, use the `File` menu to `Open Folder`, and select the folder containing the `hardhat.config.{js,ts}` file. - -Inline validation (the display of compiler errors and warnings against the code) is based on your Hardhat configuration file. The version of the `solc` solidity compiler used for validation is set within this file, see the [Hardhat documentation](https://hardhat.org/config/#solidity-configuration) for more details. - -## Monorepo Support - -Hardhat for Visual Studio Code will detect Hardhat projects (folders containing a `hardhat.config.{js,ts}` file) within a monorepo, when the root of the monorepo is opened as a workspace folder. - -The Hardhat config file that is used when validating a Solidity file is shown in the Solidity section on the _Status Bar_: - -![Open Config](/hardhat-vscode-images/open-config.gif "Open Config") diff --git a/docs/src/content/hardhat-vscode/docs/other-components/_dirinfo.yaml b/docs/src/content/hardhat-vscode/docs/other-components/_dirinfo.yaml index 6cc6cf92f9c..99e861c32c2 100644 --- a/docs/src/content/hardhat-vscode/docs/other-components/_dirinfo.yaml +++ b/docs/src/content/hardhat-vscode/docs/other-components/_dirinfo.yaml @@ -5,6 +5,8 @@ order: title: Hardhat Runner - href: /../../../hardhat-network/docs title: Hardhat Network + - href: /../../../ignition/docs + title: Hardhat Ignition - href: /../../../hardhat-chai-matchers/docs title: Hardhat Chai Matchers - href: /../../../hardhat-network-helpers/docs diff --git a/docs/src/content/hardhat-vscode/docs/overview.md b/docs/src/content/hardhat-vscode/docs/overview.md deleted file mode 100644 index a00bcf6e03c..00000000000 --- a/docs/src/content/hardhat-vscode/docs/overview.md +++ /dev/null @@ -1,122 +0,0 @@ ---- -title: Hardhat for Visual Studio Code -description: Solidity and Hardhat support for Visual Studio Code ---- - -# Hardhat for Visual Studio Code - -[Hardhat for Visual Studio Code](https://marketplace.visualstudio.com/items?itemName=NomicFoundation.hardhat-solidity) is a VS Code extension that adds language support for [Solidity](https://soliditylang.org/) and provides editor integration for [Hardhat projects](https://hardhat.org/). Integrations for other tools are coming in the near future. - -Hardhat for Visual Studio code adds the following features: - -- [Code completion](#code-completions) -- [Go to definition, type definition and references](#navigation) -- [Symbol renames](#renames) -- [Solidity code formatting](#format-document) -- [Inline code validation from compiler errors/warnings for Hardhat projects](<#inline-code-validation-(diagnostics)>) -- [Hover help for variables, function calls, errors, events etc.](#hover) -- [Code actions (quickfixes) suggested from compiler errors/warnings for Hardhat projects](#code-actions) - -## Installation - -[Hardhat for Visual Studio Code](https://marketplace.visualstudio.com/items?itemName=NomicFoundation.hardhat-solidity) can be installed by using the Visual Studio Code Marketplace. - -Some features (e.g. inline validation, quick fixes) are still experimental and are only enabled within a [Hardhat](https://hardhat.org/) project, this is a limitation that will be lifted with future releases. - -This extension should work without any configuration. To learn more about how it works with Hardhat projects, please read [this section](./hardhat-projects.md). If formatting functionality isn't working, or you have previously configured another Solidity formatter, please see the [formatting section](./formatting.md). - -## Features - -### Code Completions - -Hardhat for Visual Studio Code autocompletes references to existing symbols (e.g. contract instances, globally available variables and built-in types like arrays) and import directives (i.e. it autocompletes the path to the imported file). - -Direct imports (those not starting with `./` or `../`) are completed based on suggestions from `./node_modules`. - -Relative imports pull their suggestions from the file system based on the current solidity file's location. - -![Import completions](/hardhat-vscode-images/import-completion.gif "Import completions") - -### Navigation - -Move through your codebase with semantic navigation commands: - -#### Go to Definition - -Navigates to the definition of an identifier. - -#### Go to Type Definition - -Navigates to the type of an identifier. - -#### Go to References - -Shows all references of the identifier under the cursor. - -![Navigation](/hardhat-vscode-images/navigation.gif "Navigation") - -### Renames - -Rename the identifier under the cursor and all of its references: - -![Rename](/hardhat-vscode-images/rename.gif "Rename") - -### Format document - -Apply solidity formatting to the current document. - -The formatting configuration can be overridden through a `.prettierrc` file, see [Formatting Configuration](./formatting.md#formatting-configuration). - -![Reformat](/hardhat-vscode-images/format.gif "Reformat") - -### Hover - -Hovering the cursor over variables, function calls, errors and events will display a popup showing type and signature information: - -![Hover](/hardhat-vscode-images/on-hover.gif "Hover") - -### Inline code validation (Diagnostics) - -As code is edited, Hardhat for Visual Studio Code runs the [solc](https://docs.soliditylang.org/en/latest/using-the-compiler.html) compiler over the changes and displays any warnings or errors it finds. - -This feature is only available in solidity files that are part of a **Hardhat** project, as **Hardhat** is used for import resolution, see [Hardhat Projects](#hardhat-projects) for details. - -![Diagnostic](/hardhat-vscode-images/diagnostic.gif "Diagnostic") - -### Code Actions - -Code actions, or quickfixes are refactorings suggested to resolve a [solc](https://docs.soliditylang.org/en/latest/using-the-compiler.html) warning or error. - -A line with a warning/error that has a _code action_, will appear with small light bulb against it; clicking the light bulb will provide the option to trigger the _code action_. - -#### Implement missing functions on interface - -A contract that implements an interface, but is missing functions specified in the interface, will get a `solidity(3656)` error. - -The matching code action _Add missing functions from interface_ will determine which functions need to be implemented to satisfy the interface and add them as stubs to the body of the contract. - -![Implement interface](/hardhat-vscode-images/implement-interface.gif "Implement interface") - -#### Constrain mutability - -A function without a mutability keyword but which does not update contract state will show a `solidity(2018)` warning, with `solc` suggesting adding either the `view` or `pure` keyword depending on whether the function reads from state. - -The matching code action _Add view/pure modifier to function declaration_ resolves the warning by adding the keyword to the function signature. - -![Constrain Mutability](/hardhat-vscode-images/constrain-mutability.gif "Constrain Mutability") - -#### Adding `virtual`/`override` on inherited function signature - -A function in an inheriting contract, that has the same name and parameters as a function in the base contract, causes `solidity(4334)` in the base contract function if it does not have the `virtual` keyword and `solidity(9456)` in the inheriting contract function if does not have the `override` keyword. - -The _Add virtual specifier to function definition_ and _Add override specifier to function definition_ code actions appear against functions with these errors. - -![Virtual and Override](/hardhat-vscode-images/virtual-override.gif "Virtual and Override") - -#### Adding `public`/`private` to function signature - -A function without an accessibility keyword will cause the `solidity(4937)` error. - -Two code actions will appear against a function with this error: _Add public visibility to declaration_ and _Add private visibility to declaration_. - -![Public Private](/hardhat-vscode-images/public-private.gif "Public Private") diff --git a/docs/src/content/home.ts b/docs/src/content/home.ts index 0ba2fd12e90..59c1d8307dd 100644 --- a/docs/src/content/home.ts +++ b/docs/src/content/home.ts @@ -1,7 +1,6 @@ import SolidityIcon from "../assets/tools/solidity"; import RunnerIcon from "../assets/tools/runner"; -// TODO: Re-enable Ignition section -// import IgnitionIcon from "../assets/tools/ignition"; +import IgnitionIcon from "../assets/tools/ignition"; import NetworkIcon from "../assets/tools/network"; import SolidityImageMobile from "../assets/feature-cards/Mobile/SolidityImage.svg"; @@ -29,7 +28,7 @@ import vibrantCommunityImageDark from "../assets/vibrantCommunityImageDark.svg"; import { Tools } from "../components/ui/types"; import reviewsBlock from "../assets/homepage-assets/reviews-block"; import RunnerIconDark from "../assets/tools/runner-dark"; -// import IgnitionIconDark from "../assets/tools/ignition-dark"; +import IgnitionIconDark from "../assets/tools/ignition-dark"; import NetworkIconDark from "../assets/tools/network-dark"; import SolidityIconDark from "../assets/tools/solidity-dark"; @@ -212,16 +211,16 @@ const toolsBlockContent = { "Hardhat Runner is the main component you interact with when using Hardhat. It's a flexible and extensible task runner that helps you manage and automate the recurring tasks inherent to developing smart contracts and dApps.", link: "/hardhat-runner", }, - // TODO: Re-enable Ignition section - // { - // icon: IgnitionIcon, - // title: "Ignition", - // value: Tools.IGNITION, - // mottos: ["deploy", "distribute"], - // description: - // "Deployment system for structuring, automating and distributing smart contract deployment setups.", - // link: "/hardhat-ignition", - // }, + { + icon: IgnitionIcon, + iconDark: IgnitionIconDark, + title: "Ignition", + value: Tools.IGNITION, + mottos: ["deploy"], + description: + "Declarative deployment system that enables you to deploy your smart contracts without navigating the mechanics of the deployment process.", + link: "/ignition", + }, { icon: NetworkIcon, iconDark: NetworkIconDark, diff --git a/docs/src/content/docs-landing/_dirinfo.yaml b/docs/src/content/ignition/_dirinfo.yaml similarity index 100% rename from docs/src/content/docs-landing/_dirinfo.yaml rename to docs/src/content/ignition/_dirinfo.yaml diff --git a/docs/src/content/hardhat-chai-matchers/_dirinfo.yaml b/docs/src/content/ignition/docs/_dirinfo.yaml similarity index 100% rename from docs/src/content/hardhat-chai-matchers/_dirinfo.yaml rename to docs/src/content/ignition/docs/_dirinfo.yaml diff --git a/docs/src/content/ignition/docs/advanced/_dirinfo.yaml b/docs/src/content/ignition/docs/advanced/_dirinfo.yaml new file mode 100644 index 00000000000..3b86264611c --- /dev/null +++ b/docs/src/content/ignition/docs/advanced/_dirinfo.yaml @@ -0,0 +1,7 @@ +section-type: group +section-title: Advanced +order: + - /execution + - /deployment-artifacts + - /reconciliation + - /versioning diff --git a/docs/src/content/ignition/docs/advanced/deployment-artifacts.md b/docs/src/content/ignition/docs/advanced/deployment-artifacts.md new file mode 100644 index 00000000000..169a1bec77d --- /dev/null +++ b/docs/src/content/ignition/docs/advanced/deployment-artifacts.md @@ -0,0 +1,37 @@ +# Deployment artifacts + +Hardhat Ignition stores the information for each of your deployments in folders inside of `./ignition/deployments`. + +These folders contain all the deployment results, and a journal file which records every deployment action executed, enabling recovery from errors and resuming deployments. + +The different files inside each deployment folder are detailed below: + +## The journal + +The main file in a deployment folder is `journal.jsonl`. This is where Hardhat Ignition writes every operation it makes, before executing it. + +The journal file allows Hardhat Ignition to resume deployments. + +## Contract Artifacts and `BuildInfo`s + +Hardhat Ignition uses [the same format as Hardhat](../../../hardhat-runner/docs/advanced/artifacts.md) for artifacts and build info files. + +The only differences are that the artifacts are stored in `ignition/deployment//artifacts`, without subfolders, and that their files are named after the `Future` ID that created them. + +As an example, a call to `m.contract` with ID `"foo"` in your module `"Mod"`, will create an artifact file `ignition/deployment//artifacts/Mod#foo.json`. + +## Contract addresses + +Every deployment folder also contains a `deployed_addresses.json`, which is a JSON file mapping each successfully executed contract `Future` to its address. + +This means that if you have a call to `m.contract`, `m.library`, or `m.contractAt` with ID `"foo"` in your module `"Mod"`, the `deployed_addresses.json` mapping will look like: + +```json +{ + //... + + "Mod#foo": "0x..." + + //... +} +``` diff --git a/docs/src/content/ignition/docs/advanced/execution.md b/docs/src/content/ignition/docs/advanced/execution.md new file mode 100644 index 00000000000..23035634076 --- /dev/null +++ b/docs/src/content/ignition/docs/advanced/execution.md @@ -0,0 +1,77 @@ +# Module execution + +This section explains how Hardhat Ignition deploys your modules. You don't need to understand this to start using it, you can read the [Quick Start guide](../getting-started/index.md#quick-start) instead. + +## Module loading and validation + +When you run `npx hardhat ignition deploy `, Hardhat Ignition will read the ``, then execute its code including the call to `buildModule` that defines your module. + +`buildModule` uses your module definition callback to create different futures. `buildModule` runs some initial validations that only depend on the module definition itself. If these validations pass, an Ignition Module will be created based on the futures. + +Hardhat Ignition will next check the created module in the context of your project. It will perform additional validations to ensure the futures are correct with respect to your contracts (i.e the contracts you want to deploy exist, that you are passing them valid arguments, etc). + +## Previous state and reconciliation + +Hardhat Ignition is designed to be able to resume a previously started deployment. This is achieved by keeping a journal of the deployment execution. Before taking an action it is written to the journal. After an action produces a result, the result is written to the journal. This allows Hardhat Ignition to reconstruct its internal state by reading the journal, a technique called [write-ahead logging](https://en.wikipedia.org/wiki/Write-ahead_logging). + +Note that the journal does not store your module definition, but only the actions that have been taken during the deployment. + +Whenever you run a deployment, Hardhat Ignition will first check if there's an existing journal. If there is one, Hardhat Ignition will use it to reconstruct the state of the deployment on its last run. There is then a check to determine if the modules to be deployed are compatible with the deployment's state. This process is called Reconciliation. + +You can think of the reconciliation process as a validation that tries to understand if the previous state is compatible with your current modules. To learn more about this process, read the [Reconciliation guide](./reconciliation.md). + +If there's a journal, and the reconciliation process passes, Hardhat Ignition starts the deployment using the previous state. The next steps of the deployment process are the same whether a fresh state is used or the state of the previous run. + +## Execution order and batching + +Deploying a module means executing all of its futures, which in turn requires executing all of their dependencies, which may come from different modules. + +To decide the right order of execution, Hardhat Ignition creates a graph of `Future` objects, including those in your module, and those in submodules. In this graph, edges represent [explicit or implicit dependencies between `Future` objects](../guides/creating-modules.md#dependencies-between--future--objects). + +Using this graph, Hardhat Ignition will create different execution batches. Each batch has a set of `Future` objects that can be executed in parallel. + +The first batch will contain `Future` objects that meet one of these rules: + +- It has started executing in a previous run and has neither completed nor failed. +- It has no dependency. +- All of its dependencies were succesfully executed in a the previous run. + +The successive batches will have `Future` objects whose dependencies are included in the batches preceding it. For example, batch 4 would have `Future` objects whose dependencies were executed in a previous run, or are included in the batches 1, 2 or 3. + +This batching process is run before starting to execute, and the batches are not updated during the execution. + +When Hardhat Ignition starts executing a batch, it will wait until all its `Future` objects are complete before executing the next batch. + +## `Future` execution + +Each `Future` within a batch is executed independently, so we'll focus on the execution of a single `Future`. + +### Journaling + +As explained above, Hardhat Ignition uses a journal to be able to recreate its internal state at any point in time. To do this, it records every action it takes. + +The first message recorded into the journal indicates that Hardhat Ignition will start executing a `Future`. This message records a concrete view of your `Future`, where any `Future`, Module Parameter or account used as argument or option is replaced with their concrete value. This allows Hardhat Ignition, during the reconciliation process, to prevent the execution of an unmodified `Future` with different values (e.g. different Module Parameters). + +Subsequent steps of the `Future` execution are also recorded to the journal, including both success and failure results. The only exception to this rule are failed transaction simulations; these are not recorded. See [Transaction execution](./execution.md#transaction-execution) to learn more about transaction simulations. + +Hardhat Ignition will error if you try to resume the execution of a `Future` that has a failed result recorded in the journal. It will indicate that you need to [wipe the future's previous execution](../guides/error-handling.md#wiping-a-previous-execution). + +### Executing the different kinds of `Future` + +Hardhat Ignition knows how to execute each kind of `Future`: deploying a contract, instantiating an existing one, calling a contract, reading from one, deploying a library, sending ETH or data, or reading an event argument. + +Some of these require sending transactions, which Hardhat Ignition does through the [Hardhat Runtime Environment](../../../hardhat-runner/docs/advanced/hardhat-runtime-environment.md)'s network connection. + +### Transaction execution + +When Hardhat Ignition needs to send a transaction it first simulates it by running `eth_call`. If this simulation fails (i.e. the `eth_call` reverts) the execution is interrupted. Read the [Error handling guide](../guides/error-handling.md) to learn how to deal with this situation. + +If the simulation is successful, Hardhat Ignition will send the transaction and start monitoring its progress until it is included in a block and accumulates the [required number of confirmations](../config/index.md#requiredconfirmations) to be considered successful. + +The execution of a `Future` is not considered complete until all of its transactions have the required number of confirmations. This means that if the `Future` Child depends on the `Future` Parent, Child won't start executing before every `Future` in Parent's batch has all of their transactions confirmed with the required number of confirmations. + +Once a transaction is sent, Hardhat Ignition will wait for [a period of time](../config/index.md#timebeforebumpingfees) for it to confirm. If it doesn't get its first confirmation during that time, it will resend it with higher fees. + +If a transaction needs to be resent more than the configured [maximum number of times](../config/index.md#maxfeebumps), Hardhat Ignition will stop resending it and will consider the execution of the `Future` to have timed out, aborting the deployment. + +Finally, if the transaction gets dropped from the mempool or replaced by an unexpected transaction (e.g. sent by the user), the execution will be aborted. You will have to rerun Hardhat Ignition, which will recover from the situation automatically, though on rerun it may indicate a wait is required for unexpected transactions to fully confirm. diff --git a/docs/src/content/ignition/docs/advanced/reconciliation.md b/docs/src/content/ignition/docs/advanced/reconciliation.md new file mode 100644 index 00000000000..343546f175f --- /dev/null +++ b/docs/src/content/ignition/docs/advanced/reconciliation.md @@ -0,0 +1,42 @@ +# Reconciliation + +Being able to resume the deployment of a module is a key feature of Hardhat Ignition. Resuming is used to [recover from errors](../guides/error-handling.md), and to allow you to [continue the deployment of modified modules](../guides/modifications.md). + +As explained in the [Module execution](./execution.md) guide, Hardhat Ignition can resume a previous deployment thanks to its journal, which is used to reconstruct the internal state of the previous deployment run. + +This previous state may have been created with a different version of your modules or contracts though. Hardhat Ignition runs a process called Reconciliation to understand if the previous state is compatible with your current modules and contracts. + +If the reconciliation process fails, Hardhat Ignition won't let you resume the deployment, and will indicate which `Future` objects have incompatible changes. + +## Compatible changes + +There are different changes that you can apply to your module that will pass the reconciliation process. + +You can always define a new `Future` in an existing module, including importing from submodules. + +You can also alter your modules so that they express the same outcomes that you already deployed, but in a different way. For example, if you had this module + +```js +const param = m.getParameter("param"); +const foo = m.contract("Foo", [param]); +``` + +and deployed it with `5` as the value of `param`, you can modify it like this and it will be compatible + +```js +const foo = m.contract("Foo", [5]); +``` + +You can delete `Future` objects from modules as long as they haven't been executed yet. You can also delete a `Future` if it has been successfully executed, though Hardhat Ignition will print a warning when the modified module is deployed. + +You can also modify the dependencies of a `Future` as long as it hasn't started executing, or if the dependencies have already been successfully executed. + +Finally, you can modify the contracts used by `Future` objects that have already started executing. Hardhat Ignition will consider the changes compatible as long as their compilation bytecode is the same, except for their metadata hash, which can be different. + +## Recovering from incompatible changes + +There are three ways to recover from incompatible changes: + +1. Revert the change. +2. Apply a new change so that your module matches what you have already deployed in a different way, as explained above. +3. Delete the previous execution of a `Future`, as explained [here](../guides/error-handling.md#wiping-a-previous-execution). diff --git a/docs/src/content/ignition/docs/advanced/versioning.md b/docs/src/content/ignition/docs/advanced/versioning.md new file mode 100644 index 00000000000..b496da47bce --- /dev/null +++ b/docs/src/content/ignition/docs/advanced/versioning.md @@ -0,0 +1,11 @@ +# Version control of deployments + +Hardhat Ignition creates files for each deployment. The files are stored under the directory `./ignition/deployments/`. To understand the files created, please read our [Deployment artifacts](./deployment-artifacts.md) guide. + +If you want to store your deployments in version control, the recommended way is commiting the entire `./ignition/deployments` directory. + +If you think they are too large to be committed, you should at least commit their `deployed_addresses.json` file. + +Note that if you don't keep track of the rest of the files, you won't be able to extend your executed deployment by modifying your modules, so consider storing them somewhere else. + +Future versions of Hardhat Ignition will make the `deployments` file system structure lighter and friendlier for version control. diff --git a/docs/src/content/hardhat-runner/docs/config/_dirinfo.yaml b/docs/src/content/ignition/docs/config/_dirinfo.yaml similarity index 100% rename from docs/src/content/hardhat-runner/docs/config/_dirinfo.yaml rename to docs/src/content/ignition/docs/config/_dirinfo.yaml diff --git a/docs/src/content/ignition/docs/config/index.md b/docs/src/content/ignition/docs/config/index.md new file mode 100644 index 00000000000..179e3fa87cb --- /dev/null +++ b/docs/src/content/ignition/docs/config/index.md @@ -0,0 +1,43 @@ +# Configuration + +You can use the `ignition` field in the Hardhat config to customize how Hardhat Ignition behaves: + +```js +// hardhat.config.js +module.exports = { + ignition: { + blockPollingInterval: 1_000, + timeBeforeBumpingFees: 3 * 60 * 1_000, + maxFeeBumps: 4, + requiredConfirmations: 5, + }, +}; +``` + +## Configuration options + +These are the different options you can add to your Hardhat config file. + +### `blockPollingInterval` + +The time in milliseconds that Hardhat Ignition will wait between checks that a new block has been minted. + +Default value: 1000 milliseconds (1 second). + +### `timeBeforeBumpingFees` + +The time in milliseconds to wait before bumping the fee for an unconfirmed transaction. + +Default value: 180,000 milliseconds (3 minutes). + +### `maxFeeBumps` + +The number of times an unconfirmed transaction will have its fee bumped before Hardhat Ignition considers it timed out. + +Default value: 4. + +### `requiredConfirmations` + +The number of confirmations Hardhat Ignition waits before considering a transaction as complete. This provides control over block re-org risk. + +Default value: 5 diff --git a/docs/src/content/ignition/docs/getting-started/_dirinfo.yaml b/docs/src/content/ignition/docs/getting-started/_dirinfo.yaml new file mode 100644 index 00000000000..0d1f3c1051f --- /dev/null +++ b/docs/src/content/ignition/docs/getting-started/_dirinfo.yaml @@ -0,0 +1,9 @@ +section-type: group +section-title: Hardhat Ignition +order: + - href: "#overview" + title: Overview + - href: "#installation" + title: Installation + - href: "#quick-start" + title: Quick start diff --git a/docs/src/content/ignition/docs/getting-started/index.md b/docs/src/content/ignition/docs/getting-started/index.md new file mode 100644 index 00000000000..e1dd48a3d62 --- /dev/null +++ b/docs/src/content/ignition/docs/getting-started/index.md @@ -0,0 +1,235 @@ +--- +title: Getting started with Hardhat Ignition +description: Getting started with Hardhat Ignition, a declarative smart contract deployment system. +--- + +## Overview + +Hardhat Ignition is a [declarative](https://en.wikipedia.org/wiki/Declarative_programming) system for deploying smart contracts on Ethereum. It enables you to define smart contract instances you want to deploy, and any operation you want to run on them. By taking over the deployment and execution, Hardhat Ignition lets you focus on your project instead of getting caught up in the deployment details. + +In Hardhat Ignition, deployments are defined through Ignition Modules. These modules serve as abstractions, helping you outline and describe the system that you want to deploy. Each Ignition Module encapsulates a group of smart contract instances and operations within your system. + +You can think of Ignition Modules as being conceptually similar to JavaScript modules. In JavaScript, you create a module to group definitions of functions, classes, and values, and then you export some of them. In Hardhat Ignition, you create a module where you group definitions of smart contract instances and operations, and you export some of those contracts. + +Creating a module doesn't lead to an interaction with the Ethereum network. After your modules are defined, then you can ask Hardhat Ignition to deploy them. + +This declarative approach provides Hardhat Ignition with the autonomy to determine the best way to execute your deployment. It leverages this advantage to execute steps in parallel, manage and recover from errors, resume interrupted or partial deployments, and even adapt to modifications in your modules. + +This guide will walk you through the steps to install Hardhat Ignition into an existing Hardhat project, define your first module, and deploy it. + +:::tip + +If you don't have a Hardhat project yet, or if you want to create a new one to try Hardhat Ignition, please follow [this guide](../../../hardhat-runner/docs/getting-started/index.md) first. + +::: + +## Installation + +To install Hardhat Ignition in an existing Hardhat project, you will need: + +- Hardhat version 2.18.0 or higher +- Ethers.js version 6 or higher + +You can also follow [Hardhat's Quick Start guide](../../../hardhat-runner/docs/getting-started/index.md) to create a new project from scratch to follow this guide. + +:::tip + +If you prefer to use **Viem** instead of **ethers**, check out the [Viem guide](../../../ignition/docs/guides/viem.md) for installation instructions. + +::: + +Once you have a Hardhat project ready, open a terminal in its root directory, and run: + +::::tabsgroup{options="npm 7+,npm 6,yarn"} + +:::tab{value="npm 7+"} + +```sh +npm install --save-dev @nomicfoundation/hardhat-ignition-ethers +``` + +::: + +:::tab{value="npm 6"} + +```sh +npm install --save-dev @nomicfoundation/hardhat-ignition-ethers @nomicfoundation/hardhat-ethers @nomicfoundation/hardhat-ignition @nomicfoundation/hardhat-verify @nomicfoundation/ignition-core ethers +``` + +::: + +:::tab{value=yarn} + +```sh +yarn add --dev @nomicfoundation/hardhat-ignition-ethers @nomicfoundation/hardhat-ethers @nomicfoundation/hardhat-ignition @nomicfoundation/hardhat-verify @nomicfoundation/ignition-core ethers +``` + +::: + +:::: + +Finally, add this to your config file to [enable the plugin](../../../hardhat-runner/docs/guides/project-setup.md#plugins-and-dependencies): + +::::tabsgroup{options="TypeScript,JavaScript"} + +:::tab{value="TypeScript"} + +```typescript +import "@nomicfoundation/hardhat-ignition-ethers"; +``` + +::: + +:::tab{value="JavaScript"} + +```javascript +require("@nomicfoundation/hardhat-ignition-ethers"); +``` + +::: + +:::: + +## Quick start + +We are going to explore a basic scenario where we deploy a simple contract and then run a post-deployment initialization function. + +### Creating your contract + +Paste the following code into `contracts/Rocket.sol`: + +```solidity +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.0; + +contract Rocket { + string public name; + string public status; + + constructor(string memory _name) { + name = _name; + status = "ignition"; + } + + function launch() public { + status = "lift-off"; + } +} +``` + +It contains a simple smart contract called `Rocket`, featuring a `launch` function that we'll call after deployment. + +### Creating your first module + +Modules are defined in JavaScript or TypeScript files inside of `ignition/modules`. Let's create that folder structure: + +```sh +mkdir ignition +mkdir ignition/modules +``` + +::::tabsgroup{options="TypeScript,JavaScript"} + +:::tab{value="TypeScript"} + +And paste the following code into a `ignition/modules/Apollo.ts`. We'll explain it in a moment. + +```typescript +import { buildModule } from "@nomicfoundation/hardhat-ignition/modules"; + +export default buildModule("Apollo", (m) => { + const apollo = m.contract("Rocket", ["Saturn V"]); + + m.call(apollo, "launch", []); + + return { apollo }; +}); +``` + +::: + +:::tab{value="JavaScript"} + +And paste the following code into a `ignition/modules/Apollo.js`. We'll explain it in a moment. + +```javascript +const { buildModule } = require("@nomicfoundation/hardhat-ignition/modules"); + +module.exports = buildModule("Apollo", (m) => { + const apollo = m.contract("Rocket", ["Saturn V"]); + + m.call(apollo, "launch", []); + + return { apollo }; +}); +``` + +::: + +:::: + +The first aspect to note is that modules are created by calling the `buildModule` function, which requires a module ID and a callback function. Our module will be identified as `"Apollo"`. + +The callback function is where the module definition actually happens. The `m` parameter being passed into the callback is an instance of a `ModuleBuilder`, which is an object with methods to define and configure your smart contract instances. + +When we call these `ModuleBuilder` methods, they create a `Future` object, which represents the result of an execution step that Hardhat Ignition needs to run to deploy a contract instance or interact with an existing one. + +This doesn't execute anything against the network, it simply represents it internally. After the `Future` is created, it gets registered within the module, and the method returns it. + +In our module, we created two `Future` objects by calling the `contract` and `call` methods. The initial one instructs Hardhat Ignition to deploy a `Rocket` contract instance, specifying `"Saturn V"` as the only constructor parameter. The second one indicates that we intend to execute the `launch` function of the deployed `Rocket` instance, with no arguments provided. + +Finally, we return the `Future` object representing the `Rocket` contract instance, to make it accessible to other modules and tests as well. + +### Deploying it + +Now that our module definition is ready, let's deploy it to a local Hardhat node. Let's start by spinning up a local node: + +```sh +npx hardhat node +``` + +Next, in a terminal in the root of your Hardhat project, run: + +::::tabsgroup{options="TypeScript,JavaScript"} + +:::tab{value="TypeScript"} + +```sh +npx hardhat ignition deploy ignition/modules/Apollo.ts --network localhost +``` + +::: + +:::tab{value="JavaScript"} + +```sh +npx hardhat ignition deploy ignition/modules/Apollo.js --network localhost +``` + +::: + +:::: + +Hardhat Ignition will execute every `Future` that we defined in the right order, and display the results: + +``` +Hardhat Ignition 🚀 + +Deploying [ Apollo ] + +Batch #1 + Executed Apollo#Rocket + +Batch #2 + Executed Apollo#Rocket.launch + +[ Apollo ] successfully deployed 🚀 + +Deployed Addresses + +Apollo#Rocket - 0x5fbdb2315678afecb367f032d93f642f64180aa3 +``` + +A `ignition/deployments/chain-31337` folder will be created. This contains all details about your deployment. Hardhat Ignition uses this data to recover from errors, resume a modified deployment, and more. + +That's all it takes to define and execute a deployment using Hardhat Ignition. Check out the rest of the guides to learn more! diff --git a/docs/src/content/ignition/docs/guides/_dirinfo.yaml b/docs/src/content/ignition/docs/guides/_dirinfo.yaml new file mode 100644 index 00000000000..18ba9ad6f5b --- /dev/null +++ b/docs/src/content/ignition/docs/guides/_dirinfo.yaml @@ -0,0 +1,11 @@ +section-type: group +section-title: Guides +order: + - /creating-modules + - /deploy + - /visualize + - /error-handling + - /modifications + - /tests + - /verify + - /viem diff --git a/docs/src/content/ignition/docs/guides/creating-modules.md b/docs/src/content/ignition/docs/guides/creating-modules.md new file mode 100644 index 00000000000..13c42c67c7c --- /dev/null +++ b/docs/src/content/ignition/docs/guides/creating-modules.md @@ -0,0 +1,335 @@ +# Creating Ignition Modules + +In Hardhat Ignition, deployments are defined through Ignition Modules. These modules help you outline and describe the system that you want to deploy. Each Ignition Module encapsulates a group of smart contract instances and operations within your system. + +This guide will explain how to create Ignition Modules. + +## The module definition API + +To create an Ignition Module, import the `buildModule` function from `@nomicfoundation/hardhat-ignition/modules`. Then, call it with a `string` that will be used as the module ID, and a callback that will define the content of the module. + +This is a module which will be identified as `"MyToken"`: + +::::tabsgroup{options="TypeScript,JavaScript"} + +:::tab{value="TypeScript"} + +```typescript +import { buildModule } from "@nomicfoundation/hardhat-ignition/modules"; + +export default buildModule("MyToken", (m) => { + const token = m.contract("Token", ["My Token", "TKN", 18]); + + return { token }; +}); +``` + +::: + +:::tab{value="JavaScript"} + +```javascript +const { buildModule } = require("@nomicfoundation/hardhat-ignition/modules"); + +module.exports = buildModule("My token", (m) => { + const token = m.contract("Token", ["My Token", "TKN", 18]); + + return { token }; +}); +``` + +::: + +:::: + +You can create multiple modules in a single file, but each must have a unique ID. To deploy a module, you must export it using `module.exports =` or `export default`. As a best practice, we suggest maintaining one module per file, naming the file after the module ID. + +The callback function is where the module definition actually happens. The `m` parameter being passed into the callback is an instance of a `ModuleBuilder`, which is an object with methods to define and configure your smart contract instances. + +When we call these `ModuleBuilder` methods, they create a `Future` object, which represents the result of an execution step that Hardhat Ignition needs to run to deploy a contract instance or interact with an existing one. + +This doesn't execute anything against the network, it simply represents it internally. After the `Future` is created, it gets registered within the module, and the method returns it. + +To deploy a module, Hardhat Ignition executes each of the `Future` objects that the module defines once, and stores the results. + +Finally, the module definition callback can return `Future` objects that represent contract instances, making these contracts accessible to other modules and tests, just like we returned `token` in our example. + +## The different kinds of `Future` + +This section will explore the different kinds of `Future` objects that Hardhat Ignition supports, and how to define them using `ModuleBuilder`. + +### Deploying a contract + +As explained above, to define a new contract instance you'll have to use `m.contract` to create a `Future`. + +Hardhat Ignition knows all the contracts you have in your Hardhat project, so you can refer to them by their names like you would when you're writing tests. + +Let's go over the example again: + +```js +const token = m.contract("Token", ["My Token", "TKN", 18]); +``` + +We call `m.contract` and provide the contract name as the first argument. Then we provide an array of arguments that the constructor needs. + +If you want to use the future value that a `Future` object represents as an argument for another method call, you can simply use the `Future` object itself. Hardhat Ignition will figure out how to resolve it during execution. + +For example, we can use the address of `token` like this: + +```js +const foo = m.contract("ReceivesAnAddress", [token]); +``` + +If you need to send ETH to the constructor, you can pass an object with options as the third argument to `m.contract`, and put in how much you want to send in the `value` field: + +```js +const bar = m.contract("ReceivesETH", [], { + value: 1_000_000_000n, // 1gwei +}); +``` + +### Using an existing contract + +If you need to interact with existing contract instances, you can create a `Future` to represent it in your module like this: + +```js +const existingToken = m.contractAt("Token", "0x..."); +``` + +Just like with `m.contract`, the first value is the name of the contract, and the second value is its address. + +You can also use another `Future` for the address (the second argument). This can be useful when using a factory, or to create a contract `Future` with a different interface (like when deploying a proxy and instantiating it as its implementation). + +### Calling contract functions + +To call a function of a contract you need to use the `m.call` method in `ModuleBuilder`: + +```js +m.call(token, "transfer", [receiver, amount]); +``` + +The first argument is the `Future` object for the contract you want to call, the second one the function name, and the third one is an array of arguments. Once again, the array of arguments can contain other `Future` objects and Hardhat Ignition will figure out how to resolve them during execution. + +In this example, the `m.call` returns a `Future` which we aren't assigning to any variable. This isn't a problem. Hardhat Ignition will execute every `Future` within a module, regardless of whether we store it or not. + +If you need to send ETH while calling a function, you can pass an object with options as the third argument to `m.contract`, and put in how much you want to send in the `value` field: + +```js +m.call(myContract, "receivesEth" [], { + value: 1_000_000_000n, // 1gwei +}); +``` + +### Reading a value from a contract + +If you need to call a `view` or `pure` function in a contract to retrieve a value, you can do it with `m.staticCall`: + +```js +const balance = m.staticCall(token, "balanceOf", [address]); +``` + +Just like with `m.call`, the `m.staticCall` method requires you to provide the contract's `Future` object, the function name, and its arguments. It returns a `Future` representing the value returned by the contract call. + +If the function you are calling returns more than one value, `m.staticCall` will return the first one by default. If you need a value other than the first one, you can provide an index or name as the fourth parameter. + +To execute this `Future`, Hardhat Ignition won't send any transactions and it will use [`eth_call`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_call) instead. Just like every other `Future`, it gets executed once, and the result is recorded. + +### Reading values from events emitted during `Future` execution + +If you're dealing with a `Future` that emits a Solidity event when executed, and you need to extract an argument from said event, then you can use `m.readEventArgument`: + +```tsx +const transfer = m.call(token, "transfer", [receiver, amount]); + +const value = m.readEventArgument(transfer, "Transfer", "_value"); +``` + +The first parameter is the `Future` object, whose execution results in the event's emission. Next, you specify the event's name and the particular argument you wish to extract from this event, using either its index or name for identification. + +You can also provide as a fourth parameter an object with options, which can contain: + +- `emitter`: A `Future` representing the contract instance that **directly emits** the event. This defaults to the `Future` you pass as first argument, but they’re not always the same. A `Future` can be executed and indirectly lead to an event emission by calling other contracts during its execution, which then directly emit the event. + +- `eventIndex`: If the are multiple events with the same name emitted by the `emitter`, you can use this parameter to pick one of them. It defaults to `0`. + +### Sending ETH or data to an account + +To send ETH or data to an account you can use `m.send`: + +```js +const send = m.send("SendingEth", address, 1_000_000n); +const send = m.send("SendingData", address, undefined, "0x16417104"); +``` + +Calling `m.send` will create a `Future` representing the sending action. The first parameter it requires is the ID for the `Future` that will be created. + +The second argument is the address of the account where you want to send the ETH or data to. + +The third and fourth parameters are both optional. They represent the amount of ETH and the data to be sent. + +### Deploying a library + +To deploy a library you can use `m.library`: + +```js +const myLib = m.library("MyLib"); +``` + +If you need to link libraries take a look at the [Linking Libraries](#linking-libraries) section. + +## `Future` IDs + +Each `Future` that is created should have a unique ID. In most cases, Hardhat Ignition will automatically generate an ID for every `Future` you create, based on the creation parameters. + +In some cases, this automatic process may lead to an ID clash with an existing `Future`. If that happens, Hardhat Ignition won't try to resolve the clash, and you will need to define an ID manually to resolve the issue. Every method of `ModuleBuilder` accepts an options object as last argument, which has an `id` field that can be used like this: + +```js +const token = m.contract("Token", ["My Token 2", "TKN2", 18], { + id: "MyToken2", +}); +``` + +The `Future` IDs are used to organize your deployment results, artifacts, and to resume a deployment after interruptions or modifications. For this reason, you should avoid changing IDs after running a deployment. + +## Dependencies between `Future` objects + +If you provide a `Future` object `A` as an argument when constructing `Future` object `B`, a dependency from `B` to `A` is created. + +Dependencies are used by Hardhat Ignition to understand how to order and batch the execution of the different `Future` objects. + +You also have the option to set explicit dependencies between `Future` objects. This is done through the `after` field in the options object, accepted by all `ModuleBuilder` methods when creating a `Future`. Here's how you can do it: + +```js +const token = m.contract("Token", ["My Token", "TKN", 18]); + +const receiver = m.contract("Receiver", [], { + after: token, // `receiver` is deployed after `token` +}); +``` + +## Module parameters + +When defining Ignition Modules, you can use configurable parameters for flexibility. + +During deployment, you can specify these parameters in a JSON file that maps module IDs with respective parameter names and values. This section will focus on retrieving parameters, while the [Defining parameters during deployment](./deploy.md#defining-parameters-during-deployment) section explains how to provide them. + +To access these values, you can call `m.getParameter` providing the name for the parameter as the first argument. You can also make your parameters optional by providing a second argument to `m.getParameter` which will act as the default value in case the parameter isn't provided. + +For example, we can modify the `Apollo` module from the [Quick Start guide](../getting-started/index.md#quick-start) to make the `name` field in the `Rocket` smart contract configurable with a parameter: + +::::tabsgroup{options="TypeScript,JavaScript"} + +:::tab{value="TypeScript"} + +**ignition/modules/Apollo.ts** + +```typescript +import { buildModule } from "@nomicfoundation/hardhat-ignition/modules"; + +export default buildModule("Apollo", (m) => { + const apollo = m.contract("Rocket", [m.getParameter("name", "Saturn V")]); + + m.call(apollo, "launch", []); + + return { apollo }; +}); +``` + +::: + +:::tab{value="JavaScript"} + +**ignition/modules/Apollo.js** + +```javascript +const { buildModule } = require("@nomicfoundation/hardhat-ignition/modules"); + +module.exports = buildModule("Apollo", (m) => { + const apollo = m.contract("Rocket", [m.getParameter("name", "Saturn V")]); + + m.call(apollo, "launch", []); + + return { apollo }; +}); +``` + +::: + +:::: + +The above module code will deploy `Rocket` with the name provided in the parameters. + +Learn more about how to provide a deployment with parameters in the [Defining parameters during deployment](./deploy.md#defining-parameters-during-deployment) section. + +## Creating a module hierarchy using submodules + +You can organize your deployment into different Ignition Modules, which makes it easier to build the setup and reason about the deployment big picture. + +When you are defining a module, you can access other modules as submodules and use their resulting `Future` objects. To do this you need to call `m.useModule` with a module object as returned by `buildModule` as an argument: + +```js +const TokenModule = buildModule("TokenModule", (m) => { + const token = m.contract("Token", ["My Token", "TKN2", 18]); + + return { token }; +}); + +const TokenOwnerModule = buildModule("TokenOwnerModule", (m) => { + const { token } = m.useModule(TokenModule); + + const owner = m.contract("TokenOwner", [token]); + m.call(token, "transferOwnership", [owner]); + + return { owner }; +}); +``` + +If you use a `Future` called `A` that you retrieved from a submodule `Sub` to create another `Future` called `B`, then `B` will depend on `A`, but it will also have an implicit dependency on every `Future` within `Sub`. This means `B` will only be executed after `Sub` is fully executed. + +Calling `m.useModule` multiple times with the same Ignition Module as a parameter doesn't lead to multiple deployments. Hardhat Ignition only executes `Future` objects once. + +## Deploying and calling contracts from different accounts + +If you need to change the sender of a deployment, call, or another `Future`, you can do it by providing the `from` field in an options object. + +For example, to deploy a contract from a specific account: + +```js +const token = m.contract("Token", ["My Token", "TKN2", 18], { from: "0x...." }); +``` + +You can also define a module that uses the accounts that Hardhat has available during the deployment. To access the Hardhat accounts use `m.getAccount(index)`: + +```js +const account1 = m.getAccount(1); +const token = m.contract("Token", ["My Token", "TKN2", 18], { from: account1 }); +``` + +## Using existing artifacts + +If you need to deploy or interact with a contract that isn't part of your Hardhat project, you can provide your own artifacts. + +All the methods that create `Future` objects for contracts also accept artifacts in the second argument through overloads. Here are examples for each of them: + +```js +const token = m.contract("Token", TokenArtifact, ["My Token", "TKN2", 18]); + +const myLib = m.library("MyLib", MyLibArtifact); + +const token2 = m.contractAt("Token", TokenArtifact, token2Address); +``` + +In this case, the name of the contract is only used to generate [`Future` IDs](#future-ids), and not to load any artifact. + +## Linking libraries + +To link a library when deploying a contract, you can use the `libraries` field in an options object when calling `m.contract` or `m.library`: + +```js +const myLib = m.library("MyLib"); +const myContract = m.contract("MyContract", [], { + libraries: { + MyLib: myLib, + }, +}); +``` diff --git a/docs/src/content/ignition/docs/guides/deploy.md b/docs/src/content/ignition/docs/guides/deploy.md new file mode 100644 index 00000000000..4a43752b18f --- /dev/null +++ b/docs/src/content/ignition/docs/guides/deploy.md @@ -0,0 +1,85 @@ +# Deploying a module + +To execute your deployments, you need to use the `ignition deploy` task. It takes a path to a module file as an argument: + +```sh +npx hardhat ignition deploy ignition/modules/MyModule.js +``` + +Hardhat Ignition will load the Ignition Module exported by the file you provided, and deploy it. + +## Deployment artifact folders + +Before starting to run the deployment, Hardhat Ignition will create a deployment folder under `ignition/deployments/`. By default, the folder will be named `chain-`, where `` depends on which network Hardhat is connected to. + +You can customize the deployment folder name by providing an explicit deployment ID with `--deployment-id `. + +This folder will contain all the deployment results, and a journal file which records every deployment action executed, enabling recovery from errors and resuming deployments. + +Read the [Deployment artifacts section](./../advanced/deployment-artifacts.md) to learn more about the files in your deployment folder. + +## Extending an existing deployment + +If you've previously executed a deployment and need to make adjustments, you can continue from where you left off by reusing the current deployment artifacts. Simply reconnect to the same network and keep the same deployment ID (either manually or by keeping the default). + +You can add new `Future` objects to your existing Ignition Modules, and you can also add entirely new modules. All of the additions can make use of the previously existing `Future` objects and modules. + +Hardhat Ignition will figure out how to pick up from where it left off last time, and continue with executing the new modifications. + +## Defining parameters during deployment + +Ignition Modules can define [Module Parameters](./creating-modules.md#module-parameters) and use them programmatically. When you deploy a module using the `ingition deploy` task you can provide a JSON file with their values. This section will focus on providing the parameters, while the [Module Parameters section](./creating-modules.md#module-parameters) explains how to retrieve them within a module. + +An example file could be called `./ignition/parameters.json` and contain the following: + +```json +{ + "Apollo": { + "name": "Saturn V" + } +} +``` + +This makes the `name` parameter for the `Apollo` module be `"Saturn V"`. + +To execute a deployment using parameters, you need to use the `--parameters` argument, like this: + +::::tabsgroup{options="TypeScript,JavaScript"} + +:::tab{value="TypeScript"} + +```sh +npx hardhat ignition deploy ignition/modules/Apollo.ts --parameters ignition/parameters.json +``` + +::: + +:::tab{value="JavaScript"} + +```sh +npx hardhat ignition deploy ignition/modules/Apollo.js --parameters ignition/parameters.json +``` + +::: + +:::: + +## Inspecting an existing deployment + +To check on the current status of a deployment, run: + +```sh +npx hardhat ignition status DeploymentId +``` + +If you run it on the [Quick Start guide](../getting-started/index.md#quick-start) project after executing the deploying, you'd see something like this: + +``` +$ npx hardhat ignition status chain-31337 + +[ chain-31337 ] successfully deployed 🚀 + +Deployed Addresses + +Apollo#Rocket - 0x5fbdb2315678afecb367f032d93f642f64180aa3 +``` diff --git a/docs/src/content/ignition/docs/guides/error-handling.md b/docs/src/content/ignition/docs/guides/error-handling.md new file mode 100644 index 00000000000..a2b4ee67d50 --- /dev/null +++ b/docs/src/content/ignition/docs/guides/error-handling.md @@ -0,0 +1,27 @@ +# Handling errors + +There are many reasons that con lead to a failure when operating a smart contract. Hardhat Ignition uses different approaches for error handling depending on the error type. This guide explains these methods thoroughly. + +## Contract errors + +When interacting with a smart contract, there are always some chances that it might fail and revert. Hardhat Ignition handles these situations using two strategies. + +When it comes to catching errors and reverts, Hardhat Ignition starts by running a simulation of every transaction. If this simulation doesn't succeed, the execution stops. All you need to do to continue your deployment in this case is rerunning Hardhat Ignition. If the simulation failure persists, you might want to consider [deleting a previous execution](#wiping-a-previous-execution) from the journal, and trying again. + +While simulations catch most errors, sometimes a transaction simulation can be successful, and the contract execution still reverts. Hardhat Ignition won't send a new transaction automatically in those cases. Instead, you need to [wipe the previous execution](#wiping-a-previous-execution) and rerun the deployment. + +### Wiping a previous execution + +Hardhat Ignition uses a journal to record every execution step it performs, as well as the results of each of them. This allows it to resume a previous execution when needed. As soon as a `Future` starts its execution, it will be recoreded into the journal. + +If your deployment is failing due to a `Future`, and you need to change its definition to fix it, you will need to wipe the `Future` object's previous execution from the journal, since its definition changed. You can use the `ignition wipe` task for this, by providing it with a deployment ID **and** a future ID. + +```sh +npx hardhat ignition wipe deploymentId futureId +``` + +## Network-related errors + +Hardhat Ignition tries its best to be robust in the face of network-related errors. It manages tricky situations like resending transactions that need updated gas prices, or when nonces don't match between Hardhat Ignition and the network. + +However, sometimes Hardhat Ignition might face an error it can't manage. If this happens, you can just run the same command again to pick up where you left off with your deployment. diff --git a/docs/src/content/ignition/docs/guides/modifications.md b/docs/src/content/ignition/docs/guides/modifications.md new file mode 100644 index 00000000000..153a108b8a4 --- /dev/null +++ b/docs/src/content/ignition/docs/guides/modifications.md @@ -0,0 +1,99 @@ +# Modifying an existing module + +It's possible to make changes to modules after having deployed them. + +For example, if we wanted to add a new `Rocket` contract instance to the module we deployed in the [Quick Start guide](../getting-started/index.md#quick-start), this is what we would do: + +::::tabsgroup{options="TypeScript,JavaScript"} + +:::tab{value="TypeScript"} + +**ignition/modules/Apollo.ts** + +```typescript{8,10,12} +import { buildModule } from "@nomicfoundation/hardhat-ignition/modules"; + +export default buildModule("Apollo", (m) => { + const apollo = m.contract("Rocket", ["Saturn V"]); + + m.call(apollo, "launch", []); + + const artemis = m.contract("Rocket", ["Artemis 2"], { id: "artemis" }); + + m.call(artemis, "launch", []); + + return { apollo, artemis }; +}); +``` + +::: + +:::tab{value="JavaScript"} + +**ignition/modules/Apollo.js** + +```javascript{8,10,12} +const { buildModule } = require("@nomicfoundation/hardhat-ignition/modules"); + +module.exports = buildModule("Apollo", (m) => { + const apollo = m.contract("Rocket", ["Saturn V"]); + + m.call(apollo, "launch", []); + + const artemis = m.contract("Rocket", ["Artemis 2"], { id: "artemis" }); + + m.call(artemis, "launch", []); + + return { apollo, artemis }; +}); +``` + +::: + +:::: + +Then run it again. Hardhat Ignition will continue from where it left off, and execute the new parts of the module. + +::::tabsgroup{options="TypeScript,JavaScript"} + +:::tab{value="TypeScript"} + +```sh +npx hardhat ignition deploy ignition/modules/Apollo.ts --network localhost +``` + +::: + +:::tab{value="JavaScript"} + +```sh +npx hardhat ignition deploy ignition/modules/Apollo.js --network localhost +``` + +::: + +:::: + +This is what the output would look like: + +``` +Batch #1 + Executed Apollo#artemis + +Batch #2 + Executed Apollo#Apollo.artemis.launch + + +[ Apollo ] successfully deployed 🚀 + +Deployed Addresses + +Apollo#Rocket - 0x5fbdb2315678afecb367f032d93f642f64180aa3 +Apollo#artemis - 0x9fe46736679d2d9a65f0992f2272de9f3c7fa6e0 +``` + +We can see two new batches that execute the new parts of the module, while keeping the previous already deployed parts intact. + +## Incompatible modifications + +There are certain modifications one can make to a `Future` definition that would make the new version incompatible with the previous one _if_ the previous one has already been partially or completely executed. This would lead to Hardhat Ignition being unable to continue your deployment from where it was left off. Read the [Reconciliation](../advanced/reconciliation.md) guide to learn more about this. diff --git a/docs/src/content/ignition/docs/guides/tests.md b/docs/src/content/ignition/docs/guides/tests.md new file mode 100644 index 00000000000..ad9d96afa8b --- /dev/null +++ b/docs/src/content/ignition/docs/guides/tests.md @@ -0,0 +1,82 @@ +# Using Hardhat Ignition in your tests + +If you want to test that your deployment was correctly defined, or if you want to use your Ignition Modules to simplify your test setup, continue reading this guide. + +:::tip + +If you prefer to use **Viem** instead of **ethers**, check out the [Viem guide](../../../ignition/docs/guides/viem.md) for more details. + +::: + +## The Ignition object + +Requiring Hardhat Ignition within your Hardhat config will automatically add an `ignition` object to the [Hardhat Runtime Environment](../../../hardhat-runner/docs/advanced/hardhat-runtime-environment.md). + +The `ignition` object exposes a `deploy` method, that takes an Ignition Module as the first argument. + +```js +// We define a module in the test file here, but you can also `require`/`import` it. +const CounterModule = buildModule("Counter", (m) => { + const startCount = m.getParameter("startCount", 0); + + const counter = m.contract("Counter", [startCount]); + + return { counter }; +}); + +it("should set the start count to 0 by default", async function () { + const { counter } = await ignition.deploy(CounterModule); + + assert.equal(await counter.count(), 42); +}); +``` + +The `ignition.deploy` method returns an object with an `ethers` contract per contract `Future` returned in your module. + +## Using module parameters + +The `ignition.deploy` receives an options object as second argument which can be used to provide [Module parameters](./creating-modules.md#module-parameters) under the `parameters` field of the object. You should provide an object mapping module ID to parameters, like this: + +```js +it("should allow setting the start count for new counters", async function () { + const { counter } = await ignition.deploy(CounterModule, { + parameters: { + Counter: { + startCount: 42, + }, + }, + }); + + assert.equal(await counter.count(), 42); +}); +``` + +## Using Ignition Modules as fixtures + +You can combine Hardhat Ignition with [Hardhat Network Helper's `loadFixture`](../../../hardhat-network-helpers/docs/reference.md#loadfixture) to use them to easily define your fixtures by calling `ignition.deploy` within them. + +```js +async function deployCounterModuleFixture() { + return ignition.deploy(CounterModule); +} + +it("should set the start count to 0 by default", async function () { + const counter = await loadFixture(deployCounterModuleFixture); + + return { counter }; +}); +``` + +## Sending transactions with a different account + +The `ignition.deploy` method will default to using the first account in Hardhat network's `accounts` array as the sender for all transactions. + +You can change this by passing a `defaultSender` within the options object as a second argument to the `deploy` method: + +```typescript +const [first, second] = await hre.ethers.getSigners(); + +const result = await hre.ignition.deploy(CounterModule, { + defaultSender: second.address, +}); +``` diff --git a/docs/src/content/ignition/docs/guides/verify.md b/docs/src/content/ignition/docs/guides/verify.md new file mode 100644 index 00000000000..b7852399e9b --- /dev/null +++ b/docs/src/content/ignition/docs/guides/verify.md @@ -0,0 +1,174 @@ +# Verifying your deployment + +Once your Ignition module is tested and ready, the next step is to deploy it to a live network and verify the source code of each of its contracts. + +Verifying a contract means making its source code public, along with the compiler settings you used, which allows anyone to compile it and compare the generated bytecode with the one that is deployed on-chain. Doing this is extremely important in an open platform like Ethereum. + +In this guide we'll explain how to do this with the [Etherscan](https://etherscan.io/) explorer. + +## Getting an API key from Etherscan + +The first thing you need is an API key from Etherscan. To get one, go to [their site](https://etherscan.io/login), sign in (or create an account if you don't have one) and open the "API Keys" tab. Then click the "Add" button and give a name to the API key you are creating (e.g. "Hardhat"). After that you'll see the newly created key in the list. + +Open your Hardhat config and add the API key you just created: + +::::tabsgroup{options=TypeScript,JavaScript} + +:::tab{value=TypeScript} + +```ts +export default { + // ...rest of the config... + etherscan: { + apiKey: "ABCDE12345ABCDE12345ABCDE123456789", + }, +}; +``` + +::: + +:::tab{value=JavaScript} + +```js +module.exports = { + // ...rest of the config... + etherscan: { + apiKey: "ABCDE12345ABCDE12345ABCDE123456789", + }, +}; +``` + +::: + +:::: + +## Deploying and verifying on the Sepolia testnet + +We are going to use the [Sepolia testnet](https://ethereum.org/en/developers/docs/networks/#sepolia) to deploy and verify our Ignition module, so you need to add this network in your Hardhat config. Here we are using [Alchemy](https://alchemy.com/) to connect to the network. + +:::tip + +For more information on `vars` and configuration variables, please see our [configuration variables guide](../../../hardhat-runner/docs/guides/configuration-variables.md). + +::: + +::::tabsgroup{options=TypeScript,JavaScript} + +:::tab{value=TypeScript} + +```ts +// Go to https://alchemy.com, sign up, create a new App in +// its dashboard, and set the Hardhat configuration variable +// ALCHEMY_API_KEY to the key +const ALCHEMY_API_KEY = vars.get("ALCHEMY_API_KEY"); + +// Replace this private key with your Sepolia test account private key +// To export your private key from Coinbase Wallet, go to +// Settings > Developer Settings > Show private key +// To export your private key from Metamask, open Metamask and +// go to Account Details > Export Private Key +// Beware: NEVER put real Ether into testing accounts +const SEPOLIA_PRIVATE_KEY = vars.get("SEPOLIA_PRIVATE_KEY"); + +export default { + // ...rest of your config... + networks: { + sepolia: { + url: `https://eth-sepolia.g.alchemy.com/v2/${ALCHEMY_API_KEY}`, + accounts: [SEPOLIA_PRIVATE_KEY], + }, + }, +}; +``` + +::: + +:::tab{value=JavaScript} + +```js +// Go to https://alchemy.com, sign up, create a new App in +// its dashboard, and set the Hardhat configuration variable +// ALCHEMY_API_KEY to the key +const ALCHEMY_API_KEY = vars.get("ALCHEMY_API_KEY"); + +// Replace this private key with your Sepolia test account private key +// To export your private key from Coinbase Wallet, go to +// Settings > Developer Settings > Show private key +// To export your private key from Metamask, open Metamask and +// go to Account Details > Export Private Key +// Beware: NEVER put real Ether into testing accounts +const SEPOLIA_PRIVATE_KEY = vars.get("SEPOLIA_PRIVATE_KEY"); + +module.exports = { + // ...rest of your config... + networks: { + sepolia: { + url: `https://eth-sepolia.g.alchemy.com/v2/${ALCHEMY_API_KEY}`, + accounts: [SEPOLIA_PRIVATE_KEY], + }, + }, +}; +``` + +::: + +:::: + +To deploy on Sepolia you need to send some Sepolia ether to the address that's going to be making the deployment. You can get testnet ether from a faucet, a service that distributes testing-ETH for free. Here is one for Sepolia: + +- [Alchemy Sepolia Faucet](https://sepoliafaucet.com/) + +:::tip + +This guide assumes you are using the contracts and Ignition module from the [quick start guide](/ignition/docs/getting-started#quick-start), but the steps are the same for any deployment. + +::: + +Now you are ready to deploy your module to the testnet, but first we are going to make the source code of our contract unique. The reason we need to do this is that the sample code from the quick start guide is already verified in Sepolia, so if you try to verify it you'll get an error. If you are using your own contracts, you can likely skip this step. + +Open your contract and add a comment with something unique, like your GitHub's username. Keep in mind that whatever you include here will be, like the rest of the code, publicly available on Etherscan: + +```solidity +// Author: @janedoe +contract Rocket { +``` + +You can now run the deployment using the newly added Sepolia network: + +::::tabsgroup{options="TypeScript,JavaScript"} + +:::tab{value="TypeScript"} + +```sh +npx hardhat ignition deploy ignition/modules/Apollo.ts --network sepolia --verify +``` + +::: + +:::tab{value="JavaScript"} + +```sh +npx hardhat ignition deploy ignition/modules/Apollo.js --network sepolia --verify +``` + +::: + +:::: + +The `--verify` flag is optional, but it tells Hardhat Ignition to verify the contracts after a successful deployment. + +If you have an existing deployment and want to verify it, you can also run the `verify` task directly by passing the deployment ID: + +```sh +npx hardhat ignition verify chain-11155111 +``` + +:::tip + +If you get an error saying that the address does not have bytecode, it probably means that Etherscan has not indexed your contract yet. In that case, wait for a minute and then try again. + +::: + +After the task has successfully executed, for each deployed contract you'll see a link to its publicly verified code. + +To learn more about verifying, read the [hardhat-verify](/hardhat-runner/plugins/nomicfoundation-hardhat-verify) documentation. diff --git a/docs/src/content/ignition/docs/guides/viem.md b/docs/src/content/ignition/docs/guides/viem.md new file mode 100644 index 00000000000..bae604be3dc --- /dev/null +++ b/docs/src/content/ignition/docs/guides/viem.md @@ -0,0 +1,149 @@ +# Using Viem + +Hardhat Ignition provides a variant based on using [Viem](https://viem.sh) as your connection library. Viem is a lightweight alternative to [ethers](https://docs.ethers.org) with a focus on type safety. + +The Viem support in Hardhat Ignition includes a helper function, for use in Hardhat tests and scripts, that allows you to deploy Ignition modules and get back the deployed contracts as fully typed Viem contract instances. + +## Installation + +To install Hardhat Ignition with Viem support in an existing Hardhat project, you will need: + +- Hardhat version 2.18.0 or higher +- Viem version 1.18.0 or higher + +You can also follow [Hardhat's Viem Quick Start](../../../hardhat-runner/docs/advanced/using-viem#quick-start) to create a new Hardhat Viem project from scratch. + +From the root directory of your Hardhat project run: + +::::tabsgroup{options="npm 7+,npm 6,yarn"} + +:::tab{value="npm 7+"} + +```shell +npm install --save-dev @nomicfoundation/hardhat-ignition-viem +``` + +::: + +:::tab{value="npm 6"} + +```shell +npm install --save-dev @nomicfoundation/hardhat-ignition-viem @nomicfoundation/hardhat-ignition @nomicfoundation/hardhat-verify @nomicfoundation/hardhat-viem @nomicfoundation/ignition-core typescript viem +``` + +::: + +:::tab{value=yarn} + +```shell +yarn add --dev @nomicfoundation/hardhat-ignition-viem @nomicfoundation/hardhat-ignition @nomicfoundation/hardhat-verify @nomicfoundation/hardhat-viem @nomicfoundation/ignition-core typescript viem +``` + +::: + +:::: + +Then [enable the plugin](../../../hardhat-runner/docs/guides/project-setup.md#plugins-and-dependencies) in your config file: + +::::tabsgroup{options="TypeScript,JavaScript"} + +:::tab{value="TypeScript"} + +```typescript +import "@nomicfoundation/hardhat-ignition-viem"; +``` + +::: + +:::tab{value="JavaScript"} + +```javascript +require("@nomicfoundation/hardhat-ignition-viem"); +``` + +::: + +:::: + +:::tip + +Only **one** Hardhat Ignition package should be imported within your Hardhat config file. Viem and ethers support cannot both be enabled at the same time. + +::: + +## The Ignition object + +The `@nomicfoundation/hardhat-plugin-viem` plugin adds an `ignition` object to the [Hardhat Runtime Environment](../../../hardhat-runner/docs/advanced/hardhat-runtime-environment.md). + +The `ignition` object exposes a `deploy` method, which takes an Ignition module, deploys it against the current network, like Hardhat Network, and returns the results of the module as typed Viem contract instances. + +The `deploy` method takes the Module as its first argument: + +```typescript +const ApolloModule = buildModule("Apollo", (m) => { + const apollo = m.contract("Rocket", ["Saturn V"]); + + return { apollo }; +}); + +it("should have named the rocket Saturn V", async function () { + const { apollo } = await hre.ignition.deploy(ApolloModule); + + assert.equal(await apollo.read.name(), "Saturn V"); +}); +``` + +The `ignition.deploy` method returns an object with a Viem contract instance per `Future` returned as a result in the module. + +## Usage with Artifacts + +To infer the type of a Viem contract instance, the full type of the ABI must be available when initializing a `Future` within a module. + +For named Hardhat contracts, the ABI and type information will be retrieved automatically using [hardhat-viem's type generation](https://hardhat.org/hardhat-runner/docs/advanced/using-viem#contract-type-generation). + +If you are passing an artifact object to initialize a `Future` within a module, you will need to ensure the artifact's ABI is either declared with [const assertions](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-4.html#const-assertions) or defined inline: + +```typescript +const counterArtifact = { + // ... + abi: [...] as const, // <--- const assertion +} + +const CounterModule = buildModule("Counter", (m) => { + const counter = m.contract("Counter", CounterArtifact, [42]); + + return { counter }; +}); +``` + +If type inference isn't working for the returned contract, it is likely that the ABI type needs a `const` assertion or to be defined inline. + +This is because the ABI type must be as narrow as possible for Viem to infer the correct type for the contract, and by default Typescript will broaden the types within object literals. + +:::tip + +Typescript doesn't support importing JSON as const, it will instead automatically broaden the type, breaking Viem's inference. The artifact must be defined inline within Typescript. + +::: + +See [Viem's type inference requirements](https://viem.sh/docs/typescript.html#type-inference) for more details. + +## Sending transactions with a different account + +The `ignition.deploy` method will default to using the first account in Hardhat network's `accounts` array as the sender for all transactions. + +You can change this by passing a `defaultSender` within the options object as a second argument to the `deploy` method: + +```typescript +const [first, second] = await hre.viem.getWalletClients(); + +const result = await hre.ignition.deploy(ApolloModule, { + defaultSender: second.account.address, +}); +``` + +## Hardhat Ignition and Hardhat Viem + +Hardhat Ignition leverages the [hardhat-viem](https://hardhat.org/hardhat-runner/plugins/nomicfoundation-hardhat-viem) plugin for its type generation support, and inherits the same approach to [managing types and version stability](https://hardhat.org/hardhat-runner/docs/advanced/using-viem#managing-types-and-version-stability). + +Read the documentation on [hardhat-viem](https://hardhat.org/hardhat-runner/plugins/nomicfoundation-hardhat-viem) to learn more about Hardhat's Viem capabilities. diff --git a/docs/src/content/ignition/docs/guides/visualize.md b/docs/src/content/ignition/docs/guides/visualize.md new file mode 100644 index 00000000000..f3987899722 --- /dev/null +++ b/docs/src/content/ignition/docs/guides/visualize.md @@ -0,0 +1,19 @@ +# Visualizing your module + +Hardhat Ignition comes built-in with a `visualize` task that generates an HTML report, illustrating visually the module's deployment process execution. This can be helpful for debugging and verifying that your perception of your modules aligns with Hardhat Ignition's execution plan. + +The `visualize` task takes the path to the module to visualize as an argument: + +```bash +npx hardhat ignition visualize ./ignition/modules/Apollo.js +``` + +Running `visualize` will generate the report and open it in your system's default browser. + +The report includes: + +- A summary of the contracts that will be deployed +- A summary of the contract calls that will be made +- A dependency graph of featuring modules and `Future` objects + +Check out the [visualize report of a module to deploy the ENS protocol](/static/ignition-visualize-example.html). diff --git a/docs/src/content/ignition/docs/other-components/_dirinfo.yaml b/docs/src/content/ignition/docs/other-components/_dirinfo.yaml new file mode 100644 index 00000000000..4122ddc4d64 --- /dev/null +++ b/docs/src/content/ignition/docs/other-components/_dirinfo.yaml @@ -0,0 +1,13 @@ +section-type: group +section-title: Other Hardhat components +order: + - href: /../../../hardhat-runner/docs + title: Hardhat Runner + - href: /../../../hardhat-network/docs + title: Hardhat Network + - href: /../../../hardhat-vscode/docs + title: Hardhat VSCode + - href: /../../../hardhat-chai-matchers/docs + title: Hardhat Chai Matchers + - href: /../../../hardhat-network-helpers/docs + title: Hardhat Network Helpers diff --git a/docs/src/content/layouts.yaml b/docs/src/content/layouts.yaml index c9842696615..e7bfdde5123 100644 --- a/docs/src/content/layouts.yaml +++ b/docs/src/content/layouts.yaml @@ -46,6 +46,17 @@ hardhat-network-helpers: - hardhat-network-helpers/docs - hardhat-network-helpers/docs/other-components +ignition: + title: Hardhat Ignition + folders: + - ignition + - ignition/docs + - ignition/docs/getting-started + - ignition/docs/config + - ignition/docs/guides + - ignition/docs/advanced + - ignition/docs/other-components + hidden: title: hidden folders: diff --git a/docs/src/content/tutorial/_dirinfo.yaml b/docs/src/content/tutorial/_dirinfo.yaml deleted file mode 100644 index 2eec3ed15d5..00000000000 --- a/docs/src/content/tutorial/_dirinfo.yaml +++ /dev/null @@ -1,21 +0,0 @@ -section-type: group -section-title: Tutorial -order: - - title: 1. Overview - href: / - - title: 2. Setting up the environment - href: /setting-up-the-environment - - title: 3. Creating a new Hardhat project - href: /creating-a-new-hardhat-project - - title: 4. Writing and compiling contracts - href: /writing-and-compiling-contracts - - title: 5. Testing contracts - href: /testing-contracts - - title: 6. Debugging with Hardhat Network - href: /debugging-with-hardhat-network - - title: 7. Deploying to a live network - href: /deploying-to-a-live-network - - title: 8. Boilerplate Project - href: /boilerplate-project - - title: 9. Final thoughts - href: /final-thoughts diff --git a/docs/src/content/tutorial/boilerplate-project.md b/docs/src/content/tutorial/boilerplate-project.md deleted file mode 100644 index 8137fb31689..00000000000 --- a/docs/src/content/tutorial/boilerplate-project.md +++ /dev/null @@ -1,103 +0,0 @@ -# Hardhat Boilerplate Project - -If you want to get started with your dApp quickly or see what this whole project looks like with a frontend, you can use [our boilerplate repo](https://github.com/NomicFoundation/hardhat-boilerplate). - -## What's included - -- The Solidity contract we used in this tutorial -- Tests for the entire functionality of the contract -- A minimal React front-end to interact with the contract using ethers.js - -### Solidity contract & tests - -In the root of the repo you'll find the Hardhat project we put together through this tutorial with the `Token` contract. To refresh your memory on what it implements: - -- There is a fixed total supply of tokens that can't be changed. -- The entire supply is assigned to the address that deploys the contract. -- Anyone can receive tokens. -- Anyone with at least one token can transfer tokens. -- The token is non-divisible. You can transfer 1, 2, 3 or 37 tokens but not 2.5. - -### Frontend app - -In `frontend` you'll find a simple app that allows the user to do two things: - -- Check the connected wallet's balance -- Send tokens to an address - -It's a separate npm project and it was created using `create-react-app`, so this means that it uses webpack and babel. - -### Frontend file architecture - -- `src/` contains all the code - - `src/components` contains the react components - - `Dapp.js` is the only file with business logic. This is where you'd replace the code with your own if you were to use this as boilerplate - - Every other component just renders HTML, no logic. - - `src/contracts` has the ABI and address of the contract and these are automatically generated by the deployment script - -## How to use it - -First clone the repository, and then prepare for the contract deployment: - -``` -cd hardhat-boilerplate -npm install -npx hardhat node -``` - -Here we just install the npm project's dependencies, and by running `npx hardhat node` we spin up an instance of Hardhat Network that you can connect to using your wallet. In a different terminal in the same directory, run: - -``` -npx hardhat --network localhost run scripts/deploy.js -``` - -This will deploy the contract to Hardhat Network. After this completes, start the react web app: - -``` -cd frontend -npm install -npm run start -``` - -Then open [http://127.0.0.1:3000/](http://127.0.0.1:3000/) in your browser and you should see this: ![](/front-5.png) - -Click the button to connect your wallet. If you are using MetaMask, make sure you have selected the `Localhost 8545` network. - -After connecting your wallet, you should see this: - -![](/front-2.png) - -What's happening here is that the frontend code to show the current wallet's balance is detecting that the balance is `0`, so you wouldn't be able to try the transfer functionality. By running: - -``` -npx hardhat --network localhost faucet -``` - -You'll run a custom Hardhat task we included that uses the balance of the deploying account to send 100 MHT and 1 ETH to your address. This will allow you to send tokens to another address. - -You can check out the code for the task in [`/tasks/faucet.js`](https://github.com/NomicFoundation/hardhat-boilerplate/blob/master/tasks/faucet.js), which is required from `hardhat.config.js`. - -``` -$ npx hardhat --network localhost faucet 0x0987a41e73e69f60c5071ce3c8f7e730f9a60f90 -Transferred 1 ETH and 100 tokens to 0x0987a41e73e69f60c5071ce3c8f7e730f9a60f90 -``` - -In the terminal where you ran `npx hardhat node` you should also see: - -```markup{10-11} -eth_sendTransaction - Contract call: Token#transfer - Transaction: 0x460526d98b86f7886cd0f218d6618c96d27de7c745462ff8141973253e89b7d4 - From: 0xc783df8a850f42e7f7e57013759c285caa701eb6 - To: 0x7c2c195cd6d34b8f845992d380aadb2730bb9c6f - Value: 0 ETH - Gas used: 37098 of 185490 - Block #8: 0x6b6cd29029b31f30158bfbd12faf2c4ac4263068fd12b6130f5655e70d1bc257 - - console.log: - Transferring from 0xc783df8a850f42e7f7e57013759c285caa701eb6 to 0x0987a41e73e69f60c5071ce3c8f7e730f9a60f90 100 tokens -``` - -Showing the `console.log` output from the `transfer()` function in our contract, and this is what the web app will look like after you run the faucet task: ![](/front-6.png) - -Try playing around with it and reading the code. It's full of comments explaining what's going on and clearly indicating what code is Ethereum boilerplate and what's actually dApp logic. This should make the repository easy to reuse for your project. diff --git a/docs/src/content/tutorial/creating-a-new-hardhat-project.md b/docs/src/content/tutorial/creating-a-new-hardhat-project.md index 8f6d0d39a56..e835e8e41bf 100644 --- a/docs/src/content/tutorial/creating-a-new-hardhat-project.md +++ b/docs/src/content/tutorial/creating-a-new-hardhat-project.md @@ -80,13 +80,13 @@ yarn add --dev hardhat In the same directory where you installed Hardhat run: ``` -npx hardhat +npx hardhat init ``` Select `Create an empty hardhat.config.js` with your keyboard and hit enter. ```markup{16} -$ npx hardhat +$ npx hardhat init 888 888 888 888 888 888 888 888 888 888 888 888 888 888 888 @@ -96,11 +96,12 @@ $ npx hardhat 888 888 888 888 888 Y88b 888 888 888 888 888 Y88b. 888 888 "Y888888 888 "Y88888 888 888 "Y888888 "Y888 -👷 Welcome to Hardhat v2.9.9 👷‍ +👷 Welcome to Hardhat v{HARDHAT_VERSION} 👷‍ ? What do you want to do? … Create a JavaScript project Create a TypeScript project + Create a TypeScript project (with Viem) ❯ Create an empty hardhat.config.js Quit ``` @@ -142,7 +143,7 @@ npm install --save-dev @nomicfoundation/hardhat-toolbox :::tab{value="npm 6"} ``` -npm install --save-dev @nomicfoundation/hardhat-toolbox @nomicfoundation/hardhat-network-helpers @nomicfoundation/hardhat-chai-matchers @nomiclabs/hardhat-ethers @nomiclabs/hardhat-etherscan chai ethers hardhat-gas-reporter solidity-coverage @typechain/hardhat typechain @typechain/ethers-v5 @ethersproject/abi @ethersproject/providers +npm install --save-dev @nomicfoundation/hardhat-toolbox @nomicfoundation/hardhat-network-helpers @nomicfoundation/hardhat-chai-matchers @nomicfoundation/hardhat-ethers @nomicfoundation/hardhat-verify chai ethers hardhat-gas-reporter solidity-coverage @typechain/hardhat typechain @typechain/ethers-v6 ``` ::: @@ -150,7 +151,7 @@ npm install --save-dev @nomicfoundation/hardhat-toolbox @nomicfoundation/hardhat :::tab{value=yarn} ``` -yarn add --dev @nomicfoundation/hardhat-toolbox @nomicfoundation/hardhat-network-helpers @nomicfoundation/hardhat-chai-matchers @nomiclabs/hardhat-ethers @nomiclabs/hardhat-etherscan chai ethers hardhat-gas-reporter solidity-coverage @typechain/hardhat typechain @typechain/ethers-v5 @ethersproject/abi @ethersproject/providers +yarn add --dev @nomicfoundation/hardhat-toolbox @nomicfoundation/hardhat-network-helpers @nomicfoundation/hardhat-chai-matchers @nomicfoundation/hardhat-ethers @nomicfoundation/hardhat-verify chai ethers hardhat-gas-reporter solidity-coverage @typechain/hardhat typechain @typechain/ethers-v6 ``` ::: @@ -164,6 +165,6 @@ require("@nomicfoundation/hardhat-toolbox"); /** @type import('hardhat/config').HardhatUserConfig */ module.exports = { - solidity: "0.8.18", + solidity: "{RECOMMENDED_SOLC_VERSION}", }; ``` diff --git a/docs/src/content/tutorial/debugging-with-hardhat-network.md b/docs/src/content/tutorial/debugging-with-hardhat-network.md index 3e2f3c13e2b..879a85b86a0 100644 --- a/docs/src/content/tutorial/debugging-with-hardhat-network.md +++ b/docs/src/content/tutorial/debugging-with-hardhat-network.md @@ -9,7 +9,7 @@ When running your contracts and tests on Hardhat Network you can print logging m This is what it looks like: ```solidity{3} -pragma solidity ^0.8.9; +pragma solidity {LATEST_PRAGMA}; import "hardhat/console.sol"; diff --git a/docs/src/content/tutorial/deploying-to-a-live-network.md b/docs/src/content/tutorial/deploying-to-a-live-network.md index 088f044b511..80d6f61b327 100644 --- a/docs/src/content/tutorial/deploying-to-a-live-network.md +++ b/docs/src/content/tutorial/deploying-to-a-live-network.md @@ -1,12 +1,18 @@ # 7. Deploying to a live network +:::tip + +Try [Hardhat Ignition](/ignition) for your deployments! Our new declarative system for deploying smart contracts without getting caught up in execution details. + +::: + Once you're ready to share your dApp with other people, you may want to deploy it to a live network. This way others can access an instance that's not running locally on your system. The "mainnet" Ethereum network deals with real money, but there are separate "testnet" networks that do not. These testnets provide shared staging environments that do a good job of mimicking the real world scenario without putting real money at stake, and [Ethereum has several](https://ethereum.org/en/developers/docs/networks/#ethereum-testnets), like _Sepolia_ and _Goerli_. We recommend you deploy your contracts to the _Sepolia_ testnet. At the software level, deploying to a testnet is the same as deploying to mainnet. The only difference is which network you connect to. Let's look into what the code to deploy your contracts using ethers.js would look like. -The main concepts used are `Signer`, `ContractFactory` and `Contract` which we explained back in the [testing](testing-contracts.md) section. There's nothing new that needs to be done when compared to testing, given that when you're testing your contracts you're _actually_ making a deployment to your development network. This makes the code very similar, or even the same. +The main concepts used are `Signer` and `Contract` which we explained back in the [testing](testing-contracts.md) section. There's nothing new that needs to be done when compared to testing, given that when you're testing your contracts you're _actually_ making a deployment to your development network. This makes the code very similar, or even the same. Let's create a new directory `scripts` inside the project root's directory, and paste the following into a `deploy.js` file in that directory: @@ -16,12 +22,9 @@ async function main() { console.log("Deploying contracts with the account:", deployer.address); - console.log("Account balance:", (await deployer.getBalance()).toString()); - - const Token = await ethers.getContractFactory("Token"); - const token = await Token.deploy(); + const token = await ethers.deployContract("Token"); - console.log("Token address:", token.address); + console.log("Token address:", await token.getAddress()); } main() @@ -43,7 +46,6 @@ With our current configuration, running it without the `--network` parameter wou ``` $ npx hardhat run scripts/deploy.js Deploying contracts with the account: 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266 -Account balance: 10000000000000000000000 Token address: 0x5FbDB2315678afecb367f032d93F642f64180aa3 ``` @@ -71,7 +73,7 @@ const INFURA_API_KEY = "KEY"; const SEPOLIA_PRIVATE_KEY = "YOUR SEPOLIA PRIVATE KEY"; module.exports = { - solidity: "0.8.9", + solidity: "{RECOMMENDED_SOLC_VERSION}", networks: { sepolia: { url: `https://sepolia.infura.io/v3/${INFURA_API_KEY}`, @@ -101,7 +103,7 @@ const ALCHEMY_API_KEY = "KEY"; const SEPOLIA_PRIVATE_KEY = "YOUR SEPOLIA PRIVATE KEY"; module.exports = { - solidity: "0.8.9", + solidity: "{RECOMMENDED_SOLC_VERSION}", networks: { sepolia: { url: `https://eth-sepolia.g.alchemy.com/v2/${ALCHEMY_API_KEY}`, @@ -117,10 +119,12 @@ module.exports = { We're using [Infura](https://infura.io) or [Alchemy](https://alchemy.com/), but pointing `url` to any Ethereum node or gateway. Go grab your API key and come back. -To deploy on Sepolia you need to send some Sepolia ether to the address that's going to be making the deployment. You can get testnet ether from a faucet, a service that distributes testing-ETH for free. Here is one for Sepolia: +To deploy on Sepolia you need to send some Sepolia ether to the address that's going to be making the deployment. You can get testnet ether from a faucet, a service that distributes testing-ETH for free. Here are a few for Sepolia: - [Alchemy Sepolia Faucet](https://sepoliafaucet.com/) - [Coinbase Sepolia Faucet](https://coinbase.com/faucets/ethereum-sepolia-faucet) (only works if you are using the Coinbase Wallet) +- [Infura Sepolia Faucet](https://www.infura.io/faucet/sepolia) +- [Chainstack Sepolia Faucet](https://faucet.chainstack.com/sepolia-faucet) You'll have to change your wallet's network to Sepolia before transacting. diff --git a/docs/src/content/tutorial/final-thoughts.md b/docs/src/content/tutorial/final-thoughts.md index 419b85a365b..bda100dde52 100644 --- a/docs/src/content/tutorial/final-thoughts.md +++ b/docs/src/content/tutorial/final-thoughts.md @@ -8,7 +8,7 @@ Here are some links you might find useful throughout your journey: - [Hardhat's documentation site](/docs/) - [Hardhat Toolbox's documentation](/hardhat-runner/plugins/nomicfoundation-hardhat-toolbox) - [Hardhat Support Discord server](/discord) -- [Ethers.js Documentation](https://docs.ethers.io/) +- [Ethers.js Documentation](https://docs.ethers.org/v6/) - [Mocha Documentation](https://mochajs.org/) - [Chai Documentation](https://www.chaijs.com/) - [Alchemy's smart contract tutorial](https://docs.alchemy.com/docs/hello-world-smart-contract) to also learn how to use Metamask and Solidity as well as an RPC endpoint like the one that Alchemy provides. diff --git a/docs/src/content/tutorial/index.md b/docs/src/content/tutorial/index.md deleted file mode 100644 index 9c73ff2dfde..00000000000 --- a/docs/src/content/tutorial/index.md +++ /dev/null @@ -1,32 +0,0 @@ ---- -prev: false ---- - -![Teacher Hardhat](/hardhat-tutorial.svg) - -# Hardhat's tutorial for beginners - -Welcome to our beginners guide to Ethereum contracts and dApp development. This tutorial aims to quickly get you set up to build something from scratch. - -To orchestrate this process we're going to use Hardhat, a development environment that facilitates building on Ethereum. It helps developers manage and automate the recurring tasks that are inherent to the process of building smart contracts and dApps, and it allows you to easily introduce more functionality around this workflow. This means compiling and testing at the very core. - -Hardhat also comes built-in with Hardhat Network, a local Ethereum network designed for development. It allows you to deploy your contracts, run your tests and debug your code. - -In this tutorial we'll guide you through: - -- Setting up your Node.js environment for Ethereum development -- Creating and configuring a Hardhat project -- The basics of a Solidity smart contract that implements a token -- Writing automated tests for your contract using Hardhat -- Debugging Solidity with `console.log()` using Hardhat Network -- Deploying your contract to Hardhat Network and Ethereum testnets - -To follow this tutorial you should be able to: - -- Write code in [JavaScript](https://developer.mozilla.org/en-US/docs/Learn/Getting_started_with_the_web/JavaScript_basics) -- Operate a [terminal](https://en.wikipedia.org/wiki/Terminal_emulator) -- Use [git](https://git-scm.com/doc) -- Understand the basics of how [smart contracts](https://ethereum.org/learn/#smart-contracts) work -- Set up a [Coinbase](https://www.coinbase.com/wallet) or [Metamask](https://metamask.io/) wallet - -If you can't do any of the above, follow the links and take some time to learn the basics. diff --git a/docs/src/content/tutorial/setting-up-the-environment.md b/docs/src/content/tutorial/setting-up-the-environment.md index 50854bb22af..93fd128e184 100644 --- a/docs/src/content/tutorial/setting-up-the-environment.md +++ b/docs/src/content/tutorial/setting-up-the-environment.md @@ -21,7 +21,7 @@ Copy and paste these commands in a terminal: ``` sudo apt update sudo apt install curl git -curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash - +curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash - sudo apt-get install -y nodejs ``` @@ -33,9 +33,9 @@ There are multiple ways of installing Node.js on MacOS. We will be using [Node V ``` curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bash -nvm install 18 -nvm use 18 -nvm alias default 18 +nvm install 20 +nvm use 20 +nvm alias default 20 npm install npm --global # Upgrade npm to the latest version ``` @@ -61,12 +61,12 @@ If your version of Node.js is older and [not supported by Hardhat](../hardhat-ru ### MacOS -You can change your Node.js version using [nvm](http://github.com/creationix/nvm). To upgrade to Node.js `18.x` run these in a terminal: +You can change your Node.js version using [nvm](http://github.com/creationix/nvm). To upgrade to Node.js `20.x` run these in a terminal: ``` -nvm install 18 -nvm use 18 -nvm alias default 18 +nvm install 20 +nvm use 20 +nvm alias default 20 npm install npm --global # Upgrade npm to the latest version ``` diff --git a/docs/src/content/tutorial/testing-contracts.md b/docs/src/content/tutorial/testing-contracts.md index 4d87502e758..e6d421e1eed 100644 --- a/docs/src/content/tutorial/testing-contracts.md +++ b/docs/src/content/tutorial/testing-contracts.md @@ -4,7 +4,7 @@ Writing automated tests when building smart contracts is of crucial importance, To test our contract, we are going to use Hardhat Network, a local Ethereum network designed for development. It comes built-in with Hardhat, and it's used as the default network. You don't need to setup anything to use it. -In our tests we're going to use [ethers.js](https://docs.ethers.io/v5/) to interact with the Ethereum contract we built in the previous section, and we'll use [Mocha](https://mochajs.org/) as our test runner. +In our tests we're going to use [ethers.js](https://docs.ethers.org/v6/) to interact with the Ethereum contract we built in the previous section, and we'll use [Mocha](https://mochajs.org/) as our test runner. ## Writing tests @@ -19,9 +19,7 @@ describe("Token contract", function () { it("Deployment should assign the total supply of tokens to the owner", async function () { const [owner] = await ethers.getSigners(); - const Token = await ethers.getContractFactory("Token"); - - const hardhatToken = await Token.deploy(); + const hardhatToken = await ethers.deployContract("Token"); const ownerBalance = await hardhatToken.balanceOf(owner.address); expect(await hardhatToken.totalSupply()).to.equal(ownerBalance); @@ -57,21 +55,15 @@ const { ethers } = require("hardhat"); :::tip -To learn more about `Signer`, you can look at the [Signers documentation](https://docs.ethers.io/v5/api/signer/). +To learn more about `Signer`, you can look at the [Signers documentation](https://docs.ethers.org/v6/api/providers/#Signer). ::: ```js -const Token = await ethers.getContractFactory("Token"); -``` - -A `ContractFactory` in ethers.js is an abstraction used to deploy new smart contracts, so `Token` here is a factory for instances of our token contract. - -```js -const hardhatToken = await Token.deploy(); +const hardhatToken = await ethers.deployContract("Token"); ``` -Calling `deploy()` on a `ContractFactory` will start the deployment, and return a `Promise` that resolves to a `Contract`. This is the object that has a method for each of your smart contract functions. +Calling `ethers.deployContract("Token")` will start the deployment of our token contract, and return a `Promise` that resolves to a `Contract`. This is the object that has a method for each of your smart contract functions. ```js const ownerBalance = await hardhatToken.balanceOf(owner.address); @@ -79,7 +71,7 @@ const ownerBalance = await hardhatToken.balanceOf(owner.address); Once the contract is deployed, we can call our contract methods on `hardhatToken`. Here we get the balance of the owner account by calling the contract's `balanceOf()` method. -Recall that the account that deploys the token gets its entire supply. By default, `ContractFactory` and `Contract` instances are connected to the first signer. This means that the account in the `owner` variable executed the deployment, and `balanceOf()` should return the entire supply amount. +Recall that the account that deploys the token gets its entire supply. By default, `Contract` instances are connected to the first signer. This means that the account in the `owner` variable executed the deployment, and `balanceOf()` should return the entire supply amount. ```js expect(await hardhatToken.totalSupply()).to.equal(ownerBalance); @@ -93,7 +85,7 @@ To do this we're using [Chai](https://www.chaijs.com/) which is a popular JavaSc If you need to test your code by sending a transaction from an account (or `Signer` in ethers.js terminology) other than the default one, you can use the `connect()` method on your ethers.js `Contract` object to connect it to a different account, like this: -```js{18} +```js{16} const { expect } = require("chai"); describe("Token contract", function () { @@ -102,9 +94,7 @@ describe("Token contract", function () { it("Should transfer tokens between accounts", async function() { const [owner, addr1, addr2] = await ethers.getSigners(); - const Token = await ethers.getContractFactory("Token"); - - const hardhatToken = await Token.deploy(); + const hardhatToken = await ethers.deployContract("Token"); // Transfer 50 tokens from owner to addr1 await hardhatToken.transfer(addr1.address, 50); @@ -124,20 +114,19 @@ The two tests that we wrote begin with their setup, which in this case means dep You can avoid code duplication and improve the performance of your test suite by using **fixtures**. A fixture is a setup function that is run only the first time it's invoked. On subsequent invocations, instead of re-running it, Hardhat will reset the state of the network to what it was at the point after the fixture was initially executed. ```js -const { loadFixture } = require("@nomicfoundation/hardhat-network-helpers"); +const { + loadFixture, +} = require("@nomicfoundation/hardhat-toolbox/network-helpers"); const { expect } = require("chai"); describe("Token contract", function () { async function deployTokenFixture() { - const Token = await ethers.getContractFactory("Token"); const [owner, addr1, addr2] = await ethers.getSigners(); - const hardhatToken = await Token.deploy(); - - await hardhatToken.deployed(); + const hardhatToken = await ethers.deployContract("Token"); // Fixtures can return anything you consider useful for your tests - return { Token, hardhatToken, owner, addr1, addr2 }; + return { hardhatToken, owner, addr1, addr2 }; } it("Should assign the total supply of tokens to the owner", async function () { @@ -184,7 +173,9 @@ const { expect } = require("chai"); // We use `loadFixture` to share common setups (or fixtures) between tests. // Using this simplifies your tests and makes them run faster, by taking // advantage of Hardhat Network's snapshot functionality. -const { loadFixture } = require("@nomicfoundation/hardhat-network-helpers"); +const { + loadFixture, +} = require("@nomicfoundation/hardhat-toolbox/network-helpers"); // `describe` is a Mocha function that allows you to organize your tests. // Having your tests organized makes debugging them easier. All Mocha @@ -198,19 +189,18 @@ describe("Token contract", function () { // loadFixture to run this setup once, snapshot that state, and reset Hardhat // Network to that snapshot in every test. async function deployTokenFixture() { - // Get the ContractFactory and Signers here. - const Token = await ethers.getContractFactory("Token"); + // Get the Signers here. const [owner, addr1, addr2] = await ethers.getSigners(); - // To deploy our contract, we just have to call Token.deploy() and await - // its deployed() method, which happens once its transaction has been + // To deploy our contract, we just have to call ethers.deployContract and await + // its waitForDeployment() method, which happens once its transaction has been // mined. - const hardhatToken = await Token.deploy(); + const hardhatToken = await ethers.deployContract("Token"); - await hardhatToken.deployed(); + await hardhatToken.waitForDeployment(); // Fixtures can return anything you consider useful for your tests - return { Token, hardhatToken, owner, addr1, addr2 }; + return { hardhatToken, owner, addr1, addr2 }; } // You can nest describe calls to create subsections. @@ -299,14 +289,14 @@ This is what the output of `npx hardhat test` should look like against the full ``` $ npx hardhat test - Token contract + Token contract Deployment - ✓ Should set the right owner - ✓ Should assign the total supply of tokens to the owner + ✔ Should set the right owner (889ms) + ✔ Should assign the total supply of tokens to the owner Transactions - ✓ Should transfer tokens between accounts (199ms) - ✓ Should fail if sender doesn’t have enough tokens - ✓ Should update balances after transfers (111ms) + ✔ Should transfer tokens between accounts (121ms) + ✔ Should emit Transfer events + ✔ Should fail if sender doesn't have enough tokens (74ms) 5 passing (1s) diff --git a/docs/src/content/tutorial/writing-and-compiling-contracts.md b/docs/src/content/tutorial/writing-and-compiling-contracts.md index 4c8c2da679f..3f73b986c98 100644 --- a/docs/src/content/tutorial/writing-and-compiling-contracts.md +++ b/docs/src/content/tutorial/writing-and-compiling-contracts.md @@ -31,7 +31,7 @@ To get syntax highlighting and editing assistance for Solidity in Visual Studio // Solidity files have to start with this pragma. // It will be used by the Solidity compiler to validate its version. -pragma solidity ^0.8.9; +pragma solidity {LATEST_PRAGMA}; // This is the main building block for smart contracts. @@ -107,8 +107,7 @@ To compile the contract run `npx hardhat compile` in your terminal. The `compile ``` $ npx hardhat compile -Compiling 1 file with 0.8.9 -Compilation finished successfully +Compiled 1 Solidity file successfully (evm target: paris). ``` The contract has been successfully compiled and it's ready to be used. diff --git a/docs/src/global-tabs.tsx b/docs/src/global-tabs.tsx deleted file mode 100644 index a5bf83e6620..00000000000 --- a/docs/src/global-tabs.tsx +++ /dev/null @@ -1,69 +0,0 @@ -import React, { useCallback, useEffect, useMemo, useState } from "react"; -import tabsConfig from "../temp/tabsConfig.json"; - -type TabType = string; - -export interface ITabsState { - [key: TabType]: string; -} - -interface ITabsContext { - tabsState: ITabsState; - changeTab: (type: string, value: string) => void; - setTabsState: React.Dispatch>; -} - -export const GlobalTabsContext = React.createContext({ - tabsState: {}, - changeTab: () => {}, - setTabsState: () => {}, -}); - -export const generateTabsGroupType = (options: string): string => { - return options - .split(",") - .map((option) => option.trim()) - .join("/"); -}; - -export const TabsProvider = ({ - children, -}: React.PropsWithChildren<{}>): JSX.Element => { - const [tabsState, setTabsState] = useState(tabsConfig); - - const changeTab = useCallback( - (type, value) => { - const newTabsState = { - ...tabsState, - [type]: value, - }; - setTabsState(newTabsState); - }, - [tabsState, setTabsState] - ); - - useEffect(() => { - const savedTabsState = localStorage.getItem("tabs"); - if (savedTabsState === null) return; - - setTabsState({ - ...tabsConfig, - ...JSON.parse(savedTabsState), - }); - }, []); - - useEffect(() => { - localStorage.setItem("tabs", JSON.stringify(tabsState)); - }, [tabsState]); - - const initialContext = useMemo( - () => ({ tabsState, changeTab, setTabsState }), - [tabsState, changeTab, setTabsState] - ); - - return ( - - {children} - - ); -}; diff --git a/docs/src/hooks/useWindowSize.ts b/docs/src/hooks/useWindowSize.ts deleted file mode 100644 index 85bda13e62c..00000000000 --- a/docs/src/hooks/useWindowSize.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { useEffect, useState } from "react"; - -export interface WindowSizeState { - width: number; - height: number; -} - -function handleResize({ - setWindowSize, - windowObject, -}: { - setWindowSize: (state: WindowSizeState) => void; - windowObject: Window; -}) { - setWindowSize({ - width: windowObject.innerWidth, - height: windowObject.innerHeight, - }); -} - -export default function useWindowSize(): WindowSizeState { - const [windowSize, setWindowSize] = useState({ - width: 0, - height: 0, - }); - - useEffect(() => { - if (typeof window !== "undefined") { - const listener = () => - handleResize({ setWindowSize, windowObject: window }); - - window.addEventListener("resize", listener); - - handleResize({ setWindowSize, windowObject: window }); - - return () => { - window.removeEventListener("resize", listener); - }; - } - return () => {}; - }, []); - - return windowSize; -} diff --git a/docs/src/model/layout.tsx b/docs/src/model/layout.tsx deleted file mode 100644 index 1fe6abfcf10..00000000000 --- a/docs/src/model/layout.tsx +++ /dev/null @@ -1,420 +0,0 @@ -import glob from "glob"; -import fs from "fs"; -import yaml from "js-yaml"; - -import { - getHrefByFile, - getMDFiles, - parseMdFile, - readMDFileFromPathOrIndex, -} from "./markdown"; -import { DirInfoConfigKeys, DOCS_PATH, TEMP_PATH } from "../config"; -import { getPluginsSubitems } from "./plugins"; - -import { - SectionType, - OrderType, - DirInfo, - Layout, - LayoutsInfo, - FolderWithFiles, - FolderInfo, - FolderType, - FoldersConfig, - TocSubitem, - TocItem, - FlatTocItem, - InfoFiles, -} from "./types"; - -const toCapitalCase = (str: string): string => { - // @ts-ignore - const [c, ...rest] = str; - return `${c.toUpperCase()}${rest.join("")}`; -}; - -const getDefaultConfig = (folder: FolderInfo): DirInfo => { - const config = { - [DirInfoConfigKeys.SECTION_TYPE]: SectionType.GROUP, - [DirInfoConfigKeys.SECTION_TITLE]: toCapitalCase(folder.path), - order: folder.files.map(({ file }) => - file.replace(/\.mdx?$/, "").replace(new RegExp(`^${folder.path}`), "") - ), - }; - - return config; -}; - -const getLayoutsInfo = (): LayoutsInfo => { - const fullPath = `${DOCS_PATH}/layouts.yaml`; - const yamlText = fs.readFileSync(fullPath).toString(); - const yamlData = yaml.load(yamlText) as LayoutsInfo; - return yamlData; -}; - -export const getDirInfoFiles = (): InfoFiles => - glob - .sync(`${DOCS_PATH}**/_dirinfo.yaml`) - .filter((pathname) => /\.yaml$/.test(pathname)) - .map((pathname) => pathname.replace(DOCS_PATH, "")) - .map((pathname) => ({ - path: pathname, - })); - -export const getYamlData = (relativePath: string): DirInfo => { - const fullPath = `${DOCS_PATH}/${relativePath}`; - const yamlText = fs.readFileSync(fullPath).toString(); - const yamlData = yaml.load(yamlText) as DirInfo; - return yamlData; -}; - -export const getFoldersInfo = (infoFiles: InfoFiles): FoldersConfig => - infoFiles.map(({ path }) => ({ - path, - folder: path.replace("/_dirinfo.yaml", ""), - config: getYamlData(path), - })); - -export const getAllFolders = (mdFiles: string[]): FolderWithFiles[] => { - const filesWithPaths = mdFiles.map((fileName) => ({ - fileName, - path: fileName.replace(/\/.*\.mdx?$/, ""), - })); - // @ts-ignore - const allPaths = [...new Set(filesWithPaths.map(({ path }) => path))]; - const folders = allPaths.map((path) => ({ - path, - files: filesWithPaths - .filter((fl) => fl.path === path) - .map(({ fileName }) => fileName), - })); - - return folders; -}; - -const matchFoldersToLayouts = ( - folders: FolderWithFiles[], - layouts: LayoutsInfo, - foldersInfo: FoldersConfig -): Array => { - const layoutsList = Object.entries(layouts).map(([layoutKey, lt]) => ({ - layoutKey, - ...lt, - })); - - const allFolderPaths = new Set([ - ...folders.map(({ path }) => path), - ...foldersInfo.map(({ folder }) => folder), - ]); - - // @ts-ignore - return [...allFolderPaths].map((path) => { - const lt = layoutsList.find(({ folders: ff }) => ff.includes(path)); - if (!lt) { - throw new Error( - `Folder ${path} isn't included to any layout. Please specify it in ${DOCS_PATH}/layouts.yaml file. If you don't want to list it in the sidebar, use "section-type: hidden" in _dirinfo.yaml` - ); - } - const fld = folders.find((f) => f.path === path); - const fldInfo = foldersInfo.find((f) => f.folder === path); - if ( - fldInfo && - fldInfo.config[DirInfoConfigKeys.SECTION_TYPE] === SectionType.PLUGINS - ) { - const virtualFiles = fldInfo?.config?.order?.map((file: string | {}) => { - if (typeof file === "object") { - return file; - } - return { - file, - href: file, - }; - }); - - return { - path, - files: virtualFiles, - layout: lt, - [DirInfoConfigKeys.SECTION_TYPE]: SectionType.PLUGINS, - }; - } - const files = - fld?.files?.map((file) => ({ file, href: getHrefByFile(file) })) || null; - return { - path, - files, - layout: lt, - [DirInfoConfigKeys.SECTION_TYPE]: fldInfo?.config - ? fldInfo?.config[DirInfoConfigKeys.SECTION_TYPE] - : undefined, - }; - }); -}; - -const getSubitems = (path: string, order: OrderType[]): TocSubitem[] => { - const items = order.map((item) => { - if (typeof item === "object") { - return { - label: item.title, - href: `/${path}${item.href}`, - }; - } - - const fullName = `${path}${item}.md`; - const { source } = readMDFileFromPathOrIndex(`${DOCS_PATH}${fullName}`); - - const { tocTitle } = parseMdFile(source); - - return { - href: `/${path}${item}`, - label: tocTitle || item, - }; - }); - return items; -}; - -const generateGroupSection = (folder: FolderType) => { - const tocItem = { - label: folder[DirInfoConfigKeys.SECTION_TITLE], - type: folder[DirInfoConfigKeys.SECTION_TYPE], - children: folder.order?.length - ? getSubitems(folder.path, folder.order) - : undefined, - }; - - return tocItem; -}; - -const generateSingleSection = (folder: FolderType) => { - const tocItem = { - label: folder[DirInfoConfigKeys.SECTION_TITLE], - href: folder[DirInfoConfigKeys.SECTION_URL] ?? `/${folder.path}`, - type: folder[DirInfoConfigKeys.SECTION_TYPE], - children: folder.order?.length - ? getSubitems(folder.path, folder.order) - : undefined, - }; - - return tocItem; -}; - -const generateHiddenSection = () => null; - -const generatePluginsSection = (folder: FolderType) => { - const tocItem = { - label: - folder[DirInfoConfigKeys.SECTION_TITLE] || toCapitalCase(folder.path), - type: folder[DirInfoConfigKeys.SECTION_TYPE], - children: getPluginsSubitems(folder.path, folder.order), - }; - - return tocItem; -}; - -const sectionTypeGeneratorsMap = { - [SectionType.GROUP]: generateGroupSection, - [SectionType.SINGLE]: generateSingleSection, - [SectionType.HIDDEN]: generateHiddenSection, - [SectionType.PLUGINS]: generatePluginsSection, -}; - -const generateTocItem = (fld: null | FolderType): TocItem | null => { - if (!fld) { - return null; - } - const sectionType = fld[DirInfoConfigKeys.SECTION_TYPE] as - | SectionType - | string; - // @ts-ignore - const sectionGenerator = sectionTypeGeneratorsMap[sectionType]; - - if (!sectionGenerator) { - throw new Error(`wrong section-type - ${sectionType} (see ${fld.path})`); - } - - return sectionGenerator(fld); -}; - -const getItemByHref = - (flatTocList: FlatTocItem[]) => - ( - href: string, - needSkipSearch: boolean - ): - | { - prev: TocSubitem; - next: TocSubitem; - } - | {} => { - if (needSkipSearch) { - return {}; - } - const items = flatTocList.filter((item) => { - if (!item?.href) { - return false; - } - const itemHref = item.href.replace(/#.*$/, "").replace(/\/$/, ""); - return itemHref === href; - }); - if (!items.length) { - // throw new Error(`Can't find menu entry for ${href} URL`); - return {}; - } - const first = items[0] as FlatTocItem; - const last = items[items.length - 1] as FlatTocItem; - return { - prev: first.prev, - next: last.next, - }; - }; - -const getPluginsItems = ( - layoutNavigations: FlatTocItem[], - folder: FolderInfo & { - layout: Layout; - } -): Array => { - const pluginItems = layoutNavigations.filter(({ href }) => - /\/plugins/.test(href) - ); - - return pluginItems.map((item) => ({ - ...item, - file: item.label, - folder: folder.path, - layout: folder.layout.layoutKey, - })); -}; - -const getLayoutToc = ( - layout: Layout, - foldersStructure: Array<{ - path: string; - files: Array<{ - file: string; - href: string; - }>; - layout: Layout; - }> -): { tocItems: TocItem[]; flatTocList: FlatTocItem[] } => { - const tocItems = layout.folders - .map((fldName: string) => { - const fld = foldersStructure.find( - ({ path }: { path: string }) => path === fldName - ); - return fld; - }) - // @ts-ignore - .map(generateTocItem) - .filter(Boolean) as TocItem[]; - - const flatTocList = tocItems - .flatMap((item: TocItem | TocSubitem) => { - if ((item as TocItem).children) { - return (item as TocItem).children; - } - return [item]; - }) - .map((item, index, list) => { - const prev = index > 0 ? list[index - 1] : null; - const next = index < list.length - 1 ? list[index + 1] : null; - return { - ...item, - prev, - next, - }; - }) as FlatTocItem[]; - - return { tocItems, flatTocList }; -}; - -export const createLayouts = () => { - const infoFiles = getDirInfoFiles(); - const foldersInfo = getFoldersInfo(infoFiles); - const mdFiles = getMDFiles(); - const folders = getAllFolders(mdFiles); - - const layouts = getLayoutsInfo(); - - const foldersWithLayouts = matchFoldersToLayouts( - folders, - layouts, - foldersInfo - ); - const foldersStructure = foldersWithLayouts.map((fld) => ({ - ...fld, - ...(foldersInfo.find(({ folder }) => folder === fld.path)?.config || - getDefaultConfig(fld)), - })); - - const layoutConfigAndNavigation = Object.entries(layouts).map(([key, l]) => { - const layoutToc = getLayoutToc(l, foldersStructure); - return { - config: { - [key]: layoutToc.tocItems, - }, - navigation: layoutToc.flatTocList, - }; - }); - - const layoutConfigs = layoutConfigAndNavigation.reduce( - (acc, obj) => ({ - ...acc, - ...obj.config, - }), - {} - ); - - const layoutNavigations = layoutConfigAndNavigation.flatMap( - (l) => l.navigation - ); - - const getNavigation = getItemByHref(layoutNavigations); - - const layoutsMap = foldersWithLayouts - .map((folder) => - folder.files - ?.map((fileEntry) => { - if (folder[DirInfoConfigKeys.SECTION_TYPE] === SectionType.PLUGINS) { - const pluginItems = getPluginsItems(layoutNavigations, folder); - return pluginItems; - } - // @ts-ignore - const { prev, next } = getNavigation( - `/${fileEntry.href}`, - folder[DirInfoConfigKeys.SECTION_TYPE] === SectionType.HIDDEN - ); - return [ - { - file: fileEntry.file, - href: fileEntry.href, - folder: folder.path, - layout: folder.layout.layoutKey, - prev, - next, - }, - ]; - }) - .flat() - ) - .filter(Boolean) - .flat() - .reduce( - (acc, obj) => ({ - ...acc, - [obj.file]: obj, - }), - {} - ); - - /** - * We generating this config once per build from `getStaticPaths`. - * After that we writing the config to a temporary file for reusing this data from `getStaticProps` on page generations. - * So each single page don't need to execute this function again - */ - const sidebarConfigPath = `${TEMP_PATH}sidebarConfig.json`; - fs.writeFileSync( - sidebarConfigPath, - JSON.stringify({ layoutConfigs, layoutsMap }) - ); -}; diff --git a/docs/src/model/markdown.tsx b/docs/src/model/markdown.tsx index 935ff158129..f0946c54c24 100644 --- a/docs/src/model/markdown.tsx +++ b/docs/src/model/markdown.tsx @@ -103,6 +103,31 @@ export const withoutComments = (content: string) => { return content.replace(//gm, ""); }; +export const replacePlaceholders = (content: string) => { + const recommendedSolcVersion = "0.8.23"; + const latestPragma = "^0.8.0"; + const hardhatPackageJson = fs + .readFileSync( + path.resolve( + __dirname, + "..", + "..", + "..", + "..", + "packages", + "hardhat-core", + "package.json" + ) + ) + .toString(); + const hardhatVersion = JSON.parse(hardhatPackageJson).version; + + return content + .replaceAll("{RECOMMENDED_SOLC_VERSION}", recommendedSolcVersion) + .replaceAll("{LATEST_PRAGMA}", latestPragma) + .replaceAll("{HARDHAT_VERSION}", hardhatVersion); +}; + export const readMDFileFromPathOrIndex = ( fileName: string ): { source: string; fileName: string } => { @@ -201,7 +226,9 @@ export const generateTitleFromContent = (content: string) => { export const parseMdFile = (source: string) => { const { content, data } = matter(source); - const formattedContent = withoutComments(withInsertedCodeFromLinks(content)); + const formattedContent = replacePlaceholders( + withoutComments(withInsertedCodeFromLinks(content)) + ); const tocTitle = data.title ?? generateTitleFromContent(formattedContent); const seoTitle = tocTitle || "Hardhat"; diff --git a/docs/src/model/plugins.tsx b/docs/src/model/plugins.tsx deleted file mode 100644 index 066177a008b..00000000000 --- a/docs/src/model/plugins.tsx +++ /dev/null @@ -1,145 +0,0 @@ -import path from "path"; -import { request } from "undici"; -import { getSidebarConfig, readFileContent } from "./markdown"; -import { IPlugin, OrderType, SectionType, TocItem, TocSubitem } from "./types"; -import plugins from "../content/hardhat-runner/plugins/plugins"; - -/** - * NOTE: here we assumes that "Plugins" menu items only belongs to ${PLUGINS_LAYOUT} layout. - * This means the information for generating static pages will be found in this layout from a section - * with section-type == plugin (section is a folder in content) - * We also assume that only one section with plugins exists - * Additionally we hardcode plugins pages path to `/pages/plugins/...` - * - * If you ever need to extend this behavior see `getPluginsPaths` function. - * e.g. for adding a plugin section to another layout start reading `content/layouts.yaml` - * as a source of actual layouts configuration - */ -const PLUGINS_LAYOUT = "hardhat-runner"; - -export const generateSlug = (pluginName: string): string => - pluginName.replace(/^@/, "").replace(/\//g, "-"); - -export const getPluginsSubitems = ( - folderPath: string, - order: OrderType[] -): TocSubitem[] => { - return order.map((item: OrderType) => { - if (typeof item === "object") { - return { - label: item.title, - href: item.href, - }; - } - return { - label: item, - href: `/${folderPath}/${generateSlug(item)}`, - }; - }); -}; - -export const getPluginsPaths = (): Array<{ params: { plugin: string } }> => { - try { - const { layoutConfigs } = getSidebarConfig(); - const config = layoutConfigs[PLUGINS_LAYOUT] as TocItem[]; - const pluginsSection = config.find( - ({ type }) => type === SectionType.PLUGINS - ); - if (!pluginsSection?.children) { - throw new Error( - `Section with type=plugins is missed or empty. Check content/hardhat-runner/plugins/_dirinfo.yaml` - ); - } - return pluginsSection.children - .map(({ href }) => href.replace(/^\/hardhat-runner\/plugins\//, "")) - .filter((slug) => slug[0] !== "#") - .map((slug) => ({ - params: { - plugin: slug, - }, - })); - } catch (err) { - console.error(err); - throw new Error( - `Error while generation plugin page paths. See details above` - ); - } -}; - -const getPluginReadmeFilename = (pluginSlug: string): string => { - const folderName = pluginSlug - .replace("hardhat-runner/plugins/", "") - .replace(/nomiclabs-/, "") - .replace(/nomicfoundation-/, ""); - const rootPath = process.cwd().toString(); - const filename = path.join(rootPath, "../packages/", folderName, "README.md"); - return filename; -}; - -export const getPluginMDSource = (pluginSlug: string) => { - const readmeFilename = getPluginReadmeFilename(pluginSlug); - const source = readFileContent(readmeFilename).toString(); - return source; -}; - -export const sortPluginsByDownloads = (downloadsD: { - [key: string]: number; -}) => { - try { - plugins.communityPlugins.sort( - (p1: IPlugin, p2: IPlugin) => downloadsD[p2.name] - downloadsD[p1.name] - ); - } catch { - // we just don't sort here - } -}; - -const getLastMonthDownloads = async (npmPackage: string): Promise => { - const res = await request( - `https://api.npmjs.org/downloads/point/last-month/${npmPackage}`, - { - method: "GET", - headers: { - "Content-Type": "application/json", - Accept: "application/json", - }, - } - ); - - if (res.statusCode === 404) { - return 0; - } - - const json = (await res.body.json()) as { downloads: number }; - - return json.downloads; -}; - -export const generatePluginsDownloads = async (pluginsD: typeof plugins) => { - const downloads: Array<{ [plugin: string]: number }> = await Promise.all( - pluginsD.communityPlugins.map(async (p: any) => ({ - [p.name]: await getLastMonthDownloads(p.npmPackage ?? p.name), - })) - ); - - downloads.sort((p1, p2) => Object.values(p2)[0] - Object.values(p1)[0]); - - const result = Object.assign({}, ...downloads); - return result; -}; - -export const addNormalizedName = (pluginsList: IPlugin[]) => { - return pluginsList.map((p) => ({ - ...p, - normalizedName: p.name.split("/").join("-").replace(/^@/, ""), - })); -}; - -export const getPlugins = async () => { - const generatedPluginsDownloads = await generatePluginsDownloads(plugins); - sortPluginsByDownloads(generatedPluginsDownloads); - plugins.officialPlugins = addNormalizedName(plugins.officialPlugins); - return plugins; -}; - -export type PluginsList = typeof plugins; diff --git a/docs/src/model/types.ts b/docs/src/model/types.ts deleted file mode 100644 index df8ba554085..00000000000 --- a/docs/src/model/types.ts +++ /dev/null @@ -1,99 +0,0 @@ -import { DirInfoConfigKeys, LayoutsConfigKeys } from "../config"; - -export enum SectionType { - SINGLE = "single", - GROUP = "group", - HIDDEN = "hidden", - PLUGINS = "plugins", -} - -export type OrderType = - | string - | { - href: string; - title: string; - }; - -export interface DirInfo { - [DirInfoConfigKeys.SECTION_TYPE]: SectionType; - [DirInfoConfigKeys.SECTION_TITLE]: string; - [DirInfoConfigKeys.ORDER]: OrderType[]; -} - -export interface Layout { - [LayoutsConfigKeys.TITLE]: string; - [LayoutsConfigKeys.FOLDERS]: string[]; - layoutKey?: string; -} - -export interface LayoutsInfo { - [layoutKey: string]: Layout; -} - -export interface FolderWithFiles { - path: string; - files: string[]; -} - -export interface FolderInfo { - path: string; - files: Array<{ file: string; href: string }>; - [DirInfoConfigKeys.SECTION_TYPE]: SectionType; -} - -export interface FolderType { - [DirInfoConfigKeys.SECTION_TYPE]: SectionType; - [DirInfoConfigKeys.SECTION_TITLE]: string; - [DirInfoConfigKeys.SECTION_URL]: string | undefined; - [DirInfoConfigKeys.ORDER]: OrderType[]; - path: string; -} - -export type FoldersConfig = Array<{ - path: string; - folder: string; - config: { - [key: string]: any; - }; -}>; - -export interface TocSubitem { - label: string; - href: string; - type?: SectionType; - next?: TocSubitem; - prev?: TocSubitem; -} - -export interface TocItem { - label: string; - type: SectionType; - href?: string; - children?: TocSubitem[]; - // next?: TocSubitem; - // prev?: TocSubitem; -} - -export interface FlatTocItem { - label: string; - href: string; - next?: TocSubitem; - prev?: TocSubitem; -} - -export type InfoFiles = Array<{ path: string }>; - -export interface IFrontMatter { - seoTitle: string; - seoDescription: string; -} - -export interface IPlugin { - name: string; - npmPackage?: string; - author: string; - authorUrl: string; - description: string; - tags: string[]; - normalizedName?: string; -} diff --git a/docs/src/pages/[...docPath].tsx b/docs/src/pages/[...docPath].tsx deleted file mode 100644 index d027e89100e..00000000000 --- a/docs/src/pages/[...docPath].tsx +++ /dev/null @@ -1,93 +0,0 @@ -import type { NextPage, GetStaticProps, GetStaticPaths } from "next"; -import { MDXRemoteSerializeResult } from "next-mdx-remote"; - -import { - getCommitDate, - getEditLink, - getLayout, - getMDPaths, - prepareMdContent, - readMDFileFromPathOrIndex, - withIndexFile, -} from "../model/markdown"; -import DocumentationLayout from "../components/DocumentationLayout"; -import { createLayouts } from "../model/layout"; -import { - IDocumentationSidebarStructure, - IFooterNavigation, -} from "../components/types"; -import { IFrontMatter } from "../model/types"; - -interface IDocPage { - mdxSource: MDXRemoteSerializeResult; - frontMatter: IFrontMatter; - layout: IDocumentationSidebarStructure; - prev: IFooterNavigation; - next: IFooterNavigation; - lastEditDate: string; - editLink: string; -} - -const DocPage: NextPage = ({ - mdxSource, - frontMatter, - layout, - prev, - next, - lastEditDate, - editLink, -}): JSX.Element => { - return ( - - ); -}; - -export default DocPage; - -export const getStaticProps: GetStaticProps = async (props) => { - const { params } = props; - // @ts-ignore - const fullName = withIndexFile(params.docPath); - const { source, fileName } = readMDFileFromPathOrIndex(fullName); - const lastEditDate = getCommitDate(fileName); - const editLink = getEditLink(fileName); - - const { mdxSource, data, seoTitle, seoDescription } = await prepareMdContent( - source - ); - const { layout, next, prev } = getLayout(fileName); - - return { - props: { - mdxSource, - frontMatter: { - ...data, - seoTitle, - seoDescription, - }, - layout, - next: data.next ? next : false, - prev: data.prev ? prev : false, - lastEditDate, - editLink, - }, - }; -}; - -export const getStaticPaths: GetStaticPaths = async () => { - const paths = getMDPaths(); - createLayouts(); - - return { - paths, - fallback: false, - }; -}; diff --git a/docs/src/pages/_app.tsx b/docs/src/pages/_app.tsx deleted file mode 100644 index ad4c59574ce..00000000000 --- a/docs/src/pages/_app.tsx +++ /dev/null @@ -1,16 +0,0 @@ -import React from "react"; -import type { AppProps } from "next/app"; -import "../styles/globals.css"; -import "../styles/prism.css"; -import { TabsProvider } from "../global-tabs"; - -function MyApp({ Component, pageProps }: AppProps) { - return ( - - {/* @ts-ignore */} - - - ); -} - -export default MyApp; diff --git a/docs/src/pages/_document.tsx b/docs/src/pages/_document.tsx deleted file mode 100644 index 799a7b3c4ec..00000000000 --- a/docs/src/pages/_document.tsx +++ /dev/null @@ -1,56 +0,0 @@ -/* eslint-disable react/no-danger */ -import { Html, Head, Main, NextScript } from "next/document"; - -const MeasurementID = process.env.NEXT_PUBLIC_MEASUREMENT_ID as string; - -export default function Document() { - return ( - - - - - - + + + diff --git a/packages/hardhat-ignition-ui/package.json b/packages/hardhat-ignition-ui/package.json new file mode 100644 index 00000000000..02104bb5fe3 --- /dev/null +++ b/packages/hardhat-ignition-ui/package.json @@ -0,0 +1,46 @@ +{ + "name": "@nomicfoundation/ignition-ui", + "version": "0.15.11", + "type": "module", + "scripts": { + "predev": "pnpm regenerate-deployment-example", + "dev": "vite --force", + "build": "tsc --build . && vite build", + "test": "mocha --loader=ts-node/esm --recursive \"test/**/*.ts\"", + "test:coverage": "nyc mocha --loader=ts-node/esm --recursive \"test/**/*.ts\"", + "regenerate-deployment-example": "node ./scripts/generate-example-deployment-json.js", + "lint": "eslint src --ext ts,tsx --report-unused-disable-directives --max-warnings 0", + "preview": "vite preview", + "clean": "rimraf dist tsconfig.tsbuildinfo", + "prepack": "pnpm build" + }, + "devDependencies": { + "@fontsource/roboto": "^5.0.8", + "@nomicfoundation/ignition-core": "workspace:^", + "@types/chai": "^4.2.22", + "@types/chai-as-promised": "^7.1.5", + "@types/mocha": "9.1.1", + "@types/react": "^18.0.28", + "@types/react-dom": "^18.0.11", + "@types/styled-components": "5.1.26", + "@typescript-eslint/parser": "^5.57.1", + "@vitejs/plugin-react": "^4.0.0", + "chai": "^4.3.4", + "chai-as-promised": "7.1.1", + "eslint": "^8.38.0", + "eslint-plugin-react-hooks": "^4.6.0", + "eslint-plugin-react-refresh": "^0.3.4", + "mermaid": "10.9.3", + "mocha": "^9.1.3", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "react-router-dom": "6.11.0", + "react-tooltip": "^5.21.4", + "styled-components": "5.3.10", + "svg-pan-zoom": "^3.6.1", + "ts-node": "10.9.1", + "typescript": "^5.0.2", + "vite": "^5.4.17", + "vite-plugin-singlefile": "^2.0.1" + } +} diff --git a/packages/hardhat-ignition-ui/public/.gitkeep b/packages/hardhat-ignition-ui/public/.gitkeep new file mode 100644 index 00000000000..ad88fa0b0f1 --- /dev/null +++ b/packages/hardhat-ignition-ui/public/.gitkeep @@ -0,0 +1,2 @@ +# To keep the public folder that is used in vite +# Our development server dumps a `deployment.json` here. diff --git a/packages/hardhat-ignition-ui/scripts/generate-example-deployment-json.js b/packages/hardhat-ignition-ui/scripts/generate-example-deployment-json.js new file mode 100644 index 00000000000..caef452f791 --- /dev/null +++ b/packages/hardhat-ignition-ui/scripts/generate-example-deployment-json.js @@ -0,0 +1,31 @@ +import { + IgnitionModuleSerializer, + batches, +} from "@nomicfoundation/ignition-core"; +import { writeFile } from "node:fs/promises"; + +import complexModule from "../examples/ComplexModule.js"; + +const main = async () => { + await writeDeploymentJsonFor(complexModule); +}; + +async function writeDeploymentJsonFor(ignitionModule) { + const serializedIgnitionModule = + IgnitionModuleSerializer.serialize(ignitionModule); + + const moduleBatches = batches(ignitionModule); + + console.log("Deployment written to ./public/deployment.json"); + + await writeFile( + "./public/deployment.json", + JSON.stringify( + { module: serializedIgnitionModule, batches: moduleBatches }, + undefined, + 2 + ) + ); +} + +main(); diff --git a/packages/hardhat-ignition-ui/src/assets/ExternalLinkIcon.tsx b/packages/hardhat-ignition-ui/src/assets/ExternalLinkIcon.tsx new file mode 100644 index 00000000000..58c310609ce --- /dev/null +++ b/packages/hardhat-ignition-ui/src/assets/ExternalLinkIcon.tsx @@ -0,0 +1,15 @@ +import React from "react"; + +export const ExternalLinkIcon: React.FC = () => ( + + + + + +); diff --git a/packages/hardhat-ignition-ui/src/assets/TooltipIcon.tsx b/packages/hardhat-ignition-ui/src/assets/TooltipIcon.tsx new file mode 100644 index 00000000000..be04a3273fd --- /dev/null +++ b/packages/hardhat-ignition-ui/src/assets/TooltipIcon.tsx @@ -0,0 +1,16 @@ +import React from "react"; + +export const TooltipIcon: React.FC = () => ( + + + +); diff --git a/packages/hardhat-ignition-ui/src/assets/purple-rocket.png b/packages/hardhat-ignition-ui/src/assets/purple-rocket.png new file mode 100644 index 00000000000..374f6393979 Binary files /dev/null and b/packages/hardhat-ignition-ui/src/assets/purple-rocket.png differ diff --git a/packages/hardhat-ignition-ui/src/components/mermaid.tsx b/packages/hardhat-ignition-ui/src/components/mermaid.tsx new file mode 100644 index 00000000000..44341da19cc --- /dev/null +++ b/packages/hardhat-ignition-ui/src/components/mermaid.tsx @@ -0,0 +1,58 @@ +import React, { useEffect, useMemo } from "react"; +import styled from "styled-components"; +import svgPanZoom from "svg-pan-zoom"; + +import { + IgnitionModule, + IgnitionModuleResult, +} from "@nomicfoundation/ignition-core/ui-helpers"; +import mermaid from "mermaid"; + +import { toMermaid } from "../utils/to-mermaid"; + +export const Mermaid: React.FC<{ + ignitionModule: IgnitionModule>; +}> = ({ ignitionModule }) => { + const diagram = useMemo(() => { + const d = toMermaid(ignitionModule); + + // NOTE: this is explicitly added to aid troubleshooting + // eslint-disable-next-line @typescript-eslint/no-explicit-any + (window as any).diagram = d; + + return d; + }, [ignitionModule]); + + useEffect(() => { + mermaid.initialize({ + maxTextSize: 5000000, + flowchart: { + padding: 50, + }, + }); + + mermaid.contentLoaded(); + }); + + // requestAnimationFrame is used to ensure that the svgPanZoom is called after the svg is rendered + useEffect(() => { + requestAnimationFrame(() => { + setTimeout(() => { + svgPanZoom(".mermaid > svg", { + zoomEnabled: true, + controlIconsEnabled: true, + fit: true, + center: true, + }); + }, 0); + }); + }); + + return ( + +
    {diagram}
    +
    + ); +}; + +const Wrap = styled.div``; diff --git a/docs/src/assets/socials/dc-logo.tsx b/packages/hardhat-ignition-ui/src/components/socials/dc-logo.tsx similarity index 93% rename from docs/src/assets/socials/dc-logo.tsx rename to packages/hardhat-ignition-ui/src/components/socials/dc-logo.tsx index bfef1ccb37e..993fe038cab 100644 --- a/docs/src/assets/socials/dc-logo.tsx +++ b/packages/hardhat-ignition-ui/src/components/socials/dc-logo.tsx @@ -1,7 +1,6 @@ -import * as React from "react"; -import { SVGProps, memo } from "react"; +import { SVGProps } from "react"; -const DiscordLogo = (props: SVGProps) => ( +export const DiscordLogo = (props: SVGProps) => ( ) => ( ); - -export default memo(DiscordLogo); diff --git a/docs/src/assets/socials/gh-logo.tsx b/packages/hardhat-ignition-ui/src/components/socials/gh-logo.tsx similarity index 91% rename from docs/src/assets/socials/gh-logo.tsx rename to packages/hardhat-ignition-ui/src/components/socials/gh-logo.tsx index fef3ebd1931..4788a54230f 100644 --- a/docs/src/assets/socials/gh-logo.tsx +++ b/packages/hardhat-ignition-ui/src/components/socials/gh-logo.tsx @@ -1,7 +1,6 @@ -import * as React from "react"; -import { SVGProps, memo } from "react"; +import { SVGProps } from "react"; -const GitHubLogo = (props: SVGProps) => ( +export const GitHubLogo = (props: SVGProps) => ( ) => ( /> ); - -export default memo(GitHubLogo); diff --git a/packages/hardhat-ignition-ui/src/components/socials/index.tsx b/packages/hardhat-ignition-ui/src/components/socials/index.tsx new file mode 100644 index 00000000000..07454b5e826 --- /dev/null +++ b/packages/hardhat-ignition-ui/src/components/socials/index.tsx @@ -0,0 +1,33 @@ +import { DiscordLogo } from "./dc-logo"; +import { GitHubLogo } from "./gh-logo"; +import { TwitterLogo } from "./tw-logo"; + +export enum SocialsEnum { + GITHUB = "GITHUB", + TWITTER = "TWITTER", + DISCORD = "DISCORD", +} + +const SOCIALS_LINKS = { + [SocialsEnum.GITHUB]: "https://hardhat.org/ignition", + [SocialsEnum.TWITTER]: "https://twitter.com/HardhatHQ", + [SocialsEnum.DISCORD]: "https://hardhat.org/ignition-discord", +}; + +export const socialsItems = [ + { + name: SocialsEnum.GITHUB, + href: SOCIALS_LINKS[SocialsEnum.GITHUB], + Icon: GitHubLogo, + }, + { + name: SocialsEnum.TWITTER, + href: SOCIALS_LINKS[SocialsEnum.TWITTER], + Icon: TwitterLogo, + }, + { + name: SocialsEnum.DISCORD, + href: SOCIALS_LINKS[SocialsEnum.DISCORD], + Icon: DiscordLogo, + }, +]; diff --git a/docs/src/assets/socials/tw-logo.tsx b/packages/hardhat-ignition-ui/src/components/socials/tw-logo.tsx similarity index 88% rename from docs/src/assets/socials/tw-logo.tsx rename to packages/hardhat-ignition-ui/src/components/socials/tw-logo.tsx index e528996b105..a558a2a6928 100644 --- a/docs/src/assets/socials/tw-logo.tsx +++ b/packages/hardhat-ignition-ui/src/components/socials/tw-logo.tsx @@ -1,7 +1,6 @@ -import * as React from "react"; -import { SVGProps, memo } from "react"; +import { SVGProps } from "react"; -const TwitterLogo = (props: SVGProps) => ( +export const TwitterLogo = (props: SVGProps) => ( ) => ( ); - -export default memo(TwitterLogo); diff --git a/packages/hardhat-ignition-ui/src/main.css b/packages/hardhat-ignition-ui/src/main.css new file mode 100644 index 00000000000..629528edf67 --- /dev/null +++ b/packages/hardhat-ignition-ui/src/main.css @@ -0,0 +1,86 @@ +body { + font-family: "Roboto", sans-serif; + font-weight: 400; + font-size: 15px; + margin: 0; +} + +.deploy-background { + background: #fffde7; +} + +.call-background { + background: #f8f2ff; +} + +.styled-tooltip { + background-color: #ffffff !important; + color: #9b9fa8 !important; + padding: 1.5rem !important; + opacity: 1 !important; + -webkit-box-shadow: 0px 6px 50px 0px rgba(10, 10, 10, 0.4) !important; + -moz-box-shadow: 0px 6px 50px 0px rgba(10, 10, 10, 0.4) !important; + box-shadow: 0px 6px 50px 0px rgba(10, 10, 10, 0.4) !important; +} + +.styled-tooltip span { + font-weight: 400 !important; +} + +.styled-tooltip * { + font-size: 0.8rem !important; +} + +.batches-tooltip { + max-width: 231px !important; +} + +.batches-tooltip div { + font-weight: 400 !important; +} + +.flow-tooltip { + max-width: 391px !important; +} + +span.future-to-module-arrow { + font-weight: 900 !important; + font-size: medium !important; + letter-spacing: -2px; +} + +/* mermaid styles */ + +.mermaid { + background: #fbfbfb; + height: 500px; +} + +.mermaid * { + font-family: "Roboto", sans-serif; + font-size: 30px; +} + +.mermaid svg { + height: 100%; + vertical-align: middle; + max-width: unset !important; +} + +.mermaid span { + cursor: default; +} + +.mermaid rect { + rx: 5; + ry: 5; +} + +/* selects moduleIds only */ +.clusters .nodeLabel { + font-weight: 700; +} + +.futureNode rect { + stroke: none !important; +} diff --git a/packages/hardhat-ignition-ui/src/main.tsx b/packages/hardhat-ignition-ui/src/main.tsx new file mode 100644 index 00000000000..29478e42a02 --- /dev/null +++ b/packages/hardhat-ignition-ui/src/main.tsx @@ -0,0 +1,93 @@ +import "@fontsource/roboto"; +import "@fontsource/roboto/400.css"; +import "@fontsource/roboto/700.css"; +import React from "react"; + +import { + IgnitionModule, + IgnitionModuleDeserializer, + IgnitionModuleResult, +} from "@nomicfoundation/ignition-core/ui-helpers"; +import ReactDOM from "react-dom/client"; +import { RouterProvider, createHashRouter } from "react-router-dom"; +import { VisualizationOverview } from "./pages/visualization-overview/visualization-overview"; + +import "./main.css"; + +const loadDeploymentFromEmbeddedDiv = (): { + ignitionModule: IgnitionModule>; + batches: string[][]; +} | null => { + const scriptTag = document.getElementById("deployment"); + + if (scriptTag === null || scriptTag.textContent === null) { + return null; + } + + const data = JSON.parse(scriptTag.textContent); + + if (data.unloaded) { + return null; + } + + return { + ignitionModule: IgnitionModuleDeserializer.deserialize(data.module), + batches: data.batches, + }; +}; + +const loadDeploymentFromDevFile = async (): Promise<{ + ignitionModule: IgnitionModule>; + batches: string[][]; +}> => { + const response = await fetch("./deployment.json"); + const data = await response.json(); + + return { + ignitionModule: IgnitionModuleDeserializer.deserialize(data.module), + batches: data.batches, + }; +}; + +const loadDeploymentData = () => { + return loadDeploymentFromEmbeddedDiv() ?? loadDeploymentFromDevFile(); +}; + +const main = async () => { + try { + const { ignitionModule, batches } = await loadDeploymentData(); + + document.title = `${ignitionModule.id} Deployment Visualization - Hardhat Ignition`; + + const router = createHashRouter([ + { + path: "/", + element: ( + + ), + }, + ]); + + ReactDOM.createRoot(document.getElementById("root") as HTMLElement).render( + + + + ); + } catch (error) { + console.error(error); + const message = error instanceof Error ? error.message : "unknown error"; + + ReactDOM.createRoot(document.getElementById("root") as HTMLElement).render( +
    +

    + Error during deployment loading: {message} +

    +
    + ); + } +}; + +main(); diff --git a/packages/hardhat-ignition-ui/src/pages/visualization-overview/components/deployment-flow.tsx b/packages/hardhat-ignition-ui/src/pages/visualization-overview/components/deployment-flow.tsx new file mode 100644 index 00000000000..99f6f5871fc --- /dev/null +++ b/packages/hardhat-ignition-ui/src/pages/visualization-overview/components/deployment-flow.tsx @@ -0,0 +1,209 @@ +import { + IgnitionModule, + IgnitionModuleResult, + isDeploymentFuture, +} from "@nomicfoundation/ignition-core/ui-helpers"; +import React, { useState } from "react"; +import { Tooltip } from "react-tooltip"; +import styled, { css } from "styled-components"; +import { TooltipIcon } from "../../../assets/TooltipIcon"; +import { Mermaid } from "../../../components/mermaid"; +import { getAllFuturesForModule } from "../../../queries/futures"; +import { toEscapedId } from "../../../utils/to-escaped-id"; + +export const DeploymentFlow: React.FC<{ + ignitionModule: IgnitionModule>; + batches: string[][]; +}> = ({ ignitionModule, batches }) => { + /* batch highlighting logic */ + const escapedIdMap = batches.reduce((acc, batch, i) => { + const batchId = `batch-${i}`; + + const escapedFutureIds = batch.map(toEscapedId); + + return { + ...acc, + [batchId]: escapedFutureIds, + }; + }, {} as Record); + + const [currentlyHovered, setCurrentlyHovered] = useState(""); + + const futuresToHighlight = escapedIdMap[currentlyHovered] || []; + + /* basic future node styling */ + + const futures = getAllFuturesForModule(ignitionModule); + const deploys: string[] = []; + const others: string[] = []; + futures.forEach((future) => { + if (isDeploymentFuture(future)) { + deploys.push(toEscapedId(future.id)); + } else { + others.push(toEscapedId(future.id)); + } + }); + + return ( +
    + + Deployment flow + + + {futures.length <= 1 ? ( + + A module diagram will show once you have more than 1 future. + + ) : ( +
    + + Visualize batches + {batches.map((_, i) => ( + setCurrentlyHovered(`batch-${i}`)} + onMouseLeave={() => setCurrentlyHovered("")} + isCurrentlyHovered={currentlyHovered === `batch-${i}`} + > + Batch #{i + 1} + + ))} + + + + + +
    + )} +
    + ); +}; + +const SingleFutureNotice = styled.div` + padding-top: 1rem; +`; + +const VisualizeDiv = styled.div` + font-weight: 700; + padding: 1.5rem; + width: 100%; +`; + +// TODO: when we added the future-to-module dependency, we created a non-ideal situation where +// a module-to-module dependency arrow still gets added to the mermaid graph, even if the dependant module +// is only used as a future-to-module dependency. This is because the dependant module has to get added to the +// parent module as a submodule, and we currently don't have a way of distinguishing at this point in the code between +// a submodule that is exclusively used as a future-to-module dependency (i.e. in { after: [...] }) +// and a submodule that is used as a module-to-module dependency (i.e. in m.useModule(...)). +// This is a known issue that we have decided to revisit at a later point in time because the solution is not trivial. +const FlowTooltip: React.FC = () => ( + + + + + +
    Diagram reference
    + Future to future dependency +         + + -----------> + +
    + Future to module dependency      + + ----> + +
    + Module to module dependency     + - - -> +
    +
    +); + +const HighlightedFutures = styled.div<{ + futures: string[]; + deploys: string[]; + others: string[]; +}>` + ${({ deploys }) => + deploys.map( + (id) => + css` + g[id^="flowchart-${id}-"] rect { + fill: #fbf8d8 !important; + } + ` + )} + + ${({ others }) => + others.map( + (id) => + css` + g[id^="flowchart-${id}-"] rect { + fill: #f8f2ff !important; + } + ` + )} + + ${({ futures }) => + futures.map( + (id) => + css` + g[id^="flowchart-${id}-"] rect { + fill: #16181d !important; + } + + g[id^="flowchart-${id}-"] span { + color: #fbf8d8 !important; + } + ` + )} +`; + +const SectionHeader = styled.div` + font-size: 28px; + font-weight: 700; + line-height: 30px; + letter-spacing: 0em; + text-align: left; + display: inline-flex; + align-items: center; + + margin-bottom: 1rem; + margin-top: 1rem; +`; + +const BatchBtnSection = styled.div` + margin-bottom: 40px; + text-align: center; + display: inline-flex; + flex-wrap: wrap; + justify-content: center; + row-gap: 1rem; + width: 100%; +`; + +const BatchBtn = styled.span<{ isCurrentlyHovered: boolean }>` + font-size: 0.8rem; + width: 86px; + text-align: center; + padding: 0.5rem 1rem; + margin: auto 0.5rem; + border-radius: 10px; + background: #ffffff; + border: 1px solid #edcf00; + cursor: pointer; + white-space: nowrap; + + ${(props) => + props.isCurrentlyHovered && + ` + background: #16181D; + color: #FBF8D8; + border: 1px solid #16181D; + `} +`; diff --git a/packages/hardhat-ignition-ui/src/pages/visualization-overview/components/execution-batches.tsx b/packages/hardhat-ignition-ui/src/pages/visualization-overview/components/execution-batches.tsx new file mode 100644 index 00000000000..cb6b83a7765 --- /dev/null +++ b/packages/hardhat-ignition-ui/src/pages/visualization-overview/components/execution-batches.tsx @@ -0,0 +1,186 @@ +import { + Future, + FutureType, + IgnitionModule, + IgnitionModuleResult, +} from "@nomicfoundation/ignition-core/ui-helpers"; +import { useMemo, useRef, useState, createRef } from "react"; +import { Tooltip } from "react-tooltip"; +import styled from "styled-components"; + +import { getAllFuturesForModule } from "../../../queries/futures"; +import { FutureBatch } from "./future-batch"; +import { TooltipIcon } from "../../../assets/TooltipIcon"; + +export const ExecutionBatches: React.FC<{ + ignitionModule: IgnitionModule>; + batches: string[][]; +}> = ({ ignitionModule, batches }) => { + const futures = useMemo( + () => getAllFuturesForModule(ignitionModule), + [ignitionModule] + ); + + const nonLibraryFutureIds = futures + .filter( + ({ type }) => + type !== FutureType.LIBRARY_DEPLOYMENT && + type !== FutureType.NAMED_ARTIFACT_LIBRARY_DEPLOYMENT + ) + .map(({ id }) => id); + + const scrollRefMap = useRef( + nonLibraryFutureIds.reduce((acc, id) => { + return { ...acc, [id]: createRef() }; + }, {} as Record>) + ); + + const toggleMap = Object.fromEntries( + nonLibraryFutureIds.map((id) => [id, false]) + ); + + const [toggleState, setToggledInternal] = useState(toggleMap); + + const setToggled = (id: string, newToggleState: boolean) => { + if (newToggleState) { + scrollRefMap.current[id].current?.scrollIntoView({ + behavior: "smooth", + block: "center", + }); + } + + const newState = { ...toggleState, [id]: newToggleState }; + setToggledInternal(newState); + }; + + const [currentlyHovered, setCurrentlyHovered] = useState(""); + + const futureBatches = batches.reduce((acc, batch) => { + const fullBatch = batch.map((id) => futures.find((f) => f.id === id)); + + return [...acc, fullBatch as Future[]]; + }, [] as Future[][]); + + /* logic for highlighting a future based on future details hover */ + const futureHoverMap = Object.fromEntries( + batches.flatMap((batch, i) => { + const batchId = `batch-${i + 1}`; + + return batch.map((id, j) => [id, `${batchId}-future-${j}`]); + }) + ); + const [hoveredFuture, setHoveredFutureInternal] = useState(""); + + const setHoveredFuture = (id: string) => { + const futureId = futureHoverMap[id]; + setHoveredFutureInternal(futureId); + }; + + return ( +
    + + Execution batches + + + + {futures.length} futures will be executed across{" "} + {batches.length} batches + + + + [ {ignitionModule.id} ] + + {futureBatches.map((batch, i) => ( + + ))} + + +
    + ); +}; + +const BatchesTooltip: React.FC = () => ( + + + + + +
    + Futures that can be run simultaneously are executed at the same time in + batches. +
    +
    +
    + The sequence order shown for each batch doesn't reflect the final + execution order. The exact order is determined once they're run. + However, this specific order isn't relevant to the process, + allowing for simultaneous execution. +
    +
    +
    +); + +const RootModuleName = styled.div` + font-weight: 700; + padding-bottom: 1.5rem; + padding-left: 1.5rem; +`; + +const RootModuleBackground = styled.div` + border: 1px solid #e5e6e7; + border-radius: 10px; + padding: 1.5rem; +`; + +const SectionHeader = styled.div` + font-size: 28px; + font-weight: 700; + line-height: 30px; + letter-spacing: 0em; + display: inline-flex; + align-items: center; + + margin-bottom: 1rem; + margin-top: 1rem; +`; + +const SectionSubHeader = styled.div` + margin-bottom: 2rem; + margin-top: 2rem; +`; + +const Actions = styled.div<{ currentlyHovered: string; hoveredFuture: string }>` + display: grid; + row-gap: 1.5rem; + + ${({ currentlyHovered }) => + currentlyHovered && + ` + .${currentlyHovered} { + background: #16181D; + color: #FBF8D8; + } + `} + + ${({ hoveredFuture }) => + hoveredFuture && + ` + .${hoveredFuture} { + background: #16181D; + color: #FBF8D8; + box-shadow: -2px 2px 4px 0px #6C6F7433; + } + `} +`; diff --git a/packages/hardhat-ignition-ui/src/pages/visualization-overview/components/future-batch.tsx b/packages/hardhat-ignition-ui/src/pages/visualization-overview/components/future-batch.tsx new file mode 100644 index 00000000000..81567fab5ed --- /dev/null +++ b/packages/hardhat-ignition-ui/src/pages/visualization-overview/components/future-batch.tsx @@ -0,0 +1,398 @@ +import { + ArgumentType, + Future, + FutureType, + isDeploymentType, + isFuture, +} from "@nomicfoundation/ignition-core/ui-helpers"; +import React from "react"; +import styled from "styled-components"; +import { argumentTypeToString } from "../../../utils/argumentTypeToString"; +import { FutureHeader } from "./future-header"; + +export const FutureBatch: React.FC<{ + batch: Future[]; + index: number; + toggleState: Record; + setToggled: (id: string, newToggleState: boolean) => void; + setCurrentlyHovered: (id: string) => void; + setHoveredFuture: (id: string) => void; + scrollRefMap: Record>; +}> = ({ + batch, + index, + toggleState, + setToggled, + setCurrentlyHovered, + setHoveredFuture, + scrollRefMap, +}) => { + return ( + + + Batch #{index} + + {batch.map((future, i) => ( + + ))} + + ); +}; + +const Batch = styled.div` + padding: 1rem; + border: 1px solid #edcf00; + border-radius: 7px; +`; + +const BatchHeader = styled.div` + padding: 1rem; +`; + +const FutureBtn = styled.div<{ isLibrary: boolean; toggled: boolean }>` + padding: 1rem; + padding-top: 0.5rem; + padding-bottom: 0.5rem; + margin: 1rem; + + border-top-left-radius: 5px; + border-top-right-radius: 5px; + + ${(props) => + props.toggled && + ` + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; + `} + + ${(props) => + !props.toggled && + ` + border-bottom-left-radius: 5px; + border-bottom-right-radius: 5px; + `} + + ${(props) => + !props.isLibrary && + ` + cursor: pointer; + `} +`; + +const FutureBlock: React.FC<{ + future: Future; + toggleState: Record; + setToggled: (id: string, newToggleState: boolean) => void; + setCurrentlyHovered: (id: string) => void; + setHoveredFuture: (id: string) => void; + classKey: string; + scrollRef: React.RefObject; +}> = ({ + future, + toggleState, + setToggled, + setCurrentlyHovered, + setHoveredFuture, + classKey, + scrollRef, +}) => { + const futureId = future.id; + const toggled = toggleState[futureId]; + + const displayText = toDisplayText(future); + + const isLibrary = + future.type === FutureType.LIBRARY_DEPLOYMENT || + future.type === FutureType.NAMED_ARTIFACT_LIBRARY_DEPLOYMENT; + + const className = isDeploymentType(future.type) + ? "deploy-background" + : "call-background"; + + return ( +
    + setToggled(futureId, !toggled)} + > + + + {toggled && ( + + )} +
    + ); +}; + +function toDisplayText(future: Future): string { + switch (future.type) { + case FutureType.NAMED_ARTIFACT_CONTRACT_DEPLOYMENT: + case FutureType.CONTRACT_DEPLOYMENT: + return `Deploy ${future.contractName}`; + case FutureType.NAMED_ARTIFACT_LIBRARY_DEPLOYMENT: + return `Library deploy ${future.id}`; + case FutureType.LIBRARY_DEPLOYMENT: + return `Library deploy ${future.id} from artifact`; + case FutureType.CONTRACT_CALL: + return `Call ${future.contract.contractName}.${future.functionName}`; + case FutureType.STATIC_CALL: + return `Static call ${future.id}`; + case FutureType.ENCODE_FUNCTION_CALL: + return `Encode function call ${future.id}`; + case FutureType.NAMED_ARTIFACT_CONTRACT_AT: + return `Existing contract ${future.id} (${ + typeof future.address === "string" + ? future.address + : isFuture(future.address) + ? future.address.id + : argumentTypeToString(future.address) + })`; + case FutureType.CONTRACT_AT: + return `Existing contract ${future.id} from artifact (${ + typeof future.address === "string" + ? future.address + : isFuture(future.address) + ? future.address.id + : argumentTypeToString(future.address) + })`; + case FutureType.READ_EVENT_ARGUMENT: + return `Read event from future ${future.futureToReadFrom.id} (event ${future.eventName} argument ${future.nameOrIndex})`; + case FutureType.SEND_DATA: + return `Send data ${future.id} to ${ + typeof future.to === "string" + ? future.to + : isFuture(future.to) + ? future.to.id + : argumentTypeToString(future.to) + }`; + } +} + +const FutureDetailsStyle = styled.div` + cursor: auto; + padding: 1rem 2rem; + margin: -1rem 1rem 1rem 1rem; + + border-top-left-radius: 0; + border-top-right-radius: 0; + border-bottom-right-radius: 5px; + border-bottom-left-radius: 5px; + + -webkit-box-shadow: inset 0px 6px 8px -8px rgba(0, 0, 0, 0.3); + -moz-box-shadow: inset 0px 6px 8px -8px rgba(0, 0, 0, 0.3); + box-shadow: inset 0px 6px 8px -8px rgba(0, 0, 0, 0.3); +`; + +const FutureDetailsSection: React.FC<{ + className: string; + future: Future; + setToggled: (id: string, newToggleState: boolean) => void; + setHoveredFuture: (id: string) => void; +}> = ({ className, future, setToggled, setHoveredFuture }) => { + switch (future.type) { + case FutureType.NAMED_ARTIFACT_CONTRACT_DEPLOYMENT: + case FutureType.CONTRACT_DEPLOYMENT: { + const args = Object.entries(future.constructorArgs); + return ( + +

    {args.length === 0 ? "No " : null}Constructor Arguments

    +
      + {args.map(([, arg], i) => ( +
    • + +
    • + ))} +
    +
    + ); + } + case FutureType.NAMED_ARTIFACT_LIBRARY_DEPLOYMENT: + case FutureType.LIBRARY_DEPLOYMENT: + return null; + case FutureType.CONTRACT_CALL: { + const args = Object.entries(future.args); + return ( + +

    {args.length === 0 ? "No " : null}Arguments

    +
      + {args.map(([, arg], i) => ( +
    • + +
    • + ))} +
    +
    + ); + } + case FutureType.STATIC_CALL: { + const args = Object.entries(future.args); + return ( + +

    {args.length === 0 ? "No " : null}Arguments

    +
      + {args.map(([, arg], i) => ( +
    • + +
    • + ))} +
    +
    + ); + } + case FutureType.ENCODE_FUNCTION_CALL: { + const args = Object.entries(future.args); + return ( + +

    {args.length === 0 ? "No " : null}Arguments

    +
      + {args.map(([, arg], i) => ( +
    • + +
    • + ))} +
    +
    + ); + } + case FutureType.NAMED_ARTIFACT_CONTRACT_AT: + case FutureType.CONTRACT_AT: { + return ( + +

    Contract - {future.contractName}

    +

    + Address -{" "} + {typeof future.address === "string" ? ( + future.address + ) : ( + + )} +

    +
    + ); + } + case FutureType.READ_EVENT_ARGUMENT: { + return ( + +

    Emitter - {future.emitter.id}

    +

    Event - {future.eventName}

    +

    Event index - {future.eventIndex}

    +

    Argument - {future.nameOrIndex}

    +
    + ); + } + case FutureType.SEND_DATA: { + return ( + +

    + To -{" "} + {typeof future.to === "string" ? ( + future.to + ) : ( + + )} +

    +

    + Data -{" "} + {typeof future.data === "string" ? ( + future.data + ) : future.data === undefined ? ( + "0x" + ) : ( + + )} +

    +
    + ); + } + } +}; + +const Argument: React.FC<{ + setToggled: (id: string, newToggleState: boolean) => void; + setHoveredFuture: (id: string) => void; + arg: ArgumentType; +}> = ({ setToggled, arg, setHoveredFuture }) => { + if (isFuture(arg)) { + return ( + setToggled(arg.id, true)} + onMouseEnter={() => setHoveredFuture(arg.id)} + onMouseLeave={() => setHoveredFuture("")} + > + {argumentTypeToString(arg)} + + ); + } + + return {argumentTypeToString(arg)}; +}; + +const ArgumentText = styled.p` + margin: 0; +`; + +const ArgumentLink = styled.a` + textdecoration: underline; + color: #16181d; + cursor: pointer; + + &:hover { + font-weight: 700; + } +`; diff --git a/packages/hardhat-ignition-ui/src/pages/visualization-overview/components/future-header.tsx b/packages/hardhat-ignition-ui/src/pages/visualization-overview/components/future-header.tsx new file mode 100644 index 00000000000..ccbe4753a49 --- /dev/null +++ b/packages/hardhat-ignition-ui/src/pages/visualization-overview/components/future-header.tsx @@ -0,0 +1,53 @@ +import { Future } from "@nomicfoundation/ignition-core/ui-helpers"; +import styled from "styled-components"; + +export const FutureHeader: React.FC<{ + isLibrary: boolean; + toggled: boolean; + displayText: string; + setCurrentlyHovered: (id: string) => void; + future: Future; +}> = ({ isLibrary, toggled, displayText, setCurrentlyHovered, future }) => { + return ( + + {isLibrary ?
    : } + {displayText} +
    + setCurrentlyHovered(future.module.id)} + onMouseLeave={() => setCurrentlyHovered("")} + > + [ {future.module.id} ] + + + ); +}; + +const ToggleNameWrap = styled.div` + display: grid; + grid-template-columns: 1rem auto 1fr auto; +`; + +const ToggleBtn: React.FC<{ + toggled: boolean; +}> = ({ toggled }) => { + return {toggled ? "- " : "+ "}; +}; + +const ModuleName = styled.div` + font-weight: 700; + padding: 0.5rem; +`; + +const Text = styled.p` + margin: 0; + display: inline; + padding-top: 0.5rem; + padding-bottom: 0.5rem; + text-align: left; +`; + +const ToggleBtnText = styled(Text)` + text-align: center; +`; diff --git a/packages/hardhat-ignition-ui/src/pages/visualization-overview/components/summary.tsx b/packages/hardhat-ignition-ui/src/pages/visualization-overview/components/summary.tsx new file mode 100644 index 00000000000..26d39387dad --- /dev/null +++ b/packages/hardhat-ignition-ui/src/pages/visualization-overview/components/summary.tsx @@ -0,0 +1,64 @@ +import { + IgnitionModule, + IgnitionModuleResult, +} from "@nomicfoundation/ignition-core/ui-helpers"; +import React, { useMemo } from "react"; +import styled from "styled-components"; +import { getAllDeployFuturesFor } from "../../../queries/futures"; + +export const Summary: React.FC<{ + ignitionModule: IgnitionModule>; +}> = ({ ignitionModule }) => { + const deployFutures = useMemo( + () => getAllDeployFuturesFor(ignitionModule), + [ignitionModule] + ); + + const deployCountPerContract = deployFutures.reduce((acc, future) => { + const count = acc[future.contractName] ?? 0; + return { ...acc, [future.contractName]: count + 1 }; + }, {} as Record); + + return ( + + Contracts to be deployed + +
    + {deployFutures.length === 0 ? null : ( + + {Object.entries(deployCountPerContract).map( + ([contractName, count]) => ( + + {contractName} + {count > 1 ? ` x${count}` : null} + + ) + )} + + )} +
    +
    + ); +}; + +const SummaryStyle = styled.div``; + +const Title = styled.div` + font-size: 24px; + font-weight: 700; + line-height: 30px; + letter-spacing: 0em; + + color: #16181d; +`; + +const StyledList = styled.ul` + padding-inline-start: 1rem; +`; + +const ListItem = styled.li` + font-size: 17px; + line-height: 1.6rem; + text-align: left; + color: #040405; +`; diff --git a/packages/hardhat-ignition-ui/src/pages/visualization-overview/visualization-overview.tsx b/packages/hardhat-ignition-ui/src/pages/visualization-overview/visualization-overview.tsx new file mode 100644 index 00000000000..9d4db679f79 --- /dev/null +++ b/packages/hardhat-ignition-ui/src/pages/visualization-overview/visualization-overview.tsx @@ -0,0 +1,249 @@ +import { + IgnitionModule, + IgnitionModuleResult, +} from "@nomicfoundation/ignition-core/ui-helpers"; +import React from "react"; +import styled from "styled-components"; + +import { DeploymentFlow } from "./components/deployment-flow"; +import { ExecutionBatches } from "./components/execution-batches"; +import { Summary } from "./components/summary"; + +import { socialsItems } from "../../components/socials"; +import rocketPNG from "../../assets/purple-rocket.png"; +import { ExternalLinkIcon } from "../../assets/ExternalLinkIcon"; + +export const VisualizationOverview: React.FC<{ + ignitionModule: IgnitionModule>; + batches: string[][]; +}> = ({ ignitionModule, batches }) => { + return ( +
    + + + + + + + DOCUMENTATION + + + + + {socialsItems.map((social) => { + const { Icon } = social; + return ( + + + + + + ); + })} + + + + + +
    + + HARDHAT IGNITION + +
    + {ignitionModule.id} deployment visualization +
    + + + + + + + + + + + + + +
    + ); +}; + +const RocketIcon: React.FC = () => ( + rocket +); + +const DocLink = styled.span` + font-size: 14px; + font-weight: 400; + line-height: 14px; + letter-spacing: 0.07em; + text-align: left; + margin-top: -5px; + + padding-right: 2rem; + + & a { + text-decoration: none; + color: #040405; + } +`; + +const SocialsList = styled.ul` + min-width: 80px; + width: 80px; + display: flex; + height: 32px; + align-items: center; + list-style-type: none; + justify-content: space-between; +`; + +const SocialLink = styled.a` + display: flex; + align-items: center; + & svg { + fill: #0a0a0a; + } + &:hover svg { + cursor: pointer; + opacity: 0.8; + } + &:focus svg { + cursor: pointer; + opacity: 0.5; + } +`; + +const SocialListItem = styled.li` + display: flex; + align-items: center; + justify-content: center; + & svg { + width: 22px; + height: 22px; + } +`; + +const NavBar = styled.div` + height: 72px; + padding: 2px 64px; + border-bottom: 1px solid #b0b2b5; + display: flex; + justify-content: space-between; + align-items: center; +`; + +const Contents = styled.div` + padding: 5rem 180px; + display: grid; + row-gap: 1rem; + min-width: 920px; +`; + +const Panel = styled.div` + padding: 20px 0 40px 0; + :not(:last-child) { + border-bottom: 1px solid #b0b2b5; + } +`; + +const PageTitle = styled.div` + font-size: 20px; + font-weight: 400; + line-height: 12px; + letter-spacing: 0.2em; + color: #040405; + display: flex; + align-items: center; + margin-bottom: 1rem; +`; + +const SubTitle = styled.div` + font-size: 42px; + font-weight: 700; + line-height: 45px; + letter-spacing: 0.5px; +`; + +const HardhatLogo: React.FC = () => ( + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +); diff --git a/packages/hardhat-ignition-ui/src/queries/futures.ts b/packages/hardhat-ignition-ui/src/queries/futures.ts new file mode 100644 index 00000000000..c1b8316624e --- /dev/null +++ b/packages/hardhat-ignition-ui/src/queries/futures.ts @@ -0,0 +1,64 @@ +import { + DeploymentFuture, + FunctionCallFuture, + Future, + IgnitionModule, + IgnitionModuleResult, + isDeploymentFuture, + isFunctionCallFuture, +} from "@nomicfoundation/ignition-core/ui-helpers"; + +export function getFutureById( + ignitionModule: IgnitionModule>, + futureId: string | undefined +): Future | undefined { + if (futureId === undefined) { + return undefined; + } + + const f = getAllFuturesForModule(ignitionModule).find( + (f) => f.id === futureId + ); + + if (f === undefined) { + return undefined; + } + + return f; +} + +/* Get all futures in a module and its submodules */ +export function getAllFuturesForModule({ + futures, + submodules, +}: IgnitionModule>): Future[] { + return Array.from(futures) + .concat( + Array.from(submodules.values()).flatMap((submodule) => + getAllFuturesForModule(submodule) + ) + ) + .filter((v, i, a) => a.indexOf(v) === i); // remove duplicates +} + +/** + * Get all deploy futures in a module and its submodules, including: + * - hardhat contract deploys + * - artifact contract deploys + * - library deploys + * - artifact library deploys + */ +export function getAllDeployFuturesFor( + ignitionModule: IgnitionModule> +): DeploymentFuture[] { + return getAllFuturesForModule(ignitionModule).filter(isDeploymentFuture); +} + +/** + * Get all calls in a module and its submodules + */ +export function getAllCallFuturesFor( + ignitionModule: IgnitionModule> +): FunctionCallFuture[] { + return getAllFuturesForModule(ignitionModule).filter(isFunctionCallFuture); +} diff --git a/packages/hardhat-ignition-ui/src/utils/argumentTypeToString.tsx b/packages/hardhat-ignition-ui/src/utils/argumentTypeToString.tsx new file mode 100644 index 00000000000..215afdda27a --- /dev/null +++ b/packages/hardhat-ignition-ui/src/utils/argumentTypeToString.tsx @@ -0,0 +1,30 @@ +import { + ArgumentType, + RuntimeValueType, + isFuture, + isRuntimeValue, +} from "@nomicfoundation/ignition-core/ui-helpers"; + +export function argumentTypeToString(argument: ArgumentType): string { + if (typeof argument === "bigint") { + return ``; + } + + if (isFuture(argument)) { + return ``; + } + + if (isRuntimeValue(argument)) { + if (argument.type === RuntimeValueType.ACCOUNT) { + return ``; + } + + return ``; + } + + return JSON.stringify(argument, null, 2); +} diff --git a/packages/hardhat-ignition-ui/src/utils/to-escaped-id.ts b/packages/hardhat-ignition-ui/src/utils/to-escaped-id.ts new file mode 100644 index 00000000000..94271b0d372 --- /dev/null +++ b/packages/hardhat-ignition-ui/src/utils/to-escaped-id.ts @@ -0,0 +1,12 @@ +/** + * Convert Ignition id to an escaped version for safe use in Mermaid diagrams. + */ +export function toEscapedId(id: string): string { + return id + .replaceAll("(", "__") + .replaceAll(")", "___") + .replaceAll(",", "____") + .replaceAll("~", "_____") + .replaceAll("#", "______") + .replaceAll(" ", "_______"); +} diff --git a/packages/hardhat-ignition-ui/src/utils/to-mermaid.ts b/packages/hardhat-ignition-ui/src/utils/to-mermaid.ts new file mode 100644 index 00000000000..f37dcfd87dc --- /dev/null +++ b/packages/hardhat-ignition-ui/src/utils/to-mermaid.ts @@ -0,0 +1,158 @@ +import { + Future, + FutureType, + IgnitionModule, + IgnitionModuleResult, + isFuture, +} from "@nomicfoundation/ignition-core/ui-helpers"; +import { getAllFuturesForModule } from "../queries/futures.js"; +import { argumentTypeToString } from "./argumentTypeToString.js"; +import { toEscapedId } from "./to-escaped-id.js"; + +export function toMermaid( + ignitionModule: IgnitionModule> +) { + const modules = recursivelyListModulesAndSubmodulesFor(ignitionModule); + + const subgraphSections = modules + .map((m) => prettyPrintModule(m, " ")) + .join("\n"); + + const futureDependencies = [ + ...new Set( + getAllFuturesForModule(ignitionModule) + .flatMap((f) => + Array.from(f.dependencies).map<[string, string, boolean]>((d) => [ + toEscapedId(f.id), + toEscapedId(d.id), + /#/.test(d.id), + ]) + ) + .map( + ([from, to, isFuture]) => `${from} ${isFuture ? "-->" : "==>"} ${to}` + ) + ), + ].join("\n"); + + const moduleDependencies = [ + ...new Set( + modules + .flatMap((f) => + Array.from(f.submodules).map((d) => [ + toEscapedId(f.id), + toEscapedId(d.id), + ]) + ) + .map(([from, to]) => `${from} -.-> ${to}`) + ), + ].join("\n"); + + return `flowchart BT\n\n${toEscapedId( + ignitionModule.id + )}\n\n${subgraphSections}${ + futureDependencies === "" ? "" : "\n\n" + futureDependencies + }${moduleDependencies === "" ? "" : "\n\n" + moduleDependencies}`; +} + +function recursivelyListModulesAndSubmodulesFor( + module: IgnitionModule> +): Array>> { + return [module].concat( + Array.from(module.submodules).flatMap( + recursivelyListModulesAndSubmodulesFor + ) + ); +} + +function prettyPrintModule( + module: IgnitionModule>, + lineIndent = "" +): string { + const futures = Array.from(module.futures); + const futureList = futures + .map( + (f) => `${lineIndent}${toEscapedId(f.id)}["${toLabel(f)}"]:::futureNode` + ) + .join(`\n${lineIndent}`); + + if (futures.length > 0) { + const inner = `${lineIndent}subgraph ${toEscapedId( + module.id + )}Inner[ ]\n${lineIndent} direction BT\n\n${lineIndent}${futureList}\n${lineIndent}end\n\nstyle ${toEscapedId( + module.id + )}Inner fill:none,stroke:none`; + + const title = `${lineIndent}subgraph ${toEscapedId(module.id)}Padding["[ ${ + module.id + } ]"]\n${lineIndent} direction BT\n\n${lineIndent}${inner}\n${lineIndent}end\n\nstyle ${toEscapedId( + module.id + )}Padding fill:none,stroke:none`; + + const outer = `${lineIndent}subgraph ${toEscapedId( + module.id + )}[ ]\n${lineIndent} direction BT\n\n${lineIndent}${title}\n${lineIndent}end\n\nstyle ${toEscapedId( + module.id + )} fill:#fbfbfb,stroke:#e5e6e7`; + + return outer; + } + + const title = `${lineIndent}subgraph ${toEscapedId( + module.id + )}Padding["[ ${ + module.id + } ]"]\n${lineIndent} direction BT\n\n${lineIndent}end\n\nstyle ${toEscapedId( + module.id + )}Padding fill:none,stroke:none`; + + return `${lineIndent}subgraph ${toEscapedId( + module.id + )}[ ]\n${lineIndent} direction BT\n\n${lineIndent}${title}\n${lineIndent}end\n\nstyle ${toEscapedId( + module.id + )} fill:#fbfbfb,stroke:#e5e6e7`; +} + +function toLabel(f: Future): string { + switch (f.type) { + case FutureType.NAMED_ARTIFACT_CONTRACT_DEPLOYMENT: + return `Deploy ${f.contractName}`; + case FutureType.CONTRACT_DEPLOYMENT: + return `Deploy from artifact ${f.contractName}`; + case FutureType.NAMED_ARTIFACT_LIBRARY_DEPLOYMENT: + return `Deploy library ${f.contractName}`; + case FutureType.LIBRARY_DEPLOYMENT: + return `Deploy library from artifact ${f.contractName}`; + case FutureType.CONTRACT_CALL: + return `Call ${f.contract.contractName}.${f.functionName}`; + case FutureType.STATIC_CALL: + return `Static call ${f.contract.contractName}.${f.functionName}`; + case FutureType.ENCODE_FUNCTION_CALL: + return `Encoded call ${f.contract.contractName}.${f.functionName}`; + case FutureType.NAMED_ARTIFACT_CONTRACT_AT: + return `Existing contract ${f.contractName} (${ + typeof f.address === "string" + ? f.address + : isFuture(f.address) + ? f.address.id + : argumentTypeToString(f.address) + })`; + case FutureType.CONTRACT_AT: + return `Existing contract from artifact ${f.contractName} (${ + typeof f.address === "string" + ? f.address + : isFuture(f.address) + ? f.address.id + : argumentTypeToString(f.address) + })`; + case FutureType.READ_EVENT_ARGUMENT: + return `Read event from future ${f.futureToReadFrom.id} (event ${f.eventName} argument ${f.nameOrIndex})`; + case FutureType.SEND_DATA: + return `Send data to ${ + typeof f.to === "string" + ? f.to + : isFuture(f.to) + ? f.to.id + : argumentTypeToString(f.to) + }`; + } +} diff --git a/packages/hardhat-ignition-ui/src/vite-env.d.ts b/packages/hardhat-ignition-ui/src/vite-env.d.ts new file mode 100644 index 00000000000..11f02fe2a00 --- /dev/null +++ b/packages/hardhat-ignition-ui/src/vite-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/packages/hardhat-ignition-ui/test/to-mermaid.ts b/packages/hardhat-ignition-ui/test/to-mermaid.ts new file mode 100644 index 00000000000..6b1b758d355 --- /dev/null +++ b/packages/hardhat-ignition-ui/test/to-mermaid.ts @@ -0,0 +1,329 @@ +import { + Artifact, + IgnitionModule, + buildModule, +} from "@nomicfoundation/ignition-core"; +import { assert } from "chai"; +import { toMermaid } from "../src/utils/to-mermaid.js"; + +describe("to-mermaid", () => { + it("should render a single deploy contract diagram", () => { + const moduleDefinition = buildModule("Module", (m) => { + const p = m.getParameter("p", 123); + const contract1 = m.contract("Contract1", [{ arr: [p] }]); + + return { contract1 }; + }); + + const expectedResult = testFormat` + flowchart BT + + Module + + subgraph Module[ ] + direction BT + + subgraph ModulePadding["[ Module ]"] + direction BT + + subgraph ModuleInner[ ] + direction BT + + Module______Contract1["Deploy Contract1"]:::futureNode + end + + style ModuleInner fill:none,stroke:none + end + + style ModulePadding fill:none,stroke:none + end + + style Module fill:#fbfbfb,stroke:#e5e6e7`; + + assertDiagram(moduleDefinition, expectedResult); + }); + + it("should render a module with a space in the name", () => { + const moduleDefinition = buildModule("Test_registrar", (m) => { + const p = m.getParameter("p", 123); + const contract1 = m.contract("Contract1", [{ arr: [p] }]); + + return { contract1 }; + }); + + const expectedResult = testFormat` + flowchart BT + + Test_registrar + + subgraph Test_registrar[ ] + direction BT + + subgraph Test_registrarPadding["[ Test_registrar ]"] + direction BT + + subgraph Test_registrarInner[ ] + direction BT + + Test_registrar______Contract1["Deploy Contract1"]:::futureNode + end + + style Test_registrarInner fill:none,stroke:none + end + + style Test_registrarPadding fill:none,stroke:none + end + + style Test_registrar fill:#fbfbfb,stroke:#e5e6e7`; + + assertDiagram(moduleDefinition, expectedResult); + }); + + it("should render a multi-module deploy diagram", () => { + const sub1 = buildModule("Submodule1", (m) => { + const contract1 = m.contract("Contract1", []); + + return { contract1 }; + }); + + const sub2 = buildModule("Submodule2", (m) => { + const contract2 = m.contract("Contract2", []); + + return { contract2 }; + }); + + const moduleDefinition = buildModule("Module", (m) => { + const { contract1 } = m.useModule(sub1); + const { contract2 } = m.useModule(sub2); + + const contract3 = m.contract("Contract3", [], { + after: [contract1, contract2], + }); + + return { contract3 }; + }); + + const expectedResult = testFormat` + flowchart BT + + Module + + subgraph Module[ ] + direction BT + + subgraph ModulePadding["[ Module ]"] + direction BT + + subgraph ModuleInner[ ] + direction BT + + Module______Contract3["Deploy Contract3"]:::futureNode + end + + style ModuleInner fill:none,stroke:none + end + + style ModulePadding fill:none,stroke:none + end + + style Module fill:#fbfbfb,stroke:#e5e6e7 + subgraph Submodule1[ ] + direction BT + + subgraph Submodule1Padding["[ Submodule1 ]"] + direction BT + + subgraph Submodule1Inner[ ] + direction BT + + Submodule1______Contract1["Deploy Contract1"]:::futureNode + end + + style Submodule1Inner fill:none,stroke:none + end + + style Submodule1Padding fill:none,stroke:none + end + + style Submodule1 fill:#fbfbfb,stroke:#e5e6e7 + subgraph Submodule2[ ] + direction BT + + subgraph Submodule2Padding["[ Submodule2 ]"] + direction BT + + subgraph Submodule2Inner[ ] + direction BT + + Submodule2______Contract2["Deploy Contract2"]:::futureNode + end + + style Submodule2Inner fill:none,stroke:none + end + + style Submodule2Padding fill:none,stroke:none + end + + style Submodule2 fill:#fbfbfb,stroke:#e5e6e7 + + Module______Contract3 --> Submodule1______Contract1 + Module______Contract3 --> Submodule2______Contract2 + + Module -.-> Submodule1 + Module -.-> Submodule2`; + + assertDiagram(moduleDefinition, expectedResult); + }); + + it("should render a complex diagram with all actions", () => { + const fakeArtifact: Artifact = { + abi: [], + contractName: "", + sourceName: "", + bytecode: "", + linkReferences: {}, + }; + + const libArtifact = fakeArtifact; + const withLibArtifact = fakeArtifact; + + const moduleDefinition = buildModule("Module", (m) => { + const basic = m.contract("BasicContract"); + const library = m.library("BasicLibrary"); + const libFromArtifact = m.library("BasicLibrary", libArtifact, { + id: "BasicLibrary2", + }); + const withLib = m.contract("ContractWithLibrary", withLibArtifact, [], { + libraries: { BasicLibrary: library }, + }); + + const call = m.call(basic, "basicFunction", [40]); + const eventArg = m.readEventArgument(call, "BasicEvent", "eventArg"); + m.staticCall(withLib, "readonlyFunction", [eventArg]); + + const duplicate = m.contractAt("BasicContract", basic, { + id: "BasicContract2", + }); + const duplicateWithLib = m.contractAt( + "ContractWithLibrary", + withLibArtifact, + withLib, + { id: "ContractWithLibrary2" } + ); + + m.send("test_send", duplicate, 123n); + + return { + basic, + library, + libFromArtifact, + withLib, + duplicate, + duplicateWithLib, + }; + }); + + const expectedResult = testFormat` + flowchart BT + + Module + + subgraph Module[ ] + direction BT + + subgraph ModulePadding["[ Module ]"] + direction BT + + subgraph ModuleInner[ ] + direction BT + + Module______BasicContract["Deploy BasicContract"]:::futureNode + Module______BasicLibrary["Deploy library BasicLibrary"]:::futureNode + Module______BasicLibrary2["Deploy library from artifact BasicLibrary"]:::futureNode + Module______ContractWithLibrary["Deploy from artifact ContractWithLibrary"]:::futureNode + Module______BasicContract.basicFunction["Call BasicContract.basicFunction"]:::futureNode + Module______BasicContract.BasicEvent.eventArg.0["Read event from future Module#BasicContract.basicFunction (event BasicEvent argument eventArg)"]:::futureNode + Module______ContractWithLibrary.readonlyFunction["Static call ContractWithLibrary.readonlyFunction"]:::futureNode + Module______BasicContract2["Existing contract BasicContract (Module#BasicContract)"]:::futureNode + Module______ContractWithLibrary2["Existing contract from artifact ContractWithLibrary (Module#ContractWithLibrary)"]:::futureNode + Module______test_send["Send data to Module#BasicContract2"]:::futureNode + end + + style ModuleInner fill:none,stroke:none + end + + style ModulePadding fill:none,stroke:none + end + + style Module fill:#fbfbfb,stroke:#e5e6e7 + + Module______ContractWithLibrary --> Module______BasicLibrary + Module______BasicContract.basicFunction --> Module______BasicContract + Module______BasicContract.BasicEvent.eventArg.0 --> Module______BasicContract.basicFunction + Module______ContractWithLibrary.readonlyFunction --> Module______ContractWithLibrary + Module______ContractWithLibrary.readonlyFunction --> Module______BasicContract.BasicEvent.eventArg.0 + Module______BasicContract2 --> Module______BasicContract + Module______ContractWithLibrary2 --> Module______ContractWithLibrary + Module______test_send --> Module______BasicContract2`; + + assertDiagram(moduleDefinition, expectedResult); + }); + + it("should render calls with args", () => { + const moduleDefinition = buildModule("Module", (m) => { + const resolver = m.contract("ens", []); + + m.call(resolver, "setAddr(bytes32,address)", [123, "0x0123"]); + m.staticCall(resolver, "getAddr(bytes32,address)", [123, "0x0123"]); + + return { resolver }; + }); + + const expectedResult = testFormat` + flowchart BT + + Module + + subgraph Module[ ] + direction BT + + subgraph ModulePadding["[ Module ]"] + direction BT + + subgraph ModuleInner[ ] + direction BT + + Module______ens["Deploy ens"]:::futureNode + Module______ens.setAddr__bytes32____address___["Call ens.setAddr(bytes32,address)"]:::futureNode + Module______ens.getAddr__bytes32____address___["Static call ens.getAddr(bytes32,address)"]:::futureNode + end + + style ModuleInner fill:none,stroke:none + end + + style ModulePadding fill:none,stroke:none + end + + style Module fill:#fbfbfb,stroke:#e5e6e7 + + Module______ens.setAddr__bytes32____address___ --> Module______ens + Module______ens.getAddr__bytes32____address___ --> Module______ens`; + + assertDiagram(moduleDefinition, expectedResult); + }); +}); + +function assertDiagram(ignitionModule: IgnitionModule, expectedResult: string) { + const result = toMermaid(ignitionModule); + + assert.equal(result, expectedResult); +} + +function testFormat(expected: TemplateStringsArray): string { + return expected + .toString() + .substring(1) + .split("\n") + .map((line) => line.substring(6)) + .join("\n"); +} diff --git a/packages/hardhat-ignition-ui/tsconfig.json b/packages/hardhat-ignition-ui/tsconfig.json new file mode 100644 index 00000000000..ba9d4f9595b --- /dev/null +++ b/packages/hardhat-ignition-ui/tsconfig.json @@ -0,0 +1,27 @@ +{ + "compilerOptions": { + "target": "ESNext", + "lib": ["DOM", "DOM.Iterable", "ESNext"], + "module": "ESNext", + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + "jsx": "react-jsx", + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true + }, + "include": ["src"], + "references": [ + { "path": "./tsconfig.node.json" }, + { "path": "../hardhat-ignition-core" } + ] +} diff --git a/packages/hardhat-ignition-ui/tsconfig.node.json b/packages/hardhat-ignition-ui/tsconfig.node.json new file mode 100644 index 00000000000..eedfb78eea5 --- /dev/null +++ b/packages/hardhat-ignition-ui/tsconfig.node.json @@ -0,0 +1,11 @@ +{ + "compilerOptions": { + "composite": true, + "skipLibCheck": true, + "module": "ESNext", + "moduleResolution": "bundler", + "allowSyntheticDefaultImports": true + }, + "include": ["vite.config.ts"], + "references": [{ "path": "../hardhat-ignition-core" }] +} diff --git a/packages/hardhat-ignition-ui/vite.config.ts b/packages/hardhat-ignition-ui/vite.config.ts new file mode 100644 index 00000000000..533d4623c0d --- /dev/null +++ b/packages/hardhat-ignition-ui/vite.config.ts @@ -0,0 +1,16 @@ +import react from "@vitejs/plugin-react"; +import { defineConfig } from "vite"; +import { viteSingleFile } from "vite-plugin-singlefile"; + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [react(), viteSingleFile()], + optimizeDeps: { + include: ["@nomicfoundation/ignition-core/ui-helpers"], + }, + build: { + commonjsOptions: { + include: [/core/, /node_modules/], + }, + }, +}); diff --git a/packages/hardhat-ignition-viem/.eslintrc.js b/packages/hardhat-ignition-viem/.eslintrc.js new file mode 100644 index 00000000000..c6de07705a1 --- /dev/null +++ b/packages/hardhat-ignition-viem/.eslintrc.js @@ -0,0 +1,24 @@ +const { + slowImportsCommonIgnoredModules, +} = require("../../config/eslint/constants"); + +module.exports = { + extends: [`${__dirname}/../../config/eslint/eslintrc.js`], + parserOptions: { + project: `${__dirname}/tsconfig.json`, + sourceType: "module", + }, + overrides: [ + { + files: ["src/index.ts"], + rules: { + "@nomicfoundation/slow-imports/no-top-level-external-import": [ + "error", + { + ignoreModules: [...slowImportsCommonIgnoredModules], + }, + ], + }, + }, + ], +}; diff --git a/packages/hardhat-ignition-viem/.gitignore b/packages/hardhat-ignition-viem/.gitignore new file mode 100644 index 00000000000..d72d565ead3 --- /dev/null +++ b/packages/hardhat-ignition-viem/.gitignore @@ -0,0 +1,102 @@ +# node modules +/node_modules + +# vuepress +/docs/.vuepress/dist/ + +# Tests compilation output +/build-test/ + +# Code coverage artifacts +/coverage +/.nyc_output + +# TSC prod output. This has to be in sync with the to directories in ./src, and with pnpm script clean + +/*.js +/*.js.map +/*.d.ts +/*.d.ts.map +/*.node +/builtin-tasks +/common +/internal +/types +/utils + +test/internal/hardhat-network/provider/.hardhat_node_test_cache/ +!.eslintrc.js + +# Below is Github's node gitignore template, +# ignoring the node_modules part, as it'd ignore every node_modules, and we have some for testing + +# Logs +logs +*.log + +# Diagnostic reports (https://nodejs.org/api/report.html) +report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +#node_modules/ +jspm_packages/ + +# TypeScript v1 declaration files +typings/ + +# Optional eslint cache +.eslintcache + +# Optional REPL history +.node_repl_history + +# Output of 'pnpm pack' +*.tgz + +# parcel-bundler cache (https://parceljs.org/) +.cache + +# next.js build output +.next + +# nuxt.js build output +.nuxt + +# vuepress build output +.vuepress/dist + +# Serverless directories +.serverless/ + +# FuseBox cache +.fusebox/ + +# DynamoDB Local files +.dynamodb/ diff --git a/packages/hardhat-ignition-viem/.mocharc.json b/packages/hardhat-ignition-viem/.mocharc.json new file mode 100644 index 00000000000..f1a1008fdfb --- /dev/null +++ b/packages/hardhat-ignition-viem/.mocharc.json @@ -0,0 +1,7 @@ +{ + "require": "ts-node/register/transpile-only", + "file": "./test/setup.ts", + "timeout": 20000, + "exit": true, + "ignore": ["**/fixture-projects/**/*"] +} diff --git a/packages/hardhat-ignition-viem/.npmignore b/packages/hardhat-ignition-viem/.npmignore new file mode 100644 index 00000000000..05c3ff7c9f8 --- /dev/null +++ b/packages/hardhat-ignition-viem/.npmignore @@ -0,0 +1,14 @@ +coverage/ +.nyc_output/ +*.tsbuildinfo +**/.eslintrc.js +post-build.js +.mocharc.json +.nycrc +.prettierignore +.prettierrc +dist/test +src/ +test/ +scripts/ +esbuild.js diff --git a/packages/hardhat-ignition-viem/.nycrc b/packages/hardhat-ignition-viem/.nycrc new file mode 100644 index 00000000000..d17e98940ff --- /dev/null +++ b/packages/hardhat-ignition-viem/.nycrc @@ -0,0 +1,12 @@ +{ + "extends": "@istanbuljs/nyc-config-typescript", + "check-coverage": true, + "statements": 85, + "branches": 80, + "functions": 100, + "lines": 85, + "all": true, + "include": ["src/**/*.ts"], + "reporter": ["html", "lcov", "text", "text-summary"], + "report-dir": "coverage" +} diff --git a/packages/hardhat-ignition-viem/.prettierignore b/packages/hardhat-ignition-viem/.prettierignore new file mode 100644 index 00000000000..4ae5fe88f49 --- /dev/null +++ b/packages/hardhat-ignition-viem/.prettierignore @@ -0,0 +1,9 @@ +/node_modules +/dist +/test/fixture-projects/*/artifacts +/test/fixture-projects/*/cache +/coverage +/.nyc_output +/test/fixture-projects/*/deployments/*/artifacts +/test/fixture-projects/*/deployments/*/build-info + diff --git a/packages/hardhat-ignition-viem/CHANGELOG.md b/packages/hardhat-ignition-viem/CHANGELOG.md new file mode 100644 index 00000000000..aff20294225 --- /dev/null +++ b/packages/hardhat-ignition-viem/CHANGELOG.md @@ -0,0 +1,162 @@ +# Changelog + +## 0.15.11 + +### Patch Changes + +- 23280b8: Resolve all dependencies when using submodules in `after` + +## 0.15.10 + +### Patch Changes + +- d96c003: Fix for bug when we fail to save transaction hash + +## 0.15.9 - 2024-12-18 + +### Added + +- Standard Ignition UI can now be enabled when deploying via Hardhat scripts by setting `displayUi: true` in the `deploy` function options, @zoeyTM ([#843](https://github.com/NomicFoundation/hardhat-ignition/pull/843)) +- Ignition modules can now be set as a dependency in the `after` option of futures, @zoeyTM ([#828](https://github.com/NomicFoundation/hardhat-ignition/pull/828)) +- The `ignition transactions` command output will now include a link to view each transaction on the configured block explorer, @zoeyTM ([#849](https://github.com/NomicFoundation/hardhat-ignition/pull/849)) +- Module parameters can now be directly imported from a JSON file when deploying via Hardhat scripts by passing an absolute path to the file to the `parameters` option, @zoeyTM ([#850](https://github.com/NomicFoundation/hardhat-ignition/pull/850)) + +### Fixed + +- Properly handle errors when verifying deployments that use external artifacts, @zoeyTM ([#848](https://github.com/NomicFoundation/hardhat-ignition/pull/848)) +- Fix issue with `ignition status` command not working with deployments that use external artifacts, @zoeyTM ([#846](https://github.com/NomicFoundation/hardhat-ignition/pull/846)) + +## 0.15.8 - 2024-11-22 + +### Fixed + +- `transactions` command now properly serializes `bigint` values, @zoeyTM ([#837](https://github.com/NomicFoundation/hardhat-ignition/pull/837)) +- Additional validations added for global parameters, @kanej ([#832](https://github.com/NomicFoundation/hardhat-ignition/pull/832)) + +## 0.15.7 - 2024-10-24 + +### Added + +- New CLI command `ignition transactions` to list all transactions sent for a given deployment ID, @zoeyTM ([#821](https://github.com/NomicFoundation/hardhat-ignition/pull/821)) +- Module parameters can now be set at the global level using `$global`, @zoeyTM ([#819](https://github.com/NomicFoundation/hardhat-ignition/pull/819)) + +### Fixed + +- Gas fields are now properly set for Optimistic BNB, @zoeyTM ([#826](https://github.com/NomicFoundation/hardhat-ignition/pull/826)) +- Corrected resolution of artifacts when using fully qualified names in deployment modules, @kanej ([#822](https://github.com/NomicFoundation/hardhat-ignition/pull/822)) + +## 0.15.6 - 2024-09-25 + +### Added + +- Updates to the visualization UI, including the ability to zoom and pan the mermaid diagram ([#810](https://github.com/NomicFoundation/hardhat-ignition/pull/810)) +- `gasPrice` and `disableFeeBumping` config fields added as part of our L2 gas logic update ([#808](https://github.com/NomicFoundation/hardhat-ignition/pull/808)) +- Debug logging for communication errors with Hardhat Ledger ([#792](https://github.com/NomicFoundation/hardhat-ignition/pull/792)) +- JSON5 support for module parameters, thanks @erhant ([#800](https://github.com/NomicFoundation/hardhat-ignition/pull/800)) +- Add `writeLocalhostDeployment` flag to allow saving deployment artifacts when deploying to the ephemeral Hardhat network, thanks @SebastienGllmt ([#816](https://github.com/NomicFoundation/hardhat-ignition/pull/816)) + +### Fixed + +- Replace `this` with the class itself in `ViemIgnitionHelper`, thanks @iosh ([#796](https://github.com/NomicFoundation/hardhat-ignition/pull/796)) + +## 0.15.5 - 2024-06-17 + +### Added + +- New function `m.encodeFunctionCall` ([#761](https://github.com/NomicFoundation/hardhat-ignition/pull/761)) + +### Fixed + +- Adjusted regex to allow calling overloaded functions with array parameters ([#774](https://github.com/NomicFoundation/hardhat-ignition/pull/774)) +- Handle anvil response for `hardhat_setBalance` when deploying with create2 ([#773](https://github.com/NomicFoundation/hardhat-ignition/pull/773)) +- Properly resolve `verify` logic when dealing with circular or very deeply nested imports ([#772](https://github.com/NomicFoundation/hardhat-ignition/pull/772)) +- Exclude BNB Test Chain from zero fee configuration in gas fee logic, thanks @MukulKolpe ([#768](https://github.com/NomicFoundation/hardhat-ignition/pull/768)) + +## 0.15.4 - 2024-05-14 + +### Fixed + +- Reconcile address parameters with mismatched casings ([#748](https://github.com/NomicFoundation/hardhat-ignition/pull/748)) +- Display better error messages for insufficient funds ([#754](https://github.com/NomicFoundation/hardhat-ignition/pull/754)) + +## 0.15.3 - 2024-05-09 + +### Fixed + +- Exclude BNB Chain from zero fee configuration in gas fee logic, thanks @magicsih ([#755](https://github.com/NomicFoundation/hardhat-ignition/pull/755)) + +## 0.15.2 - 2024-05-02 + +### Added + +- Improved support for deploying via a Ledger Hardware wallet, [see our guide for details](https://hardhat.org/ignition/docs/guides/ledger) ([#720](https://github.com/NomicFoundation/hardhat-ignition/issues/720)) +- Support `maxPriorityFeePerGas` as a configuration parameter ([#728](https://github.com/NomicFoundation/hardhat-ignition/issues/728)) +- Use RPC call `eth_maxPriorityFeePerGas` in gas fee calculations when available ([#743](https://github.com/NomicFoundation/hardhat-ignition/issues/743)) +- Support zero gas fee chains (like private Besu chains), thanks @jimthematrix ([#730](https://github.com/NomicFoundation/hardhat-ignition/pull/730)) + +### Fixed + +- Use pre-EIP-1559 transactions for Polygon to avoid dropped transactions ([#735](https://github.com/NomicFoundation/hardhat-ignition/issues/735)) + +## 0.15.1 - 2024-04-04 + +### Added + +- Add a configurable upper limit for the maxFeePerGas ([#685](https://github.com/NomicFoundation/hardhat-ignition/issues/685)) +- Support writing and reading from deployments folder within tests and scripts ([#704](https://github.com/NomicFoundation/hardhat-ignition/pull/704)) +- Add `ignition deployments` task to list all the current deployments ([#646](https://github.com/NomicFoundation/hardhat-ignition/issues/646)) + +### Changed + +- Deploying to a cleared local hardhat node ignores previous deployment ([#650](https://github.com/NomicFoundation/hardhat-ignition/issues/650)) + +### Fixed + +- More resilent automine check ([#721](https://github.com/NomicFoundation/hardhat-ignition/issues/721)) +- `getCode` usage brought in line with Ethereum RPC standard ([#715](https://github.com/NomicFoundation/hardhat-ignition/issues/715)) +- Fixed unexpected next nonce on revert ([#676](https://github.com/NomicFoundation/hardhat-ignition/issues/676)) +- Reduce sources being passed to etherscan for verification ([#706](https://github.com/NomicFoundation/hardhat-ignition/issues/706)) + +## 0.15.0 - 2024-03-13 + +### Added + +- Support `create2` through strategies, for more details see [our `create2` guide](https://hardhat.org/ignition/docs/guides/create2). ([#629](https://github.com/NomicFoundation/hardhat-ignition/issues/629)) + +## 0.14.0 - 2024-02-21 + +### Added + +- Support BigInt values in Module Parameter files by encoding them as strings with the format /d+n/ ([#663](https://github.com/NomicFoundation/hardhat-ignition/issues/663)) + +### Changed + +- Upgrade to `viem@2`, a breaking change for scripts or tests that leverage viem contract instances returned from an Ignition deploy call, see [the viem@2 migration guide for more details](https://viem.sh/docs/migration-guide#2xx-breaking-changes) ([#692](https://github.com/NomicFoundation/hardhat-ignition/issues/692)) + +## 0.13.2 - 2024-01-25 + +### Fixed + +- Add memory pool lookup retry to reduce errors from slow propogation ([#667](https://github.com/NomicFoundation/hardhat-ignition/pull/667)) + +### Added + +- Improve Module API typescript doc comments to enhance intellisense experience ([#642](https://github.com/NomicFoundation/hardhat-ignition/issues/642)) +- Support module parameters taking accounts as the default value ([673](https://github.com/NomicFoundation/hardhat-ignition/issues/673)) + +## 0.13.1 - 2023-12-19 + +### Added + +- New flag `--reset` for `ignition deploy` to wipe the existing deployment state before running ([#649](https://github.com/NomicFoundation/hardhat-ignition/issues/649)) + +### Fixed + +- Fix bug with `process.stdout` being used in a non-tty context ([#644](https://github.com/NomicFoundation/hardhat-ignition/issues/644)) + +## 0.13.0 - 2023-12-13 + +### Added + +- Add `@nomicfoundation/hardhat-plugin-viem` package, that adds an `ignition` object to the Hardhat Runtime Environment that supports deploying Ignition modules and returning deployed contracts as [Viem](https://viem.sh/) contract instances, see the our [Viem guide](https://hardhat.org/ignition/docs/guides/viem) for more details ([#612](https://github.com/NomicFoundation/hardhat-ignition/pull/612)) +- Add support for setting the default sender account from tests and scripts ([#639](https://github.com/NomicFoundation/hardhat-ignition/issues/639)) diff --git a/packages/hardhat-ignition-viem/README.md b/packages/hardhat-ignition-viem/README.md new file mode 100644 index 00000000000..a1715049427 --- /dev/null +++ b/packages/hardhat-ignition-viem/README.md @@ -0,0 +1,55 @@ +![hardhat_Ignition_banner](https://github.com/NomicFoundation/hardhat-ignition/assets/24030/cc73227b-8791-4bb3-bc9a-a39be69d215f) [![npm](https://img.shields.io/npm/v/@nomicfoundation/hardhat-ignition-viem.svg)](https://www.npmjs.com/package/@nomicfoundation/hardhat-ignition) [![hardhat](https://hardhat.org/buidler-plugin-badge.svg?1)](https://hardhat.org) + +--- + +# Hardhat Ignition with Viem + +> **Note:** This package includes support for [Viem](https://viem.sh/). To use Hardhat Ignition with Ethers instead, see the [Hardhat Ignition plugin](https://www.npmjs.com/search?q=%40nomicfoundation%2Fhardhat-ignition-ethers). + +Hardhat Ignition is a declarative system for deploying smart contracts on Ethereum. It enables you to define smart contract instances you want to deploy, and any operation you want to run on them. By taking over the deployment and execution, Hardhat Ignition lets you focus on your project instead of getting caught up in the deployment details. + +Built by the [Nomic Foundation](https://nomic.foundation/) for the Ethereum community. + +Join the Hardhat Ignition channel of our [Hardhat Community Discord server](https://hardhat.org/ignition-discord) to stay up to date on new releases and tutorials. + +## Installation + +```bash +npm install --save-dev @nomicfoundation/hardhat-ignition-viem +``` + +Import the plugin in your `hardhat.config.js``: + +```js +require("@nomicfoundation/hardhat-ignition-viem"); +``` + +Or if you are using TypeScript, in your `hardhat.config.ts``: + +```js +import "@nomicfoundation/hardhat-ignition-viem"; +``` + +## Documentation + +On [Hardhat Ignition's website](https://hardhat.org/ignition) you will find guides for: + +- [Getting started](https://hardhat.org/ignition/docs/getting-started) +- [Creating Modules](https://hardhat.org/ignition/docs/guides/creating-modules) +- [Deploying a module](https://hardhat.org/ignition/docs/guides/deploy) +- [Visualizing your module](https://hardhat.org/ignition/docs/guides/visualize) +- [Handling errors](https://hardhat.org/ignition/docs/guides/error-handling) +- [Modifying an existing module](https://hardhat.org/ignition/docs/guides/modifications) +- [Using Hardhat Ignition in your tests](https://hardhat.org/ignition/docs/guides/tests) + +## Contributing + +Contributions are always welcome! Feel free to open any issue or send a pull request. + +Go to [CONTRIBUTING.md](https://github.com/NomicFoundation/hardhat-ignition/blob/main/CONTRIBUTING.md) to learn about how to set up Hardhat Ignition's development environment. + +## Feedback, help and news + +[Hardhat Ignition on Discord](https://hardhat.org/ignition-discord): for questions and feedback. + +Follow [Hardhat](https://twitter.com/HardhatHQ) and [Nomic Foundation](https://twitter.com/NomicFoundation) on Twitter. diff --git a/packages/hardhat-ignition-viem/package.json b/packages/hardhat-ignition-viem/package.json new file mode 100644 index 00000000000..b02a26094a0 --- /dev/null +++ b/packages/hardhat-ignition-viem/package.json @@ -0,0 +1,76 @@ +{ + "name": "@nomicfoundation/hardhat-ignition-viem", + "version": "0.15.11", + "license": "MIT", + "author": "Nomic Foundation", + "homepage": "https://hardhat.org", + "description": "The Viem extension to Hardhat Ignition. Hardhat Ignition is a declarative system for deploying smart contracts on Ethereum. It enables you to define smart contract instances you want to deploy, and any operation you want to run on them. By taking over the deployment and execution, Hardhat Ignition lets you focus on your project instead of getting caught up in the deployment details.", + "repository": "github:NomicFoundation/hardhat-ignition", + "keywords": [ + "ethereum", + "smart-contracts", + "hardhat", + "blockchain", + "dapps", + "tooling", + "solidity", + "deployment", + "viem" + ], + "main": "dist/src/index.js", + "types": "dist/src/index.d.ts", + "scripts": { + "prebuild": "(tsc --build || true) && ts-node --project tsconfig.json ./scripts/compile-test-fixture-project.ts create2 && ts-node --project tsconfig.json ./scripts/compile-test-fixture-project.ts minimal", + "build": "tsc --build", + "lint": "pnpm prettier --check && pnpm eslint", + "lint:fix": "pnpm prettier --write && pnpm eslint --fix", + "eslint": "eslint \"src/**/*.{ts,tsx}\" \"test/**/*.{ts,tsx}\"", + "prettier": "prettier \"**/*.{js,ts,md,json}\"", + "test": "mocha --recursive \"test/**/*.ts\"", + "test:debug": "DEBUG='hardhat-ignition-viem:*,ignition:*' pnpm test", + "test:coverage": "nyc mocha \"test/**/*.ts\"", + "test:build": "tsc --project ./test/", + "clean": "rimraf .nyc_output coverage dist tsconfig.tsbuildinfo ./test/fixture-projects/**/deployments ./test/fixture-projects/**/artifacts", + "prepack": "pnpm build" + }, + "devDependencies": { + "@istanbuljs/nyc-config-typescript": "1.0.2", + "@nomicfoundation/eslint-plugin-hardhat-internal-rules": "workspace:^", + "@nomicfoundation/hardhat-ignition": "workspace:^", + "@nomicfoundation/hardhat-viem": "workspace:^2.0.0", + "@nomicfoundation/ignition-core": "workspace:^", + "@types/chai": "^4.2.22", + "@types/chai-as-promised": "^7.1.4", + "@types/mocha": "9.1.1", + "@types/node": "^18.0.0", + "@types/sinon": "^10.0.13", + "@typescript-eslint/eslint-plugin": "^5.57.1", + "@typescript-eslint/experimental-utils": "^5.62.0", + "@typescript-eslint/parser": "^5.57.1", + "chai": "^4.3.4", + "chai-as-promised": "7.1.1", + "eslint": "^8.38.0", + "eslint-config-prettier": "8.3.0", + "eslint-import-resolver-typescript": "^3.5.5", + "eslint-plugin-import": "2.29.0", + "eslint-plugin-mocha": "^9.0.0", + "eslint-plugin-no-only-tests": "3.1.0", + "eslint-plugin-prettier": "4.0.0", + "hardhat": "workspace:^2.18.0", + "mocha": "^9.1.3", + "nyc": "15.1.0", + "prettier": "2.8.8", + "rimraf": "3.0.2", + "sinon": "^14.0.0", + "ts-node": "10.9.1", + "typescript": "^5.0.2", + "viem": "^2.7.6" + }, + "peerDependencies": { + "@nomicfoundation/hardhat-ignition": "workspace:^", + "@nomicfoundation/hardhat-viem": "workspace:^2.0.0", + "@nomicfoundation/ignition-core": "workspace:^", + "hardhat": "workspace:^2.18.0", + "viem": "^2.7.6" + } +} diff --git a/packages/hardhat-ignition-viem/scripts/compile-test-fixture-project.ts b/packages/hardhat-ignition-viem/scripts/compile-test-fixture-project.ts new file mode 100644 index 00000000000..b784b73c837 --- /dev/null +++ b/packages/hardhat-ignition-viem/scripts/compile-test-fixture-project.ts @@ -0,0 +1,24 @@ +import path from "node:path"; + +const main = async (projectToBuild: string) => { + console.log("Running compile on the test fixture project - ", projectToBuild); + + const fixtureProjectDir = path.join( + __dirname, + "../test/fixture-projects", + projectToBuild + ); + + process.chdir(fixtureProjectDir); + + const hre = require("hardhat"); + + await hre.run("compile", { quiet: true }); +}; + +const project = process.argv[2]; + +void main(project).catch((error) => { + console.error(error); + process.exit(1); +}); diff --git a/packages/hardhat-ignition-viem/src/ignition-module-results-to-viem-contracts.ts b/packages/hardhat-ignition-viem/src/ignition-module-results-to-viem-contracts.ts new file mode 100644 index 00000000000..e6575b48c4f --- /dev/null +++ b/packages/hardhat-ignition-viem/src/ignition-module-results-to-viem-contracts.ts @@ -0,0 +1,57 @@ +import { GetContractReturnType } from "@nomicfoundation/hardhat-viem/types"; +import { + ContractAtFuture, + ContractDeploymentFuture, + ContractFuture, + IgnitionModuleResult, +} from "@nomicfoundation/ignition-core"; +import { ArtifactsMap } from "hardhat/types"; + +export type IgnitionModuleResultsToViemContracts< + ContractNameT extends string, + IgnitionModuleResultsT extends IgnitionModuleResult +> = { + [resultKey in keyof IgnitionModuleResultsT]: ToContractType< + IgnitionModuleResultsT, + resultKey + >; +}; + +type ToContractType< + IgnitionModuleResultsT extends IgnitionModuleResult, + ResultKey extends keyof IgnitionModuleResultsT +> = IgnitionModuleResultsT[ResultKey] extends + | ContractDeploymentFuture + | ContractAtFuture + ? GetContractReturnType> + : LookupContractName< + IgnitionModuleResultsT, + ResultKey + > extends keyof ArtifactsMap + ? LookupContractReturnTypeForContractName< + LookupContractName + > + : never; + +type LookupContractReturnTypeForContractName< + ContractName extends keyof ArtifactsMap +> = GetContractReturnType; + +type LookupContractName< + IgnitionModuleResultsT extends IgnitionModuleResult, + ResultsContractKey extends keyof IgnitionModuleResultsT +> = ContractNameOfContractFuture; + +type ContractNameOfContractFuture = + ContractFutureT extends ContractFuture + ? ContractName + : never; + +export type AbiOf = + ContractDeploymentFutureT extends ContractDeploymentFuture< + infer ContractDeploymentAbi + > + ? ContractDeploymentAbi + : ContractDeploymentFutureT extends ContractAtFuture + ? ContractAbiT + : never; diff --git a/packages/hardhat-ignition-viem/src/index.ts b/packages/hardhat-ignition-viem/src/index.ts new file mode 100644 index 00000000000..dcb846fcd13 --- /dev/null +++ b/packages/hardhat-ignition-viem/src/index.ts @@ -0,0 +1,28 @@ +import "@nomicfoundation/hardhat-ignition"; +import "@nomicfoundation/hardhat-viem"; +import { extendEnvironment } from "hardhat/config"; +import { HardhatPluginError, lazyObject } from "hardhat/plugins"; + +import "./type-extensions"; + +/** + * Add an `ignition` object to the HRE. + */ +extendEnvironment((hre) => { + if ( + hre.ignition !== undefined && + hre.ignition.type !== "stub" && + hre.ignition.type !== "viem" + ) { + throw new HardhatPluginError( + "hardhat-ignition-viem", + `Found ${hre.ignition.type} and viem, but only one Hardhat Ignition extension plugin can be used at a time.` + ); + } + + hre.ignition = lazyObject(() => { + const { ViemIgnitionHelper } = require("./viem-ignition-helper"); + + return new ViemIgnitionHelper(hre); + }); +}); diff --git a/packages/hardhat-ignition-viem/src/type-extensions.ts b/packages/hardhat-ignition-viem/src/type-extensions.ts new file mode 100644 index 00000000000..8381d84fab5 --- /dev/null +++ b/packages/hardhat-ignition-viem/src/type-extensions.ts @@ -0,0 +1,7 @@ +import { ViemIgnitionHelper } from "./viem-ignition-helper"; + +declare module "hardhat/types/runtime" { + export interface HardhatRuntimeEnvironment { + ignition: ViemIgnitionHelper; + } +} diff --git a/packages/hardhat-ignition-viem/src/viem-ignition-helper.ts b/packages/hardhat-ignition-viem/src/viem-ignition-helper.ts new file mode 100644 index 00000000000..8de14c443bf --- /dev/null +++ b/packages/hardhat-ignition-viem/src/viem-ignition-helper.ts @@ -0,0 +1,325 @@ +import type { GetContractReturnType } from "@nomicfoundation/hardhat-viem/types"; + +import { + HardhatArtifactResolver, + PrettyEventHandler, + errorDeploymentResultToExceptionMessage, + readDeploymentParameters, + resolveDeploymentId, +} from "@nomicfoundation/hardhat-ignition/helpers"; +import { + ContractAtFuture, + ContractDeploymentFuture, + ContractFuture, + DeployConfig, + DeploymentParameters, + DeploymentResultType, + EIP1193Provider, + Future, + FutureType, + IgnitionModule, + IgnitionModuleResult, + LibraryDeploymentFuture, + NamedArtifactContractAtFuture, + NamedArtifactContractDeploymentFuture, + NamedArtifactLibraryDeploymentFuture, + StrategyConfig, + SuccessfulDeploymentResult, + deploy, + isContractFuture, +} from "@nomicfoundation/ignition-core"; +import { HardhatPluginError } from "hardhat/plugins"; +import { HardhatRuntimeEnvironment } from "hardhat/types"; +import path from "path"; + +import { IgnitionModuleResultsToViemContracts } from "./ignition-module-results-to-viem-contracts"; + +export class ViemIgnitionHelper { + public type = "viem"; + + private _provider: EIP1193Provider; + + constructor( + private _hre: HardhatRuntimeEnvironment, + private _config?: Partial, + provider?: EIP1193Provider + ) { + this._provider = provider ?? this._hre.network.provider; + } + + /** + * Deploys the given Ignition module and returns the results of the module + * as Viem contract instances. + * + * @param ignitionModule - The Ignition module to deploy. + * @param options - The options to use for the deployment. + * @returns Viem contract instances for each contract returned by the module. + */ + public async deploy< + ModuleIdT extends string, + ContractNameT extends string, + IgnitionModuleResultsT extends IgnitionModuleResult, + StrategyT extends keyof StrategyConfig = "basic" + >( + ignitionModule: IgnitionModule< + ModuleIdT, + ContractNameT, + IgnitionModuleResultsT + >, + { + parameters = {}, + config: perDeployConfig = {}, + defaultSender = undefined, + strategy, + strategyConfig, + deploymentId: givenDeploymentId = undefined, + displayUi = false, + }: { + parameters?: DeploymentParameters | string; + config?: Partial; + defaultSender?: string; + strategy?: StrategyT; + strategyConfig?: StrategyConfig[StrategyT]; + deploymentId?: string; + displayUi?: boolean; + } = { + parameters: {}, + config: {}, + defaultSender: undefined, + strategy: undefined, + strategyConfig: undefined, + deploymentId: undefined, + displayUi: undefined, + } + ): Promise< + IgnitionModuleResultsToViemContracts + > { + const accounts = (await this._hre.network.provider.request({ + method: "eth_accounts", + })) as string[]; + + const artifactResolver = new HardhatArtifactResolver(this._hre); + + const resolvedConfig: Partial = { + ...this._config, + ...perDeployConfig, + }; + + const resolvedStrategyConfig = + ViemIgnitionHelper._resolveStrategyConfig( + this._hre, + strategy, + strategyConfig + ); + + const chainId = Number( + await this._hre.network.provider.request({ + method: "eth_chainId", + }) + ); + + const deploymentId = resolveDeploymentId(givenDeploymentId, chainId); + + const deploymentDir = + this._hre.network.name === "hardhat" + ? undefined + : path.join( + this._hre.config.paths.ignition, + "deployments", + deploymentId + ); + + const executionEventListener = displayUi + ? new PrettyEventHandler() + : undefined; + + let deploymentParameters: DeploymentParameters; + + if (typeof parameters === "string") { + deploymentParameters = await readDeploymentParameters(parameters); + } else { + deploymentParameters = parameters; + } + + const result = await deploy({ + config: resolvedConfig, + provider: this._provider, + deploymentDir, + executionEventListener, + artifactResolver, + ignitionModule, + deploymentParameters, + accounts, + defaultSender, + strategy, + strategyConfig: resolvedStrategyConfig, + maxFeePerGasLimit: + this._hre.config.networks[this._hre.network.name]?.ignition + .maxFeePerGasLimit, + maxPriorityFeePerGas: + this._hre.config.networks[this._hre.network.name]?.ignition + .maxPriorityFeePerGas, + }); + + if (result.type !== DeploymentResultType.SUCCESSFUL_DEPLOYMENT) { + const message = errorDeploymentResultToExceptionMessage(result); + + throw new HardhatPluginError("hardhat-ignition-viem", message); + } + + return ViemIgnitionHelper._toViemContracts( + this._hre, + ignitionModule, + result + ); + } + + private static async _toViemContracts< + ModuleIdT extends string, + ContractNameT extends string, + IgnitionModuleResultsT extends IgnitionModuleResult + >( + hre: HardhatRuntimeEnvironment, + ignitionModule: IgnitionModule< + ModuleIdT, + ContractNameT, + IgnitionModuleResultsT + >, + result: SuccessfulDeploymentResult + ): Promise< + IgnitionModuleResultsToViemContracts + > { + return Object.fromEntries( + await Promise.all( + Object.entries(ignitionModule.results).map( + async ([name, contractFuture]) => [ + name, + await ViemIgnitionHelper._getContract( + hre, + contractFuture, + result.contracts[contractFuture.id] + ), + ] + ) + ) + ); + } + + private static async _getContract( + hre: HardhatRuntimeEnvironment, + future: Future, + deployedContract: { address: string } + ): Promise { + if (!isContractFuture(future)) { + throw new HardhatPluginError( + "hardhat-ignition-viem", + `Expected contract future but got ${future.id} with type ${future.type} instead` + ); + } + + return ViemIgnitionHelper._convertContractFutureToViemContract( + hre, + future, + deployedContract + ); + } + + private static async _convertContractFutureToViemContract( + hre: HardhatRuntimeEnvironment, + future: ContractFuture, + deployedContract: { address: string } + ) { + switch (future.type) { + case FutureType.NAMED_ARTIFACT_CONTRACT_DEPLOYMENT: + case FutureType.NAMED_ARTIFACT_LIBRARY_DEPLOYMENT: + case FutureType.NAMED_ARTIFACT_CONTRACT_AT: + return ViemIgnitionHelper._convertHardhatContractToViemContract( + hre, + future, + deployedContract + ); + case FutureType.CONTRACT_DEPLOYMENT: + case FutureType.LIBRARY_DEPLOYMENT: + case FutureType.CONTRACT_AT: + return ViemIgnitionHelper._convertArtifactToViemContract( + hre, + future, + deployedContract + ); + } + } + + private static _convertHardhatContractToViemContract( + hre: HardhatRuntimeEnvironment, + future: + | NamedArtifactContractDeploymentFuture + | NamedArtifactLibraryDeploymentFuture + | NamedArtifactContractAtFuture, + deployedContract: { address: string } + ): Promise { + return hre.viem.getContractAt( + future.contractName, + ViemIgnitionHelper._ensureAddressFormat(deployedContract.address) + ); + } + + private static async _convertArtifactToViemContract( + hre: HardhatRuntimeEnvironment, + future: + | ContractDeploymentFuture + | LibraryDeploymentFuture + | ContractAtFuture, + deployedContract: { address: string } + ): Promise { + const publicClient = await hre.viem.getPublicClient(); + const [walletClient] = await hre.viem.getWalletClients(); + + if (walletClient === undefined) { + throw new HardhatPluginError( + "hardhat-ignition-viem", + "No default wallet client found" + ); + } + + const viem = await import("viem"); + const contract = viem.getContract({ + address: ViemIgnitionHelper._ensureAddressFormat( + deployedContract.address + ), + abi: future.artifact.abi, + client: { + public: publicClient, + wallet: walletClient, + }, + }); + + return contract; + } + + private static _ensureAddressFormat(address: string): `0x${string}` { + if (!address.startsWith("0x")) { + return `0x${address}`; + } + + return `0x${address.slice(2)}`; + } + + private static _resolveStrategyConfig( + hre: HardhatRuntimeEnvironment, + strategyName: StrategyT | undefined, + strategyConfig: StrategyConfig[StrategyT] | undefined + ): StrategyConfig[StrategyT] | undefined { + if (strategyName === undefined) { + return undefined; + } + + if (strategyConfig === undefined) { + const fromHardhatConfig = + hre.config.ignition?.strategyConfig?.[strategyName]; + + return fromHardhatConfig; + } + + return strategyConfig; + } +} diff --git a/packages/hardhat-ignition-viem/src/web3.d.ts b/packages/hardhat-ignition-viem/src/web3.d.ts new file mode 100644 index 00000000000..993160c5a16 --- /dev/null +++ b/packages/hardhat-ignition-viem/src/web3.d.ts @@ -0,0 +1 @@ +declare module "web3"; diff --git a/packages/hardhat-ignition-viem/test/.eslintrc.js b/packages/hardhat-ignition-viem/test/.eslintrc.js new file mode 100644 index 00000000000..757fe8a3ca9 --- /dev/null +++ b/packages/hardhat-ignition-viem/test/.eslintrc.js @@ -0,0 +1,15 @@ +module.exports = { + extends: [`${__dirname}/../.eslintrc.js`], + parserOptions: { + project: `${__dirname}/../tsconfig.json`, + sourceType: "module", + }, + rules: { + "import/no-extraneous-dependencies": [ + "error", + { + devDependencies: true, + }, + ], + }, +}; diff --git a/packages/hardhat-ignition-viem/test/default-sender.ts b/packages/hardhat-ignition-viem/test/default-sender.ts new file mode 100644 index 00000000000..320ca42c040 --- /dev/null +++ b/packages/hardhat-ignition-viem/test/default-sender.ts @@ -0,0 +1,48 @@ +import { buildModule } from "@nomicfoundation/ignition-core"; +import { assert } from "chai"; + +import { useIgnitionProject } from "./test-helpers/use-ignition-project"; + +describe("support changing default sender", () => { + useIgnitionProject("minimal"); + + it("should deploy on the first HH account by default", async function () { + const [defaultAccount] = await this.hre.viem.getWalletClients(); + const defaultAccountAddress = defaultAccount.account.address; + + const moduleDefinition = buildModule("Module", (m) => { + const ownerSender = m.contract("OwnerSender"); + + return { ownerSender }; + }); + + const result = await this.hre.ignition.deploy(moduleDefinition, { + defaultSender: undefined, + }); + + assert.equal( + (await result.ownerSender.read.owner()).toLowerCase(), + defaultAccountAddress.toLowerCase() + ); + }); + + it("should allow changing the default sender that the ignition deployment runs against", async function () { + const [, notTheDefaultAccount] = await this.hre.viem.getWalletClients(); + const differentAccountAddress = notTheDefaultAccount.account.address; + + const moduleDefinition = buildModule("Module", (m) => { + const ownerSender = m.contract("OwnerSender"); + + return { ownerSender }; + }); + + const result = await this.hre.ignition.deploy(moduleDefinition, { + defaultSender: differentAccountAddress, + }); + + assert.equal( + (await result.ownerSender.read.owner()).toLowerCase(), + differentAccountAddress.toLowerCase() + ); + }); +}); diff --git a/packages/hardhat-ignition-viem/test/fixture-projects/.gitignore b/packages/hardhat-ignition-viem/test/fixture-projects/.gitignore new file mode 100644 index 00000000000..f1462f7a568 --- /dev/null +++ b/packages/hardhat-ignition-viem/test/fixture-projects/.gitignore @@ -0,0 +1,3 @@ +artifacts/ +cache/ +deployments/ diff --git a/packages/hardhat-ignition-viem/test/fixture-projects/create2/contracts/Baz.sol b/packages/hardhat-ignition-viem/test/fixture-projects/create2/contracts/Baz.sol new file mode 100644 index 00000000000..7904b5189c8 --- /dev/null +++ b/packages/hardhat-ignition-viem/test/fixture-projects/create2/contracts/Baz.sol @@ -0,0 +1,7 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity >=0.7.0 <0.9.0; +pragma experimental ABIEncoderV2; + +contract Baz { + bool public isBaz = true; +} diff --git a/packages/hardhat-ignition-viem/test/fixture-projects/create2/hardhat.config.js b/packages/hardhat-ignition-viem/test/fixture-projects/create2/hardhat.config.js new file mode 100644 index 00000000000..ddccd293abd --- /dev/null +++ b/packages/hardhat-ignition-viem/test/fixture-projects/create2/hardhat.config.js @@ -0,0 +1,12 @@ +require("../../../src/index"); + +module.exports = { + solidity: "0.8.19", + ignition: { + strategyConfig: { + create2: { + salt: "0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890aaaaaa", + }, + }, + }, +}; diff --git a/packages/hardhat-ignition-viem/test/fixture-projects/create2/modules/BazModule.js b/packages/hardhat-ignition-viem/test/fixture-projects/create2/modules/BazModule.js new file mode 100644 index 00000000000..a4b19a9b66a --- /dev/null +++ b/packages/hardhat-ignition-viem/test/fixture-projects/create2/modules/BazModule.js @@ -0,0 +1,8 @@ +// eslint-disable-next-line import/no-unused-modules +const { buildModule } = require("@nomicfoundation/ignition-core"); + +module.exports = buildModule("BazModule", (m) => { + const foo = m.contract("Baz"); + + return { foo }; +}); diff --git a/packages/hardhat-ignition-viem/test/fixture-projects/minimal/contracts/Contracts.sol b/packages/hardhat-ignition-viem/test/fixture-projects/minimal/contracts/Contracts.sol new file mode 100644 index 00000000000..84cd3282387 --- /dev/null +++ b/packages/hardhat-ignition-viem/test/fixture-projects/minimal/contracts/Contracts.sol @@ -0,0 +1,38 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity >=0.7.0 <0.9.0; +pragma experimental ABIEncoderV2; + +contract Foo { + event IncEvent(address indexed sender); + + bool public isFoo = true; + uint256 public x = 1; + + function inc() public { + x++; + emit IncEvent(msg.sender); + } + + function incByPositiveNumber(uint256 n) public returns (uint256) { + require(n > 0, "n must be positive"); + x += n; + return x; + } + + function incTwoNumbers(uint256 first, uint256 second) public { + x += first; + x += second; + } +} + +contract Bar { + bool public isBar = true; +} + +contract OwnerSender { + address public owner; + + constructor() { + owner = msg.sender; + } +} diff --git a/packages/hardhat-ignition-viem/test/fixture-projects/minimal/hardhat.config.js b/packages/hardhat-ignition-viem/test/fixture-projects/minimal/hardhat.config.js new file mode 100644 index 00000000000..791b28f3370 --- /dev/null +++ b/packages/hardhat-ignition-viem/test/fixture-projects/minimal/hardhat.config.js @@ -0,0 +1,12 @@ +require("../../../src/index"); + +module.exports = { + solidity: "0.8.19", + networks: { + hardhat: { + mining: { + auto: false, + }, + }, + }, +}; diff --git a/packages/hardhat-ignition-viem/test/fixture-projects/minimal/ignition/modules/MyModule.js b/packages/hardhat-ignition-viem/test/fixture-projects/minimal/ignition/modules/MyModule.js new file mode 100644 index 00000000000..f00a750bdea --- /dev/null +++ b/packages/hardhat-ignition-viem/test/fixture-projects/minimal/ignition/modules/MyModule.js @@ -0,0 +1,13 @@ +// eslint-disable-next-line import/no-unused-modules +const { buildModule } = require("@nomicfoundation/ignition-core"); + +module.exports = buildModule("MyModule", (m) => { + const bar = m.contract("Bar"); + const usesContract = m.contract("UsesContract", [ + "0x0000000000000000000000000000000000000000", + ]); + + m.call(usesContract, "setAddress", [bar]); + + return { bar, usesContract }; +}); diff --git a/packages/hardhat-ignition-viem/test/fixture-projects/with-fake-helper/hardhat.config.js b/packages/hardhat-ignition-viem/test/fixture-projects/with-fake-helper/hardhat.config.js new file mode 100644 index 00000000000..7865980390b --- /dev/null +++ b/packages/hardhat-ignition-viem/test/fixture-projects/with-fake-helper/hardhat.config.js @@ -0,0 +1,13 @@ +require("./index"); +require("../../../src/index"); + +module.exports = { + solidity: "0.8.19", + networks: { + hardhat: { + mining: { + auto: false, + }, + }, + }, +}; diff --git a/packages/hardhat-ignition-viem/test/fixture-projects/with-fake-helper/index.js b/packages/hardhat-ignition-viem/test/fixture-projects/with-fake-helper/index.js new file mode 100644 index 00000000000..f2c06ffd229 --- /dev/null +++ b/packages/hardhat-ignition-viem/test/fixture-projects/with-fake-helper/index.js @@ -0,0 +1,7 @@ +const { extendEnvironment } = require("hardhat/config"); + +extendEnvironment((hre) => { + hre.ignition = { + type: "ethers", + }; +}); diff --git a/packages/hardhat-ignition-viem/test/ignition-helper-exclusivity.ts b/packages/hardhat-ignition-viem/test/ignition-helper-exclusivity.ts new file mode 100644 index 00000000000..f11b2c5e379 --- /dev/null +++ b/packages/hardhat-ignition-viem/test/ignition-helper-exclusivity.ts @@ -0,0 +1,23 @@ +/* eslint-disable import/no-unused-modules */ +import { assert } from "chai"; +import { resetHardhatContext } from "hardhat/plugins-testing"; +import path from "path"; + +describe("ignition helper mutual exclusivity", () => { + before(function () { + process.chdir( + path.join(__dirname, "./fixture-projects", "with-fake-helper") + ); + }); + + after(function () { + resetHardhatContext(); + }); + + it("should error when loaded in conjunction with hardhat-ignition-ethers", async function () { + assert.throws( + () => require("hardhat"), + /Found ethers and viem, but only one Hardhat Ignition extension plugin can be used at a time\./ + ); + }); +}); diff --git a/packages/hardhat-ignition-viem/test/setup.ts b/packages/hardhat-ignition-viem/test/setup.ts new file mode 100644 index 00000000000..83ca4a59226 --- /dev/null +++ b/packages/hardhat-ignition-viem/test/setup.ts @@ -0,0 +1,11 @@ +/* eslint-disable import/no-unused-modules */ +import chai from "chai"; +import chaiAsPromised from "chai-as-promised"; +import sinon from "sinon"; + +chai.use(chaiAsPromised); +chai.config.truncateThreshold = 1000; + +afterEach(() => { + sinon.restore(); +}); diff --git a/packages/hardhat-ignition-viem/test/strategies/helper-invocation.ts b/packages/hardhat-ignition-viem/test/strategies/helper-invocation.ts new file mode 100644 index 00000000000..c4cb7660d06 --- /dev/null +++ b/packages/hardhat-ignition-viem/test/strategies/helper-invocation.ts @@ -0,0 +1,91 @@ +/* eslint-disable import/no-unused-modules */ +import { + NamedArtifactContractDeploymentFuture, + buildModule, +} from "@nomicfoundation/ignition-core"; +import { assert } from "chai"; + +import { IgnitionModuleResultsToViemContracts } from "../../src/ignition-module-results-to-viem-contracts"; +import { useIgnitionProject } from "../test-helpers/use-ignition-project"; + +describe("strategies - invocation via helper", () => { + const example32ByteSalt = + "0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef"; + + describe("no Hardhat config setup", () => { + useIgnitionProject("minimal"); + + let result: IgnitionModuleResultsToViemContracts< + string, + { + foo: NamedArtifactContractDeploymentFuture<"Foo">; + } + >; + + it("should execute create2 when passed config programmatically via helper", async function () { + const moduleDefinition = buildModule("Module", (m) => { + const foo = m.contract("Foo"); + + return { foo }; + }); + + result = await this.hre.ignition.deploy(moduleDefinition, { + strategy: "create2", + strategyConfig: { + salt: example32ByteSalt, + }, + }); + + assert.equal( + result.foo.address, + "0x9318a275A28F46CA742f84402226E27463cA8050" + ); + }); + + it("should error on create2 when passed bad config", async function () { + const moduleDefinition = buildModule("Module", (m) => { + const foo = m.contract("Foo"); + + return { foo }; + }); + + await assert.isRejected( + this.hre.ignition.deploy(moduleDefinition, { + strategy: "create2", + strategyConfig: { + salt: undefined as any, + }, + }), + /IGN1102: Missing required strategy configuration parameter 'salt' for the strategy 'create2'/ + ); + }); + }); + + describe("Hardhat config setup with create2 config", () => { + useIgnitionProject("create2"); + + let result: IgnitionModuleResultsToViemContracts< + string, + { + baz: NamedArtifactContractDeploymentFuture<"Baz">; + } + >; + + it("should execute create2 with the helper loading the Hardhat config", async function () { + const moduleDefinition = buildModule("Module", (m) => { + const baz = m.contract("Baz"); + + return { baz }; + }); + + result = await this.hre.ignition.deploy(moduleDefinition, { + strategy: "create2", + }); + + assert.equal( + result.baz.address, + "0x8EFE40FAEF47066689Cb06b561F5EC63F9DeA616" + ); + }); + }); +}); diff --git a/packages/hardhat-ignition-viem/test/test-helpers/externally-loaded-contract.ts b/packages/hardhat-ignition-viem/test/test-helpers/externally-loaded-contract.ts new file mode 100644 index 00000000000..cd8f2a6172f --- /dev/null +++ b/packages/hardhat-ignition-viem/test/test-helpers/externally-loaded-contract.ts @@ -0,0 +1,94 @@ +/** + * This is the artifact of a contract that is not part of the compilation output. + * + * Based on the following Solidity: + * + * ``` + contract ExternallyLoadedContract { + bool public isExternallyLoaded = true; + uint256 public x = 1; + + function buildMessage( + string memory message + ) public pure returns (string memory) { + return string.concat("A message: ", message); + } + + function inc() public returns (uint256) { + x++; + return x; + } + } + * ``` + */ +export const externallyLoadedContractArtifact = { + _format: "hh-sol-artifact-1", + contractName: "ExternallyLoadedContract", + sourceName: "contracts/Foo.sol", + abi: [ + { + inputs: [ + { + internalType: "string", + name: "message", + type: "string", + }, + ], + name: "buildMessage", + outputs: [ + { + internalType: "string", + name: "", + type: "string", + }, + ], + stateMutability: "pure", + type: "function", + }, + { + inputs: [], + name: "inc", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [], + name: "isExternallyLoaded", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "x", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + ], + bytecode: + "0x608060405260016000806101000a81548160ff0219169083151502179055506001805534801561002e57600080fd5b506105208061003e6000396000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c80630c55699c14610051578063371303c01461006f578063ae78e06b1461008d578063c4a5693d146100ab575b600080fd5b6100596100db565b6040516100669190610156565b60405180910390f35b6100776100e1565b6040516100849190610156565b60405180910390f35b610095610103565b6040516100a2919061018c565b60405180910390f35b6100c560048036038101906100c09190610301565b610114565b6040516100d291906103c9565b60405180910390f35b60015481565b6000600160008154809291906100f69061041a565b9190505550600154905090565b60008054906101000a900460ff1681565b60608160405160200161012791906104c4565b6040516020818303038152906040529050919050565b6000819050919050565b6101508161013d565b82525050565b600060208201905061016b6000830184610147565b92915050565b60008115159050919050565b61018681610171565b82525050565b60006020820190506101a1600083018461017d565b92915050565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61020e826101c5565b810181811067ffffffffffffffff8211171561022d5761022c6101d6565b5b80604052505050565b60006102406101a7565b905061024c8282610205565b919050565b600067ffffffffffffffff82111561026c5761026b6101d6565b5b610275826101c5565b9050602081019050919050565b82818337600083830152505050565b60006102a461029f84610251565b610236565b9050828152602081018484840111156102c0576102bf6101c0565b5b6102cb848285610282565b509392505050565b600082601f8301126102e8576102e76101bb565b5b81356102f8848260208601610291565b91505092915050565b600060208284031215610317576103166101b1565b5b600082013567ffffffffffffffff811115610335576103346101b6565b5b610341848285016102d3565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015610384578082015181840152602081019050610369565b60008484015250505050565b600061039b8261034a565b6103a58185610355565b93506103b5818560208601610366565b6103be816101c5565b840191505092915050565b600060208201905081810360008301526103e38184610390565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006104258261013d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203610457576104566103eb565b5b600182019050919050565b7f41206d6573736167653a20000000000000000000000000000000000000000000815250565b600081905092915050565b600061049e8261034a565b6104a88185610488565b93506104b8818560208601610366565b80840191505092915050565b60006104cf82610462565b600b820191506104df8284610493565b91508190509291505056fea2646970667358221220d6f949c606fe2cf1b3274ef889cd952363a9558f9f5027ee18f03fe4c4cbaee864736f6c63430008130033", + deployedBytecode: + "0x608060405234801561001057600080fd5b506004361061004c5760003560e01c80630c55699c14610051578063371303c01461006f578063ae78e06b1461008d578063c4a5693d146100ab575b600080fd5b6100596100db565b6040516100669190610156565b60405180910390f35b6100776100e1565b6040516100849190610156565b60405180910390f35b610095610103565b6040516100a2919061018c565b60405180910390f35b6100c560048036038101906100c09190610301565b610114565b6040516100d291906103c9565b60405180910390f35b60015481565b6000600160008154809291906100f69061041a565b9190505550600154905090565b60008054906101000a900460ff1681565b60608160405160200161012791906104c4565b6040516020818303038152906040529050919050565b6000819050919050565b6101508161013d565b82525050565b600060208201905061016b6000830184610147565b92915050565b60008115159050919050565b61018681610171565b82525050565b60006020820190506101a1600083018461017d565b92915050565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61020e826101c5565b810181811067ffffffffffffffff8211171561022d5761022c6101d6565b5b80604052505050565b60006102406101a7565b905061024c8282610205565b919050565b600067ffffffffffffffff82111561026c5761026b6101d6565b5b610275826101c5565b9050602081019050919050565b82818337600083830152505050565b60006102a461029f84610251565b610236565b9050828152602081018484840111156102c0576102bf6101c0565b5b6102cb848285610282565b509392505050565b600082601f8301126102e8576102e76101bb565b5b81356102f8848260208601610291565b91505092915050565b600060208284031215610317576103166101b1565b5b600082013567ffffffffffffffff811115610335576103346101b6565b5b610341848285016102d3565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015610384578082015181840152602081019050610369565b60008484015250505050565b600061039b8261034a565b6103a58185610355565b93506103b5818560208601610366565b6103be816101c5565b840191505092915050565b600060208201905081810360008301526103e38184610390565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006104258261013d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203610457576104566103eb565b5b600182019050919050565b7f41206d6573736167653a20000000000000000000000000000000000000000000815250565b600081905092915050565b600061049e8261034a565b6104a88185610488565b93506104b8818560208601610366565b80840191505092915050565b60006104cf82610462565b600b820191506104df8284610493565b91508190509291505056fea2646970667358221220d6f949c606fe2cf1b3274ef889cd952363a9558f9f5027ee18f03fe4c4cbaee864736f6c63430008130033", + linkReferences: {}, + deployedLinkReferences: {}, +} as const; diff --git a/packages/hardhat-ignition-viem/test/test-helpers/use-ignition-project.ts b/packages/hardhat-ignition-viem/test/test-helpers/use-ignition-project.ts new file mode 100644 index 00000000000..42fc434fc06 --- /dev/null +++ b/packages/hardhat-ignition-viem/test/test-helpers/use-ignition-project.ts @@ -0,0 +1,28 @@ +import { resetHardhatContext } from "hardhat/plugins-testing"; +import { HardhatRuntimeEnvironment } from "hardhat/types"; +import path from "path"; + +declare module "mocha" { + interface Context { + hre: HardhatRuntimeEnvironment; + } +} + +export function useIgnitionProject(fixtureProjectName: string) { + beforeEach("Load environment", async function () { + process.chdir( + path.join(__dirname, "../fixture-projects", fixtureProjectName) + ); + + const hre = require("hardhat"); + + await hre.network.provider.send("evm_setAutomine", [true]); + await hre.run("compile", { quiet: true }); + + this.hre = hre; + }); + + afterEach("reset hardhat context", function () { + resetHardhatContext(); + }); +} diff --git a/packages/hardhat-ignition-viem/test/use-module.ts b/packages/hardhat-ignition-viem/test/use-module.ts new file mode 100644 index 00000000000..b89897e54b6 --- /dev/null +++ b/packages/hardhat-ignition-viem/test/use-module.ts @@ -0,0 +1,32 @@ +/* eslint-disable import/no-unused-modules */ +import { buildModule } from "@nomicfoundation/ignition-core"; +import { assert } from "chai"; + +import { useIgnitionProject } from "./test-helpers/use-ignition-project"; + +describe("viem results should work across useModule boundaries", () => { + useIgnitionProject("minimal"); + + it("should only return properties for the properties of the module results", async function () { + const submoduleDefinition = buildModule("Submodule", (m) => { + const foo = m.contract("Foo"); + + return { foo }; + }); + + const moduleDefinition = buildModule("Module", (m) => { + const { foo } = m.useModule(submoduleDefinition); + + return { foo }; + }); + + const result = await this.hre.ignition.deploy(moduleDefinition); + + assert.equal(await result.foo.read.x(), 1n); + + await result.foo.write.inc(); + await result.foo.write.inc(); + + assert.equal(await result.foo.read.x(), 3n); + }); +}); diff --git a/packages/hardhat-ignition-viem/test/viem-instances/artifact-contract-at.ts b/packages/hardhat-ignition-viem/test/viem-instances/artifact-contract-at.ts new file mode 100644 index 00000000000..66d306d5132 --- /dev/null +++ b/packages/hardhat-ignition-viem/test/viem-instances/artifact-contract-at.ts @@ -0,0 +1,109 @@ +import { ContractAtFuture, buildModule } from "@nomicfoundation/ignition-core"; +import { assert } from "chai"; + +import { IgnitionModuleResultsToViemContracts } from "../../src/ignition-module-results-to-viem-contracts"; +import { externallyLoadedContractArtifact } from "../test-helpers/externally-loaded-contract"; +import { useIgnitionProject } from "../test-helpers/use-ignition-project"; + +describe("deploy converts ignition artifact contractAt to viem instance", () => { + useIgnitionProject("minimal"); + + let result: IgnitionModuleResultsToViemContracts< + string, + { + externallyLoadedContractAt: ContractAtFuture< + (typeof externallyLoadedContractArtifact)["abi"] + >; + } + >; + + beforeEach(async function () { + const moduleDefinition = buildModule("Module", (m) => { + const externallyLoadedContract = m.contract( + "ExternallyLoadedContract", + externallyLoadedContractArtifact, + [] + ); + + const externallyLoadedContractAt = m.contractAt( + "externallyLoadedContractAt", + externallyLoadedContractArtifact, + externallyLoadedContract, + { id: "externallyLoadedContractAt" } + ); + + return { externallyLoadedContractAt }; + }); + + result = await this.hre.ignition.deploy(moduleDefinition); + }); + + it("should provide the address", async function () { + assert.equal( + result.externallyLoadedContractAt.address, + "0x5FbDB2315678afecb367f032d93F642f64180aa3" + ); + }); + + it("should provide the abi", async function () { + assert.equal( + result.externallyLoadedContractAt.abi, + externallyLoadedContractArtifact.abi + ); + }); + + it("should allow reading the contract instance", async function () { + assert.equal( + await result.externallyLoadedContractAt.read.buildMessage([ + "Hello World", + ]), + "A message: Hello World" + ); + }); + + it("should allow writing to the contract instance", async function () { + await result.externallyLoadedContractAt.write.inc(); + await result.externallyLoadedContractAt.write.inc(); + await result.externallyLoadedContractAt.write.inc(); + + assert.equal(await result.externallyLoadedContractAt.read.x(), 4n); + }); + + it("should support simulating write function calls", async function () { + const { result: simulationResult } = + await result.externallyLoadedContractAt.simulate.inc(); + + assert.equal(simulationResult, 2n); + }); + + it("should support gas estimation of write function calls", async function () { + const estimation = + await result.externallyLoadedContractAt.estimateGas.inc(); + + assert.isDefined(estimation); + assert(typeof estimation === "bigint"); + }); + + it("should enforce the type is constrained to the contracts functions", async function () { + await assert.isRejected( + // @ts-expect-error + result.externallyLoadedContractAt.write.nonexistantWrite(), + /Make sure you are using the correct ABI and that the function exists on it./ + ); + await assert.isRejected( + // @ts-expect-error + result.externallyLoadedContractAt.read.nonexistantRead(), + /Make sure you are using the correct ABI and that the function exists on it./ + ); + await assert.isRejected( + // @ts-expect-error + result.externallyLoadedContractAt.estimateGas.nonexistantEstimate(), + /Make sure you are using the correct ABI and that the function exists on it./ + ); + await assert.isRejected( + // @ts-expect-error + result.externallyLoadedContractAt.simulate.nonexistantEstimate(), + /Make sure you are using the correct ABI and that the function exists on it./ + ); + }); +}); diff --git a/packages/hardhat-ignition-viem/test/viem-instances/artifact-deployment-contract.ts b/packages/hardhat-ignition-viem/test/viem-instances/artifact-deployment-contract.ts new file mode 100644 index 00000000000..1c0188b307f --- /dev/null +++ b/packages/hardhat-ignition-viem/test/viem-instances/artifact-deployment-contract.ts @@ -0,0 +1,103 @@ +import { + ContractDeploymentFuture, + buildModule, +} from "@nomicfoundation/ignition-core"; +import { assert } from "chai"; + +import { IgnitionModuleResultsToViemContracts } from "../../src/ignition-module-results-to-viem-contracts"; +import { externallyLoadedContractArtifact } from "../test-helpers/externally-loaded-contract"; +import { useIgnitionProject } from "../test-helpers/use-ignition-project"; + +describe("deploy converts ignition artifact contract to viem instance", () => { + useIgnitionProject("minimal"); + + let result: IgnitionModuleResultsToViemContracts< + string, + { + externallyLoadedContract: ContractDeploymentFuture< + (typeof externallyLoadedContractArtifact)["abi"] + >; + } + >; + + beforeEach(async function () { + const moduleDefinition = buildModule("Module", (m) => { + const externallyLoadedContract = m.contract( + "ExternallyLoadedContract", + externallyLoadedContractArtifact, + [], + { id: "ExternallyLoadedContract" } + ); + + return { externallyLoadedContract }; + }); + + result = await this.hre.ignition.deploy(moduleDefinition); + }); + + it("should provide the address", async function () { + assert.equal( + result.externallyLoadedContract.address, + "0x5FbDB2315678afecb367f032d93F642f64180aa3" + ); + }); + + it("should provide the abi", async function () { + assert.equal( + result.externallyLoadedContract.abi, + externallyLoadedContractArtifact.abi + ); + }); + + it("should allow reading the contract instance", async function () { + assert.equal( + await result.externallyLoadedContract.read.buildMessage(["Hello World"]), + "A message: Hello World" + ); + }); + + it("should allow writing to the contract instance", async function () { + await result.externallyLoadedContract.write.inc(); + await result.externallyLoadedContract.write.inc(); + await result.externallyLoadedContract.write.inc(); + + assert.equal(await result.externallyLoadedContract.read.x(), 4n); + }); + + it("should support simulating write function calls", async function () { + const { result: simulationResult } = + await result.externallyLoadedContract.simulate.inc(); + + assert.equal(simulationResult, 2n); + }); + + it("should support gas estimation of write function calls", async function () { + const estimation = await result.externallyLoadedContract.estimateGas.inc(); + + assert.isDefined(estimation); + assert(typeof estimation === "bigint"); + }); + + it("should enforce the type is constrained to the contracts functions", async function () { + await assert.isRejected( + // @ts-expect-error + result.externallyLoadedContract.write.nonexistantWrite(), + /Make sure you are using the correct ABI and that the function exists on it./ + ); + await assert.isRejected( + // @ts-expect-error + result.externallyLoadedContract.read.nonexistantRead(), + /Make sure you are using the correct ABI and that the function exists on it./ + ); + await assert.isRejected( + // @ts-expect-error + result.externallyLoadedContract.estimateGas.nonexistantEstimate(), + /Make sure you are using the correct ABI and that the function exists on it./ + ); + await assert.isRejected( + // @ts-expect-error + result.externallyLoadedContract.simulate.nonexistantEstimate(), + /Make sure you are using the correct ABI and that the function exists on it./ + ); + }); +}); diff --git a/packages/hardhat-ignition-viem/test/viem-instances/named-contract-at.ts b/packages/hardhat-ignition-viem/test/viem-instances/named-contract-at.ts new file mode 100644 index 00000000000..ac8f723226e --- /dev/null +++ b/packages/hardhat-ignition-viem/test/viem-instances/named-contract-at.ts @@ -0,0 +1,103 @@ +import { + NamedArtifactContractAtFuture, + buildModule, +} from "@nomicfoundation/ignition-core"; +import { assert } from "chai"; + +import { IgnitionModuleResultsToViemContracts } from "../../src/ignition-module-results-to-viem-contracts"; +import { useIgnitionProject } from "../test-helpers/use-ignition-project"; + +describe("deploy converts ignition named contractAt to viem instance", () => { + useIgnitionProject("minimal"); + + let result: IgnitionModuleResultsToViemContracts< + string, + { + contractAtFoo: NamedArtifactContractAtFuture<"Foo">; + } + >; + + beforeEach(async function () { + const moduleDefinition = buildModule("Module", (m) => { + const foo = m.contract("Foo"); + const contractAtFoo = m.contractAt("Foo", foo, { id: "ContractAtFoo" }); + + return { contractAtFoo }; + }); + + result = await this.hre.ignition.deploy(moduleDefinition); + }); + + it("should provide the address", async function () { + assert.equal( + result.contractAtFoo.address, + "0x5FbDB2315678afecb367f032d93F642f64180aa3" + ); + }); + + it("should provide the abi", async function () { + assert.isDefined(result.contractAtFoo.abi); + }); + + it("should allow reading the contract instance", async function () { + assert.equal(await result.contractAtFoo.read.x(), 1n); + }); + + it("should allow writing to the contract instance", async function () { + assert.equal(await result.contractAtFoo.read.x(), 1n); + + await result.contractAtFoo.write.inc(); + await result.contractAtFoo.write.inc(); + + assert.equal(await result.contractAtFoo.read.x(), 3n); + }); + + it("should support simulating write function calls", async function () { + const { result: addedNumberResult } = + await result.contractAtFoo.simulate.incByPositiveNumber([2n]); + + assert.equal(addedNumberResult, 3n); + }); + + it("should support gas estimation of write function calls", async function () { + const estimation = await result.contractAtFoo.estimateGas.inc(); + + assert.isDefined(estimation); + assert(typeof estimation === "bigint"); + }); + + it("should support events", async function () { + await result.contractAtFoo.write.inc(); + + const logs = await result.contractAtFoo.getEvents.IncEvent(); + + assert.equal(logs.length, 1); + assert.equal( + logs[0].args.sender, + "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266" + ); + }); + + it("should enforce the type is constrained to the contracts functions", async function () { + await assert.isRejected( + // @ts-expect-error + result.contractAtFoo.write.nonexistantWrite(), + /Make sure you are using the correct ABI and that the function exists on it./ + ); + await assert.isRejected( + // @ts-expect-error + result.contractAtFoo.read.nonexistantRead(), + /Make sure you are using the correct ABI and that the function exists on it./ + ); + await assert.isRejected( + // @ts-expect-error + result.contractAtFoo.estimateGas.nonexistantEstimate(), + /Make sure you are using the correct ABI and that the function exists on it./ + ); + await assert.isRejected( + // @ts-expect-error + result.contractAtFoo.simulate.nonexistantEstimate(), + /Make sure you are using the correct ABI and that the function exists on it./ + ); + }); +}); diff --git a/packages/hardhat-ignition-viem/test/viem-instances/named-deployment-contract.ts b/packages/hardhat-ignition-viem/test/viem-instances/named-deployment-contract.ts new file mode 100644 index 00000000000..65861373ea7 --- /dev/null +++ b/packages/hardhat-ignition-viem/test/viem-instances/named-deployment-contract.ts @@ -0,0 +1,103 @@ +/* eslint-disable import/no-unused-modules */ +import { + NamedArtifactContractDeploymentFuture, + buildModule, +} from "@nomicfoundation/ignition-core"; +import { assert } from "chai"; + +import { IgnitionModuleResultsToViemContracts } from "../../src/ignition-module-results-to-viem-contracts"; +import { useIgnitionProject } from "../test-helpers/use-ignition-project"; + +describe("deploy converts ignition named contract to viem instance", () => { + useIgnitionProject("minimal"); + + let result: IgnitionModuleResultsToViemContracts< + string, + { + foo: NamedArtifactContractDeploymentFuture<"Foo">; + } + >; + + beforeEach(async function () { + const moduleDefinition = buildModule("Module", (m) => { + const foo = m.contract("Foo"); + + return { foo }; + }); + + result = await this.hre.ignition.deploy(moduleDefinition); + }); + + it("should provide the address", async function () { + assert.equal( + result.foo.address, + "0x5FbDB2315678afecb367f032d93F642f64180aa3" + ); + }); + + it("should provide the abi", async function () { + assert.isDefined(result.foo.abi); + }); + + it("should allow reading the contract instance", async function () { + assert.equal(await result.foo.read.x(), 1n); + }); + + it("should allow writing to the contract instance", async function () { + assert.equal(await result.foo.read.x(), 1n); + + await result.foo.write.inc(); + await result.foo.write.inc(); + + assert.equal(await result.foo.read.x(), 3n); + }); + + it("should support simulating write function calls", async function () { + const { result: addedNumberResult } = + await result.foo.simulate.incByPositiveNumber([2n]); + + assert.equal(addedNumberResult, 3n); + }); + + it("should support gas estimation of write function calls", async function () { + const estimation = await result.foo.estimateGas.inc(); + assert.isDefined(estimation); + + assert(typeof estimation === "bigint"); + }); + + it("should support events", async function () { + await result.foo.write.inc(); + + const logs = await result.foo.getEvents.IncEvent(); + + assert.equal(logs.length, 1); + assert.equal( + logs[0].args.sender, + "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266" + ); + }); + + it("should enforce the type is constrained to the contracts functions", async function () { + await assert.isRejected( + // @ts-expect-error + result.foo.write.nonexistantWrite(), + /Make sure you are using the correct ABI and that the function exists on it./ + ); + await assert.isRejected( + // @ts-expect-error + result.foo.read.nonexistantRead(), + /Make sure you are using the correct ABI and that the function exists on it./ + ); + await assert.isRejected( + // @ts-expect-error + result.foo.estimateGas.nonexistantEstimate(), + /Make sure you are using the correct ABI and that the function exists on it./ + ); + await assert.isRejected( + // @ts-expect-error + result.foo.simulate.nonexistantEstimate(), + /Make sure you are using the correct ABI and that the function exists on it./ + ); + }); +}); diff --git a/packages/hardhat-ignition-viem/test/viem-results.ts b/packages/hardhat-ignition-viem/test/viem-results.ts new file mode 100644 index 00000000000..67e1de82364 --- /dev/null +++ b/packages/hardhat-ignition-viem/test/viem-results.ts @@ -0,0 +1,80 @@ +/* eslint-disable import/no-unused-modules */ +import { buildModule } from "@nomicfoundation/ignition-core"; +import { assert } from "chai"; + +import { externallyLoadedContractArtifact } from "./test-helpers/externally-loaded-contract"; +import { useIgnitionProject } from "./test-helpers/use-ignition-project"; + +describe("viem results", () => { + useIgnitionProject("minimal"); + + it("should only return properties for the properties of the module results", async function () { + const moduleDefinition = buildModule("Module", (m) => { + const foo = m.contract("Foo"); + + return { foo }; + }); + + const result = await this.hre.ignition.deploy(moduleDefinition); + + assert.isDefined(result.foo); + + // @ts-expect-error - only returned result keys should exist + assert.isUndefined(result.nonexistant); + }); + + it("should differentiate between different contracts in the type system", async function () { + const moduleDefinition = buildModule("Module", (m) => { + const foo = m.contract("Foo"); + const bar = m.contract("Bar"); + const baz = m.contract("Bas", externallyLoadedContractArtifact); + + return { foo, bar, baz }; + }); + + const result = await this.hre.ignition.deploy(moduleDefinition); + + assert.isTrue(await result.foo.read.isFoo()); + assert.isTrue(await result.bar.read.isBar()); + assert.isTrue(await result.baz.read.isExternallyLoaded()); + + // Calling the wrong method on a viem instance should throw, but more + // importantly give a type error. + + // foo shouldn't have bar or baz methods + await assert.isRejected( + // @ts-expect-error - isBar is not a method on Foo + result.foo.read.isBar(), + /Make sure you are using the correct ABI and that the function exists on it./ + ); + await assert.isRejected( + // @ts-expect-error - isBar is not a method on Foo + result.foo.read.isExternallyLoaded(), + /Make sure you are using the correct ABI and that the function exists on it./ + ); + + // bar shouldn't have foo or baz methods + await assert.isRejected( + // @ts-expect-error - isFoo is not a method on Bar + result.bar.read.isFoo(), + /Make sure you are using the correct ABI and that the function exists on it./ + ); + await assert.isRejected( + // @ts-expect-error - isExternallyLoaded is not a method on Bar + result.bar.read.isExternallyLoaded(), + /Make sure you are using the correct ABI and that the function exists on it./ + ); + + // baz shouldn't have foo or bar methods + await assert.isRejected( + // @ts-expect-error - isFoo is not a method on the externally loaded contract + result.baz.read.isFoo(), + /Make sure you are using the correct ABI and that the function exists on it./ + ); + await assert.isRejected( + // @ts-expect-error - isBar is not a method on the externally loaded contract + result.baz.read.isBar(), + /Make sure you are using the correct ABI and that the function exists on it./ + ); + }); +}); diff --git a/packages/hardhat-ignition-viem/tsconfig.json b/packages/hardhat-ignition-viem/tsconfig.json new file mode 100644 index 00000000000..d788dcf5b4c --- /dev/null +++ b/packages/hardhat-ignition-viem/tsconfig.json @@ -0,0 +1,15 @@ +{ + "extends": "../../config/typescript/tsconfig.json", + "compilerOptions": { + "target": "ES2022", + "outDir": "dist", + "composite": true, + "jsx": "react-jsx" + }, + "references": [ + { "path": "../hardhat-ignition-core" }, + { "path": "../hardhat-ignition" }, + { "path": "../hardhat-viem" }, + { "path": "../hardhat-core" } + ] +} diff --git a/packages/hardhat-ignition/.eslintrc.js b/packages/hardhat-ignition/.eslintrc.js new file mode 100644 index 00000000000..13139c79c6e --- /dev/null +++ b/packages/hardhat-ignition/.eslintrc.js @@ -0,0 +1,24 @@ +const { + slowImportsCommonIgnoredModules, +} = require("../../config/eslint/constants"); + +module.exports = { + extends: [`${__dirname}/../../config/eslint/eslintrc.js`], + parserOptions: { + project: `${__dirname}/src/tsconfig.json`, + sourceType: "module", + }, + overrides: [ + { + files: ["src/index.ts"], + rules: { + "@nomicfoundation/slow-imports/no-top-level-external-import": [ + "error", + { + ignoreModules: [...slowImportsCommonIgnoredModules], + }, + ], + }, + }, + ], +}; diff --git a/packages/hardhat-ignition/.gitignore b/packages/hardhat-ignition/.gitignore new file mode 100644 index 00000000000..c1c475b6a33 --- /dev/null +++ b/packages/hardhat-ignition/.gitignore @@ -0,0 +1,144 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +lerna-debug.log* +.pnpm-debug.log* +*.ndjson + +# Diagnostic reports (https://nodejs.org/api/report.html) +report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage +*.lcov + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules/ +jspm_packages/ + +# Snowpack dependency directory (https://snowpack.dev/) +web_modules/ + +# TypeScript cache +*.tsbuildinfo + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Optional stylelint cache +.stylelintcache + +# Microbundle cache +.rpt2_cache/ +.rts2_cache_cjs/ +.rts2_cache_es/ +.rts2_cache_umd/ + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variable files +.env +.env.development.local +.env.test.local +.env.production.local +.env.local + +# parcel-bundler cache (https://parceljs.org/) +.cache +.parcel-cache + +# Next.js build output +.next +out + +# Nuxt.js build / generate output +.nuxt +dist + +# Gatsby files +.cache/ +# Comment in the public line in if your project uses Gatsby and not Next.js +# https://nextjs.org/blog/next-9-1#public-directory-support +# public + +# vuepress build output +.vuepress/dist + +# vuepress v2.x temp and cache directory +.temp +.cache + +# Docusaurus cache and generated files +.docusaurus + +# Serverless directories +.serverless/ + +# FuseBox cache +.fusebox/ + +# DynamoDB Local files +.dynamodb/ + +# TernJS port file +.tern-port + +# Stores VSCode versions used for testing VSCode extensions +.vscode-test + +# yarn v2 +.yarn/cache +.yarn/unplugged +.yarn/build-state.yml +.yarn/install-state.gz +.pnp.* +.npmrc + +# Mac OSX garbage +.DS_Store + +# Custom workspace settings for VSCode +.vscode/settings.json + +# Webstorm files +.idea/ + +# npm lockfile since we use pnpm now +package-lock.json diff --git a/packages/hardhat-ignition/.mocharc.json b/packages/hardhat-ignition/.mocharc.json new file mode 100644 index 00000000000..3c924036ae7 --- /dev/null +++ b/packages/hardhat-ignition/.mocharc.json @@ -0,0 +1,6 @@ +{ + "require": "ts-node/register/transpile-only", + "file": "./test/setup.ts", + "timeout": 20000, + "exit": true +} diff --git a/packages/hardhat-ignition/.npmignore b/packages/hardhat-ignition/.npmignore new file mode 100644 index 00000000000..ecceab5f3af --- /dev/null +++ b/packages/hardhat-ignition/.npmignore @@ -0,0 +1,13 @@ +coverage/ +.nyc_output/ +*.tsbuildinfo +**/.eslintrc.js +post-build.js +.mocharc.json +.nycrc +.prettierignore +.prettierrc +dist/test +src/ +test/ +esbuild.js diff --git a/packages/hardhat-ignition/.nycrc b/packages/hardhat-ignition/.nycrc new file mode 100644 index 00000000000..0f9e436c719 --- /dev/null +++ b/packages/hardhat-ignition/.nycrc @@ -0,0 +1,12 @@ +{ + "extends": "@istanbuljs/nyc-config-typescript", + "check-coverage": true, + "statements": 70, + "branches": 50, + "functions": 60, + "lines": 70, + "all": true, + "include": ["src/**/*.ts"], + "reporter": ["html", "lcov", "text", "text-summary"], + "report-dir": "coverage" +} diff --git a/packages/hardhat-ignition/.prettierignore b/packages/hardhat-ignition/.prettierignore new file mode 100644 index 00000000000..4ae5fe88f49 --- /dev/null +++ b/packages/hardhat-ignition/.prettierignore @@ -0,0 +1,9 @@ +/node_modules +/dist +/test/fixture-projects/*/artifacts +/test/fixture-projects/*/cache +/coverage +/.nyc_output +/test/fixture-projects/*/deployments/*/artifacts +/test/fixture-projects/*/deployments/*/build-info + diff --git a/packages/hardhat-ignition/CHANGELOG.md b/packages/hardhat-ignition/CHANGELOG.md new file mode 100644 index 00000000000..7884f11de22 --- /dev/null +++ b/packages/hardhat-ignition/CHANGELOG.md @@ -0,0 +1,409 @@ +# Changelog + +## 0.15.11 + +### Patch Changes + +- 23280b8: Resolve all dependencies when using submodules in `after` + +## 0.15.10 + +### Patch Changes + +- d96c003: Fix for bug when we fail to save transaction hash + +## 0.15.9 - 2024-12-18 + +### Added + +- Standard Ignition UI can now be enabled when deploying via Hardhat scripts by setting `displayUi: true` in the `deploy` function options, @zoeyTM ([#843](https://github.com/NomicFoundation/hardhat-ignition/pull/843)) +- Ignition modules can now be set as a dependency in the `after` option of futures, @zoeyTM ([#828](https://github.com/NomicFoundation/hardhat-ignition/pull/828)) +- The `ignition transactions` command output will now include a link to view each transaction on the configured block explorer, @zoeyTM ([#849](https://github.com/NomicFoundation/hardhat-ignition/pull/849)) +- Module parameters can now be directly imported from a JSON file when deploying via Hardhat scripts by passing an absolute path to the file to the `parameters` option, @zoeyTM ([#850](https://github.com/NomicFoundation/hardhat-ignition/pull/850)) + +### Fixed + +- Properly handle errors when verifying deployments that use external artifacts, @zoeyTM ([#848](https://github.com/NomicFoundation/hardhat-ignition/pull/848)) +- Fix issue with `ignition status` command not working with deployments that use external artifacts, @zoeyTM ([#846](https://github.com/NomicFoundation/hardhat-ignition/pull/846)) + +## 0.15.8 - 2024-11-22 + +### Fixed + +- `transactions` command now properly serializes `bigint` values, @zoeyTM ([#837](https://github.com/NomicFoundation/hardhat-ignition/pull/837)) +- Additional validations added for global parameters, @kanej ([#832](https://github.com/NomicFoundation/hardhat-ignition/pull/832)) + +## 0.15.7 - 2024-10-24 + +### Added + +- New CLI command `ignition transactions` to list all transactions sent for a given deployment ID, @zoeyTM ([#821](https://github.com/NomicFoundation/hardhat-ignition/pull/821)) +- Module parameters can now be set at the global level using `$global`, @zoeyTM ([#819](https://github.com/NomicFoundation/hardhat-ignition/pull/819)) + +### Fixed + +- Gas fields are now properly set for Optimistic BNB, @zoeyTM ([#826](https://github.com/NomicFoundation/hardhat-ignition/pull/826)) +- Corrected resolution of artifacts when using fully qualified names in deployment modules, @kanej ([#822](https://github.com/NomicFoundation/hardhat-ignition/pull/822)) + +## 0.15.6 - 2024-09-25 + +### Added + +- Updates to the visualization UI, including the ability to zoom and pan the mermaid diagram ([#810](https://github.com/NomicFoundation/hardhat-ignition/pull/810)) +- `gasPrice` and `disableFeeBumping` config fields added as part of our L2 gas logic update ([#808](https://github.com/NomicFoundation/hardhat-ignition/pull/808)) +- Debug logging for communication errors with Hardhat Ledger ([#792](https://github.com/NomicFoundation/hardhat-ignition/pull/792)) +- JSON5 support for module parameters, thanks @erhant ([#800](https://github.com/NomicFoundation/hardhat-ignition/pull/800)) +- Add `writeLocalhostDeployment` flag to allow saving deployment artifacts when deploying to the ephemeral Hardhat network, thanks @SebastienGllmt ([#816](https://github.com/NomicFoundation/hardhat-ignition/pull/816)) + +### Fixed + +- Replace `this` with the class itself in `ViemIgnitionHelper`, thanks @iosh ([#796](https://github.com/NomicFoundation/hardhat-ignition/pull/796)) + +## 0.15.5 - 2024-06-17 + +### Added + +- New function `m.encodeFunctionCall` ([#761](https://github.com/NomicFoundation/hardhat-ignition/pull/761)) + +### Fixed + +- Adjusted regex to allow calling overloaded functions with array parameters ([#774](https://github.com/NomicFoundation/hardhat-ignition/pull/774)) +- Handle anvil response for `hardhat_setBalance` when deploying with create2 ([#773](https://github.com/NomicFoundation/hardhat-ignition/pull/773)) +- Properly resolve `verify` logic when dealing with circular or very deeply nested imports ([#772](https://github.com/NomicFoundation/hardhat-ignition/pull/772)) +- Exclude BNB Test Chain from zero fee configuration in gas fee logic, thanks @MukulKolpe ([#768](https://github.com/NomicFoundation/hardhat-ignition/pull/768)) + +## 0.15.4 - 2024-05-14 + +### Fixed + +- Reconcile address parameters with mismatched casings ([#748](https://github.com/NomicFoundation/hardhat-ignition/pull/748)) +- Display better error messages for insufficient funds ([#754](https://github.com/NomicFoundation/hardhat-ignition/pull/754)) + +## 0.15.3 - 2024-05-09 + +### Fixed + +- Exclude BNB Chain from zero fee configuration in gas fee logic, thanks @magicsih ([#755](https://github.com/NomicFoundation/hardhat-ignition/pull/755)) + +## 0.15.2 - 2024-05-02 + +### Added + +- Improved support for deploying via a Ledger Hardware wallet, [see our guide for details](https://hardhat.org/ignition/docs/guides/ledger) ([#720](https://github.com/NomicFoundation/hardhat-ignition/issues/720)) +- Support `maxPriorityFeePerGas` as a configuration parameter ([#728](https://github.com/NomicFoundation/hardhat-ignition/issues/728)) +- Use RPC call `eth_maxPriorityFeePerGas` in gas fee calculations when available ([#743](https://github.com/NomicFoundation/hardhat-ignition/issues/743)) +- Support zero gas fee chains (like private Besu chains), thanks @jimthematrix ([#730](https://github.com/NomicFoundation/hardhat-ignition/pull/730)) + +### Fixed + +- Use pre-EIP-1559 transactions for Polygon to avoid dropped transactions ([#735](https://github.com/NomicFoundation/hardhat-ignition/issues/735)) + +## 0.15.1 - 2024-04-04 + +### Added + +- Add a configurable upper limit for the maxFeePerGas ([#685](https://github.com/NomicFoundation/hardhat-ignition/issues/685)) +- Support writing and reading from deployments folder within tests and scripts ([#704](https://github.com/NomicFoundation/hardhat-ignition/pull/704)) +- Add `ignition deployments` task to list all the current deployments ([#646](https://github.com/NomicFoundation/hardhat-ignition/issues/646)) + +### Changed + +- Deploying to a cleared local hardhat node ignores previous deployment ([#650](https://github.com/NomicFoundation/hardhat-ignition/issues/650)) + +### Fixed + +- More resilent automine check ([#721](https://github.com/NomicFoundation/hardhat-ignition/issues/721)) +- `getCode` usage brought in line with Ethereum RPC standard ([#715](https://github.com/NomicFoundation/hardhat-ignition/issues/715)) +- Fixed unexpected next nonce on revert ([#676](https://github.com/NomicFoundation/hardhat-ignition/issues/676)) +- Reduce sources being passed to etherscan for verification ([#706](https://github.com/NomicFoundation/hardhat-ignition/issues/706)) + +## 0.15.0 - 2024-03-13 + +### Added + +- Support `create2` through strategies, for more details see [our `create2` guide](https://hardhat.org/ignition/docs/guides/create2). ([#629](https://github.com/NomicFoundation/hardhat-ignition/issues/629)) + +## 0.14.0 - 2024-02-21 + +### Added + +- Support BigInt values in Module Parameter files by encoding them as strings with the format /d+n/ ([#663](https://github.com/NomicFoundation/hardhat-ignition/issues/663)) + +## 0.13.2 - 2024-01-25 + +### Fixed + +- Add memory pool lookup retry to reduce errors from slow propogation ([#667](https://github.com/NomicFoundation/hardhat-ignition/pull/667)) + +### Added + +- Improve Module API typescript doc comments to enhance intellisense experience ([#642](https://github.com/NomicFoundation/hardhat-ignition/issues/642)) +- Support module parameters taking accounts as the default value ([673](https://github.com/NomicFoundation/hardhat-ignition/issues/673)) + +## 0.13.1 - 2023-12-19 + +### Added + +- New flag `--reset` for `ignition deploy` to wipe the existing deployment state before running ([#649](https://github.com/NomicFoundation/hardhat-ignition/issues/649)) + +### Fixed + +- Fix bug with `process.stdout` being used in a non-tty context ([#644](https://github.com/NomicFoundation/hardhat-ignition/issues/644)) + +## 0.13.0 - 2023-12-13 + +### Added + +- Add support for setting the default sender account from tests and scripts ([#639](https://github.com/NomicFoundation/hardhat-ignition/issues/639)) +- Add support for setting the default sender from the cli ([#620](https://github.com/NomicFoundation/hardhat-ignition/issues/620)) + +### Changed + +- Split out `ethers` support from `@nomicfoundation/hardhat-plugin`, to allow opting for either **ethers** or **Viem** in tests and scripts. If you were using `hre.ignition.deploy(...)` in tests or scripts you will need to install, and require in your Hardhat config, the `@nomicfoundation/hardhat-plugin-ethers` package. For more details on our [Viem support see our guide](https://hardhat.org/ignition/docs/guides/viem). ([#612](https://github.com/NomicFoundation/hardhat-ignition/pull/612)) + +## 0.12.0 - 2023-12-05 + +### Added + +- Add support for verification, see our [verification guide](https://hardhat.org/ignition/docs/guides/verify) for more information ([#630](https://github.com/NomicFoundation/hardhat-ignition/issues/630)) + +### Changed + +- Improved the error for fee exceeding block gas limit ([#594](https://github.com/NomicFoundation/hardhat-ignition/issues/594)) + +## 0.11.2 - 2023-11-06 + +### Added + +- Support account values in _send_ `to` in Module API ([#618](https://github.com/NomicFoundation/hardhat-ignition/issues/618)) +- Validation check for duplicate module ids ([#608](https://github.com/NomicFoundation/hardhat-ignition/issues/608)) + +### Fixed + +- Fix `ContractAt`s being recorded to `deployed_addresses.json` ([#607](https://github.com/NomicFoundation/hardhat-ignition/issues/607)) + +## 0.11.1 - 2023-10-30 + +### Added + +- Give visual indication that there was a gas bump in `deploy` task ([#587](https://github.com/NomicFoundation/hardhat-ignition/issues/587)) + +### Changed + +- When displaying an Ethereum Address at the cli, show in checksum format ([#600](https://github.com/NomicFoundation/hardhat-ignition/issues/600)) +- Show a better message when no futures were executed during a rerun ([#586](https://github.com/NomicFoundation/hardhat-ignition/issues/586)) +- Less confusing message for no modules folder error ([#602](https://github.com/NomicFoundation/hardhat-ignition/issues/602)) + +## 0.11.0 - 2023-10-23 + +First public launch 🚀 + +### Added + +- Display batching information in the visualize report ([#494](https://github.com/NomicFoundation/hardhat-ignition/issues/494)) +- Update styling of visualize report ([#493](https://github.com/NomicFoundation/hardhat-ignition/issues/493)) +- Expand Module API so value and from support staticCall/readEventArg as values ([#455](https://github.com/NomicFoundation/hardhat-ignition/issues/455)) +- Support fully qualified contract names ([#563](https://github.com/NomicFoundation/hardhat-ignition/pull/563)) + +### Changed + +- More compact command-line UI ([#495](https://github.com/NomicFoundation/hardhat-ignition/issues/495)) +- Ignition tasks are now scoped e.g. `npx hardhat ignition deploy` ([#442](https://github.com/NomicFoundation/hardhat-ignition/issues/442)) +- The `ignition-info` task has been renamed to `status`, and now shows the status of the current deployment not just the successes ([#496](https://github.com/NomicFoundation/hardhat-ignition/issues/496)) +- Modules now have to be inside a `modules` subfolder within the `./ignition` folder ([#511](https://github.com/NomicFoundation/hardhat-ignition/issues/511)) +- Import of `buildModule` now from `@nomicfoundation/hardhat-ignition/modules` ([#540](https://github.com/NomicFoundation/hardhat-ignition/issues/540)) +- A warning is displayed if you are running against an in-process hardhat network ([#553](https://github.com/NomicFoundation/hardhat-ignition/issues/553)) +- The default deployment id is now `chain-` ([#551](https://github.com/NomicFoundation/hardhat-ignition/issues/551)) +- The `contractAt` signature overload for artifact has been changed to match other artifact overload signatures ([#557](https://github.com/NomicFoundation/hardhat-ignition/issues/557)) + +### Fixed + +- Improve loading times for other non-ignition hh tasks, when Ignition is included ([#13](https://github.com/NomicFoundation/hardhat-ignition/issues/13)) +- Only open visualization report if supported ([#504](https://github.com/NomicFoundation/hardhat-ignition/issues/504)) +- Fixed nonce check failure on rerun ([#506](https://github.com/NomicFoundation/hardhat-ignition/issues/506)) +- Ensure future's senders meet nonce sync checks ([#411](https://github.com/NomicFoundation/hardhat-ignition/issues/411)) +- Show all deployed contracts at the end of a deployment ([#480](https://github.com/NomicFoundation/hardhat-ignition/issues/480)) +- Rerun blocked by sent transactions message IGN403 ([#574](https://github.com/NomicFoundation/hardhat-ignition/issues/574)) +- Rerun over multiple batches trigger error IGN405 ([#576](https://github.com/NomicFoundation/hardhat-ignition/issues/576)) + +## 0.4.0 - 2023-09-15 + +### Added + +- Advanced cli UI for deploy ([#401](https://github.com/NomicFoundation/ignition/pull/401)) +- Store artifact debug files as part of deployment directory ([#473](https://github.com/NomicFoundation/ignition/pull/473)) + +### Changed + +- Changed npm package name to `@nomicfoundation/hardhat-ignition` +- rename the `plan` task to `visualize` ([#471](https://github.com/NomicFoundation/ignition/pull/471)) +- Constrain module ids and action ids to better support storing deployments on windows ([#466](https://github.com/NomicFoundation/ignition/pull/466)) +- Rename `use-verbose` flag on `deploy` task to `simple-text-ui` ([#444](https://github.com/NomicFoundation/ignition/pull/444)) + +### Fixed + +- Fix batch completion on non-automining chains ([#467](https://github.com/NomicFoundation/ignition/pull/467)) + +## 0.3.0 - 2023-08-30 + +### Added + +- Support eip-1559 style transactions ([#8](https://github.com/NomicFoundation/ignition/issues/8)) +- Automatic gas bumping of transactions ([#294](https://github.com/NomicFoundation/ignition/issues/294)) +- Improve validation based on artifacts ([#390](https://github.com/NomicFoundation/ignition/issues/390)) + +### Changed + +- Switch peer dependency from ethers v5 to ethers v6 ([#338](https://github.com/NomicFoundation/ignition/issues/338)) +- Deprecate support for node 14, and add support for node 20 ([#370](https://github.com/NomicFoundation/ignition/issues/370)) + +## 0.2.0 - 2023-08-16 + +### Added + +- The execution config is now exposed through deploy and wired into the `hardhat-ignition` plugin config. + +### Fixed + +- Switch default deploy configurations depending on whether the current network is automined. + +## 0.1.2 - 2023-07-31 + +### Fixed + +- Fix validation error when using the result of a `staticCall` as the address of a `contractAt`/`contractAtFromArtifact` ([#354](https://github.com/NomicFoundation/ignition/issues/357)) +- Fix bug in `staticCall` execution logic preventing successful execution + +## 0.1.1 - 2023-07-30 + +### Fixed + +- Fix validation error when using the result of a `readEventArgument` as the address of a `contractAt`/`contractAtFromArtifact` ([#354](https://github.com/NomicFoundation/ignition/issues/354)) + +## 0.1.0 - 2023-07-27 + +### Added + +- Rerunning now uses a reconciliation phase to allow more leeway in changing a module between runs +- Deployments against real networks are recorded to `./ignition/deployments/`, including recording the deployed addresses and the artifacts (i.e. abi, build-info etc) used for each contract deploy + +### Changed + +- The _Module API_ has went through considerable restructuring, including _breaking changes_, please see the `./docs` for more details +- The plan task has been enhanced to give a module centric view rather than the lower level execution that was previously shown +- The _ui_ during a deployment has been reduced to showing the results, the full UI will be brought back in a coming release + +## 0.0.13 - 2023-04-18 + +### Added + +- Support static calls in the Module API ([#85](https://github.com/NomicFoundation/ignition/issues/85)) +- Add command, `ignition-info`, to list previously deployed contracts ([#111](https://github.com/NomicFoundation/ignition/issues/111)) + +## 0.0.12 - 2023-04-04 + +### Fixed + +- Support recursive types in `m.call` args ([#186](https://github.com/NomicFoundation/ignition/issues/186)) + +## 0.0.11 - 2023-03-29 + +### Changed + +- Replace `m.getBytesForArtifact("Foo")` with `m.getArtifact("Foo")` in the module api ([#155](https://github.com/NomicFoundation/ignition/issues/155)) + +### Fixed + +- Fix libraries in plan ([#131](https://github.com/NomicFoundation/ignition/issues/131)) + +## 0.0.10 - 2023-03-14 + +### Added + +- Make Hardhat network accounts available within modules ([#166](https://github.com/NomicFoundation/ignition/pull/166)) + +### Changed + +- Show file/line/column against validation errors, so that module problems can more easily be traced back to the source code ([#160](https://github.com/NomicFoundation/ignition/pull/160)) + +## 0.0.9 - 2023-03-02 + +### Added + +- Support defining modules in typescript ([#101](https://github.com/NomicFoundation/ignition/issues/101)) +- Allow rerunning deployment while ignoring journal history through a `--force` flag ([#132](https://github.com/NomicFoundation/ignition/issues/132)) + +### Changed + +- Do not ask for confirmation when deploying to a hardhat node ([#134](https://github.com/NomicFoundation/ignition/issues/134)) + +## 0.0.8 - 2023-02-16 + +### Added + +- Allow file paths to ignition modules on cli to support cli completions for file discovery ([#102](https://github.com/NomicFoundation/ignition/issues/102)) + +### Changed + +- Rename config option `gasIncrementPerRetry` to `gasPriceIncrementPerRetry` for clarity ([#143](https://github.com/NomicFoundation/ignition/pull/143)) + +### Fixed + +- Improve error messages display during module validation ([#141](https://github.com/NomicFoundation/ignition/issues/141)) +- Ban passing async functions to `buildModule` ([#138](https://github.com/NomicFoundation/ignition/issues/138)) + +## 0.0.7 - 2023-01-31 + +### Fixed + +- Resolve parameter args for deployed contracts during execution ([#125](https://github.com/NomicFoundation/ignition/pull/125)) + +## 0.0.6 - 2023-01-20 + +### Added + +- Support rerunning deployments that errored or went to on-hold on a previous run ([#70](https://github.com/NomicFoundation/ignition/pull/70)) +- Support sending `ETH` to a contract without having to make a call/deploy ([#79](https://github.com/NomicFoundation/ignition/pull/79)) +- Confirm dialog on deploys to non-hardhat networks ([#95](https://github.com/NomicFoundation/ignition/issues/95)) + +### Changed + +- Rename the `awaitEvent` action in the api to `event` ([#108](https://github.com/NomicFoundation/ignition/issues/108)) + +## 0.0.5 - 2022-12-20 + +### Added + +- Add params section to deploy display in cli ([#74](https://github.com/NomicFoundation/ignition/pull/74)) +- Expose config for pollingInterval ([#75](https://github.com/NomicFoundation/ignition/pull/75)) +- Support `getBytesForArtifact` in deployment api ([#76](https://github.com/NomicFoundation/ignition/pull/76)) +- Support use of emitted event args as futures for later deployment api calls ([#77](https://github.com/NomicFoundation/ignition/pull/77)) +- Support event params futures in `contractAt` ([#78](https://github.com/NomicFoundation/ignition/pull/78)) + +### Fixed + +- Fix for planning on modules with deploys from artifacts ([#73](https://github.com/NomicFoundation/ignition/pull/73)) + +## 0.0.4 - 2022-11-22 + +### Added + +- Support setting module params from JSON file ([#64](https://github.com/NomicFoundation/ignition/pull/64)) + +## 0.0.3 - 2022-11-09 + +### Added + +- Allow modules to depend on other calls ([#53](https://github.com/NomicFoundation/ignition/pull/53)) +- Allow depending on a module ([#54](https://github.com/NomicFoundation/ignition/pull/54)) + +### Changed + +- Dependening on returned module contract equivalent to depending on the module ([#55](https://github.com/NomicFoundation/ignition/pull/55)) + +## 0.0.2 - 2022-10-26 + +### Added + +- Add `deploy` task to hardhat via the plugin +- Add `plan` task to hardhat via the plugin diff --git a/packages/hardhat-ignition/README.md b/packages/hardhat-ignition/README.md new file mode 100644 index 00000000000..7acbb2377a5 --- /dev/null +++ b/packages/hardhat-ignition/README.md @@ -0,0 +1,65 @@ +![hardhat_Ignition_banner](https://github.com/NomicFoundation/hardhat-ignition/assets/24030/cc73227b-8791-4bb3-bc9a-a39be69d215f) [![npm](https://img.shields.io/npm/v/@nomicfoundation/hardhat-ignition.svg)](https://www.npmjs.com/package/@nomicfoundation/hardhat-ignition) [![hardhat](https://hardhat.org/buidler-plugin-badge.svg?1)](https://hardhat.org) [![Open in Dev Containers](https://img.shields.io/static/v1?label=Dev%20Containers&message=Open&color=blue&logo=visualstudiocode)](https://vscode.dev/redirect?url=vscode://ms-vscode-remote.remote-containers/cloneInVolume?url=https://github.com/NomicFoundation/hardhat-ignition.git) + +--- + +# Hardhat Ignition + +Hardhat Ignition is a declarative system for deploying smart contracts on Ethereum. It enables you to define smart contract instances you want to deploy, and any operation you want to run on them. By taking over the deployment and execution, Hardhat Ignition lets you focus on your project instead of getting caught up in the deployment details. + +Built by the [Nomic Foundation](https://nomic.foundation/) for the Ethereum community. + +Join the Hardhat Ignition channel of our [Hardhat Community Discord server](https://hardhat.org/ignition-discord) to stay up to date on new releases and tutorials. + +## Installation + +```bash +# ethers users +npm install --save-dev @nomicfoundation/hardhat-ignition-ethers + +# viem users +npm install --save-dev @nomicfoundation/hardhat-ignition-viem +``` + +Import the plugin in your `hardhat.config.js``: + +```js +// ethers users +require("@nomicfoundation/hardhat-ignition-ethers"); + +// viem users +require("@nomicfoundation/hardhat-ignition-viem"); +``` + +Or if you are using TypeScript, in your `hardhat.config.ts``: + +```js +// ethers users +import "@nomicfoundation/hardhat-ignition-ethers"; + +// viem users +import "@nomicfoundation/hardhat-ignition-viem"; +``` + +## Documentation + +On [Hardhat Ignition's website](https://hardhat.org/ignition) you will find guides for: + +- [Getting started](https://hardhat.org/ignition/docs/getting-started) +- [Creating Modules](https://hardhat.org/ignition/docs/guides/creating-modules) +- [Deploying a module](https://hardhat.org/ignition/docs/guides/deploy) +- [Visualizing your module](https://hardhat.org/ignition/docs/guides/visualize) +- [Handling errors](https://hardhat.org/ignition/docs/guides/error-handling) +- [Modifying an existing module](https://hardhat.org/ignition/docs/guides/modifications) +- [Using Hardhat Ignition in your tests](https://hardhat.org/ignition/docs/guides/tests) + +## Contributing + +Contributions are always welcome! Feel free to open any issue or send a pull request. + +Go to [CONTRIBUTING.md](https://github.com/NomicFoundation/hardhat-ignition/blob/main/CONTRIBUTING.md) to learn about how to set up Hardhat Ignition's development environment. + +## Feedback, help and news + +[Hardhat Ignition on Discord](https://hardhat.org/ignition-discord): for questions and feedback. + +Follow [Hardhat](https://twitter.com/HardhatHQ) and [Nomic Foundation](https://twitter.com/NomicFoundation) on Twitter. diff --git a/packages/hardhat-ignition/package.json b/packages/hardhat-ignition/package.json new file mode 100644 index 00000000000..d6c43c1f2e6 --- /dev/null +++ b/packages/hardhat-ignition/package.json @@ -0,0 +1,98 @@ +{ + "name": "@nomicfoundation/hardhat-ignition", + "version": "0.15.11", + "license": "MIT", + "author": "Nomic Foundation", + "homepage": "https://hardhat.org", + "description": "Hardhat Ignition is a declarative system for deploying smart contracts on Ethereum. It enables you to define smart contract instances you want to deploy, and any operation you want to run on them. By taking over the deployment and execution, Hardhat Ignition lets you focus on your project instead of getting caught up in the deployment details.", + "repository": "github:NomicFoundation/hardhat-ignition", + "keywords": [ + "ethereum", + "smart-contracts", + "hardhat", + "blockchain", + "dapps", + "tooling", + "solidity", + "deployment" + ], + "main": "dist/src/index.js", + "types": "dist/src/index.d.ts", + "exports": { + ".": "./dist/src/index.js", + "./modules": "./dist/src/modules.js", + "./helpers": "./dist/src/helpers.js" + }, + "typesVersions": { + "*": { + "modules": [ + "./dist/src/modules.d.ts" + ], + "helpers": [ + "./dist/src/helpers.d.ts" + ] + } + }, + "scripts": { + "prebuild": "pnpm run --dir ../hardhat-ignition-ui build", + "build": "tsc --build", + "lint": "pnpm prettier --check && pnpm eslint", + "lint:fix": "pnpm prettier --write && pnpm eslint --fix", + "eslint": "eslint \"src/**/*.{ts,tsx}\" \"test/**/*.{ts,tsx}\"", + "prettier": "prettier \"**/*.{js,ts,md,json}\"", + "test": "mocha --recursive \"test/**/*.ts\"", + "test:debug": "DEBUG='hardhat-ignition:*,ignition:*' pnpm test", + "test:coverage": "nyc mocha \"test/**/*.ts\"", + "test:build": "tsc --project ./test/", + "clean": "rimraf .nyc_output coverage dist tsconfig.tsbuildinfo ./test/fixture-projects/**/deployments ./test/fixture-projects/**/artifacts", + "prepack": "pnpm build" + }, + "devDependencies": { + "@istanbuljs/nyc-config-typescript": "1.0.2", + "@nomicfoundation/eslint-plugin-hardhat-internal-rules": "workspace:^", + "@nomicfoundation/hardhat-network-helpers": "workspace:^1.0.9", + "@nomicfoundation/hardhat-verify": "workspace:^2.0.1", + "@types/chai": "^4.2.22", + "@types/chai-as-promised": "^7.1.4", + "@types/debug": "^4.1.7", + "@types/fs-extra": "^9.0.13", + "@types/mocha": "9.1.1", + "@types/node": "^18.0.0", + "@types/prompts": "^2.4.2", + "@types/sinon": "^10.0.13", + "@typescript-eslint/eslint-plugin": "^5.57.1", + "@typescript-eslint/experimental-utils": "^5.62.0", + "@typescript-eslint/parser": "^5.57.1", + "chai": "^4.3.4", + "chai-as-promised": "7.1.1", + "eslint": "^8.38.0", + "eslint-config-prettier": "8.3.0", + "eslint-import-resolver-typescript": "^3.5.5", + "eslint-plugin-import": "2.29.0", + "eslint-plugin-mocha": "^9.0.0", + "eslint-plugin-no-only-tests": "3.1.0", + "eslint-plugin-prettier": "4.0.0", + "hardhat": "workspace:^2.18.0", + "mocha": "^9.1.3", + "nyc": "15.1.0", + "prettier": "2.8.8", + "rimraf": "3.0.2", + "sinon": "^14.0.0", + "ts-node": "10.9.1", + "typescript": "^5.0.2", + "viem": "^2.7.6" + }, + "peerDependencies": { + "@nomicfoundation/hardhat-verify": "workspace:^2.0.1", + "hardhat": "workspace:^2.18.0" + }, + "dependencies": { + "@nomicfoundation/ignition-core": "workspace:^", + "@nomicfoundation/ignition-ui": "workspace:^", + "chalk": "^4.0.0", + "debug": "^4.3.2", + "fs-extra": "^10.0.0", + "prompts": "^2.4.2", + "json5": "^2.2.3" + } +} diff --git a/packages/hardhat-ignition/src/hardhat-artifact-resolver.ts b/packages/hardhat-ignition/src/hardhat-artifact-resolver.ts new file mode 100644 index 00000000000..0b22d189987 --- /dev/null +++ b/packages/hardhat-ignition/src/hardhat-artifact-resolver.ts @@ -0,0 +1,75 @@ +import { + Artifact, + ArtifactResolver, + BuildInfo, +} from "@nomicfoundation/ignition-core"; +import fs from "fs"; +import { HardhatPluginError } from "hardhat/plugins"; +import { HardhatRuntimeEnvironment } from "hardhat/types"; +import path from "path"; + +export class HardhatArtifactResolver implements ArtifactResolver { + constructor(private _hre: HardhatRuntimeEnvironment) {} + + public async getBuildInfo( + contractName: string + ): Promise { + // If a fully qualified name is used, we can can + // leverage the artifact manager directly to load the build + // info. + if (this._isFullyQualifiedName(contractName)) { + return this._hre.artifacts.getBuildInfo(contractName); + } + + // Otherwise we have only the contract name, and need to + // resolve the artifact for the contract ourselves. + // We can build on the assumption that the contract name + // is unique based on Module validation. + const artifactPath = await this._resolvePath(contractName); + + if (artifactPath === undefined) { + throw new HardhatPluginError( + "hardhat-ignition", + `Artifact path not found for ${contractName}` + ); + } + + const debugPath = artifactPath.replace(".json", ".dbg.json"); + const debugJson = await fs.promises.readFile(debugPath); + + const buildInfoPath = path.join( + path.parse(debugPath).dir, + JSON.parse(debugJson.toString()).buildInfo + ); + + const buildInfoJson = await fs.promises.readFile(buildInfoPath); + + return JSON.parse(buildInfoJson.toString()); + } + + private async _resolvePath( + contractName: string + ): Promise { + const artifactPaths = await this._hre.artifacts.getArtifactPaths(); + + const artifactPath = artifactPaths.find( + (p) => path.parse(p).name === contractName + ); + + return artifactPath; + } + + public loadArtifact(contractName: string): Promise { + return this._hre.artifacts.readArtifact(contractName); + } + + /** + * Returns true if a name is fully qualified, and not just a bare contract name. + * + * This is based on Hardhat's own test for fully qualified names, taken + * from `contract-names.ts` in `hardhat-core` utils. + */ + private _isFullyQualifiedName(contractName: string): boolean { + return contractName.includes(":"); + } +} diff --git a/packages/hardhat-ignition/src/helpers.ts b/packages/hardhat-ignition/src/helpers.ts new file mode 100644 index 00000000000..aa85a0adc81 --- /dev/null +++ b/packages/hardhat-ignition/src/helpers.ts @@ -0,0 +1,5 @@ +export { HardhatArtifactResolver } from "./hardhat-artifact-resolver"; +export { errorDeploymentResultToExceptionMessage } from "./utils/error-deployment-result-to-exception-message"; +export { resolveDeploymentId } from "./utils/resolve-deployment-id"; +export { PrettyEventHandler } from "./ui/pretty-event-handler"; +export { readDeploymentParameters } from "./utils/read-deployment-parameters"; diff --git a/packages/hardhat-ignition/src/index.ts b/packages/hardhat-ignition/src/index.ts new file mode 100644 index 00000000000..912f49f0e2c --- /dev/null +++ b/packages/hardhat-ignition/src/index.ts @@ -0,0 +1,815 @@ +import "@nomicfoundation/hardhat-verify"; +import { Etherscan } from "@nomicfoundation/hardhat-verify/etherscan"; +import { + DeploymentParameters, + IgnitionError, + ListTransactionsResult, + StatusResult, +} from "@nomicfoundation/ignition-core"; +import debug from "debug"; +import { ensureDir, pathExists, readdirSync, rm, writeJSON } from "fs-extra"; +import { extendConfig, extendEnvironment, scope } from "hardhat/config"; +import { NomicLabsHardhatPluginError } from "hardhat/plugins"; +import { parse as json5Parse } from "json5"; +import path from "path"; + +import "./type-extensions"; +import { calculateDeploymentStatusDisplay } from "./ui/helpers/calculate-deployment-status-display"; +import { bigintReviver } from "./utils/bigintReviver"; +import { getApiKeyAndUrls } from "./utils/getApiKeyAndUrls"; +import { readDeploymentParameters } from "./utils/read-deployment-parameters"; +import { resolveDeploymentId } from "./utils/resolve-deployment-id"; +import { shouldBeHardhatPluginError } from "./utils/shouldBeHardhatPluginError"; +import { verifyEtherscanContract } from "./utils/verifyEtherscanContract"; + +/* ignition config defaults */ +const IGNITION_DIR = "ignition"; + +const ignitionScope = scope( + "ignition", + "Deploy your smart contracts using Hardhat Ignition" +); + +const log = debug("hardhat:ignition"); + +extendConfig((config, userConfig) => { + /* setup path configs */ + const userPathsConfig = userConfig.paths ?? {}; + + config.paths = { + ...config.paths, + ignition: path.resolve( + config.paths.root, + userPathsConfig.ignition ?? IGNITION_DIR + ), + }; + + Object.keys(config.networks).forEach((networkName) => { + const userNetworkConfig = userConfig.networks?.[networkName] ?? {}; + + config.networks[networkName].ignition = { + maxFeePerGasLimit: userNetworkConfig.ignition?.maxFeePerGasLimit, + maxPriorityFeePerGas: userNetworkConfig.ignition?.maxPriorityFeePerGas, + gasPrice: userNetworkConfig.ignition?.gasPrice, + disableFeeBumping: userNetworkConfig.ignition?.disableFeeBumping, + explorerUrl: userNetworkConfig.ignition?.explorerUrl, + }; + }); + + /* setup core configs */ + const userIgnitionConfig = userConfig.ignition ?? {}; + + config.ignition = userIgnitionConfig; +}); + +/** + * Add an `ignition` stub to throw + */ +extendEnvironment((hre) => { + if ((hre as any).ignition === undefined) { + (hre as any).ignition = { + type: "stub", + deploy: () => { + throw new NomicLabsHardhatPluginError( + "hardhat-ignition", + "Please install either `@nomicfoundation/hardhat-ignition-viem` or `@nomicfoundation/hardhat-ignition-ethers` to use Ignition in your Hardhat tests" + ); + }, + }; + } +}); + +ignitionScope + .task("deploy") + .addPositionalParam("modulePath", "The path to the module file to deploy") + .addOptionalParam( + "parameters", + "A relative path to a JSON file to use for the module parameters" + ) + .addOptionalParam("deploymentId", "Set the id of the deployment") + .addOptionalParam( + "defaultSender", + "Set the default sender for the deployment" + ) + .addOptionalParam("strategy", "Set the deployment strategy to use", "basic") + .addFlag("reset", "Wipes the existing deployment state before deploying") + .addFlag("verify", "Verify the deployment on Etherscan") + .addFlag( + "writeLocalhostDeployment", + "Write deployment information to disk when deploying to the in-memory network" + ) + .setDescription("Deploy a module to the specified network") + .setAction( + async ( + { + modulePath, + parameters: parametersInput, + deploymentId: givenDeploymentId, + defaultSender, + reset, + verify, + strategy: strategyName, + writeLocalhostDeployment, + }: { + modulePath: string; + parameters?: string; + deploymentId: string | undefined; + defaultSender: string | undefined; + reset: boolean; + verify: boolean; + strategy: string; + writeLocalhostDeployment: boolean; + }, + hre + ) => { + const { default: chalk } = await import("chalk"); + const { default: Prompt } = await import("prompts"); + const { deploy } = await import("@nomicfoundation/ignition-core"); + + const { HardhatArtifactResolver } = await import( + "./hardhat-artifact-resolver" + ); + const { loadModule } = await import("./utils/load-module"); + const { PrettyEventHandler } = await import("./ui/pretty-event-handler"); + + if (verify) { + if ( + hre.config.etherscan === undefined || + hre.config.etherscan.apiKey === undefined || + hre.config.etherscan.apiKey === "" + ) { + throw new NomicLabsHardhatPluginError( + "@nomicfoundation/hardhat-ignition", + "No etherscan API key configured" + ); + } + } + + const chainId = Number( + await hre.network.provider.request({ + method: "eth_chainId", + }) + ); + + const deploymentId = resolveDeploymentId(givenDeploymentId, chainId); + + const deploymentDir = + hre.network.name === "hardhat" && !writeLocalhostDeployment + ? undefined + : path.join(hre.config.paths.ignition, "deployments", deploymentId); + if (chainId !== 31337) { + if (process.env.HARDHAT_IGNITION_CONFIRM_DEPLOYMENT === undefined) { + const prompt = await Prompt({ + type: "confirm", + name: "networkConfirmation", + message: `Confirm deploy to network ${hre.network.name} (${chainId})?`, + initial: false, + }); + + if (prompt.networkConfirmation !== true) { + console.log("Deploy cancelled"); + return; + } + } + + if (reset && process.env.HARDHAT_IGNITION_CONFIRM_RESET === undefined) { + const resetPrompt = await Prompt({ + type: "confirm", + name: "resetConfirmation", + message: `Confirm reset of deployment "${deploymentId}" on chain ${chainId}?`, + initial: false, + }); + + if (resetPrompt.resetConfirmation !== true) { + console.log("Deploy cancelled"); + return; + } + } + } else if (deploymentDir !== undefined) { + // since we're on hardhat-network + // check for a previous run of this deploymentId and compare instanceIds + // if they're different, wipe deployment state + const instanceFilePath = path.join( + hre.config.paths.cache, + ".hardhat-network-instances.json" + ); + const instanceFileExists = await pathExists(instanceFilePath); + + const instanceFile: { + [deploymentId: string]: string; + } = instanceFileExists ? require(instanceFilePath) : {}; + + const metadata = (await hre.network.provider.request({ + method: "hardhat_metadata", + })) as { instanceId: string }; + + if (instanceFile[deploymentId] !== metadata.instanceId) { + await rm(deploymentDir, { recursive: true, force: true }); + } + + // save current instanceId to instanceFile for future runs + instanceFile[deploymentId] = metadata.instanceId; + await ensureDir(path.dirname(instanceFilePath)); + await writeJSON(instanceFilePath, instanceFile, { spaces: 2 }); + } + + if (reset) { + if (deploymentDir === undefined) { + throw new NomicLabsHardhatPluginError( + "@nomicfoundation/hardhat-ignition", + "Deploy cancelled: Cannot reset deployment on ephemeral Hardhat network" + ); + } else { + await rm(deploymentDir, { recursive: true, force: true }); + } + } + + if (strategyName !== "basic" && strategyName !== "create2") { + throw new NomicLabsHardhatPluginError( + "hardhat-ignition", + "Invalid strategy name, must be either 'basic' or 'create2'" + ); + } + + await hre.run("compile", { quiet: true }); + + const userModule = loadModule(hre.config.paths.ignition, modulePath); + + if (userModule === undefined) { + throw new NomicLabsHardhatPluginError( + "@nomicfoundation/hardhat-ignition", + "No Ignition modules found" + ); + } + + let parameters: DeploymentParameters | undefined; + if (parametersInput === undefined) { + parameters = await resolveParametersFromModuleName( + userModule.id, + hre.config.paths.ignition + ); + } else if ( + parametersInput.endsWith(".json") || + parametersInput.endsWith(".json5") + ) { + parameters = await resolveParametersFromFileName(parametersInput); + } else { + parameters = resolveParametersString(parametersInput); + } + + const accounts = (await hre.network.provider.request({ + method: "eth_accounts", + })) as string[]; + + const artifactResolver = new HardhatArtifactResolver(hre); + + const executionEventListener = new PrettyEventHandler(); + + const strategyConfig = hre.config.ignition.strategyConfig?.[strategyName]; + + try { + const ledgerConnectionStart = () => + executionEventListener.ledgerConnectionStart(); + const ledgerConnectionSuccess = () => + executionEventListener.ledgerConnectionSuccess(); + const ledgerConnectionFailure = () => + executionEventListener.ledgerConnectionFailure(); + const ledgerConfirmationStart = () => + executionEventListener.ledgerConfirmationStart(); + const ledgerConfirmationSuccess = () => + executionEventListener.ledgerConfirmationSuccess(); + const ledgerConfirmationFailure = () => + executionEventListener.ledgerConfirmationFailure(); + + try { + await hre.network.provider.send("hardhat_setLedgerOutputEnabled", [ + false, + ]); + + hre.network.provider.once("connection_start", ledgerConnectionStart); + hre.network.provider.once( + "connection_success", + ledgerConnectionSuccess + ); + hre.network.provider.once( + "connection_failure", + ledgerConnectionFailure + ); + hre.network.provider.on( + "confirmation_start", + ledgerConfirmationStart + ); + hre.network.provider.on( + "confirmation_success", + ledgerConfirmationSuccess + ); + hre.network.provider.on( + "confirmation_failure", + ledgerConfirmationFailure + ); + } catch (error) { + log(error); + } + + const result = await deploy({ + config: hre.config.ignition, + provider: hre.network.provider, + executionEventListener, + artifactResolver, + deploymentDir, + ignitionModule: userModule, + deploymentParameters: parameters ?? {}, + accounts, + defaultSender, + strategy: strategyName, + strategyConfig, + maxFeePerGasLimit: + hre.config.networks[hre.network.name]?.ignition.maxFeePerGasLimit, + maxPriorityFeePerGas: + hre.config.networks[hre.network.name]?.ignition + .maxPriorityFeePerGas, + gasPrice: hre.config.networks[hre.network.name]?.ignition.gasPrice, + disableFeeBumping: + hre.config.ignition.disableFeeBumping ?? + hre.config.networks[hre.network.name]?.ignition.disableFeeBumping, + }); + + try { + await hre.network.provider.send("hardhat_setLedgerOutputEnabled", [ + true, + ]); + + hre.network.provider.off("connection_start", ledgerConnectionStart); + hre.network.provider.off( + "connection_success", + ledgerConnectionSuccess + ); + hre.network.provider.off( + "connection_failure", + ledgerConnectionFailure + ); + hre.network.provider.off( + "confirmation_start", + ledgerConfirmationStart + ); + hre.network.provider.off( + "confirmation_success", + ledgerConfirmationSuccess + ); + hre.network.provider.off( + "confirmation_failure", + ledgerConfirmationFailure + ); + } catch (error) { + log(error); + } + + if (result.type === "SUCCESSFUL_DEPLOYMENT" && verify) { + console.log(""); + console.log(chalk.bold("Verifying deployed contracts")); + console.log(""); + + await hre.run( + { scope: "ignition", task: "verify" }, + { deploymentId } + ); + } + + if (result.type !== "SUCCESSFUL_DEPLOYMENT") { + process.exitCode = 1; + } + } catch (e) { + if (e instanceof IgnitionError && shouldBeHardhatPluginError(e)) { + throw new NomicLabsHardhatPluginError( + "hardhat-ignition", + e.message, + e + ); + } + + throw e; + } + } + ); + +ignitionScope + .task("track-tx") + .addPositionalParam("txHash", "The hash of the transaction to track") + .addPositionalParam( + "deploymentId", + "The id of the deployment to add the tx to" + ) + .setDescription( + "Track a transaction that is missing from a given deployment. Only use if a Hardhat Ignition error message suggests to do so." + ) + .setAction( + async ( + { txHash, deploymentId }: { txHash: string; deploymentId: string }, + hre + ) => { + const { trackTransaction } = await import( + "@nomicfoundation/ignition-core" + ); + + const deploymentDir = path.join( + hre.config.paths.ignition, + "deployments", + deploymentId + ); + + let output: string | void; + try { + output = await trackTransaction( + deploymentDir, + txHash, + hre.network.provider, + hre.config.ignition.requiredConfirmations + ); + } catch (e) { + if (e instanceof IgnitionError && shouldBeHardhatPluginError(e)) { + throw new NomicLabsHardhatPluginError( + "hardhat-ignition", + e.message, + e + ); + } + + throw e; + } + + console.log( + output ?? + `Thanks for providing the transaction hash, your deployment has been fixed. + +Now you can re-run Hardhat Ignition to continue with your deployment.` + ); + } + ); + +ignitionScope + .task("visualize") + .addFlag("noOpen", "Disables opening report in browser") + .addPositionalParam("modulePath", "The path to the module file to visualize") + .setDescription("Visualize a module as an HTML report") + .setAction( + async ( + { noOpen = false, modulePath }: { noOpen: boolean; modulePath: string }, + hre + ) => { + const { IgnitionModuleSerializer, batches } = await import( + "@nomicfoundation/ignition-core" + ); + + const { loadModule } = await import("./utils/load-module"); + const { open } = await import("./utils/open"); + + const { writeVisualization } = await import( + "./visualization/write-visualization" + ); + + await hre.run("compile", { quiet: true }); + + const userModule = loadModule(hre.config.paths.ignition, modulePath); + + if (userModule === undefined) { + throw new NomicLabsHardhatPluginError( + "@nomicfoundation/hardhat-ignition", + "No Ignition modules found" + ); + } else { + try { + const serializedIgnitionModule = + IgnitionModuleSerializer.serialize(userModule); + + const batchInfo = batches(userModule); + + await writeVisualization( + { module: serializedIgnitionModule, batches: batchInfo }, + { + cacheDir: hre.config.paths.cache, + } + ); + } catch (e) { + if (e instanceof IgnitionError && shouldBeHardhatPluginError(e)) { + throw new NomicLabsHardhatPluginError( + "hardhat-ignition", + e.message, + e + ); + } + + throw e; + } + } + + if (!noOpen) { + const indexFile = path.join( + hre.config.paths.cache, + "visualization", + "index.html" + ); + + console.log(`Deployment visualization written to ${indexFile}`); + + open(indexFile); + } + } + ); + +ignitionScope + .task("status") + .addPositionalParam("deploymentId", "The id of the deployment to show") + .setDescription("Show the current status of a deployment") + .setAction(async ({ deploymentId }: { deploymentId: string }, hre) => { + const { status } = await import("@nomicfoundation/ignition-core"); + + const { HardhatArtifactResolver } = await import( + "./hardhat-artifact-resolver" + ); + + const deploymentDir = path.join( + hre.config.paths.ignition, + "deployments", + deploymentId + ); + + const artifactResolver = new HardhatArtifactResolver(hre); + + let statusResult: StatusResult; + try { + statusResult = await status(deploymentDir, artifactResolver); + } catch (e) { + if (e instanceof IgnitionError && shouldBeHardhatPluginError(e)) { + throw new NomicLabsHardhatPluginError("hardhat-ignition", e.message, e); + } + + throw e; + } + + console.log(calculateDeploymentStatusDisplay(deploymentId, statusResult)); + }); + +ignitionScope + .task("deployments") + .setDescription("List all deployment IDs") + .setAction(async (_, hre) => { + const { listDeployments } = await import("@nomicfoundation/ignition-core"); + + const deploymentDir = path.join(hre.config.paths.ignition, "deployments"); + + try { + const deployments = await listDeployments(deploymentDir); + + for (const deploymentId of deployments) { + console.log(deploymentId); + } + } catch (e) { + if (e instanceof IgnitionError && shouldBeHardhatPluginError(e)) { + throw new NomicLabsHardhatPluginError("hardhat-ignition", e.message, e); + } + + throw e; + } + }); + +ignitionScope + .task("wipe") + .addPositionalParam( + "deploymentId", + "The id of the deployment with the future to wipe" + ) + .addPositionalParam("futureId", "The id of the future to wipe") + .setDescription("Reset a deployment's future to allow rerunning") + .setAction( + async ( + { deploymentId, futureId }: { deploymentId: string; futureId: string }, + hre + ) => { + const { wipe } = await import("@nomicfoundation/ignition-core"); + + const { HardhatArtifactResolver } = await import( + "./hardhat-artifact-resolver" + ); + + const deploymentDir = path.join( + hre.config.paths.ignition, + "deployments", + deploymentId + ); + + try { + await wipe(deploymentDir, new HardhatArtifactResolver(hre), futureId); + } catch (e) { + if (e instanceof IgnitionError && shouldBeHardhatPluginError(e)) { + throw new NomicLabsHardhatPluginError( + "hardhat-ignition", + e.message, + e + ); + } + + throw e; + } + + console.log(`${futureId} state has been cleared`); + } + ); + +ignitionScope + .task("verify") + .addFlag( + "includeUnrelatedContracts", + "Include all compiled contracts in the verification" + ) + .addPositionalParam("deploymentId", "The id of the deployment to verify") + .setDescription( + "Verify contracts from a deployment against the configured block explorers" + ) + .setAction( + async ( + { + deploymentId, + includeUnrelatedContracts = false, + }: { deploymentId: string; includeUnrelatedContracts: boolean }, + hre + ) => { + const { getVerificationInformation } = await import( + "@nomicfoundation/ignition-core" + ); + + const deploymentDir = path.join( + hre.config.paths.ignition, + "deployments", + deploymentId + ); + + if ( + hre.config.etherscan === undefined || + hre.config.etherscan.apiKey === undefined || + hre.config.etherscan.apiKey === "" + ) { + throw new NomicLabsHardhatPluginError( + "@nomicfoundation/hardhat-ignition", + "No etherscan API key configured" + ); + } + + try { + for await (const [ + chainConfig, + contractInfo, + ] of getVerificationInformation( + deploymentDir, + hre.config.etherscan.customChains, + includeUnrelatedContracts + )) { + if (chainConfig === null) { + console.log( + `Could not resolve contract artifacts for contract "${contractInfo}". Skipping verification.` + ); + console.log(""); + continue; + } + + const apiKeyAndUrls = getApiKeyAndUrls( + hre.config.etherscan.apiKey, + chainConfig + ); + + const instance = new Etherscan(...apiKeyAndUrls); + + console.log( + `Verifying contract "${contractInfo.name}" for network ${chainConfig.network}...` + ); + + const result = await verifyEtherscanContract(instance, contractInfo); + + if (result.type === "success") { + console.log( + `Successfully verified contract "${contractInfo.name}" for network ${chainConfig.network}:\n - ${result.contractURL}` + ); + console.log(""); + } else { + if (/already verified/gi.test(result.reason.message)) { + const contractURL = instance.getContractUrl(contractInfo.address); + console.log( + `Contract ${contractInfo.name} already verified on network ${chainConfig.network}:\n - ${contractURL}` + ); + console.log(""); + continue; + } else { + if (!includeUnrelatedContracts) { + throw new NomicLabsHardhatPluginError( + "hardhat-ignition", + `Verification failed. Please run \`hardhat ignition verify ${deploymentId} --include-unrelated-contracts\` to attempt verifying all contracts.` + ); + } else { + throw new NomicLabsHardhatPluginError( + "hardhat-ignition", + result.reason.message + ); + } + } + } + } + } catch (e) { + if (e instanceof IgnitionError && shouldBeHardhatPluginError(e)) { + throw new NomicLabsHardhatPluginError( + "hardhat-ignition", + e.message, + e + ); + } + + throw e; + } + } + ); + +ignitionScope + .task("transactions") + .addPositionalParam( + "deploymentId", + "The id of the deployment to show transactions for" + ) + .setDescription("Show all transactions for a given deployment") + .setAction(async ({ deploymentId }: { deploymentId: string }, hre) => { + const { listTransactions } = await import("@nomicfoundation/ignition-core"); + + const { HardhatArtifactResolver } = await import( + "./hardhat-artifact-resolver" + ); + const { calculateListTransactionsDisplay } = await import( + "./ui/helpers/calculate-list-transactions-display" + ); + + const deploymentDir = path.join( + hre.config.paths.ignition, + "deployments", + deploymentId + ); + + const artifactResolver = new HardhatArtifactResolver(hre); + + let listTransactionsResult: ListTransactionsResult; + try { + listTransactionsResult = await listTransactions( + deploymentDir, + artifactResolver + ); + } catch (e) { + if (e instanceof IgnitionError && shouldBeHardhatPluginError(e)) { + throw new NomicLabsHardhatPluginError("hardhat-ignition", e.message, e); + } + + throw e; + } + + console.log( + calculateListTransactionsDisplay( + deploymentId, + listTransactionsResult, + hre.config.networks[hre.network.name]?.ignition?.explorerUrl + ) + ); + }); + +async function resolveParametersFromModuleName( + moduleName: string, + ignitionPath: string +): Promise { + const files = readdirSync(ignitionPath); + const configFilename = `${moduleName}.config.json`; + + return files.includes(configFilename) + ? readDeploymentParameters(path.resolve(ignitionPath, configFilename)) + : undefined; +} + +async function resolveParametersFromFileName( + fileName: string +): Promise { + const filepath = path.resolve(process.cwd(), fileName); + + return readDeploymentParameters(filepath); +} + +function resolveParametersString(paramString: string): DeploymentParameters { + try { + return json5Parse(paramString, bigintReviver); + } catch (e) { + if (e instanceof NomicLabsHardhatPluginError) { + throw e; + } + + if (e instanceof Error) { + throw new NomicLabsHardhatPluginError( + "@nomicfoundation/hardhat-ignition", + "Could not parse JSON parameters", + e + ); + } + + throw e; + } +} diff --git a/packages/hardhat-ignition/src/modules.ts b/packages/hardhat-ignition/src/modules.ts new file mode 100644 index 00000000000..840e207281a --- /dev/null +++ b/packages/hardhat-ignition/src/modules.ts @@ -0,0 +1 @@ +export { buildModule } from "@nomicfoundation/ignition-core"; diff --git a/packages/hardhat-ignition/src/type-extensions.ts b/packages/hardhat-ignition/src/type-extensions.ts new file mode 100644 index 00000000000..3a0c6cda8e1 --- /dev/null +++ b/packages/hardhat-ignition/src/type-extensions.ts @@ -0,0 +1,67 @@ +/* eslint-disable import/no-unused-modules */ +import "hardhat/types/config"; +import "hardhat/types/runtime"; + +import { DeployConfig, StrategyConfig } from "@nomicfoundation/ignition-core"; + +declare module "hardhat/types/config" { + export interface ProjectPathsUserConfig { + ignition?: string; + } + + export interface ProjectPathsConfig { + ignition: string; + } + + export interface HardhatNetworkUserConfig { + ignition?: { + maxFeePerGasLimit?: bigint; + maxPriorityFeePerGas?: bigint; + gasPrice?: bigint; + disableFeeBumping?: boolean; + explorerUrl?: string; + }; + } + + export interface HardhatNetworkConfig { + ignition: { + maxFeePerGasLimit?: bigint; + maxPriorityFeePerGas?: bigint; + gasPrice?: bigint; + disableFeeBumping?: boolean; + explorerUrl?: string; + }; + } + + export interface HttpNetworkUserConfig { + ignition?: { + maxFeePerGasLimit?: bigint; + maxPriorityFeePerGas?: bigint; + gasPrice?: bigint; + disableFeeBumping?: boolean; + explorerUrl?: string; + }; + } + + export interface HttpNetworkConfig { + ignition: { + maxFeePerGasLimit?: bigint; + maxPriorityFeePerGas?: bigint; + gasPrice?: bigint; + disableFeeBumping?: boolean; + explorerUrl?: string; + }; + } + + export interface HardhatUserConfig { + ignition?: Partial & { + strategyConfig?: Partial; + }; + } + + export interface HardhatConfig { + ignition: Partial & { + strategyConfig?: Partial; + }; + } +} diff --git a/packages/hardhat-ignition/src/ui/helpers/calculate-batch-display.ts b/packages/hardhat-ignition/src/ui/helpers/calculate-batch-display.ts new file mode 100644 index 00000000000..f5fcb2d4c89 --- /dev/null +++ b/packages/hardhat-ignition/src/ui/helpers/calculate-batch-display.ts @@ -0,0 +1,53 @@ +import { UiFuture, UiFutureStatusType, UiState } from "../types"; + +export function calculateBatchDisplay(state: UiState): { + text: string; + height: number; +} { + const batch = state.batches[state.currentBatch - 1]; + const height = batch.length + (state.ledgerMessageIsDisplayed ? 4 : 2); + + let text = `Batch #${state.currentBatch}\n`; + + text += batch + .sort((a, b) => a.futureId.localeCompare(b.futureId)) + .map((v) => _futureStatus(v, state.gasBumps, state.maxFeeBumps)) + .join("\n"); + + text += "\n"; + + if (state.ledger) { + text += `\n Ledger: ${state.ledgerMessage}\n`; + } + + return { text, height }; +} + +function _futureStatus( + future: UiFuture, + gasBumps: Record, + maxFeeBumps: number +): string { + switch (future.status.type) { + case UiFutureStatusType.UNSTARTED: { + const gas = gasBumps[future.futureId]; + return ` Executing ${future.futureId}${ + gas !== undefined + ? ` - bumping gas fee (${gas}/${maxFeeBumps})...` + : "..." + }`; + } + case UiFutureStatusType.SUCCESS: { + return ` Executed ${future.futureId}`; + } + case UiFutureStatusType.TIMEDOUT: { + return ` Timed out ${future.futureId}`; + } + case UiFutureStatusType.ERRORED: { + return ` Failed ${future.futureId}`; + } + case UiFutureStatusType.HELD: { + return ` Held ${future.futureId}`; + } + } +} diff --git a/packages/hardhat-ignition/src/ui/helpers/calculate-deploying-module-panel.ts b/packages/hardhat-ignition/src/ui/helpers/calculate-deploying-module-panel.ts new file mode 100644 index 00000000000..638b1b8b99a --- /dev/null +++ b/packages/hardhat-ignition/src/ui/helpers/calculate-deploying-module-panel.ts @@ -0,0 +1,48 @@ +import chalk from "chalk"; + +import { UiState } from "../types"; + +import { pathFromCwd } from "./cwd-relative-path"; + +export function calculateDeployingModulePanel(state: UiState): string { + let deployingMessage = `Hardhat Ignition 🚀 + +`; + + if (state.isResumed === true) { + deployingMessage += `${chalk.bold( + `Resuming existing deployment from ${pathFromCwd(state.deploymentDir!)}` + )} + +`; + } + + deployingMessage += `${chalk.bold( + `Deploying [ ${state.moduleName ?? "unknown"} ]${_calculateStrategySuffix( + state + )}` + )} +`; + + if (state.warnings.length > 0) { + deployingMessage += `\n${chalk.yellow( + "Warning - previously executed futures are not in the module:" + )}\n`; + + deployingMessage += state.warnings + .map((futureId) => chalk.yellow(` - ${futureId}`)) + .join("\n"); + + deployingMessage += "\n"; + } + + return deployingMessage; +} + +function _calculateStrategySuffix(state: UiState) { + if (state.strategy === "basic") { + return ""; + } + + return ` with strategy ${state.strategy ?? "unknown"}`; +} diff --git a/packages/hardhat-ignition/src/ui/helpers/calculate-deployment-complete-display.ts b/packages/hardhat-ignition/src/ui/helpers/calculate-deployment-complete-display.ts new file mode 100644 index 00000000000..dfb457d6acc --- /dev/null +++ b/packages/hardhat-ignition/src/ui/helpers/calculate-deployment-complete-display.ts @@ -0,0 +1,201 @@ +import { + DeploymentCompleteEvent, + DeploymentResultType, + ExecutionErrorDeploymentResult, + PreviousRunErrorDeploymentResult, + ReconciliationErrorDeploymentResult, + SuccessfulDeploymentResult, + ValidationErrorDeploymentResult, +} from "@nomicfoundation/ignition-core"; +import chalk from "chalk"; + +import { UiState } from "../types"; + +import { pathFromCwd } from "./cwd-relative-path"; +import { wasAnythingExecuted } from "./was-anything-executed"; + +export function calculateDeploymentCompleteDisplay( + event: DeploymentCompleteEvent, + uiState: Pick< + UiState, + "moduleName" | "isResumed" | "batches" | "deploymentDir" + > +): string { + const moduleName = uiState.moduleName ?? "unknown"; + const isResumed = uiState.isResumed ?? false; + + switch (event.result.type) { + case DeploymentResultType.SUCCESSFUL_DEPLOYMENT: { + const isRerunWithNoChanges: boolean = + isResumed && !wasAnythingExecuted(uiState); + + return _displaySuccessfulDeployment(event.result, { + moduleName, + isRerunWithNoChanges, + deploymentDir: uiState.deploymentDir, + }); + } + case DeploymentResultType.VALIDATION_ERROR: { + return _displayValidationErrors(event.result, { moduleName }); + } + case DeploymentResultType.RECONCILIATION_ERROR: { + return _displayReconciliationErrors(event.result, { moduleName }); + } + case DeploymentResultType.PREVIOUS_RUN_ERROR: { + return _displayPreviousRunErrors(event.result, { moduleName }); + } + case DeploymentResultType.EXECUTION_ERROR: { + return _displayExecutionErrors(event.result, { moduleName }); + } + } +} + +function _displaySuccessfulDeployment( + result: SuccessfulDeploymentResult, + { + moduleName, + isRerunWithNoChanges, + deploymentDir, + }: { + moduleName: string; + isRerunWithNoChanges: boolean; + deploymentDir: string | null | undefined; + } +): string { + const fillerText = isRerunWithNoChanges + ? `Nothing new to deploy based on previous execution stored in ${pathFromCwd( + deploymentDir ?? "Not provided" + )}` + : `successfully deployed 🚀`; + + let text = `[ ${moduleName} ] ${fillerText} + +${chalk.bold("Deployed Addresses")} + +`; + + const deployedContracts = Object.values(result.contracts); + + if (deployedContracts.length > 0) { + text += deployedContracts + .map((contract) => `${contract.id} - ${contract.address}`) + .join("\n"); + } else { + text += `${chalk.italic("No contracts were deployed")}`; + } + + return text; +} + +function _displayValidationErrors( + result: ValidationErrorDeploymentResult, + { moduleName }: { moduleName: string } +): string { + let text = `[ ${moduleName} ] validation failed ⛔ + +The module contains futures that would fail to execute: + +`; + + text += Object.entries(result.errors) + .map(([futureId, errors]) => { + let futureSection = `${futureId}:\n`; + + futureSection += errors.map((error) => ` - ${error}`).join("\n"); + + return futureSection; + }) + .join("\n\n"); + + text += `\n\nUpdate the invalid futures and rerun the deployment.`; + + return text; +} + +function _displayReconciliationErrors( + result: ReconciliationErrorDeploymentResult, + { moduleName }: { moduleName: string } +): string { + let text = `[ ${moduleName} ] reconciliation failed ⛔ + +The module contains changes to executed futures: + +`; + + text += Object.entries(result.errors) + .map(([futureId, errors]) => { + let errorSection = `${futureId}:\n`; + + errorSection += errors.map((error) => ` - ${error}`).join("\n"); + + return errorSection; + }) + .join("\n\n"); + + text += `\n\nConsider modifying your module to remove the inconsistencies with deployed futures.`; + + return text; +} + +function _displayPreviousRunErrors( + result: PreviousRunErrorDeploymentResult, + { moduleName }: { moduleName: string } +): string { + let text = `[ ${moduleName} ] deployment cancelled ⛔\n\n`; + + text += `These futures failed or timed out on a previous run:\n`; + + text += Object.keys(result.errors) + .map((futureId) => ` - ${futureId}`) + .join("\n"); + + text += `\n\nUse the ${chalk.italic("wipe")} task to reset them.`; + + return text; +} + +function _displayExecutionErrors( + result: ExecutionErrorDeploymentResult, + { moduleName }: { moduleName: string } +) { + const sections: string[] = []; + + let text = `[ ${moduleName} ] failed ⛔\n\n`; + + if (result.timedOut.length > 0) { + let timedOutSection = `Futures timed out with transactions unconfirmed after maximum fee bumps:\n`; + + timedOutSection += Object.values(result.timedOut) + .map(({ futureId }) => ` - ${futureId}`) + .join("\n"); + + sections.push(timedOutSection); + } + + if (result.failed.length > 0) { + let failedSection = `Futures failed during execution:\n`; + + failedSection += Object.values(result.failed) + .map(({ futureId, error }) => ` - ${futureId}: ${error}`) + .join("\n"); + + failedSection += + "\n\nTo learn how to handle these errors: https://hardhat.org/ignition-errors"; + + sections.push(failedSection); + } + + if (result.held.length > 0) { + let heldSection = `Held:\n`; + + heldSection += Object.values(result.held) + .map(({ futureId, reason }) => ` - ${futureId}: ${reason}`) + .join("\n"); + + sections.push(heldSection); + } + + text += sections.join("\n\n"); + + return text; +} diff --git a/packages/hardhat-ignition/src/ui/helpers/calculate-deployment-status-display.ts b/packages/hardhat-ignition/src/ui/helpers/calculate-deployment-status-display.ts new file mode 100644 index 00000000000..49c461e1749 --- /dev/null +++ b/packages/hardhat-ignition/src/ui/helpers/calculate-deployment-status-display.ts @@ -0,0 +1,95 @@ +import { StatusResult } from "@nomicfoundation/ignition-core"; +import chalk from "chalk"; + +export function calculateDeploymentStatusDisplay( + deploymentId: string, + statusResult: StatusResult +): string { + if (statusResult.started.length > 0) { + return _calculateStartedButUnfinished(deploymentId, statusResult); + } + + if ( + statusResult.timedOut.length > 0 || + statusResult.failed.length > 0 || + statusResult.held.length > 0 + ) { + return _calculateFailed(deploymentId, statusResult); + } + + return _calculateSuccess(deploymentId, statusResult); +} + +function _calculateSuccess(deploymentId: string, statusResult: StatusResult) { + let successText = `Deployment ${deploymentId} (chainId: ${statusResult.chainId}) was successful\n\n`; + + if (Object.values(statusResult.contracts).length === 0) { + successText += chalk.italic("No contracts were deployed"); + } else { + successText += `${chalk.bold("Deployed Addresses")}\n\n`; + + successText += Object.values(statusResult.contracts) + .map((contract) => `${contract.id} - ${contract.address}`) + .join("\n"); + } + + return successText; +} + +function _calculateStartedButUnfinished( + deploymentId: string, + statusResult: StatusResult +) { + let startedText = `Deployment ${deploymentId} (chainId: ${statusResult.chainId}) has futures that have started but not completed\n\n`; + + startedText += Object.values(statusResult.started) + .map((futureId) => ` - ${futureId}`) + .join("\n"); + + startedText += "\n\nPlease rerun your deployment."; + + return startedText; +} + +function _calculateFailed(deploymentId: string, statusResult: StatusResult) { + let failedExecutionText = `Deployment ${deploymentId} (chainId: ${statusResult.chainId}) failed\n`; + + const sections: string[] = []; + + if (statusResult.timedOut.length > 0) { + let timedOutSection = `\nFutures timed out with transactions unconfirmed after maximum fee bumps:\n`; + + timedOutSection += Object.values(statusResult.timedOut) + .map(({ futureId }) => ` - ${futureId}`) + .join("\n"); + + sections.push(timedOutSection); + } + + if (statusResult.failed.length > 0) { + let failedSection = `\nFutures failed during execution:\n`; + + failedSection += Object.values(statusResult.failed) + .map(({ futureId, error }) => ` - ${futureId}: ${error}`) + .join("\n"); + + failedSection += + "\n\nTo learn how to handle these errors: https://hardhat.org/ignition-errors"; + + sections.push(failedSection); + } + + if (statusResult.held.length > 0) { + let heldSection = `\nFutures where held by the strategy:\n`; + + heldSection += Object.values(statusResult.held) + .map(({ futureId, reason }) => ` - ${futureId}: ${reason}`) + .join("\n"); + + sections.push(heldSection); + } + + failedExecutionText += sections.join("\n"); + + return failedExecutionText; +} diff --git a/packages/hardhat-ignition/src/ui/helpers/calculate-list-transactions-display.ts b/packages/hardhat-ignition/src/ui/helpers/calculate-list-transactions-display.ts new file mode 100644 index 00000000000..4bb9c839d29 --- /dev/null +++ b/packages/hardhat-ignition/src/ui/helpers/calculate-list-transactions-display.ts @@ -0,0 +1,89 @@ +import { ListTransactionsResult } from "@nomicfoundation/ignition-core"; +import { NomicLabsHardhatPluginError } from "hardhat/plugins"; +import { stringify } from "json5"; + +export function calculateListTransactionsDisplay( + deploymentId: string, + listTransactionsResult: ListTransactionsResult, + configUrl?: string +): string { + let text = `Logging transactions for deployment ${deploymentId}\n\n`; + + for (const [index, transaction] of listTransactionsResult.entries()) { + const txLink = getTransactionLink( + transaction.txHash, + configUrl ?? transaction.browserUrl + ); + + text += `Transaction ${index + 1}${txLink === undefined ? "" : txLink}:\n`; + text += ` - Type: ${transactionTypeToDisplayType(transaction.type)}\n`; + text += ` - Status: ${transaction.status}\n`; + text += ` - TxHash: ${transaction.txHash}\n`; + text += ` - From: ${transaction.from}\n`; + + if (transaction.to !== undefined) { + text += ` - To: ${transaction.to}\n`; + } + + if (transaction.name !== undefined) { + text += ` - Name: ${transaction.name}\n`; + } + + if (transaction.address !== undefined) { + text += ` - Address: ${transaction.address}\n`; + } + + if (transaction.params !== undefined) { + text += ` - Params: ${stringify( + transaction.params, + transactionDisplaySerializeReplacer + )}\n`; + } + + if (transaction.value !== undefined) { + text += ` - Value: '${transaction.value}n'\n`; + } + + text += "\n"; + } + + return text; +} + +function transactionTypeToDisplayType(type: string): string { + switch (type) { + case "DEPLOYMENT_EXECUTION_STATE": + return "Contract Deployment"; + case "CALL_EXECUTION_STATE": + return "Function Call"; + case "SEND_DATA_EXECUTION_STATE": + return "Generic Transaction"; + default: + throw new NomicLabsHardhatPluginError( + "hardhat-ignition", + `Unknown transaction type: ${type}` + ); + } +} + +export function transactionDisplaySerializeReplacer( + _key: string, + value: unknown +) { + if (typeof value === "bigint") { + return `${value}n`; + } + + return value; +} + +function getTransactionLink( + txHash: string, + browserURL?: string +): string | undefined { + if (browserURL === undefined) { + return undefined; + } + + return `\x1b]8;;${browserURL}/tx/${txHash}\x1b\\ (🔗 view on block explorer)\x1b]8;;\x1b\\`; +} diff --git a/packages/hardhat-ignition/src/ui/helpers/calculate-starting-message.ts b/packages/hardhat-ignition/src/ui/helpers/calculate-starting-message.ts new file mode 100644 index 00000000000..a199fe6f562 --- /dev/null +++ b/packages/hardhat-ignition/src/ui/helpers/calculate-starting-message.ts @@ -0,0 +1,30 @@ +import chalk from "chalk"; + +/** + * Display the temporary starting message. Note this does not print a newline. + * + * @param state - the UI state + */ +export function calculateStartingMessage({ + moduleName, + deploymentDir, +}: { + moduleName: string | null; + deploymentDir: string | undefined | null; +}): string { + const warningMessage = chalk.yellow( + chalk.bold( + `You are running Hardhat Ignition against an in-process instance of Hardhat Network. +This will execute the deployment, but the results will be lost. +You can use --network to deploy to a different network.` + ) + ); + + const startingMessage = `Hardhat Ignition starting for [ ${ + moduleName ?? "unknown" + } ]...`; + + return deploymentDir === undefined + ? `${warningMessage}\n\n${startingMessage}` + : startingMessage; +} diff --git a/packages/hardhat-ignition/src/ui/helpers/cwd-relative-path.ts b/packages/hardhat-ignition/src/ui/helpers/cwd-relative-path.ts new file mode 100644 index 00000000000..ed6eeee0135 --- /dev/null +++ b/packages/hardhat-ignition/src/ui/helpers/cwd-relative-path.ts @@ -0,0 +1,12 @@ +import path from "path"; +import process from "process"; + +export function pathFromCwd(thePath: string): string { + const cwd = process.cwd(); + + if (thePath.startsWith(cwd)) { + return `.${path.sep}${path.relative(process.cwd(), thePath)}`; + } + + return thePath; +} diff --git a/packages/hardhat-ignition/src/ui/helpers/was-anything-executed.ts b/packages/hardhat-ignition/src/ui/helpers/was-anything-executed.ts new file mode 100644 index 00000000000..f81919113d9 --- /dev/null +++ b/packages/hardhat-ignition/src/ui/helpers/was-anything-executed.ts @@ -0,0 +1,11 @@ +import { UiState } from "../types"; + +/** + * Was anything executed during the deployment. We determine this based + * on whether the batcher indicates that there was at least one batch. + */ +export function wasAnythingExecuted({ + batches, +}: Pick): boolean { + return batches.length > 0; +} diff --git a/packages/hardhat-ignition/src/ui/pretty-event-handler.ts b/packages/hardhat-ignition/src/ui/pretty-event-handler.ts new file mode 100644 index 00000000000..a5d7070fe4e --- /dev/null +++ b/packages/hardhat-ignition/src/ui/pretty-event-handler.ts @@ -0,0 +1,568 @@ +import { + BatchInitializeEvent, + BeginNextBatchEvent, + CallExecutionStateCompleteEvent, + CallExecutionStateInitializeEvent, + ContractAtExecutionStateInitializeEvent, + DeploymentCompleteEvent, + DeploymentExecutionStateCompleteEvent, + DeploymentExecutionStateInitializeEvent, + DeploymentInitializeEvent, + DeploymentParameters, + DeploymentResult, + DeploymentResultType, + DeploymentStartEvent, + EncodeFunctionCallExecutionStateInitializeEvent, + ExecutionEventListener, + ExecutionEventResult, + ExecutionEventResultType, + NetworkInteractionRequestEvent, + OnchainInteractionBumpFeesEvent, + OnchainInteractionDroppedEvent, + OnchainInteractionReplacedByUserEvent, + OnchainInteractionTimeoutEvent, + ReadEventArgExecutionStateInitializeEvent, + ReconciliationWarningsEvent, + RunStartEvent, + SendDataExecutionStateCompleteEvent, + SendDataExecutionStateInitializeEvent, + SetModuleIdEvent, + SetStrategyEvent, + StaticCallCompleteEvent, + StaticCallExecutionStateCompleteEvent, + StaticCallExecutionStateInitializeEvent, + TransactionConfirmEvent, + TransactionSendEvent, + WipeApplyEvent, +} from "@nomicfoundation/ignition-core"; +import readline from "readline"; + +import { calculateBatchDisplay } from "./helpers/calculate-batch-display"; +import { calculateDeployingModulePanel } from "./helpers/calculate-deploying-module-panel"; +import { calculateDeploymentCompleteDisplay } from "./helpers/calculate-deployment-complete-display"; +import { calculateStartingMessage } from "./helpers/calculate-starting-message"; +import { wasAnythingExecuted } from "./helpers/was-anything-executed"; +import { + UiBatches, + UiFuture, + UiFutureErrored, + UiFutureHeld, + UiFutureStatus, + UiFutureStatusType, + UiFutureSuccess, + UiState, + UiStateDeploymentStatus, +} from "./types"; + +export class PrettyEventHandler implements ExecutionEventListener { + private _uiState: UiState = { + status: UiStateDeploymentStatus.UNSTARTED, + chainId: null, + moduleName: null, + deploymentDir: null, + batches: [], + currentBatch: 0, + result: null, + warnings: [], + isResumed: null, + maxFeeBumps: 0, + disableFeeBumping: null, + gasBumps: {}, + strategy: null, + ledger: false, + ledgerMessage: "", + ledgerMessageIsDisplayed: false, + }; + + constructor( + private _deploymentParams: DeploymentParameters = {}, + private _disableOutput = false + ) {} + + public get state(): UiState { + return this._uiState; + } + + public set state(uiState: UiState) { + this._uiState = uiState; + } + + public deploymentStart(event: DeploymentStartEvent): void { + this.state = { + ...this.state, + status: UiStateDeploymentStatus.DEPLOYING, + moduleName: event.moduleName, + deploymentDir: event.deploymentDir, + isResumed: event.isResumed, + maxFeeBumps: event.maxFeeBumps, + disableFeeBumping: event.disableFeeBumping, + }; + + process.stdout.write(calculateStartingMessage(this.state)); + } + + public deploymentInitialize(event: DeploymentInitializeEvent): void { + this.state = { + ...this.state, + chainId: event.chainId, + }; + } + + public runStart(_event: RunStartEvent): void { + this._clearCurrentLine(); + console.log(calculateDeployingModulePanel(this.state)); + } + + public beginNextBatch(_event: BeginNextBatchEvent): void { + // rerender the previous batch + if (this.state.currentBatch > 0) { + this._redisplayCurrentBatch(); + } + + this.state = { + ...this.state, + currentBatch: this.state.currentBatch + 1, + }; + + if (this.state.currentBatch === 0) { + return; + } + + // render the new batch + console.log(calculateBatchDisplay(this.state).text); + } + + public wipeApply(event: WipeApplyEvent): void { + const batches: UiBatches = []; + + for (const batch of this.state.batches) { + const futureBatch: UiFuture[] = []; + + for (const future of batch) { + if (future.futureId === event.futureId) { + continue; + } else { + futureBatch.push(future); + } + } + + batches.push(futureBatch); + } + + this.state = { + ...this.state, + batches, + }; + } + + public deploymentExecutionStateInitialize( + event: DeploymentExecutionStateInitializeEvent + ): void { + this._setFutureStatusInitializedAndRedisplayBatch(event); + } + + public deploymentExecutionStateComplete( + event: DeploymentExecutionStateCompleteEvent + ): void { + this._setFutureStatusCompleteAndRedisplayBatch(event); + } + + public callExecutionStateInitialize( + event: CallExecutionStateInitializeEvent + ): void { + this._setFutureStatusInitializedAndRedisplayBatch(event); + } + + public callExecutionStateComplete( + event: CallExecutionStateCompleteEvent + ): void { + this._setFutureStatusCompleteAndRedisplayBatch(event); + } + + public staticCallExecutionStateInitialize( + event: StaticCallExecutionStateInitializeEvent + ): void { + this._setFutureStatusInitializedAndRedisplayBatch(event); + } + + public staticCallExecutionStateComplete( + event: StaticCallExecutionStateCompleteEvent + ): void { + this._setFutureStatusCompleteAndRedisplayBatch(event); + } + + public sendDataExecutionStateInitialize( + event: SendDataExecutionStateInitializeEvent + ): void { + this._setFutureStatusInitializedAndRedisplayBatch(event); + } + + public sendDataExecutionStateComplete( + event: SendDataExecutionStateCompleteEvent + ): void { + this._setFutureStatusCompleteAndRedisplayBatch(event); + } + + public contractAtExecutionStateInitialize( + event: ContractAtExecutionStateInitializeEvent + ): void { + this._setFutureStatusAndRedisplayBatch(event.futureId, { + type: UiFutureStatusType.SUCCESS, + }); + } + + public readEventArgumentExecutionStateInitialize( + event: ReadEventArgExecutionStateInitializeEvent + ): void { + this._setFutureStatusAndRedisplayBatch(event.futureId, { + type: UiFutureStatusType.SUCCESS, + }); + } + + public encodeFunctionCallExecutionStateInitialize( + event: EncodeFunctionCallExecutionStateInitializeEvent + ): void { + this._setFutureStatusAndRedisplayBatch(event.futureId, { + type: UiFutureStatusType.SUCCESS, + }); + } + + public batchInitialize(event: BatchInitializeEvent): void { + const batches: UiBatches = []; + + for (const batch of event.batches) { + const futureBatch: UiFuture[] = []; + + for (const futureId of batch) { + futureBatch.push({ + futureId, + status: { + type: UiFutureStatusType.UNSTARTED, + }, + }); + } + + batches.push(futureBatch); + } + + this.state = { + ...this.state, + batches, + }; + } + + public networkInteractionRequest( + _event: NetworkInteractionRequestEvent + ): void {} + + public transactionSend(_event: TransactionSendEvent): void {} + + public transactionConfirm(_event: TransactionConfirmEvent): void {} + + public staticCallComplete(_event: StaticCallCompleteEvent): void {} + + public onchainInteractionBumpFees( + event: OnchainInteractionBumpFeesEvent + ): void { + if (this._uiState.gasBumps[event.futureId] === undefined) { + this._uiState.gasBumps[event.futureId] = 0; + } + + this._uiState.gasBumps[event.futureId] += 1; + + this._redisplayCurrentBatch(); + } + + public onchainInteractionDropped( + _event: OnchainInteractionDroppedEvent + ): void {} + + public onchainInteractionReplacedByUser( + _event: OnchainInteractionReplacedByUserEvent + ): void {} + + public onchainInteractionTimeout( + _event: OnchainInteractionTimeoutEvent + ): void {} + + public deploymentComplete(event: DeploymentCompleteEvent): void { + this.state = { + ...this.state, + status: UiStateDeploymentStatus.COMPLETE, + result: event.result, + batches: this._applyResultToBatches(this.state.batches, event.result), + }; + + // If batches where executed, rerender the last batch + if (wasAnythingExecuted(this.state)) { + this._redisplayCurrentBatch(); + } else { + // Otherwise only the completion panel will be shown so clear + // the Starting Ignition line. + this._clearCurrentLine(); + } + + console.log(calculateDeploymentCompleteDisplay(event, this.state)); + } + + public reconciliationWarnings(event: ReconciliationWarningsEvent): void { + this.state = { + ...this.state, + warnings: [...this.state.warnings, ...event.warnings], + }; + } + + public setModuleId(event: SetModuleIdEvent): void { + this.state = { + ...this.state, + moduleName: event.moduleName, + }; + } + + public setStrategy(event: SetStrategyEvent): void { + this.state = { + ...this.state, + strategy: event.strategy, + }; + } + + public ledgerConnectionStart(): void { + this.state = { + ...this.state, + ledger: true, + ledgerMessage: "Connecting wallet", + }; + + this._redisplayCurrentBatch(); + + this.state = { + ...this.state, + ledgerMessageIsDisplayed: true, + }; + } + + public ledgerConnectionSuccess(): void { + this.state = { + ...this.state, + ledgerMessage: "Wallet connected", + }; + + this._redisplayCurrentBatch(); + } + + public ledgerConnectionFailure(): void { + this.state = { + ...this.state, + ledgerMessage: "Wallet connection failed", + }; + + this._redisplayCurrentBatch(); + } + + public ledgerConfirmationStart(): void { + this.state = { + ...this.state, + ledger: true, + ledgerMessage: "Waiting for confirmation on device", + }; + + this._redisplayCurrentBatch(); + + this.state = { + ...this.state, + ledgerMessageIsDisplayed: true, + }; + } + + public ledgerConfirmationSuccess(): void { + this.state = { + ...this.state, + ledgerMessage: "Transaction approved by device", + }; + + this._redisplayCurrentBatch(); + + this.state = { + ...this.state, + ledger: false, + }; + } + + public ledgerConfirmationFailure(): void { + this.state = { + ...this.state, + ledgerMessage: "Transaction confirmation failed", + }; + + this._redisplayCurrentBatch(); + } + + private _setFutureStatusInitializedAndRedisplayBatch({ + futureId, + }: { + futureId: string; + }) { + this._setFutureStatusAndRedisplayBatch(futureId, { + type: UiFutureStatusType.UNSTARTED, + }); + } + + private _setFutureStatusCompleteAndRedisplayBatch({ + futureId, + result, + }: { + futureId: string; + result: ExecutionEventResult; + }) { + this._setFutureStatusAndRedisplayBatch( + futureId, + this._getFutureStatusFromEventResult(result) + ); + + this.state = { + ...this.state, + ledgerMessageIsDisplayed: false, + }; + } + + private _setFutureStatusAndRedisplayBatch( + futureId: string, + status: UiFutureStatus + ) { + const updatedFuture: UiFuture = { + futureId, + status, + }; + + this.state = { + ...this.state, + batches: this._applyUpdateToBatchFuture(updatedFuture), + }; + + this._redisplayCurrentBatch(); + } + + private _applyUpdateToBatchFuture(updatedFuture: UiFuture): UiBatches { + const batches: UiBatches = []; + + for (const batch of this.state.batches) { + const futureBatch: UiFuture[] = []; + + for (const future of batch) { + if (future.futureId === updatedFuture.futureId) { + futureBatch.push(updatedFuture); + } else { + futureBatch.push(future); + } + } + + batches.push(futureBatch); + } + + return batches; + } + + private _getFutureStatusFromEventResult( + result: ExecutionEventResult + ): UiFutureSuccess | UiFutureErrored | UiFutureHeld { + switch (result.type) { + case ExecutionEventResultType.SUCCESS: { + return { + type: UiFutureStatusType.SUCCESS, + result: result.result, + }; + } + case ExecutionEventResultType.ERROR: { + return { + type: UiFutureStatusType.ERRORED, + message: result.error, + }; + } + case ExecutionEventResultType.HELD: { + return { + type: UiFutureStatusType.HELD, + heldId: result.heldId, + reason: result.reason, + }; + } + } + } + + private _applyResultToBatches( + batches: UiBatches, + result: DeploymentResult + ): UiBatches { + const newBatches: UiBatches = []; + + for (const oldBatch of batches) { + const newBatch = []; + for (const future of oldBatch) { + const updatedFuture = this._hasUpdatedResult(future.futureId, result); + + newBatch.push(updatedFuture ?? future); + } + + newBatches.push(newBatch); + } + + return newBatches; + } + + private _hasUpdatedResult( + futureId: string, + result: DeploymentResult + ): UiFuture | null { + if (result.type !== DeploymentResultType.EXECUTION_ERROR) { + return null; + } + + const failed = result.failed.find((f) => f.futureId === futureId); + + if (failed !== undefined) { + const f: UiFuture = { + futureId, + status: { + type: UiFutureStatusType.ERRORED, + message: failed.error, + }, + }; + + return f; + } + + const timedout = result.timedOut.find((f) => f.futureId === futureId); + + if (timedout !== undefined) { + const f: UiFuture = { + futureId, + status: { + type: UiFutureStatusType.TIMEDOUT, + }, + }; + + return f; + } + + return null; + } + + private _redisplayCurrentBatch() { + if (!this._disableOutput) { + const { height, text: batch } = calculateBatchDisplay(this.state); + + this._clearUpToHeight(height); + + console.log(batch); + } + } + + private _clearCurrentLine(): void { + readline.clearLine(process.stdout, 0); + readline.cursorTo(process.stdout, 0); + } + + private _clearUpToHeight(height: number) { + readline.moveCursor(process.stdout, 0, -height); + readline.clearScreenDown(process.stdout); + } +} diff --git a/packages/hardhat-ignition/src/ui/types.ts b/packages/hardhat-ignition/src/ui/types.ts new file mode 100644 index 00000000000..1eb6a1563de --- /dev/null +++ b/packages/hardhat-ignition/src/ui/types.ts @@ -0,0 +1,76 @@ +import { DeploymentResult } from "@nomicfoundation/ignition-core"; + +export enum UiFutureStatusType { + UNSTARTED = "UNSTARTED", + SUCCESS = "SUCCESS", + TIMEDOUT = "TIMEDOUT", + ERRORED = "ERRORED", + HELD = "HELD", +} + +export enum UiStateDeploymentStatus { + UNSTARTED = "UNSTARTED", + DEPLOYING = "DEPLOYING", + COMPLETE = "COMPLETE", +} + +export interface UiFutureUnstarted { + type: UiFutureStatusType.UNSTARTED; +} + +export interface UiFutureSuccess { + type: UiFutureStatusType.SUCCESS; + result?: string; +} + +export interface UiFutureTimedOut { + type: UiFutureStatusType.TIMEDOUT; +} + +export interface UiFutureErrored { + type: UiFutureStatusType.ERRORED; + message: string; +} + +export interface UiFutureHeld { + type: UiFutureStatusType.HELD; + heldId: number; + reason: string; +} + +export type UiFutureStatus = + | UiFutureUnstarted + | UiFutureSuccess + | UiFutureTimedOut + | UiFutureErrored + | UiFutureHeld; + +export interface UiFuture { + status: UiFutureStatus; + futureId: string; +} + +export type UiBatches = UiFuture[][]; + +export interface UiState { + status: UiStateDeploymentStatus; + chainId: number | null; + moduleName: string | null; + deploymentDir: string | undefined | null; + batches: UiBatches; + currentBatch: number; + result: DeploymentResult | null; + warnings: string[]; + isResumed: boolean | null; + maxFeeBumps: number; + gasBumps: Record; + disableFeeBumping: boolean | null; + strategy: string | null; + ledger: boolean; + ledgerMessage: string; + ledgerMessageIsDisplayed: boolean; +} + +export interface AddressMap { + [label: string]: string; +} diff --git a/packages/hardhat-ignition/src/ui/verbose-event-handler.ts b/packages/hardhat-ignition/src/ui/verbose-event-handler.ts new file mode 100644 index 00000000000..ad1491a4f5e --- /dev/null +++ b/packages/hardhat-ignition/src/ui/verbose-event-handler.ts @@ -0,0 +1,287 @@ +import { + BatchInitializeEvent, + BeginNextBatchEvent, + CallExecutionStateCompleteEvent, + CallExecutionStateInitializeEvent, + ContractAtExecutionStateInitializeEvent, + DeploymentCompleteEvent, + DeploymentExecutionStateCompleteEvent, + DeploymentExecutionStateInitializeEvent, + DeploymentInitializeEvent, + DeploymentStartEvent, + EncodeFunctionCallExecutionStateInitializeEvent, + ExecutionEventListener, + ExecutionEventNetworkInteractionType, + ExecutionEventResultType, + NetworkInteractionRequestEvent, + OnchainInteractionBumpFeesEvent, + OnchainInteractionDroppedEvent, + OnchainInteractionReplacedByUserEvent, + OnchainInteractionTimeoutEvent, + ReadEventArgExecutionStateInitializeEvent, + ReconciliationWarningsEvent, + RunStartEvent, + SendDataExecutionStateCompleteEvent, + SendDataExecutionStateInitializeEvent, + SetModuleIdEvent, + SetStrategyEvent, + StaticCallCompleteEvent, + StaticCallExecutionStateCompleteEvent, + StaticCallExecutionStateInitializeEvent, + TransactionConfirmEvent, + TransactionSendEvent, + WipeApplyEvent, +} from "@nomicfoundation/ignition-core"; + +export class VerboseEventHandler implements ExecutionEventListener { + public deploymentInitialize(event: DeploymentInitializeEvent): void { + console.log(`Deployment initialized for chainId: ${event.chainId}`); + } + + public wipeApply(event: WipeApplyEvent): void { + console.log(`Removing the execution of future ${event.futureId}`); + } + + public deploymentExecutionStateInitialize( + event: DeploymentExecutionStateInitializeEvent + ): void { + console.log(`Starting to execute the deployment future ${event.futureId}`); + } + + public deploymentExecutionStateComplete( + event: DeploymentExecutionStateCompleteEvent + ): void { + switch (event.result.type) { + case ExecutionEventResultType.SUCCESS: { + return console.log( + `Successfully completed the execution of deployment future ${ + event.futureId + } with address ${event.result.result ?? "undefined"}` + ); + } + case ExecutionEventResultType.ERROR: { + return console.log( + `Execution of future ${event.futureId} failed with reason: ${event.result.error}` + ); + } + case ExecutionEventResultType.HELD: { + return console.log( + `Execution of future ${event.futureId}/${event.result.heldId} held with reason: ${event.result.reason}` + ); + } + } + } + + public callExecutionStateInitialize( + event: CallExecutionStateInitializeEvent + ): void { + console.log(`Starting to execute the call future ${event.futureId}`); + } + + public callExecutionStateComplete( + event: CallExecutionStateCompleteEvent + ): void { + switch (event.result.type) { + case ExecutionEventResultType.SUCCESS: { + return console.log( + `Successfully completed the execution of call future ${event.futureId}` + ); + } + case ExecutionEventResultType.ERROR: { + return console.log( + `Execution of call future ${event.futureId} failed with reason: ${event.result.error}` + ); + } + case ExecutionEventResultType.HELD: { + return console.log( + `Execution of call future ${event.futureId}/${event.result.heldId} held with reason: ${event.result.reason}` + ); + } + } + } + + public staticCallExecutionStateInitialize( + event: StaticCallExecutionStateInitializeEvent + ): void { + console.log(`Starting to execute the static call future ${event.futureId}`); + } + + public staticCallExecutionStateComplete( + event: StaticCallExecutionStateCompleteEvent + ): void { + switch (event.result.type) { + case ExecutionEventResultType.SUCCESS: { + return console.log( + `Successfully completed the execution of static call future ${ + event.futureId + } with result ${event.result.result ?? "undefined"}` + ); + } + case ExecutionEventResultType.ERROR: { + return console.log( + `Execution of static call future ${event.futureId} failed with reason: ${event.result.error}` + ); + } + case ExecutionEventResultType.HELD: { + return console.log( + `Execution of static call future ${event.futureId}/${event.result.heldId} held with reason: ${event.result.reason}` + ); + } + } + } + + public sendDataExecutionStateInitialize( + event: SendDataExecutionStateInitializeEvent + ): void { + console.log(`Started to execute the send data future ${event.futureId}`); + } + + public sendDataExecutionStateComplete( + event: SendDataExecutionStateCompleteEvent + ): void { + switch (event.result.type) { + case ExecutionEventResultType.SUCCESS: { + return console.log( + `Successfully completed the execution of send data future ${ + event.futureId + } in tx ${event.result.result ?? "undefined"}` + ); + } + case ExecutionEventResultType.ERROR: { + return console.log( + `Execution of future ${event.futureId} failed with reason: ${event.result.error}` + ); + } + case ExecutionEventResultType.HELD: { + return console.log( + `Execution of send future ${event.futureId}/${event.result.heldId} held with reason: ${event.result.reason}` + ); + } + } + } + + public contractAtExecutionStateInitialize( + event: ContractAtExecutionStateInitializeEvent + ): void { + console.log(`Executed contract at future ${event.futureId}`); + } + + public readEventArgumentExecutionStateInitialize( + event: ReadEventArgExecutionStateInitializeEvent + ): void { + console.log( + `Executed read event argument future ${event.futureId} with result ${ + event.result.result ?? "undefined" + }` + ); + } + + public encodeFunctionCallExecutionStateInitialize( + event: EncodeFunctionCallExecutionStateInitializeEvent + ): void { + console.log( + `Executed encode function call future ${event.futureId} with result ${ + event.result.result ?? "undefined" + }` + ); + } + + public networkInteractionRequest( + event: NetworkInteractionRequestEvent + ): void { + if ( + event.networkInteractionType === + ExecutionEventNetworkInteractionType.ONCHAIN_INTERACTION + ) { + console.log( + `New onchain interaction requested for future ${event.futureId}` + ); + } else { + console.log(`New static call requested for future ${event.futureId}`); + } + } + + public transactionSend(event: TransactionSendEvent): void { + console.log( + `Transaction ${event.hash} sent for onchain interaction of future ${event.futureId}` + ); + } + + public transactionConfirm(event: TransactionConfirmEvent): void { + console.log(`Transaction ${event.hash} confirmed`); + } + + public staticCallComplete(event: StaticCallCompleteEvent): void { + console.log(`Static call completed for future ${event.futureId}`); + } + + public onchainInteractionBumpFees( + event: OnchainInteractionBumpFeesEvent + ): void { + console.log( + `A transaction with higher fees will be sent for onchain interaction of future ${event.futureId}` + ); + } + + public onchainInteractionDropped( + event: OnchainInteractionDroppedEvent + ): void { + console.log( + `Transactions for onchain interaction of future ${event.futureId} has been dropped and will be resent` + ); + } + + public onchainInteractionReplacedByUser( + event: OnchainInteractionReplacedByUserEvent + ): void { + console.log( + `Transactions for onchain interaction of future ${event.futureId} has been replaced by the user and the onchain interaction exection will start again` + ); + } + + public onchainInteractionTimeout( + event: OnchainInteractionTimeoutEvent + ): void { + console.log( + `Onchain interaction of future ${event.futureId} failed due to being resent too many times and not having confirmed` + ); + } + + public batchInitialize(event: BatchInitializeEvent): void { + console.log( + `Starting execution for batches: ${JSON.stringify(event.batches)}` + ); + } + + public deploymentStart(_event: DeploymentStartEvent): void { + console.log(`Starting execution for new deployment`); + } + + public beginNextBatch(_event: BeginNextBatchEvent): void { + console.log(`Starting execution for next batch`); + } + + public deploymentComplete(_event: DeploymentCompleteEvent): void { + console.log(`Deployment complete`); + } + + public reconciliationWarnings(event: ReconciliationWarningsEvent): void { + console.log( + `Deployment produced reconciliation warnings:\n${event.warnings.join( + " -" + )}` + ); + } + + public setModuleId(event: SetModuleIdEvent): void { + console.log(`Starting validation for module: ${event.moduleName}`); + } + + public setStrategy(event: SetStrategyEvent): void { + console.log(`Starting execution with strategy: ${event.strategy}`); + } + + public runStart(_event: RunStartEvent): void { + console.log("Execution run starting"); + } +} diff --git a/packages/hardhat-ignition/src/utils/bigintReviver.ts b/packages/hardhat-ignition/src/utils/bigintReviver.ts new file mode 100644 index 00000000000..11bb67e3e92 --- /dev/null +++ b/packages/hardhat-ignition/src/utils/bigintReviver.ts @@ -0,0 +1,16 @@ +import { NomicLabsHardhatPluginError } from "hardhat/plugins"; + +export function bigintReviver(key: string, value: any): any { + if (typeof value === "string" && /^\d+n$/.test(value)) { + return BigInt(value.slice(0, -1)); + } + + if (typeof value === "number" && value > Number.MAX_SAFE_INTEGER) { + throw new NomicLabsHardhatPluginError( + "hardhat-ignition", + `Parameter "${key}" exceeds maximum safe integer size. Encode the value as a string using bigint notation: \`$\{value\}n\`` + ); + } + + return value; +} diff --git a/packages/hardhat-ignition/src/utils/error-deployment-result-to-exception-message.ts b/packages/hardhat-ignition/src/utils/error-deployment-result-to-exception-message.ts new file mode 100644 index 00000000000..db02b53b1f3 --- /dev/null +++ b/packages/hardhat-ignition/src/utils/error-deployment-result-to-exception-message.ts @@ -0,0 +1,141 @@ +import { + DeploymentResultType, + ExecutionErrorDeploymentResult, + PreviousRunErrorDeploymentResult, + ReconciliationErrorDeploymentResult, + ValidationErrorDeploymentResult, +} from "@nomicfoundation/ignition-core"; +import { HardhatPluginError } from "hardhat/plugins"; + +/** + * Converts the result of an errored deployment into a message that can + * be shown to the user in an exception. + * + * @param result - the errored deployment's result + * @returns the text of the message + */ +export function errorDeploymentResultToExceptionMessage( + result: + | ValidationErrorDeploymentResult + | ReconciliationErrorDeploymentResult + | ExecutionErrorDeploymentResult + | PreviousRunErrorDeploymentResult +): string { + switch (result.type) { + case DeploymentResultType.VALIDATION_ERROR: + return _convertValidationError(result); + case DeploymentResultType.RECONCILIATION_ERROR: + return _convertReconciliationError(result); + case DeploymentResultType.EXECUTION_ERROR: + return _convertExecutionError(result); + case DeploymentResultType.PREVIOUS_RUN_ERROR: + return _convertPreviousRunError(result); + } +} + +function _convertValidationError( + result: ValidationErrorDeploymentResult +): string { + const errorsList = Object.entries(result.errors).flatMap( + ([futureId, errors]) => errors.map((err) => ` * ${futureId}: ${err}`) + ); + + return `The deployment wasn't run because of the following validation errors: + +${errorsList.join("\n")}`; +} + +function _convertReconciliationError( + result: ReconciliationErrorDeploymentResult +) { + const errorsList = Object.entries(result.errors).flatMap( + ([futureId, errors]) => errors.map((err) => ` * ${futureId}: ${err}`) + ); + + return `The deployment wasn't run because of the following reconciliation errors: + +${errorsList.join("\n")}`; +} + +function _convertExecutionError(result: ExecutionErrorDeploymentResult) { + const sections: string[] = []; + + const messageDetails = { + timeouts: result.timedOut.length > 0, + failures: result.failed.length > 0, + held: result.held.length > 0, + }; + + if (messageDetails.timeouts) { + const timeoutList = result.timedOut.map( + ({ futureId, networkInteractionId }) => + ` * ${futureId}/${networkInteractionId}` + ); + + sections.push(`Timed out:\n\n${timeoutList.join("\n")}`); + } + + if (messageDetails.failures) { + const errorList = result.failed.map( + ({ futureId, networkInteractionId, error }) => + ` * ${futureId}/${networkInteractionId}: ${error}` + ); + + sections.push(`Failures:\n\n${errorList.join("\n")}`); + } + + if (messageDetails.held) { + const reasonList = result.held.map( + ({ futureId, heldId, reason }) => ` * ${futureId}/${heldId}: ${reason}` + ); + + sections.push(`Held:\n\n${reasonList.join("\n")}`); + } + + return `The deployment wasn't successful, there were ${_toText( + messageDetails + )}: + +${sections.join("\n\n")}`; +} + +function _convertPreviousRunError(result: PreviousRunErrorDeploymentResult) { + const errorsList = Object.entries(result.errors).flatMap( + ([futureId, errors]) => errors.map((err) => ` * ${futureId}: ${err}`) + ); + + return `The deployment wasn't run because of the following errors in a previous run: + +${errorsList.join("\n")}`; +} + +function _toText({ + timeouts, + failures, + held, +}: { + timeouts: boolean; + failures: boolean; + held: boolean; +}): string { + if (timeouts && failures && held) { + return "timeouts, failures and holds"; + } else if (timeouts && failures) { + return "timeouts and failures"; + } else if (failures && held) { + return "failures and holds"; + } else if (timeouts && held) { + return "timeouts and holds"; + } else if (timeouts) { + return "timeouts"; + } else if (failures) { + return "failures"; + } else if (held) { + return "holds"; + } + + throw new HardhatPluginError( + "@nomicfoundation/hardhat-ignition", + "Invariant violated: neither timeouts or failures" + ); +} diff --git a/packages/hardhat-ignition/src/utils/getApiKeyAndUrls.ts b/packages/hardhat-ignition/src/utils/getApiKeyAndUrls.ts new file mode 100644 index 00000000000..4b34e8feaa9 --- /dev/null +++ b/packages/hardhat-ignition/src/utils/getApiKeyAndUrls.ts @@ -0,0 +1,22 @@ +import type { ChainConfig } from "@nomicfoundation/hardhat-verify/types"; + +import { NomicLabsHardhatPluginError } from "hardhat/plugins"; + +export function getApiKeyAndUrls( + etherscanApiKey: string | Record, + chainConfig: ChainConfig +): [apiKey: string, apiUrl: string, webUrl: string] { + const apiKey: string = + typeof etherscanApiKey === "string" + ? etherscanApiKey + : etherscanApiKey[chainConfig.network]; + + if (apiKey === undefined) { + throw new NomicLabsHardhatPluginError( + "@nomicfoundation/hardhat-ignition", + `No etherscan API key configured for network ${chainConfig.network}` + ); + } + + return [apiKey, chainConfig.urls.apiURL, chainConfig.urls.browserURL]; +} diff --git a/packages/hardhat-ignition/src/utils/load-module.ts b/packages/hardhat-ignition/src/utils/load-module.ts new file mode 100644 index 00000000000..09c33808438 --- /dev/null +++ b/packages/hardhat-ignition/src/utils/load-module.ts @@ -0,0 +1,92 @@ +import { IgnitionError, IgnitionModule } from "@nomicfoundation/ignition-core"; +import setupDebug from "debug"; +import { pathExistsSync } from "fs-extra"; +import { + HardhatPluginError, + NomicLabsHardhatPluginError, +} from "hardhat/plugins"; +import path from "path"; + +import { shouldBeHardhatPluginError } from "./shouldBeHardhatPluginError"; + +const debug = setupDebug("hardhat-ignition:modules"); + +const MODULES_FOLDER = "modules"; + +export function loadModule( + ignitionDirectory: string, + modulePath: string +): IgnitionModule | undefined { + const fullModulesDirectoryName = path.resolve( + ignitionDirectory, + MODULES_FOLDER + ); + + const shortModulesDirectoryName = path.join( + ignitionDirectory, + MODULES_FOLDER + ); + + debug(`Loading user modules from '${fullModulesDirectoryName}'`); + + const fullpathToModule = path.resolve(modulePath); + + if (!pathExistsSync(fullpathToModule)) { + throw new HardhatPluginError( + "hardhat-ignition", + `Could not find a module file at the path: ${modulePath}` + ); + } + + if (!isInModuleDirectory(fullModulesDirectoryName, fullpathToModule)) { + throw new HardhatPluginError( + "hardhat-ignition", + `The referenced module file ${modulePath} is outside the module directory ${shortModulesDirectoryName}` + ); + } + + debug(`Loading module file '${fullpathToModule}'`); + + let module; + try { + module = require(fullpathToModule); + } catch (e) { + if (e instanceof IgnitionError) { + /** + * Errors thrown from within ModuleBuilder use this errorNumber. + * + * They have a stack trace that's useful to the user, so we display it here, instead of + * wrapping the error in a NomicLabsHardhatPluginError. + */ + if (e.errorNumber === 702) { + console.error(e); + + throw new NomicLabsHardhatPluginError( + "hardhat-ignition", + "Module validation failed. Check the stack trace above to identify the issue and its source code location." + ); + } + + if (shouldBeHardhatPluginError(e)) { + throw new NomicLabsHardhatPluginError("hardhat-ignition", e.message, e); + } + } + + throw e; + } + + return module.default ?? module; +} + +function isInModuleDirectory(modulesDirectory: string, modulePath: string) { + const resolvedModulesDirectory = path.resolve(modulesDirectory); + const moduleRelativeToModuleDir = path.relative( + resolvedModulesDirectory, + modulePath + ); + + return ( + !moduleRelativeToModuleDir.startsWith("..") && + !path.isAbsolute(moduleRelativeToModuleDir) + ); +} diff --git a/packages/hardhat-ignition/src/utils/open.ts b/packages/hardhat-ignition/src/utils/open.ts new file mode 100644 index 00000000000..eb5b1ee6b8b --- /dev/null +++ b/packages/hardhat-ignition/src/utils/open.ts @@ -0,0 +1,22 @@ +import { execSync } from "child_process"; +import os from "os"; + +export function open(filePath: string): void { + let command: string; + switch (os.platform()) { + case "win32": + command = "start"; + break; + case "darwin": + command = "open"; + break; + default: + command = "xdg-open"; + } + + try { + execSync(`${command} ${filePath}`, { stdio: "ignore" }); + } catch { + // do nothing + } +} diff --git a/packages/hardhat-ignition/src/utils/read-deployment-parameters.ts b/packages/hardhat-ignition/src/utils/read-deployment-parameters.ts new file mode 100644 index 00000000000..fb6bee8cd6b --- /dev/null +++ b/packages/hardhat-ignition/src/utils/read-deployment-parameters.ts @@ -0,0 +1,30 @@ +import { DeploymentParameters } from "@nomicfoundation/ignition-core"; +import { readFile } from "fs-extra"; +import { NomicLabsHardhatPluginError } from "hardhat/plugins"; +import { parse as json5Parse } from "json5"; + +import { bigintReviver } from "./bigintReviver"; + +export async function readDeploymentParameters( + filepath: string +): Promise { + try { + const rawFile = await readFile(filepath); + + return await json5Parse(rawFile.toString(), bigintReviver); + } catch (e) { + if (e instanceof NomicLabsHardhatPluginError) { + throw e; + } + + if (e instanceof Error) { + throw new NomicLabsHardhatPluginError( + "@nomicfoundation/hardhat-ignition", + `Could not parse parameters from ${filepath}`, + e + ); + } + + throw e; + } +} diff --git a/packages/hardhat-ignition/src/utils/resolve-deployment-id.ts b/packages/hardhat-ignition/src/utils/resolve-deployment-id.ts new file mode 100644 index 00000000000..ad9aaf25049 --- /dev/null +++ b/packages/hardhat-ignition/src/utils/resolve-deployment-id.ts @@ -0,0 +1,43 @@ +import { NomicLabsHardhatPluginError } from "hardhat/plugins"; + +/** + * A regex that captures Ignitions rules for deployment-ids, specifically + * that they can only contain alphanumerics, dashes and underscores, + * and that they start with a letter. + */ +const ignitionDeploymentIdRegex = /^[a-zA-Z][a-zA-Z0-9_\-]*$/; + +/** + * Determine the deploymentId, using either the user provided id, + * throwing if it is invalid, or generating one from the chainId + * if none was provided. + * + * @param givenDeploymentId - the user provided deploymentId if + * they provided one undefined otherwise + * @param chainId - the chainId of the network being deployed to + * + * @returns the deploymentId + */ +export function resolveDeploymentId( + givenDeploymentId: string | undefined, + chainId: number +) { + if ( + givenDeploymentId !== undefined && + !_isValidDeploymentIdentifier(givenDeploymentId) + ) { + throw new NomicLabsHardhatPluginError( + "hardhat-ignition", + `The deployment-id "${givenDeploymentId}" contains banned characters, ids can only contain alphanumerics, dashes or underscores` + ); + } + + return givenDeploymentId ?? `chain-${chainId}`; +} + +/** + * Determine if the given identifier the rules for a valid deployment id. + * */ +export function _isValidDeploymentIdentifier(identifier: string): boolean { + return ignitionDeploymentIdRegex.test(identifier); +} diff --git a/packages/hardhat-ignition/src/utils/shouldBeHardhatPluginError.ts b/packages/hardhat-ignition/src/utils/shouldBeHardhatPluginError.ts new file mode 100644 index 00000000000..add829bb5be --- /dev/null +++ b/packages/hardhat-ignition/src/utils/shouldBeHardhatPluginError.ts @@ -0,0 +1,20 @@ +import type { IgnitionError } from "@nomicfoundation/ignition-core"; + +/** + * This is a whitelist of error codes that should be rethrown as NomicLabsHardhatPluginError. + * + * The rules for adding an error code to this list are: + * - If an exception is used to tell the user that they did something wrong, it should be added. + * - If an exception is used to indicate some failure and terminate the current process/deployment, that shouldn't be added. + * - If there's an exception that doesn't fit in either category, let's discuss it and review the categories. + */ +const whitelist = [ + 200, 201, 202, 203, 204, 403, 404, 405, 406, 407, 408, 409, 411, 600, 601, + 602, 700, 701, 702, 703, 704, 705, 706, 707, 708, 709, 710, 711, 712, 713, + 714, 715, 716, 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, 800, 900, + 1000, 1001, 1002, 1101, 1102, 1103, 1300, 1301, 1302, 1303, 1304, 1305, +]; + +export function shouldBeHardhatPluginError(error: IgnitionError): boolean { + return whitelist.includes(error.errorNumber); +} diff --git a/packages/hardhat-ignition/src/utils/verifyEtherscanContract.ts b/packages/hardhat-ignition/src/utils/verifyEtherscanContract.ts new file mode 100644 index 00000000000..d43f861e63c --- /dev/null +++ b/packages/hardhat-ignition/src/utils/verifyEtherscanContract.ts @@ -0,0 +1,37 @@ +import type { Etherscan } from "@nomicfoundation/hardhat-verify/etherscan"; +import type { VerifyInfo } from "@nomicfoundation/ignition-core"; + +export async function verifyEtherscanContract( + etherscanInstance: Etherscan, + { address, compilerVersion, sourceCode, name, args }: VerifyInfo +): Promise< + { type: "success"; contractURL: string } | { type: "failure"; reason: Error } +> { + try { + const { message: guid } = await etherscanInstance.verify( + address, + sourceCode, + name, + compilerVersion, + args + ); + + const verificationStatus = await etherscanInstance.getVerificationStatus( + guid + ); + + if (verificationStatus.isSuccess()) { + const contractURL = etherscanInstance.getContractUrl(address); + return { type: "success", contractURL }; + } else { + // todo: what case would cause verification status not to succeed without throwing? + return { type: "failure", reason: new Error(verificationStatus.message) }; + } + } catch (e) { + if (e instanceof Error) { + return { type: "failure", reason: e }; + } else { + throw e; + } + } +} diff --git a/packages/hardhat-ignition/src/visualization/write-visualization.ts b/packages/hardhat-ignition/src/visualization/write-visualization.ts new file mode 100644 index 00000000000..1c5c8df308c --- /dev/null +++ b/packages/hardhat-ignition/src/visualization/write-visualization.ts @@ -0,0 +1,37 @@ +import { SerializedIgnitionModule } from "@nomicfoundation/ignition-core"; +import { ensureDir, pathExists, readFile, writeFile } from "fs-extra"; +import { NomicLabsHardhatPluginError } from "hardhat/plugins"; +import path from "path"; + +export async function writeVisualization( + visualizationPayload: { + module: SerializedIgnitionModule; + batches: string[][]; + }, + { cacheDir }: { cacheDir: string } +) { + const templateDir = path.join( + require.resolve("@nomicfoundation/ignition-ui/package.json"), + "../dist" + ); + + const templateDirExists = await pathExists(templateDir); + + if (!templateDirExists) { + throw new NomicLabsHardhatPluginError( + "@nomicfouncation/hardhat-ignition", + `Unable to find template directory: ${templateDir}` + ); + } + + const visualizationDir = path.join(cacheDir, "visualization"); + + await ensureDir(visualizationDir); + + const indexHtml = await readFile(path.join(templateDir, "index.html")); + const updatedHtml = indexHtml + .toString() + .replace('{ "unloaded": true }', JSON.stringify(visualizationPayload)); + + await writeFile(path.join(visualizationDir, "index.html"), updatedHtml); +} diff --git a/packages/hardhat-ignition/test/.eslintrc.js b/packages/hardhat-ignition/test/.eslintrc.js new file mode 100644 index 00000000000..757fe8a3ca9 --- /dev/null +++ b/packages/hardhat-ignition/test/.eslintrc.js @@ -0,0 +1,15 @@ +module.exports = { + extends: [`${__dirname}/../.eslintrc.js`], + parserOptions: { + project: `${__dirname}/../tsconfig.json`, + sourceType: "module", + }, + rules: { + "import/no-extraneous-dependencies": [ + "error", + { + devDependencies: true, + }, + ], + }, +}; diff --git a/packages/hardhat-ignition/test/config.ts b/packages/hardhat-ignition/test/config.ts new file mode 100644 index 00000000000..05cc7a6c2f7 --- /dev/null +++ b/packages/hardhat-ignition/test/config.ts @@ -0,0 +1,105 @@ +/* eslint-disable import/no-unused-modules */ + +import { buildModule } from "@nomicfoundation/ignition-core"; +import { assert } from "chai"; +import { HardhatConfig } from "hardhat/types"; + +import { KeyListOf } from "./test-helpers/type-helper"; +import { useEphemeralIgnitionProject } from "./test-helpers/use-ignition-project"; + +describe("config", () => { + describe("loading", () => { + useEphemeralIgnitionProject("with-config"); + + let loadedOptions: Partial; + + beforeEach(function () { + loadedOptions = this.hre.config.ignition; + }); + + it("should apply requiredConfirmations", async function () { + assert.equal(loadedOptions.requiredConfirmations, 10); + }); + + it("should apply blockPollingInterval", async function () { + assert.equal(loadedOptions.blockPollingInterval, 100); + }); + + it("should apply timeBeforeBumpingFees", async function () { + assert.equal(loadedOptions.timeBeforeBumpingFees, 60 * 1000); + }); + + it("should apply maxFeeBumps", async function () { + assert.equal(loadedOptions.maxFeeBumps, 2); + }); + + it("should apply strategyConfig", async function () { + assert.deepStrictEqual(loadedOptions.strategyConfig, { + create2: { salt: "custom-salt" }, + }); + }); + + it("should apply disableFeeBumping at the top level", async function () { + assert.equal(loadedOptions.disableFeeBumping, true); + }); + + it("should apply maxFeePerGasLimit", async function () { + assert.equal( + this.hre.config.networks.hardhat.ignition.maxFeePerGasLimit, + 2n + ); + }); + + it("should apply maxPriorityFeePerGas", async function () { + assert.equal( + this.hre.config.networks.hardhat.ignition.maxPriorityFeePerGas, + 3n + ); + }); + + it("should apply gasPrice", async function () { + assert.equal(this.hre.config.networks.hardhat.ignition.gasPrice, 1n); + }); + + it("should apply disableFeeBumping at the network level", async function () { + assert.equal( + this.hre.config.networks.hardhat.ignition.disableFeeBumping, + false + ); + }); + + it("should only have known config", () => { + const configOptions: KeyListOf = [ + "blockPollingInterval", + "disableFeeBumping", + "maxFeeBumps", + "requiredConfirmations", + "strategyConfig", + "timeBeforeBumpingFees", + ]; + + assert.deepStrictEqual(Object.keys(loadedOptions).sort(), configOptions); + }); + }); + + describe("validating", () => { + useEphemeralIgnitionProject("with-invalid-config"); + + it("should throw when given a `requiredConfirmations` value less than 1", async function () { + const moduleDefinition = buildModule("FooModule", (m) => { + const foo = m.contract("Foo"); + + return { foo }; + }); + + await assert.isRejected( + this.hre.ignition.deploy(moduleDefinition, { + config: { + requiredConfirmations: 0, + }, + }), + `Configured value 'requiredConfirmations' cannot be less than 1. Value given: '0'` + ); + }); + }); +}); diff --git a/packages/hardhat-ignition/test/deploy/default-sender.ts b/packages/hardhat-ignition/test/deploy/default-sender.ts new file mode 100644 index 00000000000..6247eb7e71f --- /dev/null +++ b/packages/hardhat-ignition/test/deploy/default-sender.ts @@ -0,0 +1,47 @@ +/* eslint-disable import/no-unused-modules */ +import { buildModule } from "@nomicfoundation/ignition-core"; +import { assert } from "chai"; + +import { useEphemeralIgnitionProject } from "../test-helpers/use-ignition-project"; + +describe("default sender", function () { + useEphemeralIgnitionProject("minimal"); + + it("should throw if default sender is not in configured accounts", async function () { + await assert.isRejected( + this.hre.run( + { scope: "ignition", task: "deploy" }, + { + modulePath: "ignition/modules/OwnModule.js", + defaultSender: "0x1234567890abcdef1234567890abcdef12345678", + } + ), + /IGN700: Default sender 0x1234567890abcdef1234567890abcdef12345678 is not part of the configured accounts./ + ); + }); + + it("should allow setting default sender via cli", async function () { + const secondAccountAddress = "0x70997970C51812dc3A010C7d01b50e0d17dc79C8"; + + await this.hre.run( + { scope: "ignition", task: "deploy" }, + { + modulePath: "ignition/modules/OwnModule.js", + defaultSender: secondAccountAddress, + } + ); + + const existingModule = buildModule("ExistingModule", (m) => { + const bar = m.contractAt( + "Ownable", + "0x8464135c8F25Da09e49BC8782676a84730C318bC" + ); + + return { bar }; + }); + + const result = await this.hre.ignition.deploy(existingModule); + + assert.equal(await result.bar.read.owner(), secondAccountAddress); + }); +}); diff --git a/packages/hardhat-ignition/test/deploy/gas-estimation.ts b/packages/hardhat-ignition/test/deploy/gas-estimation.ts new file mode 100644 index 00000000000..bc8cbdf8aa1 --- /dev/null +++ b/packages/hardhat-ignition/test/deploy/gas-estimation.ts @@ -0,0 +1,27 @@ +/* eslint-disable import/no-unused-modules */ +import { buildModule } from "@nomicfoundation/ignition-core"; +import { assert } from "chai"; + +import { useEphemeralIgnitionProject } from "../test-helpers/use-ignition-project"; + +describe("gas estimation", function () { + useEphemeralIgnitionProject("minimal"); + + it("should throw with simulation error if sender account has less ETH than gas estimate", async function () { + const moduleDefinition = buildModule("FooModule", (m) => { + const foo = m.contract("Fails"); + + return { foo }; + }); + + await this.hre.network.provider.send("hardhat_setBalance", [ + "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + "0x1", + ]); + + await assert.isRejected( + this.hre.ignition.deploy(moduleDefinition), + /Simulating the transaction failed with error: Reverted with reason "Constructor failed"/ + ); + }); +}); diff --git a/packages/hardhat-ignition/test/deploy/module-patterns/index-pattern.ts b/packages/hardhat-ignition/test/deploy/module-patterns/index-pattern.ts new file mode 100644 index 00000000000..077903af737 --- /dev/null +++ b/packages/hardhat-ignition/test/deploy/module-patterns/index-pattern.ts @@ -0,0 +1,104 @@ +/* eslint-disable import/no-unused-modules */ +import { buildModule } from "@nomicfoundation/ignition-core"; +import { assert } from "chai"; + +import { useEphemeralIgnitionProject } from "../../test-helpers/use-ignition-project"; + +describe("index pattern deployments", function () { + useEphemeralIgnitionProject("index-pattern-success"); + + it("should succeed for a standard case", async function () { + const Mod1 = buildModule("Mod1", (m) => { + const F1 = m.contract("F1"); + + m.call(F1, "first"); + + return { F1 }; + }); + + const Mod2 = buildModule("Mod2", (m) => { + const { F1 } = m.useModule(Mod1); + + const F2 = m.contract("F2", [F1]); + + m.call(F2, "second"); + + return { F2 }; + }); + + const IndexMod = buildModule("IndexMod", (m) => { + const { F2 } = m.useModule(Mod2); + + return { F2 }; + }); + + const moduleDefinition = buildModule("DeployModule", (m) => { + const { F1 } = m.useModule(Mod1); + + m.call(F1, "third", [], { after: [Mod1, IndexMod] }); + + return { F1 }; + }); + + await assert.isFulfilled(this.hre.ignition.deploy(moduleDefinition)); + }); + + it("should succeed for a malaga case", async function () { + const Mod1 = buildModule("Mod1", (m) => { + const F1 = m.contract("F1"); + + return { F1 }; + }); + + const Mod2 = buildModule("Mod2", (m) => { + const { F1 } = m.useModule(Mod1); + + const F2 = m.contract("F2", [F1]); + + const firstCall = m.call(F2, "unrelatedFunc"); + const secondCall = m.call(F2, "unrelatedFunc", [], { + after: [firstCall], + id: "secondCall", + }); + const lastCall = m.call(F2, "unrelatedFunc", [], { + after: [secondCall], + id: "lastCall", + }); + + m.call(F2, "mustBeCalledByTwoSeparateContracts", [], { + after: [lastCall], + }); + + return { F2 }; + }); + + const Mod3 = buildModule("Mod3", (m) => { + const { F1 } = m.useModule(Mod1); + + const F3 = m.contract("F2", [F1], { id: "F3" }); + + return { F3 }; + }); + + const IndexMod = buildModule("IndexMod", (m) => { + const { F1 } = m.useModule(Mod1); + const { F2 } = m.useModule(Mod2); + const { F3 } = m.useModule(Mod3); + + const lastCall = m.call(F3, "mustBeCalledByTwoSeparateContracts"); + const NewF1 = m.contractAt("F1", F1, { after: [lastCall], id: "NewF1" }); + + return { NewF1, F2, F3 }; + }); + + const moduleDefinition = buildModule("DeployModule", (m) => { + const { NewF1 } = m.useModule(IndexMod); + + m.call(NewF1, "throwsIfNotCalledTwice"); + + return {}; + }); + + await assert.isFulfilled(this.hre.ignition.deploy(moduleDefinition)); + }); +}); diff --git a/packages/hardhat-ignition/test/deploy/multiple-batch-contract-deploy.ts b/packages/hardhat-ignition/test/deploy/multiple-batch-contract-deploy.ts new file mode 100644 index 00000000000..d92ed7422fb --- /dev/null +++ b/packages/hardhat-ignition/test/deploy/multiple-batch-contract-deploy.ts @@ -0,0 +1,76 @@ +/* eslint-disable import/no-unused-modules */ +import { buildModule } from "@nomicfoundation/ignition-core"; +import { assert } from "chai"; + +import { sleep } from "../test-helpers/sleep"; +import { useEphemeralIgnitionProject } from "../test-helpers/use-ignition-project"; + +/** + * Deploy a multiple contracts over several batches. + * + * The intent here is to test batching. + */ +describe("execution - multiple batch contract deploy", function () { + useEphemeralIgnitionProject("minimal"); + + it("should deploy over multiple batches", async function () { + const moduleDefinition = buildModule("FooModule", (m) => { + const contract1 = m.contract("Foo", [], { id: "Contract1" }); + const contractA = m.contract("Foo", [], { id: "ContractA" }); + + const contract2 = m.contract("Foo", [], { + id: "Contract2", + after: [contract1], + }); + const contractB = m.contract("Foo", [], { + id: "ContractB", + after: [contractA], + }); + + const contract3 = m.contract("Foo", [], { + id: "Contract3", + after: [contract2], + }); + const contractC = m.contract("Foo", [], { + id: "ContractC", + after: [contractB], + }); + + return { + contract1, + contractA, + contract2, + contractB, + contract3, + contractC, + }; + }); + + const deployPromise = this.hre.ignition.deploy(moduleDefinition); + + await sleep(300); + await this.hre.network.provider.send("evm_mine"); + + await sleep(300); + await this.hre.network.provider.send("evm_mine"); + + await sleep(300); + await this.hre.network.provider.send("evm_mine"); + + const result = await deployPromise; + + const x1 = await result.contract1.read.x(); + const xA = await result.contractA.read.x(); + const x2 = await result.contract2.read.x(); + const xB = await result.contractB.read.x(); + const x3 = await result.contract3.read.x(); + const xC = await result.contractC.read.x(); + + assert.equal(x1, 1n); + assert.equal(xA, 1n); + assert.equal(x2, 1n); + assert.equal(xB, 1n); + assert.equal(x3, 1n); + assert.equal(xC, 1n); + }); +}); diff --git a/packages/hardhat-ignition/test/deploy/nonce-checks/error-on-pending-user-transactions.ts b/packages/hardhat-ignition/test/deploy/nonce-checks/error-on-pending-user-transactions.ts new file mode 100644 index 00000000000..460c582b595 --- /dev/null +++ b/packages/hardhat-ignition/test/deploy/nonce-checks/error-on-pending-user-transactions.ts @@ -0,0 +1,77 @@ +/* eslint-disable import/no-unused-modules */ +import { buildModule } from "@nomicfoundation/ignition-core"; +import { assert } from "chai"; +import { createWalletClient, custom } from "viem"; +import { hardhat } from "viem/chains"; + +import { mineBlock } from "../../test-helpers/mine-block"; +import { + TestChainHelper, + useFileIgnitionProject, +} from "../../test-helpers/use-ignition-project"; +import { waitForPendingTxs } from "../../test-helpers/wait-for-pending-txs"; + +/** + * For all accounts that will be used during the deployment we check + * to see if there are pending transactions (not from previous runs) + * and error if there are any. + */ +describe("execution - error on pending user transactions", () => { + useFileIgnitionProject( + "minimal", + "error-on-rerun-with-replaced-pending-user-transaction" + ); + + it("should error if a transaction is in flight for an account used in the deploy", async function () { + // Setup a module with a contract deploy on accounts[2] + const moduleDefinition = buildModule("FooModule", (m) => { + const account2 = m.getAccount(2); + + const foo = m.contract("Foo", [], { from: account2 }); + + return { + foo, + }; + }); + + const FooArtifact = this.hre.artifacts.readArtifactSync("Foo"); + + // Before deploy, put a valid transaction into the mempool for accounts[2] + const [, , signer2] = (await this.hre.network.provider.request({ + method: "eth_accounts", + })) as string[]; + + const walletClient = createWalletClient({ + chain: hardhat, + transport: custom(this.hre.network.provider), + }); + + const deployPromise = walletClient.deployContract({ + abi: FooArtifact.abi, + bytecode: FooArtifact.bytecode as `0x${string}`, + args: [], + account: signer2 as `0x${string}`, + }); + + await waitForPendingTxs(this.hre, 1, deployPromise); + + // Deploying the module that uses accounts[2] throws with a warning + await assert.isRejected( + this.runControlledDeploy( + moduleDefinition, + async (_c: TestChainHelper) => {} + ), + "IGN403: You have sent transactions from 0x3c44cdddb6a900fa2b585dd299e03d12fa4293bc and they interfere with Hardhat Ignition. Please wait until they get 1 confirmations before running Hardhat Ignition again." + ); + + // Now mine the user interference transaction + await mineBlock(this.hre); + + // The users interfering transaction completes normally + const outsideFoo = await deployPromise; + assert.equal( + outsideFoo, + "0x3d0ac80b8daf180b4d03e0ff107caa7089b5494cdbd81ba9d7619cc4d710caae" + ); + }); +}); diff --git a/packages/hardhat-ignition/test/deploy/nonce-checks/error-on-rerun-with-replaced-pending-user-transaction.ts b/packages/hardhat-ignition/test/deploy/nonce-checks/error-on-rerun-with-replaced-pending-user-transaction.ts new file mode 100644 index 00000000000..3d3ec36546a --- /dev/null +++ b/packages/hardhat-ignition/test/deploy/nonce-checks/error-on-rerun-with-replaced-pending-user-transaction.ts @@ -0,0 +1,83 @@ +/* eslint-disable import/no-unused-modules */ +import { buildModule } from "@nomicfoundation/ignition-core"; +import { assert } from "chai"; +import { createWalletClient, custom, parseEther } from "viem"; +import { hardhat } from "viem/chains"; + +import { + TestChainHelper, + useFileIgnitionProject, +} from "../../test-helpers/use-ignition-project"; + +/** + * Run an initial deploy, that starts but does not finish several on-chain + * transactions via Ignition. The user then replaces a transaction by + * reusing a nonce with a higher gas value. On the rerun we should + * error that there is a pending non-ignition transaction. + */ +describe("execution - error on rerun with replaced pending user transaction", () => { + useFileIgnitionProject( + "minimal", + "error-on-rerun-with-replaced-pending-user-transaction" + ); + + it("should error on the second run", async function () { + const moduleDefinition = buildModule("FooModule", (m) => { + const account2 = m.getAccount(2); + + // batch 1 + const foo1 = m.contract("Foo", [], { id: "Foo1", from: account2 }); + const foo2 = m.contract("Foo", [], { id: "Foo2", from: account2 }); + const foo3 = m.contract("Foo", [], { id: "Foo3", from: account2 }); + + return { + foo1, + foo2, + foo3, + }; + }); + + // Start the deployment, but exit before processing a block, + // so transactions are in memory pool but not confirmed + await this.runControlledDeploy( + moduleDefinition, + async (c: TestChainHelper) => { + // Wait for the submission of foo1 foo2 and foo3 to mempool + await c.waitForPendingTxs(3); + + // Then kill before any blocks + c.exitDeploy(); + } + ); + + const FooArtifact = this.hre.artifacts.readArtifactSync("Foo"); + + // Send user interefering deploy transaction, between runs + // so it is in mempool, overriding the existing nonce 2 + // transaction + const [, , signer2] = (await this.hre.network.provider.request({ + method: "eth_accounts", + })) as string[]; + + const walletClient = createWalletClient({ + chain: hardhat, + transport: custom(this.hre.network.provider), + }); + + void walletClient.deployContract({ + abi: FooArtifact.abi, + bytecode: FooArtifact.bytecode as `0x${string}`, + args: [], + account: signer2 as `0x${string}`, + gasPrice: parseEther("500", "gwei"), + nonce: 2, + }); + + // On the second run, we should detect the user interference + // and error + await assert.isRejected( + this.hre.ignition.deploy(moduleDefinition), + "IGN403: You have sent transactions from 0x3c44cdddb6a900fa2b585dd299e03d12fa4293bc and they interfere with Hardhat Ignition. Please wait until they get 5 confirmations before running Hardhat Ignition again." + ); + }); +}); diff --git a/packages/hardhat-ignition/test/deploy/nonce-checks/error-on-transaction-dropped.ts b/packages/hardhat-ignition/test/deploy/nonce-checks/error-on-transaction-dropped.ts new file mode 100644 index 00000000000..f555836dee4 --- /dev/null +++ b/packages/hardhat-ignition/test/deploy/nonce-checks/error-on-transaction-dropped.ts @@ -0,0 +1,55 @@ +/* eslint-disable import/no-unused-modules */ +import { buildModule } from "@nomicfoundation/ignition-core"; +import { assert } from "chai"; + +import { + TestChainHelper, + useFileIgnitionProject, +} from "../../test-helpers/use-ignition-project"; + +/** + * On running a deploy, if a transaction is dropped from the mempool + * before it is confirmed, then we halt and display an error. + */ +describe("execution - error on transaction dropped", () => { + useFileIgnitionProject("minimal", "error-on-transaction-dropped"); + + it("should error on the drop being detected", async function () { + // Setup a module with two contract deploys (foo1 and foo2) over 2 batches + const moduleDefinition = buildModule("FooModule", (m) => { + const account2 = m.getAccount(2); + + // batch 1 + const foo1 = m.contract("Foo", [], { id: "Foo1", from: account2 }); + + // batch 2 + const foo2 = m.contract("Foo", [], { + id: "Foo2", + from: account2, + after: [foo1], + }); + + return { + foo1, + foo2, + }; + }); + + // The deploy should exception once the dropped transaction for foo2 + // is detected + + await assert.isRejected( + this.runControlledDeploy(moduleDefinition, async (c: TestChainHelper) => { + // Process block 1 confirming foo1 + await c.mineBlock(1); + + // Wait for foo2 to be pending, then wipe it from memory pool + await c.clearMempool(1); + + // Mine further block allowing foo2 to be checked again + await c.mineBlock(); + }), + "IGN401: Error while executing FooModule#Foo2: all the transactions of its network interaction 1 were dropped. Please try rerunning Hardhat Ignition." + ); + }); +}); diff --git a/packages/hardhat-ignition/test/deploy/nonce-checks/error-on-user-transaction-sent.ts b/packages/hardhat-ignition/test/deploy/nonce-checks/error-on-user-transaction-sent.ts new file mode 100644 index 00000000000..ba5f88e346f --- /dev/null +++ b/packages/hardhat-ignition/test/deploy/nonce-checks/error-on-user-transaction-sent.ts @@ -0,0 +1,80 @@ +/* eslint-disable import/no-unused-modules */ +import { buildModule } from "@nomicfoundation/ignition-core"; +import { assert } from "chai"; +import { createWalletClient, custom } from "viem"; +import { hardhat } from "viem/chains"; + +import { + TestChainHelper, + useFileIgnitionProject, +} from "../../test-helpers/use-ignition-project"; + +/** + * On running a deploy, if a transaction is pending and the user + * sends a new transaction outside Ignition on the same account + * we should error and halt immediately + */ +describe("execution - error on user transaction sent", () => { + useFileIgnitionProject("minimal", "error-on-user-transaction-sent"); + + it("should error on the drop being detected", async function () { + const moduleDefinition = buildModule("FooModule", (m) => { + const account2 = m.getAccount(2); + + // batch 1 + const foo1 = m.contract("Foo", [], { id: "Foo1", from: account2 }); + + // batch 2 + const foo2 = m.contract("Foo", [], { + id: "Foo2", + from: account2, + after: [foo1], + }); + + return { + foo1, + foo2, + }; + }); + + // The deploy should exception when the additional user interfering + // transaction is detected + await assert.isRejected( + this.runControlledDeploy(moduleDefinition, async (c: TestChainHelper) => { + // wait for foo1 to be submitted + await c.waitForPendingTxs(1); + + const FooArtifact = this.hre.artifacts.readArtifactSync("Foo"); + + // Submit user interference transaction to mempool (note a fresh + // nonce is used, so no replacement) + const [, , signer2] = (await this.hre.network.provider.request({ + method: "eth_accounts", + })) as string[]; + + const walletClient = createWalletClient({ + chain: hardhat, + transport: custom(this.hre.network.provider), + }); + + const deployPromise = walletClient.deployContract({ + abi: FooArtifact.abi, + bytecode: FooArtifact.bytecode as `0x${string}`, + args: [], + account: signer2 as `0x${string}`, + gasPrice: 500_000_000_000n, + }); + + // Process block 1 with foo1 + await c.mineBlock(1); + + const fooAddress = await deployPromise; + assert.equal( + fooAddress, + "0x9154ff20c97a7ebf9d2ebbb3f8b7e24bf99caee050a24c50f1162492c0b6af79" + ); + }), + "IGN405: The next nonce for 0x3c44cdddb6a900fa2b585dd299e03d12fa4293bc should be 1, but is 2. Please make sure not to send transactions from 0x3c44cdddb6a900fa2b585dd299e03d12fa4293bc while running this deployment and try again." + ); + }); +}); diff --git a/packages/hardhat-ignition/test/deploy/nonce-checks/rerun-with-dropped-ignition-transaction.ts b/packages/hardhat-ignition/test/deploy/nonce-checks/rerun-with-dropped-ignition-transaction.ts new file mode 100644 index 00000000000..d943fdb18c0 --- /dev/null +++ b/packages/hardhat-ignition/test/deploy/nonce-checks/rerun-with-dropped-ignition-transaction.ts @@ -0,0 +1,59 @@ +/* eslint-disable import/no-unused-modules */ +import { buildModule } from "@nomicfoundation/ignition-core"; +import { assert } from "chai"; + +import { clearPendingTransactionsFromMemoryPool } from "../../test-helpers/clear-pending-transactions-from-memory-pool"; +import { mineBlock } from "../../test-helpers/mine-block"; +import { + TestChainHelper, + useFileIgnitionProject, +} from "../../test-helpers/use-ignition-project"; + +/** + * Run an initial deploy, that starts but does not finish an on-chain + * transaction. The transaction is dropped from the memory pool. On rerun + * the transaction should be resubmitted. + */ +describe("execution - rerun with dropped ignition transactions", () => { + useFileIgnitionProject("minimal", "rerun-with-dropped-ignition-transactions"); + + it("should deploy successfully on second run", async function () { + const moduleDefinition = buildModule("FooModule", (m) => { + const foo = m.contract("Foo", []); + + return { + foo, + }; + }); + + // Start the deploy + await this.runControlledDeploy( + moduleDefinition, + async (c: TestChainHelper) => { + // Wait for the submission of foo to mempool + await c.waitForPendingTxs(1); + + // kill the deployment before confirming foo + c.exitDeploy(); + } + ); + + // remove the submitted foo deploy from mempool + await clearPendingTransactionsFromMemoryPool(this.hre); + + // Further blocks with no pending transactions + await mineBlock(this.hre); + await mineBlock(this.hre); + + // Rerun the deployment + const result = await this.runControlledDeploy( + moduleDefinition, + async (c: TestChainHelper) => { + // this block shound include deployment of foo via resend + await c.mineBlock(1); + } + ); + + assert.equal(await result.foo.read.x(), 1n); + }); +}); diff --git a/packages/hardhat-ignition/test/deploy/nonce-checks/rerun-with-now-complete-ignition-transactions.ts b/packages/hardhat-ignition/test/deploy/nonce-checks/rerun-with-now-complete-ignition-transactions.ts new file mode 100644 index 00000000000..b45d53c4f90 --- /dev/null +++ b/packages/hardhat-ignition/test/deploy/nonce-checks/rerun-with-now-complete-ignition-transactions.ts @@ -0,0 +1,105 @@ +/* eslint-disable import/no-unused-modules */ +import { buildModule } from "@nomicfoundation/ignition-core"; +import { assert } from "chai"; + +import { mineBlock } from "../../test-helpers/mine-block"; +import { + TestChainHelper, + useFileIgnitionProject, +} from "../../test-helpers/use-ignition-project"; + +/** + * Run an initial deploy, that sumbit but does not confirm several on-chain + * transactions via Ignition. Those ignition transactions now confirm before + * a second run completes the deploy. + */ +describe("execution - rerun with now complete ignition transactions", () => { + useFileIgnitionProject( + "minimal", + "rerun-with-now-complete-ignition-transactions" + ); + + it("should complete the run on the second attempt", async function () { + // Setup a module with 6 foo contracts deployed in pairs of 2 over 3 batches + const moduleDefinition = buildModule("FooModule", (m) => { + const account2 = m.getAccount(2); + + // batch 1 + const foo1 = m.contract("Foo", [], { id: "Foo1", from: account2 }); + const foo2 = m.contract("Foo", [], { id: "Foo2", from: account2 }); + + // batch 2 + const foo3 = m.contract("Foo", [], { + id: "Foo3", + from: account2, + after: [foo1], + }); + const foo4 = m.contract("Foo", [], { + id: "Foo4", + from: account2, + after: [foo2], + }); + + // batch 3 + const foo5 = m.contract("Foo", [], { + id: "Foo5", + from: account2, + after: [foo3], + }); + const foo6 = m.contract("Foo", [], { + id: "Foo6", + from: account2, + after: [foo4], + }); + + return { + foo1, + foo2, + foo3, + foo4, + foo5, + foo6, + }; + }); + + await this.runControlledDeploy( + moduleDefinition, + async (c: TestChainHelper) => { + // Process the first block, include foo1 and foo2 + await c.mineBlock(2); + + // Kill the deployment, after foo3 and foo4 are submitted to mempool + await c.waitForPendingTxs(2); + c.exitDeploy(); + } + ); + + // Further blocks are processed confirming foo3 and foo4 + await mineBlock(this.hre); + await mineBlock(this.hre); + + // Rerun the deployment, with foo3 and foo3 now confirmed + const result = await this.runControlledDeploy( + moduleDefinition, + async (c: TestChainHelper) => { + await c.mineBlock(2); + } + ); + + assert.isDefined(result); + + const x1 = await result.foo1.read.x(); + const x2 = await result.foo2.read.x(); + const x3 = await result.foo3.read.x(); + const x4 = await result.foo4.read.x(); + const x5 = await result.foo5.read.x(); + const x6 = await result.foo6.read.x(); + + assert.equal(x1, 1n); + assert.equal(x2, 1n); + assert.equal(x3, 1n); + assert.equal(x4, 1n); + assert.equal(x5, 1n); + assert.equal(x6, 1n); + }); +}); diff --git a/packages/hardhat-ignition/test/deploy/nonce-checks/rerun-with-pending-ignition-transactions.ts b/packages/hardhat-ignition/test/deploy/nonce-checks/rerun-with-pending-ignition-transactions.ts new file mode 100644 index 00000000000..261a7d0123a --- /dev/null +++ b/packages/hardhat-ignition/test/deploy/nonce-checks/rerun-with-pending-ignition-transactions.ts @@ -0,0 +1,102 @@ +/* eslint-disable import/no-unused-modules */ +import { buildModule } from "@nomicfoundation/ignition-core"; +import { assert } from "chai"; + +import { + TestChainHelper, + useFileIgnitionProject, +} from "../../test-helpers/use-ignition-project"; + +/** + * Run an initial deploy, that starts but does not finish several on-chain + * transactions via Ignition. Perform another run picking the deployment + * up where the first run left off and without any other user transactions. + */ +describe("execution - rerun with pending ignition transactions", () => { + useFileIgnitionProject("minimal", "rerun-with-pending-ignition-transactions"); + + it("should complete the run on the second attempt", async function () { + const moduleDefinition = buildModule("FooModule", (m) => { + const account2 = m.getAccount(2); + + // batch 1 + const foo1 = m.contract("Foo", [], { id: "Foo1", from: account2 }); + const foo2 = m.contract("Foo", [], { id: "Foo2", from: account2 }); + + // batch 2 + const foo3 = m.contract("Foo", [], { + id: "Foo3", + from: account2, + after: [foo1], + }); + const foo4 = m.contract("Foo", [], { + id: "Foo4", + from: account2, + after: [foo2], + }); + + // batch 3 + const foo5 = m.contract("Foo", [], { + id: "Foo5", + from: account2, + after: [foo3], + }); + const foo6 = m.contract("Foo", [], { + id: "Foo6", + from: account2, + after: [foo4], + }); + + return { + foo1, + foo2, + foo3, + foo4, + foo5, + foo6, + }; + }); + + await this.runControlledDeploy( + moduleDefinition, + async (c: TestChainHelper) => { + // Process the first block, include foo1 and foo2 + await c.mineBlock(2); + + // Kill the deployment, with foo3 and foo4 submitted to mempool + await c.waitForPendingTxs(2); + c.exitDeploy(); + } + ); + + // NOTE: no blocks mined between previous run and this run + // there should two deploy contract transactions for foo3 and foo4 + // in the mempool + const result = await this.runControlledDeploy( + moduleDefinition, + async (c: TestChainHelper) => { + // this block should confirm foo3 and foo4 + await c.mineBlock(2); + + // this block shound include foo5 and foo6 + await c.mineBlock(2); + } + ); + + assert.isDefined(result); + + const x1 = await result.foo1.read.x(); + const x2 = await result.foo2.read.x(); + const x3 = await result.foo3.read.x(); + const x4 = await result.foo4.read.x(); + const x5 = await result.foo5.read.x(); + const x6 = await result.foo6.read.x(); + + assert.equal(x1, 1n); + assert.equal(x2, 1n); + assert.equal(x3, 1n); + assert.equal(x4, 1n); + assert.equal(x5, 1n); + assert.equal(x6, 1n); + }); +}); diff --git a/packages/hardhat-ignition/test/deploy/nonce-checks/rerun-with-replaced-confirmed-user-transaction.ts b/packages/hardhat-ignition/test/deploy/nonce-checks/rerun-with-replaced-confirmed-user-transaction.ts new file mode 100644 index 00000000000..5d5b00e8fda --- /dev/null +++ b/packages/hardhat-ignition/test/deploy/nonce-checks/rerun-with-replaced-confirmed-user-transaction.ts @@ -0,0 +1,104 @@ +/* eslint-disable import/no-unused-modules */ +import { buildModule } from "@nomicfoundation/ignition-core"; +import { assert } from "chai"; +import { createWalletClient, custom, parseEther } from "viem"; +import { hardhat } from "viem/chains"; + +import { mineBlock } from "../../test-helpers/mine-block"; +import { sleep } from "../../test-helpers/sleep"; +import { + TestChainHelper, + useFileIgnitionProject, +} from "../../test-helpers/use-ignition-project"; + +/** + * Run an initial deploy, that starts but does not finish several on-chain + * transactions via Ignition. The user then replaces a transaction by + * reusing a nonce with a higher gas value. The user submitted transaction + * confirms between runs. On the rerun we should we should resubmit + * the original transaction with a new nonce. + */ +describe("execution - rerun with replaced confirmed user transaction", () => { + useFileIgnitionProject( + "minimal", + "rerun-with-replaced-confirmed-user-transaction", + { + requiredConfirmations: 2, + } + ); + + it.skip("should deploy user interfered transaction on second run", async function () { + const moduleDefinition = buildModule("FooModule", (m) => { + const account2 = m.getAccount(2); + + // batch 1 + const foo1 = m.contract("Foo", [], { id: "Foo1", from: account2 }); + const foo2 = m.contract("Foo", [], { id: "Foo2", from: account2 }); + const foo3 = m.contract("Foo", [], { id: "Foo3", from: account2 }); + + return { + foo1, + foo2, + foo3, + }; + }); + + // First run fo the deploy + await this.runControlledDeploy( + moduleDefinition, + async (c: TestChainHelper) => { + // Wait for the submission of foo1 foo2 and foo3 to mempool, + // then kill the deploy process + await c.waitForPendingTxs(3); + c.exitDeploy(); + } + ); + + const FooArtifact = this.hre.artifacts.readArtifactSync("Foo"); + + // Submit a user interfering deploy transaction + // to the mempool reusing nonce 2 + const [, , signer2] = (await this.hre.network.provider.request({ + method: "eth_accounts", + })) as string[]; + + const walletClient = createWalletClient({ + chain: hardhat, + transport: custom(this.hre.network.provider), + }); + + const deployPromise = walletClient.deployContract({ + abi: FooArtifact.abi, + bytecode: FooArtifact.bytecode as `0x${string}`, + args: [], + account: signer2 as `0x${string}`, + gasPrice: parseEther("500", "gwei"), + nonce: 2, + }); + + // mine a block confirming foo1, foo2, and the user provided transaction + // foo3 is no longer in the mempool + await sleep(300); + await mineBlock(this.hre); + + // Rerun the deployment with foo3 replaced, causing it to + // be resubmitted + const result = await this.runControlledDeploy( + moduleDefinition, + async (c: TestChainHelper) => { + // this block should confirm foo3 + await c.mineBlock(1); + } + ); + + assert.isDefined(result); + + assert.equal(await result.foo1.read.x(), 1n); + assert.equal(await result.foo2.read.x(), 1n); + assert.equal(await result.foo3.read.x(), 1n); + + // the user deployed contract is working as well + const userDeployed = await deployPromise; + assert(userDeployed); + }); +}); diff --git a/packages/hardhat-ignition/test/deploy/nonce-checks/revert-nonce-on-simulation-error.ts b/packages/hardhat-ignition/test/deploy/nonce-checks/revert-nonce-on-simulation-error.ts new file mode 100644 index 00000000000..3e9284efc34 --- /dev/null +++ b/packages/hardhat-ignition/test/deploy/nonce-checks/revert-nonce-on-simulation-error.ts @@ -0,0 +1,36 @@ +/* eslint-disable import/no-unused-modules */ +import { buildModule } from "@nomicfoundation/ignition-core"; +import { assert } from "chai"; + +import { useEphemeralIgnitionProject } from "../../test-helpers/use-ignition-project"; + +/** + * On running a deploy, if a transaction fails simulation, we should + * revert the allocated nonce and complete the rest of the batch. + * + * This test ensures that the nonce is reverted and the rest of the batch completes + * because the second transaction does not fail the nonce check. + */ +describe("execution - revert nonce on simulation error", () => { + useEphemeralIgnitionProject("minimal"); + + it("should raise the simulation error if there are multiple transactions in a batch and fails simulation", async function () { + const moduleDefinition = buildModule("FooModule", (m) => { + // batch 1 + const foo = m.contract("FailureCalls"); + + // batch 2 + m.call(foo, "fails"); + m.call(foo, "doesNotFail"); + + return { foo }; + }); + + // We check that it doesn't fail because of a nonce validation, + // but because of the actual simulation + await assert.isRejected( + this.hre.ignition.deploy(moduleDefinition), + /Simulating the transaction failed with error: Reverted with reason "fails"/ + ); + }); +}); diff --git a/packages/hardhat-ignition/test/deploy/rerun/rerun-a-deploy-that-timed-out.ts b/packages/hardhat-ignition/test/deploy/rerun/rerun-a-deploy-that-timed-out.ts new file mode 100644 index 00000000000..122c8dfb190 --- /dev/null +++ b/packages/hardhat-ignition/test/deploy/rerun/rerun-a-deploy-that-timed-out.ts @@ -0,0 +1,127 @@ +/* eslint-disable import/no-unused-modules */ +import { setNextBlockBaseFeePerGas } from "@nomicfoundation/hardhat-network-helpers"; +import { buildModule, wipe } from "@nomicfoundation/ignition-core"; +import { assert } from "chai"; + +import { HardhatArtifactResolver } from "../../../src/hardhat-artifact-resolver"; +import { mineBlock } from "../../test-helpers/mine-block"; +import { + TestChainHelper, + useFileIgnitionProject, +} from "../../test-helpers/use-ignition-project"; + +/** + * A run that deploys a contract times out + * + * TODO: Needs to be updated to deal with fee bumps + */ +describe("execution - rerun a deploy that timed out", () => { + useFileIgnitionProject("minimal", "rerun-a-deploy-that-timed-out", { + blockPollingInterval: 50, + timeBeforeBumpingFees: 45, + maxFeeBumps: 2, + requiredConfirmations: 1, + }); + + it("shows an error indicating a wipe is required", async function () { + // Setup a module with a contract deploy on accounts[2] + const moduleDefinition = buildModule("FooModule", (m) => { + const account2 = m.getAccount(2); + + const foo = m.contract("Foo", [], { from: account2 }); + + return { + foo, + }; + }); + + // Deploying the module that uses accounts[2], but force timeout, + // by not processing any blocks + await assert.isRejected( + this.runControlledDeploy(moduleDefinition, async (c: TestChainHelper) => { + // wait for the deploy transaction to hit the memory pool, + // but then never mine the block that will complete it. + await c.waitForPendingTxs(1); + await setNextBlockBaseFeePerGas(10_000_000_000n); + await c.mineBlock(); + + await c.waitForPendingTxs(1); + await setNextBlockBaseFeePerGas(100_000_000_000n); + await c.mineBlock(); + + await c.waitForPendingTxs(1); + await setNextBlockBaseFeePerGas(1_000_000_000_000n); + await c.mineBlock(); + }) + ); + + await assert.isRejected( + this.runControlledDeploy(moduleDefinition, async (c: TestChainHelper) => { + // Mine the block, confirming foo + await c.mineBlock(1); + }), + `The deployment wasn\'t run because of the following errors in a previous run: + + * FooModule#Foo: The previous run of the future FooModule#Foo timed out, and will need wiped before running again` + ); + }); + + /** + * Perform a run that times out by manipulating the base fee. Reset the base fee + * and wipe the future, the run again. + * + * A new second transaction is submitted that succeeds. + */ + it("should successfully rerun after a timeout (and a wipe)", async function () { + // Setup a module with a contract deploy on accounts[2] + const moduleDefinition = buildModule("FooModule", (m) => { + const account2 = m.getAccount(2); + + const foo = m.contract("Foo", [], { from: account2 }); + + return { + foo, + }; + }); + + // Deploying the module that uses accounts[2], but force timeout, + // by not processing any blocks + await assert.isRejected( + this.runControlledDeploy(moduleDefinition, async (c: TestChainHelper) => { + // wait for the deploy transaction to hit the memory pool, + // but then never mine the block that will complete it. + await c.waitForPendingTxs(1); + await setNextBlockBaseFeePerGas(10_000_000_000n); + await c.mineBlock(); + + await c.waitForPendingTxs(1); + await setNextBlockBaseFeePerGas(100_000_000_000n); + await c.mineBlock(); + + await c.waitForPendingTxs(1); + await setNextBlockBaseFeePerGas(1_000_000_000_000n); + await c.mineBlock(); + }) + ); + + await setNextBlockBaseFeePerGas(1_000_000n); + await mineBlock(this.hre); + + await wipe( + this.deploymentDir!, + new HardhatArtifactResolver(this.hre), + "FooModule#Foo" + ); + + const result = await this.runControlledDeploy( + moduleDefinition, + async (c: TestChainHelper) => { + // Mine the block, confirming foo + await c.mineBlock(1); + } + ); + + assert.isDefined(result); + assert.equal(await result.foo.read.x(), 1n); + }); +}); diff --git a/packages/hardhat-ignition/test/deploy/rerun/rerun-after-kill.ts b/packages/hardhat-ignition/test/deploy/rerun/rerun-after-kill.ts new file mode 100644 index 00000000000..01c04dc57d8 --- /dev/null +++ b/packages/hardhat-ignition/test/deploy/rerun/rerun-after-kill.ts @@ -0,0 +1,70 @@ +/* eslint-disable import/no-unused-modules */ +import { buildModule } from "@nomicfoundation/ignition-core"; +import { assert } from "chai"; + +import { + TestChainHelper, + useFileIgnitionProject, +} from "../../test-helpers/use-ignition-project"; + +/** + * Run an initial deploy that deploys multiple contracts, one contract per batch. + * Kill the process on the first transaction being submitted. + * Restart the deployment and ensure that the deployment is completed with + * all contracts deployed. + * + * This covers a bug in the nonce mangement code: see #576 + */ +describe("execution - rerun after kill", function () { + this.timeout(60000); + + useFileIgnitionProject("minimal", "rerun-after-kill"); + + it("should pickup deployment and run contracts to completion", async function () { + const moduleDefinition = buildModule("FooModule", (m) => { + const foo1 = m.contract("Foo", [], { id: "foo1" }); + const foo2 = m.contract("Foo", [], { id: "foo2" }); + const foo3 = m.contract("Foo", [], { id: "foo3" }); + const foo4 = m.contract("Foo", [], { id: "foo4" }); + const foo5 = m.contract("Foo", [], { id: "foo5" }); + + return { + foo1, + foo2, + foo3, + foo4, + foo5, + }; + }); + + // Start the deploy + await this.runControlledDeploy( + moduleDefinition, + async (c: TestChainHelper) => { + // this block shound include deployment of foo1 + await c.waitForPendingTxs(1); + + c.exitDeploy(); + } + ); + + // Rerun the deployment + const result = await this.runControlledDeploy( + moduleDefinition, + async (c: TestChainHelper) => { + // this block shound include deployment of foo2 + await c.mineBlock(1); + await c.mineBlock(1); + await c.mineBlock(1); + await c.mineBlock(1); + await c.mineBlock(1); + } + ); + + assert.equal(await result.foo1.read.x(), 1n); + assert.equal(await result.foo2.read.x(), 1n); + assert.equal(await result.foo3.read.x(), 1n); + assert.equal(await result.foo4.read.x(), 1n); + assert.equal(await result.foo5.read.x(), 1n); + }); +}); diff --git a/packages/hardhat-ignition/test/deploy/rerun/rerun-with-new-contract-deploy.ts b/packages/hardhat-ignition/test/deploy/rerun/rerun-with-new-contract-deploy.ts new file mode 100644 index 00000000000..323633f64ab --- /dev/null +++ b/packages/hardhat-ignition/test/deploy/rerun/rerun-with-new-contract-deploy.ts @@ -0,0 +1,73 @@ +/* eslint-disable import/no-unused-modules */ +import { buildModule } from "@nomicfoundation/ignition-core"; +import { assert } from "chai"; + +import { mineBlock } from "../../test-helpers/mine-block"; +import { + TestChainHelper, + useFileIgnitionProject, +} from "../../test-helpers/use-ignition-project"; + +/** + * Run an initial deploy, that deploys a contract. The module is modified + * to add an additional dependent contract. On the second run only one contract + * is deployed. + */ +describe("execution - rerun with new contract deploy", () => { + useFileIgnitionProject("minimal", "rerun-with-new-contract-deploy"); + + it("should deploy only one contract on second run", async function () { + const moduleDefinition = buildModule("BarModule", (m) => { + const bar = m.contract("Bar"); + + return { + bar, + }; + }); + + // Start the deploy + const { bar: originalBar } = await this.runControlledDeploy( + moduleDefinition, + async (c: TestChainHelper) => { + // this block shound include deployment of foo1 + await c.mineBlock(1); + } + ); + + const firstRunBarAddress = originalBar.address.toLowerCase(); + + // Further blocks with no pending transactions + await mineBlock(this.hre); + await mineBlock(this.hre); + + const updatedModuleDefinition = buildModule("BarModule", (m) => { + const bar = m.contract("Bar"); + const usesContract = m.contract("UsesContract", [bar]); + + return { + bar, + usesContract, + }; + }); + + // Rerun the deployment + const result = await this.runControlledDeploy( + updatedModuleDefinition, + async (c: TestChainHelper) => { + // this block shound include deployment of foo2 + await c.mineBlock(1); + } + ); + + const usedAddress = ( + (await result.usesContract.read.contractAddress()) as string + ).toLowerCase(); + + const secondRunBarAddress = result.bar.address.toLowerCase(); + + // The BarModule#Bar contract has not been redeployed if + // it shares the same address. + assert.equal(firstRunBarAddress, secondRunBarAddress); + assert.equal(usedAddress, secondRunBarAddress); + }); +}); diff --git a/packages/hardhat-ignition/test/deploy/reset.ts b/packages/hardhat-ignition/test/deploy/reset.ts new file mode 100644 index 00000000000..2615060f120 --- /dev/null +++ b/packages/hardhat-ignition/test/deploy/reset.ts @@ -0,0 +1,42 @@ +import { status } from "@nomicfoundation/ignition-core"; +import { assert } from "chai"; + +import { HardhatArtifactResolver } from "../../src/hardhat-artifact-resolver"; +import { useFileIgnitionProject } from "../test-helpers/use-ignition-project"; + +describe("reset flag", function () { + useFileIgnitionProject("reset-flag", "custom-reset-id"); + + it("should reset a deployment", async function () { + this.hre.network.name = "something-else"; + + await this.hre.run( + { scope: "ignition", task: "deploy" }, + { + modulePath: "./ignition/modules/FirstPass.js", + deploymentId: "custom-reset-id", + reset: true, + } + ); + + await this.hre.run( + { scope: "ignition", task: "deploy" }, + { + modulePath: "./ignition/modules/SecondPass.js", + deploymentId: "custom-reset-id", + reset: true, + } + ); + + const artifactResolver = new HardhatArtifactResolver(this.hre); + const result = await status(this.deploymentDir!, artifactResolver); + + // ResetModule#B will only be in the success list if the second + // run ran without any reconciliation errors - so the retry + // cleared the first pass + assert( + result.successful.includes("ResetModule#B"), + "Retry did not clear first pass, so second pass failed" + ); + }); +}); diff --git a/packages/hardhat-ignition/test/deploy/timeouts/deploy-run-times-out.ts b/packages/hardhat-ignition/test/deploy/timeouts/deploy-run-times-out.ts new file mode 100644 index 00000000000..86391e3898e --- /dev/null +++ b/packages/hardhat-ignition/test/deploy/timeouts/deploy-run-times-out.ts @@ -0,0 +1,55 @@ +/* eslint-disable import/no-unused-modules */ +import { setNextBlockBaseFeePerGas } from "@nomicfoundation/hardhat-network-helpers"; +import { buildModule } from "@nomicfoundation/ignition-core"; +import { assert } from "chai"; + +import { + TestChainHelper, + useFileIgnitionProject, +} from "../../test-helpers/use-ignition-project"; + +/** + * A run that deploys a contract times out + */ +describe("execution - deploy run times out", () => { + useFileIgnitionProject("minimal", "deploy-run-times-out", { + blockPollingInterval: 50, + timeBeforeBumpingFees: 45, + maxFeeBumps: 2, + requiredConfirmations: 1, + }); + + it("should error naming timed out transactions", async function () { + // Setup a module with a contract deploy on accounts[2] + const moduleDefinition = buildModule("FooModule", (m) => { + const account2 = m.getAccount(2); + + const foo = m.contract("Foo", [], { from: account2 }); + + return { + foo, + }; + }); + + // Deploying the module that uses accounts[2] throws with a warning + await assert.isRejected( + this.runControlledDeploy(moduleDefinition, async (c: TestChainHelper) => { + // wait for the deploy transaction to hit the memory pool, + // but then bump the base fee so that it doesn't get mined, + // with the next block + await c.waitForPendingTxs(1); + await setNextBlockBaseFeePerGas(10_000_000_000n); + await c.mineBlock(); + + await c.waitForPendingTxs(1); + await setNextBlockBaseFeePerGas(100_000_000_000n); + await c.mineBlock(); + + await c.waitForPendingTxs(1); + await setNextBlockBaseFeePerGas(1_000_000_000_000n); + await c.mineBlock(); + }), + "The deployment wasn't successful, there were timeouts:\n\nTimed out:\n\n * FooModule#Foo/1" + ); + }); +}); diff --git a/packages/hardhat-ignition/test/deploy/writeLocalhost.ts b/packages/hardhat-ignition/test/deploy/writeLocalhost.ts new file mode 100644 index 00000000000..1d64e03b567 --- /dev/null +++ b/packages/hardhat-ignition/test/deploy/writeLocalhost.ts @@ -0,0 +1,55 @@ +import { assert } from "chai"; +import { pathExists, removeSync } from "fs-extra"; +import path from "path"; + +import { useEphemeralIgnitionProject } from "../test-helpers/use-ignition-project"; + +const fixtureProjectName = "minimal"; +const deploymentDir = path.join( + path.resolve(__dirname, `../fixture-projects/${fixtureProjectName}/ignition`), + "deployments", + "chain-31337" +); + +describe("localhost deployment flag", function () { + useEphemeralIgnitionProject(fixtureProjectName); + + beforeEach("clean filesystem", async function () { + // make sure nothing is left over from a previous test + removeSync(deploymentDir); + }); + afterEach("clean filesystem", function () { + // cleanup + removeSync(deploymentDir); + }); + + it("true should write deployment to disk", async function () { + await this.hre.run( + { scope: "ignition", task: "deploy" }, + { + modulePath: "./ignition/modules/OwnModule.js", + writeLocalhostDeployment: true, + } + ); + + assert( + await pathExists(deploymentDir), + "Deployment was not written to disk" + ); + }); + + it("false should not write deployment to disk", async function () { + await this.hre.run( + { scope: "ignition", task: "deploy" }, + { + modulePath: "./ignition/modules/OwnModule.js", + writeLocalhostDeployment: false, + } + ); + + assert( + !(await pathExists(deploymentDir)), + "Deployment was not written to disk" + ); + }); +}); diff --git a/packages/hardhat-ignition/test/fixture-projects/.gitignore b/packages/hardhat-ignition/test/fixture-projects/.gitignore new file mode 100644 index 00000000000..f1462f7a568 --- /dev/null +++ b/packages/hardhat-ignition/test/fixture-projects/.gitignore @@ -0,0 +1,3 @@ +artifacts/ +cache/ +deployments/ diff --git a/packages/hardhat-ignition/test/fixture-projects/create2-bad-config/contracts/Foo.sol b/packages/hardhat-ignition/test/fixture-projects/create2-bad-config/contracts/Foo.sol new file mode 100644 index 00000000000..33c8ffdf303 --- /dev/null +++ b/packages/hardhat-ignition/test/fixture-projects/create2-bad-config/contracts/Foo.sol @@ -0,0 +1,7 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity >=0.7.0 <0.9.0; +pragma experimental ABIEncoderV2; + +contract Foo { + bool public isFoo = true; +} diff --git a/packages/hardhat-ignition/test/fixture-projects/create2-bad-config/hardhat.config.js b/packages/hardhat-ignition/test/fixture-projects/create2-bad-config/hardhat.config.js new file mode 100644 index 00000000000..bb4b83c2608 --- /dev/null +++ b/packages/hardhat-ignition/test/fixture-projects/create2-bad-config/hardhat.config.js @@ -0,0 +1,15 @@ +require("../../../src/index"); + +/** + * @type import('hardhat/config').HardhatUserConfig + */ +module.exports = { + solidity: "0.8.19", + ignition: { + strategyConfig: { + create2: { + salt: undefined, // Missing salt + }, + }, + }, +}; diff --git a/packages/hardhat-ignition/test/fixture-projects/create2-bad-config/ignition/modules/MyModule.js b/packages/hardhat-ignition/test/fixture-projects/create2-bad-config/ignition/modules/MyModule.js new file mode 100644 index 00000000000..88f3faf68d7 --- /dev/null +++ b/packages/hardhat-ignition/test/fixture-projects/create2-bad-config/ignition/modules/MyModule.js @@ -0,0 +1,7 @@ +const { buildModule } = require("@nomicfoundation/ignition-core"); + +module.exports = buildModule("MyModule", (m) => { + const foo = m.contract("Foo"); + + return { foo }; +}); diff --git a/packages/hardhat-ignition/test/fixture-projects/create2-exists-chain/contracts/Foo.sol b/packages/hardhat-ignition/test/fixture-projects/create2-exists-chain/contracts/Foo.sol new file mode 100644 index 00000000000..821ff9cd70d --- /dev/null +++ b/packages/hardhat-ignition/test/fixture-projects/create2-exists-chain/contracts/Foo.sol @@ -0,0 +1,24 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity >=0.7.0 <0.9.0; +pragma experimental ABIEncoderV2; + +contract Foo { + bool public isFoo = true; + uint256 public x = 1; + + constructor() payable {} + + function inc() public { + x++; + } + + function incByPositiveNumber(uint256 n) public { + require(n > 0, "n must be positive"); + x += n; + } + + function incTwoNumbers(uint256 first, uint256 second) public { + x += first; + x += second; + } +} diff --git a/packages/hardhat-ignition/test/fixture-projects/create2-exists-chain/contracts/Unpayable.sol b/packages/hardhat-ignition/test/fixture-projects/create2-exists-chain/contracts/Unpayable.sol new file mode 100644 index 00000000000..d038ce117b3 --- /dev/null +++ b/packages/hardhat-ignition/test/fixture-projects/create2-exists-chain/contracts/Unpayable.sol @@ -0,0 +1,10 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity >=0.7.0 <0.9.0; +pragma experimental ABIEncoderV2; + +contract Unpayable { + bool public isUnpayable = true; + + // intentionally not payable + constructor() {} +} diff --git a/packages/hardhat-ignition/test/fixture-projects/create2-exists-chain/hardhat.config.js b/packages/hardhat-ignition/test/fixture-projects/create2-exists-chain/hardhat.config.js new file mode 100644 index 00000000000..4b67cc0a661 --- /dev/null +++ b/packages/hardhat-ignition/test/fixture-projects/create2-exists-chain/hardhat.config.js @@ -0,0 +1,16 @@ +require("../../../src/index"); + +/** + * @type import('hardhat/config').HardhatUserConfig + */ +module.exports = { + solidity: "0.8.19", + networks: { + hardhat: { + mining: { + auto: false, + }, + chainId: 1, + }, + }, +}; diff --git a/packages/hardhat-ignition/test/fixture-projects/create2-exists-chain/ignition/modules/MyModule.js b/packages/hardhat-ignition/test/fixture-projects/create2-exists-chain/ignition/modules/MyModule.js new file mode 100644 index 00000000000..11dd2c6589c --- /dev/null +++ b/packages/hardhat-ignition/test/fixture-projects/create2-exists-chain/ignition/modules/MyModule.js @@ -0,0 +1,8 @@ +// eslint-disable-next-line import/no-unused-modules +const { buildModule } = require("@nomicfoundation/ignition-core"); + +module.exports = buildModule("MyModule", (m) => { + const foo = m.contract("Foo"); + + return { foo }; +}); diff --git a/packages/hardhat-ignition/test/fixture-projects/create2-not-exists-chain/contracts/Foo.sol b/packages/hardhat-ignition/test/fixture-projects/create2-not-exists-chain/contracts/Foo.sol new file mode 100644 index 00000000000..992dab4f1da --- /dev/null +++ b/packages/hardhat-ignition/test/fixture-projects/create2-not-exists-chain/contracts/Foo.sol @@ -0,0 +1,22 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity >=0.7.0 <0.9.0; +pragma experimental ABIEncoderV2; + +contract Foo { + bool public isFoo = true; + uint256 public x = 1; + + function inc() public { + x++; + } + + function incByPositiveNumber(uint256 n) public { + require(n > 0, "n must be positive"); + x += n; + } + + function incTwoNumbers(uint256 first, uint256 second) public { + x += first; + x += second; + } +} diff --git a/packages/hardhat-ignition/test/fixture-projects/create2-not-exists-chain/hardhat.config.js b/packages/hardhat-ignition/test/fixture-projects/create2-not-exists-chain/hardhat.config.js new file mode 100644 index 00000000000..186e6f152ea --- /dev/null +++ b/packages/hardhat-ignition/test/fixture-projects/create2-not-exists-chain/hardhat.config.js @@ -0,0 +1,16 @@ +require("../../../src/index"); + +/** + * @type import('hardhat/config').HardhatUserConfig + */ +module.exports = { + solidity: "0.8.19", + networks: { + hardhat: { + mining: { + auto: false, + }, + chainId: 88888, + }, + }, +}; diff --git a/packages/hardhat-ignition/test/fixture-projects/create2-not-exists-chain/ignition/modules/MyModule.js b/packages/hardhat-ignition/test/fixture-projects/create2-not-exists-chain/ignition/modules/MyModule.js new file mode 100644 index 00000000000..11dd2c6589c --- /dev/null +++ b/packages/hardhat-ignition/test/fixture-projects/create2-not-exists-chain/ignition/modules/MyModule.js @@ -0,0 +1,8 @@ +// eslint-disable-next-line import/no-unused-modules +const { buildModule } = require("@nomicfoundation/ignition-core"); + +module.exports = buildModule("MyModule", (m) => { + const foo = m.contract("Foo"); + + return { foo }; +}); diff --git a/packages/hardhat-ignition/test/fixture-projects/index-pattern-success/contracts/Test.sol b/packages/hardhat-ignition/test/fixture-projects/index-pattern-success/contracts/Test.sol new file mode 100644 index 00000000000..0e799e88d15 --- /dev/null +++ b/packages/hardhat-ignition/test/fixture-projects/index-pattern-success/contracts/Test.sol @@ -0,0 +1,64 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.9; + +contract F1 { + bool public firstCalled; + bool public secondCalled; + bool public thirdCalled; + + address public caller1; + address public caller2; + + function first() public { + firstCalled = true; + } + + function second() public { + require(firstCalled, "first() was not called"); + require(!thirdCalled, "third() was called"); + + secondCalled = true; + } + + function third() public { + require(firstCalled, "first() was not called"); + require(secondCalled, "second() was not called"); + + thirdCalled = true; + } + + function mustBeCalledByTwoSeparateContracts() public { + if (caller1 == address(0)) { + caller1 = msg.sender; + } else { + caller2 = msg.sender; + } + } + + function throwsIfNotCalledTwice() public view { + require(caller1 != address(0) && caller2 != address(0) && caller1 != caller2, "was not called by two separate contracts"); + } +} + +contract F2 { + + F1 public f1; + + uint public counter; + + constructor(F1 _f1) { + f1 = _f1; + } + + function second() public { + f1.second(); + } + + function mustBeCalledByTwoSeparateContracts() public { + f1.mustBeCalledByTwoSeparateContracts(); + } + + function unrelatedFunc() public { + counter++; + } +} diff --git a/packages/hardhat-ignition/test/fixture-projects/index-pattern-success/hardhat.config.js b/packages/hardhat-ignition/test/fixture-projects/index-pattern-success/hardhat.config.js new file mode 100644 index 00000000000..c76e2c9b8d1 --- /dev/null +++ b/packages/hardhat-ignition/test/fixture-projects/index-pattern-success/hardhat.config.js @@ -0,0 +1,14 @@ +require("@nomicfoundation/hardhat-ignition"); + +/** @type import('hardhat/config').HardhatUserConfig */ +module.exports = { + solidity: { + version: "0.8.19", + settings: { + metadata: { + // We disable the metadata to keep the fixtures more stables + appendCBOR: false, + }, + }, + }, +}; diff --git a/packages/hardhat-ignition/test/fixture-projects/index-pattern-success/ignition/modules/MyModule.js b/packages/hardhat-ignition/test/fixture-projects/index-pattern-success/ignition/modules/MyModule.js new file mode 100644 index 00000000000..11dd2c6589c --- /dev/null +++ b/packages/hardhat-ignition/test/fixture-projects/index-pattern-success/ignition/modules/MyModule.js @@ -0,0 +1,8 @@ +// eslint-disable-next-line import/no-unused-modules +const { buildModule } = require("@nomicfoundation/ignition-core"); + +module.exports = buildModule("MyModule", (m) => { + const foo = m.contract("Foo"); + + return { foo }; +}); diff --git a/packages/hardhat-ignition/test/fixture-projects/lock/contracts/Lock.sol b/packages/hardhat-ignition/test/fixture-projects/lock/contracts/Lock.sol new file mode 100644 index 00000000000..122a2744645 --- /dev/null +++ b/packages/hardhat-ignition/test/fixture-projects/lock/contracts/Lock.sol @@ -0,0 +1,38 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.9; + +// Uncomment this line to use console.log +// import "hardhat/console.sol"; + +contract Lock { + uint public unlockTime; + address payable public owner; + + event Withdrawal(uint amount, uint when); + + constructor(uint _unlockTime) payable { + require( + block.timestamp < _unlockTime, + "Unlock time should be in the future" + ); + + unlockTime = _unlockTime; + owner = payable(msg.sender); + } + + function test() public { + emit Withdrawal(address(this).balance, block.timestamp); + } + + function withdraw() public { + // Uncomment this line, and the import of "hardhat/console.sol", to print a log in your terminal + // console.log("Unlock time is %o and block timestamp is %o", unlockTime, block.timestamp); + + require(block.timestamp >= unlockTime, "You can't withdraw yet"); + require(msg.sender == owner, "You aren't the owner"); + + emit Withdrawal(address(this).balance, block.timestamp); + + owner.transfer(address(this).balance); + } +} diff --git a/packages/hardhat-ignition/test/fixture-projects/lock/hardhat.config.js b/packages/hardhat-ignition/test/fixture-projects/lock/hardhat.config.js new file mode 100644 index 00000000000..791b28f3370 --- /dev/null +++ b/packages/hardhat-ignition/test/fixture-projects/lock/hardhat.config.js @@ -0,0 +1,12 @@ +require("../../../src/index"); + +module.exports = { + solidity: "0.8.19", + networks: { + hardhat: { + mining: { + auto: false, + }, + }, + }, +}; diff --git a/packages/hardhat-ignition/test/fixture-projects/lock/ignition/modules/Lock.ts b/packages/hardhat-ignition/test/fixture-projects/lock/ignition/modules/Lock.ts new file mode 100644 index 00000000000..8b88fea646f --- /dev/null +++ b/packages/hardhat-ignition/test/fixture-projects/lock/ignition/modules/Lock.ts @@ -0,0 +1,15 @@ +import { buildModule } from "@nomicfoundation/ignition-core"; + +const LockModule = buildModule("LockModule", (m) => { + const unlockTime = m.getParameter("unlockTime"); + const lockedAmount = m.getParameter("lockedAmount", 1_000_000_000n); + + const lock = m.contract("Lock", [unlockTime], { + value: lockedAmount, + }); + + return { lock }; +}); + +// eslint-disable-next-line import/no-default-export +export default LockModule; diff --git a/packages/hardhat-ignition/test/fixture-projects/lock/ignition/modules/parameters-bigints-as-strings.json b/packages/hardhat-ignition/test/fixture-projects/lock/ignition/modules/parameters-bigints-as-strings.json new file mode 100644 index 00000000000..f84de04388a --- /dev/null +++ b/packages/hardhat-ignition/test/fixture-projects/lock/ignition/modules/parameters-bigints-as-strings.json @@ -0,0 +1,6 @@ +{ + "LockModule": { + "unlockTime": "1893499200000n", + "lockedAmount": "2000000000000n" + } +} diff --git a/packages/hardhat-ignition/test/fixture-projects/lock/ignition/modules/parameters-json5.json5 b/packages/hardhat-ignition/test/fixture-projects/lock/ignition/modules/parameters-json5.json5 new file mode 100644 index 00000000000..6a57f6c0340 --- /dev/null +++ b/packages/hardhat-ignition/test/fixture-projects/lock/ignition/modules/parameters-json5.json5 @@ -0,0 +1,16 @@ +/** + * comments allowed in json5 + */ + +{ + // no quotes around keys + LockModule: { + // weird multi-line but should pass + unlockTime: "1\ +893\ +499\ +200\ +000n", + lockedAmount: "2000000000000n", + }, +} diff --git a/packages/hardhat-ignition/test/fixture-projects/lock/ignition/modules/parameters-too-large.json b/packages/hardhat-ignition/test/fixture-projects/lock/ignition/modules/parameters-too-large.json new file mode 100644 index 00000000000..0fe07f2b2ae --- /dev/null +++ b/packages/hardhat-ignition/test/fixture-projects/lock/ignition/modules/parameters-too-large.json @@ -0,0 +1,5 @@ +{ + "LockModule": { + "unlockTime": 1893499200000000000 + } +} diff --git a/packages/hardhat-ignition/test/fixture-projects/lock/ignition/modules/parameters.json b/packages/hardhat-ignition/test/fixture-projects/lock/ignition/modules/parameters.json new file mode 100644 index 00000000000..914e9c7c4e7 --- /dev/null +++ b/packages/hardhat-ignition/test/fixture-projects/lock/ignition/modules/parameters.json @@ -0,0 +1,5 @@ +{ + "LockModule": { + "unlockTime": 1893499200000 + } +} diff --git a/packages/hardhat-ignition/test/fixture-projects/minimal/contracts/Bar.sol b/packages/hardhat-ignition/test/fixture-projects/minimal/contracts/Bar.sol new file mode 100644 index 00000000000..1ee84c4f404 --- /dev/null +++ b/packages/hardhat-ignition/test/fixture-projects/minimal/contracts/Bar.sol @@ -0,0 +1,6 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity >=0.7.0 <0.9.0; + +contract Bar { + bool public isBar = true; +} diff --git a/packages/hardhat-ignition/test/fixture-projects/minimal/contracts/CaptureArraysContract.sol b/packages/hardhat-ignition/test/fixture-projects/minimal/contracts/CaptureArraysContract.sol new file mode 100644 index 00000000000..7cc2e4871f3 --- /dev/null +++ b/packages/hardhat-ignition/test/fixture-projects/minimal/contracts/CaptureArraysContract.sol @@ -0,0 +1,47 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.7.0 <0.9.0; + +contract CaptureArraysContract { + bool public arraysCaptured; + + constructor() { + arraysCaptured = false; + } + + function recordArrays( + uint256[] memory first, + string[] memory second, + bool[] memory third + ) public returns (uint256 output) { + arraysCaptured = true; + + require(first.length == 3, "Wrong number of args on first arg"); + require(first[0] == 1, "First value is wrong"); + require(first[1] == 2, "Second value is wrong"); + require(first[2] == 3, "Third value is wrong"); + + require(second.length == 3, "Wrong number of args on second arg"); + require( + keccak256(abi.encodePacked(second[0])) == + keccak256(abi.encodePacked("a")), + "First value is wrong" + ); + require( + keccak256(abi.encodePacked(second[1])) == + keccak256(abi.encodePacked("b")), + "Second value is wrong" + ); + require( + keccak256(abi.encodePacked(second[2])) == + keccak256(abi.encodePacked("c")), + "Third value is wrong" + ); + + require(third.length == 3, "Wrong number of args on third arg"); + require(third[0] == true, "First value is wrong"); + require(third[1] == false, "Second value is wrong"); + require(third[2] == true, "Third value is wrong"); + + return 1; + } +} diff --git a/packages/hardhat-ignition/test/fixture-projects/minimal/contracts/CaptureComplexObjectContract.sol b/packages/hardhat-ignition/test/fixture-projects/minimal/contracts/CaptureComplexObjectContract.sol new file mode 100644 index 00000000000..698c71207f1 --- /dev/null +++ b/packages/hardhat-ignition/test/fixture-projects/minimal/contracts/CaptureComplexObjectContract.sol @@ -0,0 +1,41 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.7.0 <0.9.0; + +contract CaptureComplexObjectContract { + bool public complexArgCaptured; + + constructor() { + complexArgCaptured = false; + } + + struct SubComplex { + string sub; + } + + struct Complex { + bool firstBool; + uint256[] secondArray; + SubComplex thirdSubcomplex; + } + + function testComplexObject( + Complex memory complexArg + ) public returns (uint256 output) { + complexArgCaptured = true; + + require(complexArg.firstBool, "bad first bool"); + + require(complexArg.secondArray.length == 3, "bad second array"); + require(complexArg.secondArray[0] == 1, "First value is wrong"); + require(complexArg.secondArray[1] == 2, "Second value is wrong"); + require(complexArg.secondArray[2] == 3, "Third value is wrong"); + + require( + keccak256(abi.encodePacked(complexArg.thirdSubcomplex.sub)) == + keccak256(abi.encodePacked("sub")), + "The complex sub object property is wrong" + ); + + return 1; + } +} diff --git a/packages/hardhat-ignition/test/fixture-projects/minimal/contracts/EventArgValue.sol b/packages/hardhat-ignition/test/fixture-projects/minimal/contracts/EventArgValue.sol new file mode 100644 index 00000000000..11bdb0a6cea --- /dev/null +++ b/packages/hardhat-ignition/test/fixture-projects/minimal/contracts/EventArgValue.sol @@ -0,0 +1,24 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity >=0.7.0 <0.9.0; + +contract EventArgValue { + event EventValue(uint256 value); + + bool public argWasValidated; + + constructor() { + emit EventValue(42); + } + + function validateEmitted(uint256 arg) public { + argWasValidated = true; + + require(arg == 42, "arg is wrong"); + } +} + +contract PassingValue { + constructor() payable {} + + function deposit() public payable {} +} diff --git a/packages/hardhat-ignition/test/fixture-projects/minimal/contracts/Factory.sol b/packages/hardhat-ignition/test/fixture-projects/minimal/contracts/Factory.sol new file mode 100644 index 00000000000..c5d27b1d5bc --- /dev/null +++ b/packages/hardhat-ignition/test/fixture-projects/minimal/contracts/Factory.sol @@ -0,0 +1,35 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.7.0 <0.9.0; +pragma experimental ABIEncoderV2; + +import "./Foo.sol"; + +contract FooFactory { + event Deployed(address indexed fooAddress); + + address public deployed; + address[] public allDeployed; + + bool public nonAddressResult; + + function create() public { + Foo foo = new Foo(); + + deployed = address(foo); + allDeployed.push(address(foo)); + + emit Deployed(address(foo)); + } + + function isDeployed() public pure returns (bool output) { + return true; + } + + function getDeployed() public view returns (address output) { + return allDeployed[0]; + } + + function getDeployed(uint256 value) public view returns (address output) { + return allDeployed[value]; + } +} diff --git a/packages/hardhat-ignition/test/fixture-projects/minimal/contracts/Fails.sol b/packages/hardhat-ignition/test/fixture-projects/minimal/contracts/Fails.sol new file mode 100644 index 00000000000..60f8354fdc3 --- /dev/null +++ b/packages/hardhat-ignition/test/fixture-projects/minimal/contracts/Fails.sol @@ -0,0 +1,9 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity >=0.7.0 <0.9.0; +pragma experimental ABIEncoderV2; + +contract Fails { + constructor() { + revert("Constructor failed"); + } +} diff --git a/packages/hardhat-ignition/test/fixture-projects/minimal/contracts/FailureCalls.sol b/packages/hardhat-ignition/test/fixture-projects/minimal/contracts/FailureCalls.sol new file mode 100644 index 00000000000..9db5e14ac02 --- /dev/null +++ b/packages/hardhat-ignition/test/fixture-projects/minimal/contracts/FailureCalls.sol @@ -0,0 +1,16 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity >=0.7.0 <0.9.0; + +contract FailureCalls { + bool public success; + + function fails() public { + success = false; + revert("fails"); + } + + function doesNotFail() public { + // modify the state so the function isn't pure/view + success = true; + } +} diff --git a/packages/hardhat-ignition/test/fixture-projects/minimal/contracts/Foo.sol b/packages/hardhat-ignition/test/fixture-projects/minimal/contracts/Foo.sol new file mode 100644 index 00000000000..197a16b1760 --- /dev/null +++ b/packages/hardhat-ignition/test/fixture-projects/minimal/contracts/Foo.sol @@ -0,0 +1,21 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity >=0.7.0 <0.9.0; + +contract Foo { + bool public isFoo = true; + uint256 public x = 1; + + function inc() public { + x++; + } + + function incByPositiveNumber(uint256 n) public { + require(n > 0, "n must be positive"); + x += n; + } + + function incTwoNumbers(uint256 first, uint256 second) public { + x += first; + x += second; + } +} diff --git a/packages/hardhat-ignition/test/fixture-projects/minimal/contracts/Greeter.sol b/packages/hardhat-ignition/test/fixture-projects/minimal/contracts/Greeter.sol new file mode 100644 index 00000000000..ac1942abe48 --- /dev/null +++ b/packages/hardhat-ignition/test/fixture-projects/minimal/contracts/Greeter.sol @@ -0,0 +1,14 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity >=0.7.0 <0.9.0; + +contract Greeter { + string private _greeting; + + constructor(string memory greeting) { + _greeting = greeting; + } + + function getGreeting() public view returns (string memory) { + return _greeting; + } +} diff --git a/packages/hardhat-ignition/test/fixture-projects/minimal/contracts/Ownable.sol b/packages/hardhat-ignition/test/fixture-projects/minimal/contracts/Ownable.sol new file mode 100644 index 00000000000..7c4c829625a --- /dev/null +++ b/packages/hardhat-ignition/test/fixture-projects/minimal/contracts/Ownable.sol @@ -0,0 +1,10 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity >=0.7.0 <0.9.0; + +contract Ownable { + address public owner; + + constructor() { + owner = msg.sender; + } +} diff --git a/packages/hardhat-ignition/test/fixture-projects/minimal/contracts/Owner.sol b/packages/hardhat-ignition/test/fixture-projects/minimal/contracts/Owner.sol new file mode 100644 index 00000000000..67f06f801c4 --- /dev/null +++ b/packages/hardhat-ignition/test/fixture-projects/minimal/contracts/Owner.sol @@ -0,0 +1,14 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +contract Owner { + address public owner; + + constructor() { + owner = msg.sender; + } + + function setOwner(address _owner) public { + owner = _owner; + } +} diff --git a/packages/hardhat-ignition/test/fixture-projects/minimal/contracts/SendDataEmitter.sol b/packages/hardhat-ignition/test/fixture-projects/minimal/contracts/SendDataEmitter.sol new file mode 100644 index 00000000000..bf78a7361b0 --- /dev/null +++ b/packages/hardhat-ignition/test/fixture-projects/minimal/contracts/SendDataEmitter.sol @@ -0,0 +1,22 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.7.0 <0.9.0; + +contract SendDataEmitter { + event SendDataEvent(uint256 arg); + + bool public wasEmitted; + + receive() external payable { + emit SendDataEvent(42); + } + + function emitEvent() public { + emit SendDataEvent(42); + } + + function validateEmitted(uint256 arg) public { + wasEmitted = true; + + require(arg == 42, "arg is wrong"); + } +} diff --git a/packages/hardhat-ignition/test/fixture-projects/minimal/contracts/StaticCallValue.sol b/packages/hardhat-ignition/test/fixture-projects/minimal/contracts/StaticCallValue.sol new file mode 100644 index 00000000000..11b5f3b1d05 --- /dev/null +++ b/packages/hardhat-ignition/test/fixture-projects/minimal/contracts/StaticCallValue.sol @@ -0,0 +1,8 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity >=0.7.0 <0.9.0; + +contract StaticCallValue { + function getValue() public pure returns (uint256) { + return 42; + } +} diff --git a/packages/hardhat-ignition/test/fixture-projects/minimal/contracts/Trace.sol b/packages/hardhat-ignition/test/fixture-projects/minimal/contracts/Trace.sol new file mode 100644 index 00000000000..1687a1d4850 --- /dev/null +++ b/packages/hardhat-ignition/test/fixture-projects/minimal/contracts/Trace.sol @@ -0,0 +1,14 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity >=0.7.0 <0.9.0; + +contract Trace { + string[] public entries; + + constructor(string memory firstEntry) { + entries = [firstEntry]; + } + + function addEntry(string memory entry) public { + entries.push(entry); + } +} diff --git a/packages/hardhat-ignition/test/fixture-projects/minimal/contracts/TupleEmitter.sol b/packages/hardhat-ignition/test/fixture-projects/minimal/contracts/TupleEmitter.sol new file mode 100644 index 00000000000..b9f98c5cb7e --- /dev/null +++ b/packages/hardhat-ignition/test/fixture-projects/minimal/contracts/TupleEmitter.sol @@ -0,0 +1,29 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.7.0 <0.9.0; + +contract TupleEmitter { + bool public arg1Captured; + bool public arg2Captured; + + event TupleEvent(bool arg1, uint256 arg2); + + function emitTuple() public { + emit TupleEvent(true, 1234); + } + + function verifyArg1(bool arg) public returns (uint256 output) { + arg1Captured = true; + + require(arg == true, "arg1 is wrong"); + + return 1; + } + + function verifyArg2(uint256 arg) public returns (uint256 output) { + arg2Captured = true; + + require(arg == 1234, "arg2 is wrong"); + + return 1; + } +} diff --git a/packages/hardhat-ignition/test/fixture-projects/minimal/contracts/TupleReturn.sol b/packages/hardhat-ignition/test/fixture-projects/minimal/contracts/TupleReturn.sol new file mode 100644 index 00000000000..c7e224e6fca --- /dev/null +++ b/packages/hardhat-ignition/test/fixture-projects/minimal/contracts/TupleReturn.sol @@ -0,0 +1,27 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.7.0 <0.9.0; + +contract TupleReturn { + bool public arg1Captured; + bool public arg2Captured; + + function getTuple() public pure returns (bool arg1, uint256 arg2) { + return (true, 1234); + } + + function verifyArg1(bool arg) public returns (uint256 output) { + arg1Captured = true; + + require(arg == true, "arg1 is wrong"); + + return 1; + } + + function verifyArg2(uint256 arg) public returns (uint256 output) { + arg2Captured = true; + + require(arg == 1234, "arg2 is wrong"); + + return 1; + } +} diff --git a/packages/hardhat-ignition/test/fixture-projects/minimal/contracts/UsesContract.sol b/packages/hardhat-ignition/test/fixture-projects/minimal/contracts/UsesContract.sol new file mode 100644 index 00000000000..a1b14aabe2c --- /dev/null +++ b/packages/hardhat-ignition/test/fixture-projects/minimal/contracts/UsesContract.sol @@ -0,0 +1,14 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity >=0.7.0 <0.9.0; + +contract UsesContract { + address public contractAddress; + + constructor(address _contract) { + contractAddress = _contract; + } + + function setAddress(address _contract) public { + contractAddress = _contract; + } +} diff --git a/packages/hardhat-ignition/test/fixture-projects/minimal/contracts/WithLibrary.sol b/packages/hardhat-ignition/test/fixture-projects/minimal/contracts/WithLibrary.sol new file mode 100644 index 00000000000..3a1f0acd2ae --- /dev/null +++ b/packages/hardhat-ignition/test/fixture-projects/minimal/contracts/WithLibrary.sol @@ -0,0 +1,34 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity >=0.7.0 <0.9.0; + +library RubbishMath { + function add(uint16 left, uint16 right) public pure returns (uint16) { + return left + right; + } +} + +contract DependsOnLib { + function addThreeNumbers( + uint16 first, + uint16 second, + uint16 third + ) public pure returns (uint16) { + return RubbishMath.add(first, RubbishMath.add(second, third)); + } +} + +library LibDependsOnLib { + function add(uint16 left, uint16 right) public pure returns (uint16) { + return RubbishMath.add(left, right); + } +} + +contract DependsOnLibThatDependsOnLib { + function addThreeNumbers( + uint16 first, + uint16 second, + uint16 third + ) public pure returns (uint16) { + return LibDependsOnLib.add(first, LibDependsOnLib.add(second, third)); + } +} diff --git a/packages/hardhat-ignition/test/fixture-projects/minimal/hardhat.config.js b/packages/hardhat-ignition/test/fixture-projects/minimal/hardhat.config.js new file mode 100644 index 00000000000..791b28f3370 --- /dev/null +++ b/packages/hardhat-ignition/test/fixture-projects/minimal/hardhat.config.js @@ -0,0 +1,12 @@ +require("../../../src/index"); + +module.exports = { + solidity: "0.8.19", + networks: { + hardhat: { + mining: { + auto: false, + }, + }, + }, +}; diff --git a/packages/hardhat-ignition/test/fixture-projects/minimal/ignition/modules/MyModule.js b/packages/hardhat-ignition/test/fixture-projects/minimal/ignition/modules/MyModule.js new file mode 100644 index 00000000000..f00a750bdea --- /dev/null +++ b/packages/hardhat-ignition/test/fixture-projects/minimal/ignition/modules/MyModule.js @@ -0,0 +1,13 @@ +// eslint-disable-next-line import/no-unused-modules +const { buildModule } = require("@nomicfoundation/ignition-core"); + +module.exports = buildModule("MyModule", (m) => { + const bar = m.contract("Bar"); + const usesContract = m.contract("UsesContract", [ + "0x0000000000000000000000000000000000000000", + ]); + + m.call(usesContract, "setAddress", [bar]); + + return { bar, usesContract }; +}); diff --git a/packages/hardhat-ignition/test/fixture-projects/minimal/ignition/modules/OwnModule.js b/packages/hardhat-ignition/test/fixture-projects/minimal/ignition/modules/OwnModule.js new file mode 100644 index 00000000000..b124b9d11f9 --- /dev/null +++ b/packages/hardhat-ignition/test/fixture-projects/minimal/ignition/modules/OwnModule.js @@ -0,0 +1,8 @@ +// eslint-disable-next-line import/no-unused-modules +const { buildModule } = require("@nomicfoundation/ignition-core"); + +module.exports = buildModule("OwnModule", (m) => { + const ownable = m.contract("Ownable"); + + return { ownable }; +}); diff --git a/packages/hardhat-ignition/test/fixture-projects/multiple-contracts-with-same-name/contracts/Rocket1.sol b/packages/hardhat-ignition/test/fixture-projects/multiple-contracts-with-same-name/contracts/Rocket1.sol new file mode 100644 index 00000000000..8b11e5648a3 --- /dev/null +++ b/packages/hardhat-ignition/test/fixture-projects/multiple-contracts-with-same-name/contracts/Rocket1.sol @@ -0,0 +1,11 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.0; + +// This contract name is the same as in `./Rocket2.sol` +contract Rocket { + string public name; + + constructor(string memory _name) { + name = _name; + } +} diff --git a/packages/hardhat-ignition/test/fixture-projects/multiple-contracts-with-same-name/contracts/Rocket2.sol b/packages/hardhat-ignition/test/fixture-projects/multiple-contracts-with-same-name/contracts/Rocket2.sol new file mode 100644 index 00000000000..e13358a6bc1 --- /dev/null +++ b/packages/hardhat-ignition/test/fixture-projects/multiple-contracts-with-same-name/contracts/Rocket2.sol @@ -0,0 +1,11 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.0; + +// This contract name is the same as in `./Rocket1.sol` +contract Rocket { + string public name; + + constructor(string memory _name) { + name = _name; + } +} diff --git a/packages/hardhat-ignition/test/fixture-projects/multiple-contracts-with-same-name/hardhat.config.js b/packages/hardhat-ignition/test/fixture-projects/multiple-contracts-with-same-name/hardhat.config.js new file mode 100644 index 00000000000..a59d1ed4d8a --- /dev/null +++ b/packages/hardhat-ignition/test/fixture-projects/multiple-contracts-with-same-name/hardhat.config.js @@ -0,0 +1,5 @@ +require("../../../src/index"); + +module.exports = { + solidity: "0.8.19", +}; diff --git a/packages/hardhat-ignition/test/fixture-projects/reset-flag/contracts/Contracts.sol b/packages/hardhat-ignition/test/fixture-projects/reset-flag/contracts/Contracts.sol new file mode 100644 index 00000000000..c821b2d0d94 --- /dev/null +++ b/packages/hardhat-ignition/test/fixture-projects/reset-flag/contracts/Contracts.sol @@ -0,0 +1,20 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.9; + +contract Foo { + function isFoo() public pure returns (bool) { + return true; + } +} + +contract Bar { + function isBar() public pure returns (bool) { + return true; + } +} + +contract Baz { + function isBaz() public pure returns (bool) { + return true; + } +} diff --git a/packages/hardhat-ignition/test/fixture-projects/reset-flag/hardhat.config.js b/packages/hardhat-ignition/test/fixture-projects/reset-flag/hardhat.config.js new file mode 100644 index 00000000000..c76e2c9b8d1 --- /dev/null +++ b/packages/hardhat-ignition/test/fixture-projects/reset-flag/hardhat.config.js @@ -0,0 +1,14 @@ +require("@nomicfoundation/hardhat-ignition"); + +/** @type import('hardhat/config').HardhatUserConfig */ +module.exports = { + solidity: { + version: "0.8.19", + settings: { + metadata: { + // We disable the metadata to keep the fixtures more stables + appendCBOR: false, + }, + }, + }, +}; diff --git a/packages/hardhat-ignition/test/fixture-projects/reset-flag/ignition/modules/FirstPass.js b/packages/hardhat-ignition/test/fixture-projects/reset-flag/ignition/modules/FirstPass.js new file mode 100644 index 00000000000..e69d05696f4 --- /dev/null +++ b/packages/hardhat-ignition/test/fixture-projects/reset-flag/ignition/modules/FirstPass.js @@ -0,0 +1,9 @@ +const { buildModule } = require("@nomicfoundation/hardhat-ignition/modules"); + +module.exports = buildModule("ResetModule", (m) => { + const a = m.contract("Foo", [], { + id: "A", + }); + + return { a }; +}); diff --git a/packages/hardhat-ignition/test/fixture-projects/reset-flag/ignition/modules/SecondPass.js b/packages/hardhat-ignition/test/fixture-projects/reset-flag/ignition/modules/SecondPass.js new file mode 100644 index 00000000000..fdf765ce38e --- /dev/null +++ b/packages/hardhat-ignition/test/fixture-projects/reset-flag/ignition/modules/SecondPass.js @@ -0,0 +1,14 @@ +const { buildModule } = require("@nomicfoundation/hardhat-ignition/modules"); + +module.exports = buildModule("ResetModule", (m) => { + // Same id as first pass but a different contract + const a = m.contract("Bar", [], { + id: "A", + }); + + const b = m.contract("Baz", [], { + id: "B", + }); + + return { a, b }; +}); diff --git a/packages/hardhat-ignition/test/fixture-projects/reset-flag/journal.jsonl b/packages/hardhat-ignition/test/fixture-projects/reset-flag/journal.jsonl new file mode 100644 index 00000000000..9598589a9bc --- /dev/null +++ b/packages/hardhat-ignition/test/fixture-projects/reset-flag/journal.jsonl @@ -0,0 +1,7 @@ + +{"chainId":31337,"type":"DEPLOYMENT_INITIALIZE"} +{"artifactId":"LockModule#resetFutureId","constructorArgs":[1987909200],"contractName":"Lock","dependencies":[],"from":"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266","futureId":"LockModule#resetFutureId","futureType":"NAMED_ARTIFACT_CONTRACT_DEPLOYMENT","libraries":{},"strategy":"basic","type":"DEPLOYMENT_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"1000000000"}} +{"futureId":"LockModule#resetFutureId","networkInteraction":{"data":"0x60806040526040516105d83803806105d8833981810160405281019061002591906100f0565b804210610067576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161005e906101a0565b60405180910390fd5b8060008190555033600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550506101c0565b600080fd5b6000819050919050565b6100cd816100ba565b81146100d857600080fd5b50565b6000815190506100ea816100c4565b92915050565b600060208284031215610106576101056100b5565b5b6000610114848285016100db565b91505092915050565b600082825260208201905092915050565b7f556e6c6f636b2074696d652073686f756c6420626520696e207468652066757460008201527f7572650000000000000000000000000000000000000000000000000000000000602082015250565b600061018a60238361011d565b91506101958261012e565b604082019050919050565b600060208201905081810360008301526101b98161017d565b9050919050565b610409806101cf6000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c8063251c1aa3146100465780633ccfd60b146100645780638da5cb5b1461006e575b600080fd5b61004e61008c565b60405161005b919061024a565b60405180910390f35b61006c610092565b005b61007661020b565b60405161008391906102a6565b60405180910390f35b60005481565b6000544210156100d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100ce9061031e565b60405180910390fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610167576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161015e9061038a565b60405180910390fd5b7fbf2ed60bd5b5965d685680c01195c9514e4382e28e3a5a2d2d5244bf59411b9347426040516101989291906103aa565b60405180910390a1600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610208573d6000803e3d6000fd5b50565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000819050919050565b61024481610231565b82525050565b600060208201905061025f600083018461023b565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061029082610265565b9050919050565b6102a081610285565b82525050565b60006020820190506102bb6000830184610297565b92915050565b600082825260208201905092915050565b7f596f752063616e27742077697468647261772079657400000000000000000000600082015250565b60006103086016836102c1565b9150610313826102d2565b602082019050919050565b60006020820190508181036000830152610337816102fb565b9050919050565b7f596f75206172656e277420746865206f776e6572000000000000000000000000600082015250565b60006103746014836102c1565b915061037f8261033e565b602082019050919050565b600060208201905081810360008301526103a381610367565b9050919050565b60006040820190506103bf600083018561023b565b6103cc602083018461023b565b939250505056fea2646970667358221220f92f73d2a3284a3c1cca55a0fe6ec1a91b13bec884aecdbcf644cebf2774f32f64736f6c6343000813003300000000000000000000000000000000000000000000000000000000767d1650","id":1,"type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"1000000000"}},"type":"NETWORK_INTERACTION_REQUEST"} +{"futureId":"LockModule#resetFutureId","networkInteractionId":1,"nonce":1,"transaction":{"fees":{"maxFeePerGas":{"_kind":"bigint","value":"2750000000"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"1000000000"}},"hash":"0x1a3eb512e21fc849f8e8733b250ce49b61178c9c4a670063f969db59eda4a59f"},"type":"TRANSACTION_SEND"} +{"futureId":"LockModule#resetFutureId","hash":"0x1a3eb512e21fc849f8e8733b250ce49b61178c9c4a670063f969db59eda4a59f","networkInteractionId":1,"receipt":{"blockHash":"0xd742dbff894385ce6cbe737508ce91c181d0b65c7faaa5a7078fde68070c16e5","blockNumber":2,"contractAddress":"0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512","logs":[],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"} +{"futureId":"LockModule#resetFutureId","result":{"address":"0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512","type":"SUCCESS"},"type":"DEPLOYMENT_EXECUTION_STATE_COMPLETE"} \ No newline at end of file diff --git a/packages/hardhat-ignition/test/fixture-projects/user-modules/contracts/Contracts.sol b/packages/hardhat-ignition/test/fixture-projects/user-modules/contracts/Contracts.sol new file mode 100644 index 00000000000..f975a1abdcc --- /dev/null +++ b/packages/hardhat-ignition/test/fixture-projects/user-modules/contracts/Contracts.sol @@ -0,0 +1,31 @@ +contract Foo { + bool public isFoo = true; + uint public x = 1; + + function inc() public { + x++; + } + + function incByPositiveNumber(uint n) public { + require(n > 0, "n must be positive"); + x += n; + } + + function incTwoNumbers(uint n, uint y) public { + require(n > 0, "n must be positive"); + x += n; + x += y; + } +} + +contract Bar { + bool public isBar = true; +} + +contract UsesContract { + address public contractAddress; + + constructor (address _contract) { + contractAddress = _contract; + } +} diff --git a/packages/hardhat-ignition/test/fixture-projects/user-modules/contracts/WithLibrary.sol b/packages/hardhat-ignition/test/fixture-projects/user-modules/contracts/WithLibrary.sol new file mode 100644 index 00000000000..903f589c6c4 --- /dev/null +++ b/packages/hardhat-ignition/test/fixture-projects/user-modules/contracts/WithLibrary.sol @@ -0,0 +1,18 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity >=0.7.0 <0.9.0; + +library RubbishMath { + function add(uint16 left, uint16 right) public pure returns (uint16) { + return left + right; + } +} + +contract DependsOnLib { + function addThreeNumbers( + uint16 first, + uint16 second, + uint16 third + ) public pure returns (uint16) { + return RubbishMath.add(first, RubbishMath.add(second, third)); + } +} diff --git a/packages/hardhat-ignition/test/fixture-projects/user-modules/hardhat.config.js b/packages/hardhat-ignition/test/fixture-projects/user-modules/hardhat.config.js new file mode 100644 index 00000000000..39a079daef0 --- /dev/null +++ b/packages/hardhat-ignition/test/fixture-projects/user-modules/hardhat.config.js @@ -0,0 +1,11 @@ +require("../../../src/index"); + +module.exports = { + networks: { + hardhat: { + mining: { + auto: false, + }, + }, + }, +}; diff --git a/packages/hardhat-ignition/test/fixture-projects/user-modules/ignition/.testignore b/packages/hardhat-ignition/test/fixture-projects/user-modules/ignition/.testignore new file mode 100644 index 00000000000..e69de29bb2d diff --git a/packages/hardhat-ignition/test/fixture-projects/user-modules/ignition/modules/TestModule.js b/packages/hardhat-ignition/test/fixture-projects/user-modules/ignition/modules/TestModule.js new file mode 100644 index 00000000000..5e46fcd6080 --- /dev/null +++ b/packages/hardhat-ignition/test/fixture-projects/user-modules/ignition/modules/TestModule.js @@ -0,0 +1,4 @@ +module.exports = { + id: "testing123", + moduleDefintionFunction: () => {}, +}; diff --git a/packages/hardhat-ignition/test/fixture-projects/verify-no-api-key/hardhat.config.js b/packages/hardhat-ignition/test/fixture-projects/verify-no-api-key/hardhat.config.js new file mode 100644 index 00000000000..8eb8897a693 --- /dev/null +++ b/packages/hardhat-ignition/test/fixture-projects/verify-no-api-key/hardhat.config.js @@ -0,0 +1,15 @@ +require("../../../src/index"); + +module.exports = { + solidity: "0.8.19", + networks: { + hardhat: { + mining: { + auto: false, + }, + }, + }, + etherscan: { + apiKey: "", + }, +}; diff --git a/packages/hardhat-ignition/test/fixture-projects/with-config/contracts/Contracts.sol b/packages/hardhat-ignition/test/fixture-projects/with-config/contracts/Contracts.sol new file mode 100644 index 00000000000..7b168b2d7de --- /dev/null +++ b/packages/hardhat-ignition/test/fixture-projects/with-config/contracts/Contracts.sol @@ -0,0 +1,49 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity >=0.7.0 <0.9.0; + +contract Foo { + bool public isFoo = true; + uint256 public x = 1; + + function inc() public { + x++; + } + + function incByPositiveNumber(uint256 n) public { + require(n > 0, "n must be positive"); + x += n; + } + + function incTwoNumbers(uint256 first, uint256 second) public { + x += first; + x += second; + } +} + +contract Bar { + bool public isBar = true; +} + +contract UsesContract { + address public contractAddress; + + constructor(address _contract) { + contractAddress = _contract; + } + + function setAddress(address _contract) public { + contractAddress = _contract; + } +} + +contract Greeter { + string private _greeting; + + constructor(string memory greeting) { + _greeting = greeting; + } + + function getGreeting() public view returns (string memory) { + return _greeting; + } +} diff --git a/packages/hardhat-ignition/test/fixture-projects/with-config/contracts/Trace.sol b/packages/hardhat-ignition/test/fixture-projects/with-config/contracts/Trace.sol new file mode 100644 index 00000000000..1687a1d4850 --- /dev/null +++ b/packages/hardhat-ignition/test/fixture-projects/with-config/contracts/Trace.sol @@ -0,0 +1,14 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity >=0.7.0 <0.9.0; + +contract Trace { + string[] public entries; + + constructor(string memory firstEntry) { + entries = [firstEntry]; + } + + function addEntry(string memory entry) public { + entries.push(entry); + } +} diff --git a/packages/hardhat-ignition/test/fixture-projects/with-config/contracts/WithLibrary.sol b/packages/hardhat-ignition/test/fixture-projects/with-config/contracts/WithLibrary.sol new file mode 100644 index 00000000000..903f589c6c4 --- /dev/null +++ b/packages/hardhat-ignition/test/fixture-projects/with-config/contracts/WithLibrary.sol @@ -0,0 +1,18 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity >=0.7.0 <0.9.0; + +library RubbishMath { + function add(uint16 left, uint16 right) public pure returns (uint16) { + return left + right; + } +} + +contract DependsOnLib { + function addThreeNumbers( + uint16 first, + uint16 second, + uint16 third + ) public pure returns (uint16) { + return RubbishMath.add(first, RubbishMath.add(second, third)); + } +} diff --git a/packages/hardhat-ignition/test/fixture-projects/with-config/hardhat.config.js b/packages/hardhat-ignition/test/fixture-projects/with-config/hardhat.config.js new file mode 100644 index 00000000000..1a2ca9a9678 --- /dev/null +++ b/packages/hardhat-ignition/test/fixture-projects/with-config/hardhat.config.js @@ -0,0 +1,29 @@ +require("../../../src/index"); + +module.exports = { + networks: { + hardhat: { + mining: { + auto: false, + }, + ignition: { + maxFeePerGasLimit: 2n, + maxPriorityFeePerGas: 3n, + gasPrice: 1n, + disableFeeBumping: false, + }, + }, + }, + ignition: { + requiredConfirmations: 10, + blockPollingInterval: 100, + timeBeforeBumpingFees: 60 * 1000, + maxFeeBumps: 2, + strategyConfig: { + create2: { + salt: "custom-salt", + }, + }, + disableFeeBumping: true, + }, +}; diff --git a/packages/hardhat-ignition/test/fixture-projects/with-config/ignition/modules/MyModule.js b/packages/hardhat-ignition/test/fixture-projects/with-config/ignition/modules/MyModule.js new file mode 100644 index 00000000000..49cddf0034c --- /dev/null +++ b/packages/hardhat-ignition/test/fixture-projects/with-config/ignition/modules/MyModule.js @@ -0,0 +1,14 @@ +const { buildModule } = require("@nomicfoundation/ignition-core"); + +module.exports = buildModule("MyModule", (m) => { + const bar = m.contract("Bar"); + const usesContract = m.contract("UsesContract", { + args: ["0x0000000000000000000000000000000000000000"], + }); + + m.call(usesContract, "setAddress", { + args: [bar], + }); + + return { bar, usesContract }; +}); diff --git a/packages/hardhat-ignition/test/fixture-projects/with-invalid-config/contracts/Contracts.sol b/packages/hardhat-ignition/test/fixture-projects/with-invalid-config/contracts/Contracts.sol new file mode 100644 index 00000000000..7b168b2d7de --- /dev/null +++ b/packages/hardhat-ignition/test/fixture-projects/with-invalid-config/contracts/Contracts.sol @@ -0,0 +1,49 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity >=0.7.0 <0.9.0; + +contract Foo { + bool public isFoo = true; + uint256 public x = 1; + + function inc() public { + x++; + } + + function incByPositiveNumber(uint256 n) public { + require(n > 0, "n must be positive"); + x += n; + } + + function incTwoNumbers(uint256 first, uint256 second) public { + x += first; + x += second; + } +} + +contract Bar { + bool public isBar = true; +} + +contract UsesContract { + address public contractAddress; + + constructor(address _contract) { + contractAddress = _contract; + } + + function setAddress(address _contract) public { + contractAddress = _contract; + } +} + +contract Greeter { + string private _greeting; + + constructor(string memory greeting) { + _greeting = greeting; + } + + function getGreeting() public view returns (string memory) { + return _greeting; + } +} diff --git a/packages/hardhat-ignition/test/fixture-projects/with-invalid-config/contracts/Trace.sol b/packages/hardhat-ignition/test/fixture-projects/with-invalid-config/contracts/Trace.sol new file mode 100644 index 00000000000..1687a1d4850 --- /dev/null +++ b/packages/hardhat-ignition/test/fixture-projects/with-invalid-config/contracts/Trace.sol @@ -0,0 +1,14 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity >=0.7.0 <0.9.0; + +contract Trace { + string[] public entries; + + constructor(string memory firstEntry) { + entries = [firstEntry]; + } + + function addEntry(string memory entry) public { + entries.push(entry); + } +} diff --git a/packages/hardhat-ignition/test/fixture-projects/with-invalid-config/contracts/WithLibrary.sol b/packages/hardhat-ignition/test/fixture-projects/with-invalid-config/contracts/WithLibrary.sol new file mode 100644 index 00000000000..903f589c6c4 --- /dev/null +++ b/packages/hardhat-ignition/test/fixture-projects/with-invalid-config/contracts/WithLibrary.sol @@ -0,0 +1,18 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity >=0.7.0 <0.9.0; + +library RubbishMath { + function add(uint16 left, uint16 right) public pure returns (uint16) { + return left + right; + } +} + +contract DependsOnLib { + function addThreeNumbers( + uint16 first, + uint16 second, + uint16 third + ) public pure returns (uint16) { + return RubbishMath.add(first, RubbishMath.add(second, third)); + } +} diff --git a/packages/hardhat-ignition/test/fixture-projects/with-invalid-config/hardhat.config.js b/packages/hardhat-ignition/test/fixture-projects/with-invalid-config/hardhat.config.js new file mode 100644 index 00000000000..26fea701e46 --- /dev/null +++ b/packages/hardhat-ignition/test/fixture-projects/with-invalid-config/hardhat.config.js @@ -0,0 +1,17 @@ +require("../../../src/index"); + +module.exports = { + networks: { + hardhat: { + mining: { + auto: false, + }, + }, + }, + ignition: { + requiredConfirmations: 0, + blockPollingInterval: 100, + timeBeforeBumpingFees: 60 * 1000, + maxFeeBumps: 2, + }, +}; diff --git a/packages/hardhat-ignition/test/fixture-projects/with-invalid-config/ignition/modules/MyModule.js b/packages/hardhat-ignition/test/fixture-projects/with-invalid-config/ignition/modules/MyModule.js new file mode 100644 index 00000000000..49cddf0034c --- /dev/null +++ b/packages/hardhat-ignition/test/fixture-projects/with-invalid-config/ignition/modules/MyModule.js @@ -0,0 +1,14 @@ +const { buildModule } = require("@nomicfoundation/ignition-core"); + +module.exports = buildModule("MyModule", (m) => { + const bar = m.contract("Bar"); + const usesContract = m.contract("UsesContract", { + args: ["0x0000000000000000000000000000000000000000"], + }); + + m.call(usesContract, "setAddress", { + args: [bar], + }); + + return { bar, usesContract }; +}); diff --git a/packages/hardhat-ignition/test/ignition-helper-guard.ts b/packages/hardhat-ignition/test/ignition-helper-guard.ts new file mode 100644 index 00000000000..fb7359bbf2f --- /dev/null +++ b/packages/hardhat-ignition/test/ignition-helper-guard.ts @@ -0,0 +1,21 @@ +/* eslint-disable import/no-unused-modules */ +import { assert } from "chai"; + +import { useEphemeralIgnitionProject } from "./test-helpers/use-ignition-project"; + +/** + * A project that only imports `@nomicfoundation/hardhat-ignition` will not add + * a `hre.ignition` property to the Hardhat Runtime Environment. + * We warn that you need to install either the viem or ethers plugin to get + * Ignition support in tests or scripts. + */ +describe("ignition helper guard", () => { + useEphemeralIgnitionProject("minimal"); + + it("should error on attempting to use `hre.ignition` without viem/ethers plugins installed", function () { + assert.throws( + () => (this.hre as any).originalIgnition.deploy(), + /Please install either `@nomicfoundation\/hardhat-ignition-viem` or `@nomicfoundation\/hardhat-ignition-ethers` to use Ignition in your Hardhat tests/ + ); + }); +}); diff --git a/packages/hardhat-ignition/test/module-api/calls.ts b/packages/hardhat-ignition/test/module-api/calls.ts new file mode 100644 index 00000000000..e18ce6e1811 --- /dev/null +++ b/packages/hardhat-ignition/test/module-api/calls.ts @@ -0,0 +1,173 @@ +/* eslint-disable import/no-unused-modules */ +import { buildModule } from "@nomicfoundation/ignition-core"; +import { assert } from "chai"; + +import { getBalanceFor } from "../test-helpers/get-balance-for"; +import { useEphemeralIgnitionProject } from "../test-helpers/use-ignition-project"; + +describe("calls", () => { + useEphemeralIgnitionProject("minimal"); + + it("should be able to call contracts", async function () { + const moduleDefinition = buildModule("SetAddressModule", (m) => { + const bar = m.contract("Bar"); + const usesContract = m.contract("UsesContract", [ + "0x0000000000000000000000000000000000000000", + ]); + + m.call(usesContract, "setAddress", [bar]); + + return { bar, usesContract }; + }); + + const result = await this.hre.ignition.deploy(moduleDefinition); + + assert.isDefined(result.bar); + assert.isDefined(result.usesContract); + + const usedAddress = + (await result.usesContract.read.contractAddress()) as string; + + assert.equal(usedAddress.toLowerCase(), result.bar.address.toLowerCase()); + }); + + it("should be able to call contracts with array args", async function () { + const moduleDefinition = buildModule("ArrayArgModule", (m) => { + const captureArraysContract = m.contract("CaptureArraysContract"); + + m.call(captureArraysContract, "recordArrays", [ + [1, 2, 3], + ["a", "b", "c"], + [true, false, true], + ]); + + return { captureArraysContract }; + }); + + const result = await this.hre.ignition.deploy(moduleDefinition); + + assert.isDefined(result.captureArraysContract); + + const captureSuceeded = + await result.captureArraysContract.read.arraysCaptured(); + + assert(captureSuceeded); + }); + + it("should be able to call contracts with arrays nested in objects args", async function () { + const moduleDefinition = buildModule("ArrayNestedModule", (m) => { + const captureComplexObjectContract = m.contract( + "CaptureComplexObjectContract" + ); + + m.call(captureComplexObjectContract, "testComplexObject", [ + { + firstBool: true, + secondArray: [1, 2, 3], + thirdSubcomplex: { sub: "sub" }, + }, + ]); + + return { captureComplexObjectContract }; + }); + + const result = await this.hre.ignition.deploy(moduleDefinition); + + assert.isDefined(result.captureComplexObjectContract); + + const captureSuceeded = + await result.captureComplexObjectContract.read.complexArgCaptured(); + + assert(captureSuceeded); + }); + + it("should be able to make calls in order", async function () { + const moduleDefinition = buildModule("OrderedModule", (m) => { + const trace = m.contract("Trace", ["first"]); + + const second = m.call(trace, "addEntry", ["second"], { id: "AddEntry1" }); + + m.call(trace, "addEntry", ["third"], { + id: "AddEntry2", + after: [second], + }); + + return { trace }; + }); + + const result = await this.hre.ignition.deploy(moduleDefinition); + + assert.isDefined(result.trace); + + const entry1 = await result.trace.read.entries([0n]); + const entry2 = await result.trace.read.entries([1n]); + const entry3 = await result.trace.read.entries([2n]); + + assert.deepStrictEqual( + [entry1, entry2, entry3], + ["first", "second", "third"] + ); + }); + + describe("passing value", () => { + it("should be able to call a contract passing a value", async function () { + const moduleDefinition = buildModule("PassingValue", (m) => { + const passingValue = m.contract("PassingValue"); + + m.call(passingValue, "deposit", [], { + value: 1_000_000_000n, + }); + + return { passingValue }; + }); + + const result = await this.hre.ignition.deploy(moduleDefinition); + + assert.isDefined(result.passingValue); + + const actualInstanceBalance = await getBalanceFor( + this.hre, + result.passingValue.address + ); + + assert.equal(actualInstanceBalance, 1_000_000_000n); + }); + + it("should be able to call a contract passing a value via a parameter", async function () { + const submoduleDefinition = buildModule("Submodule", (m) => { + const depositValue = m.getParameter("depositValue", 1000n); + + const passingValue = m.contract("PassingValue"); + + m.call(passingValue, "deposit", [], { + value: depositValue, + }); + + return { passingValue }; + }); + + const moduleDefinition = buildModule("Module", (m) => { + const { passingValue } = m.useModule(submoduleDefinition); + + return { passingValue }; + }); + + const result = await this.hre.ignition.deploy(moduleDefinition, { + parameters: { + Submodule: { + depositValue: 1_000_000_000n, + }, + }, + }); + + assert.isDefined(result.passingValue); + + const actualInstanceBalance = await getBalanceFor( + this.hre, + result.passingValue.address + ); + + assert.equal(actualInstanceBalance, 1_000_000_000n); + }); + }); +}); diff --git a/packages/hardhat-ignition/test/module-api/contracts.ts b/packages/hardhat-ignition/test/module-api/contracts.ts new file mode 100644 index 00000000000..01dcb3fc3cf --- /dev/null +++ b/packages/hardhat-ignition/test/module-api/contracts.ts @@ -0,0 +1,206 @@ +/* eslint-disable import/no-unused-modules */ +import { buildModule } from "@nomicfoundation/ignition-core"; +import { assert } from "chai"; + +import { getBalanceFor } from "../test-helpers/get-balance-for"; +import { useEphemeralIgnitionProject } from "../test-helpers/use-ignition-project"; + +describe("contract deploys", () => { + useEphemeralIgnitionProject("minimal"); + + it("should be able to deploy a contract", async function () { + const moduleDefinition = buildModule("FooModule", (m) => { + const foo = m.contract("Foo"); + + return { foo }; + }); + + const result = await this.hre.ignition.deploy(moduleDefinition); + + assert.equal(await result.foo.read.x(), 1n); + }); + + it("should be able to deploy a contract with arguments", async function () { + const moduleDefinition = buildModule("GreeterModule", (m) => { + const greeter = m.contract("Greeter", ["Hello World"]); + + return { greeter }; + }); + + const result = await this.hre.ignition.deploy(moduleDefinition); + + const greeting = await result.greeter.read.getGreeting(); + assert.equal(greeting, "Hello World"); + }); + + it("should be able to deploy contracts with dependencies", async function () { + const moduleDefinition = buildModule("DependentModule", (m) => { + const bar = m.contract("Bar"); + const usesContract = m.contract("UsesContract", [bar]); + + return { bar, usesContract }; + }); + + const result = await this.hre.ignition.deploy(moduleDefinition); + + assert.isDefined(result.bar); + assert.isDefined(result.usesContract); + + const usedAddress = + (await result.usesContract.read.contractAddress()) as string; + + assert.equal(usedAddress.toLowerCase(), result.bar.address.toLowerCase()); + }); + + it("should be able to deploy contracts without dependencies", async function () { + const moduleDefinition = buildModule("WithoutDepModule", (m) => { + const foo = m.contract("Foo"); + const bar = m.contract("Bar"); + + return { foo, bar }; + }); + + const result = await this.hre.ignition.deploy(moduleDefinition); + + const x = await result.foo.read.x(); + const isBar = await result.bar.read.isBar(); + + assert.equal(x, 1n); + assert.equal(isBar, true); + }); + + it("should be able to use an artifact to deploy a contract", async function () { + await this.hre.run("compile", { quiet: true }); + + const artifact = await this.hre.artifacts.readArtifact("Greeter"); + + const moduleDefinition = buildModule("ArtifactModule", (m) => { + const greeter = m.contract("Greeter", artifact, ["Hello World"]); + + return { greeter }; + }); + + const result = await this.hre.ignition.deploy(moduleDefinition); + + const greeting = await result.greeter.read.getGreeting(); + assert.equal(greeting, "Hello World"); + }); + + describe("with endowment", () => { + it("should be able to deploy a contract with an endowment", async function () { + const moduleDefinition = buildModule("EndowmentModule", (m) => { + const passingValue = m.contract("PassingValue", [], { + value: 1_000_000_000n, + }); + + return { passingValue }; + }); + + const result = await this.hre.ignition.deploy(moduleDefinition); + + assert.isDefined(result.passingValue); + + const actualInstanceBalance = await getBalanceFor( + this.hre, + result.passingValue.address + ); + + assert.equal(actualInstanceBalance, 1_000_000_000n); + }); + + it("should be able to deploy a contract with an endowment via a parameter", async function () { + const submoduleDefinition = buildModule("submodule", (m) => { + const endowment = m.getParameter("endowment", 2_000_000_000n); + + const passingValue = m.contract("PassingValue", [], { + value: endowment, + }); + + return { passingValue }; + }); + + const moduleDefinition = buildModule("Module", (m) => { + const { passingValue } = m.useModule(submoduleDefinition); + + return { passingValue }; + }); + + const result = await this.hre.ignition.deploy(moduleDefinition); + + assert.isDefined(result.passingValue); + + const actualInstanceBalance = await getBalanceFor( + this.hre, + result.passingValue.address + ); + + assert.equal(actualInstanceBalance, 2_000_000_000n); + }); + + it("should be able to deploy a contract with an endowment via a static call", async function () { + const submoduleDefinition = buildModule("submodule", (m) => { + const valueContract = m.contract("StaticCallValue"); + + const valueResult = m.staticCall(valueContract, "getValue"); + + const passingValue = m.contract("PassingValue", [], { + value: valueResult, + }); + + return { passingValue }; + }); + + const moduleDefinition = buildModule("Module", (m) => { + const { passingValue } = m.useModule(submoduleDefinition); + + return { passingValue }; + }); + + const result = await this.hre.ignition.deploy(moduleDefinition); + + assert.isDefined(result.passingValue); + + const actualInstanceBalance = await getBalanceFor( + this.hre, + result.passingValue.address + ); + + assert.equal(actualInstanceBalance.toString(), "42"); + }); + + it("should be able to deploy a contract with an endowment via an event argument", async function () { + const submoduleDefinition = buildModule("submodule", (m) => { + const valueContract = m.contract("EventArgValue"); + + const valueResult = m.readEventArgument( + valueContract, + "EventValue", + "value" + ); + + const passingValue = m.contract("PassingValue", [], { + value: valueResult, + }); + + return { passingValue }; + }); + + const moduleDefinition = buildModule("Module", (m) => { + const { passingValue } = m.useModule(submoduleDefinition); + + return { passingValue }; + }); + + const result = await this.hre.ignition.deploy(moduleDefinition); + + assert.isDefined(result.passingValue); + + const actualInstanceBalance = await getBalanceFor( + this.hre, + result.passingValue.address + ); + + assert.equal(actualInstanceBalance.toString(), "42"); + }); + }); +}); diff --git a/packages/hardhat-ignition/test/module-api/events.ts b/packages/hardhat-ignition/test/module-api/events.ts new file mode 100644 index 00000000000..291d0b4383a --- /dev/null +++ b/packages/hardhat-ignition/test/module-api/events.ts @@ -0,0 +1,106 @@ +/* eslint-disable import/no-unused-modules */ +import { buildModule } from "@nomicfoundation/ignition-core"; +import { assert } from "chai"; + +import { useEphemeralIgnitionProject } from "../test-helpers/use-ignition-project"; + +describe("events", () => { + useEphemeralIgnitionProject("minimal"); + + it("should be able to use the output of a readEvent in a contract at", async function () { + const moduleDefinition = buildModule("FooModule", (m) => { + const account1 = m.getAccount(1); + + const fooFactory = m.contract("FooFactory", [], { from: account1 }); + + const createCall = m.call(fooFactory, "create", []); + + const newAddress = m.readEventArgument( + createCall, + "Deployed", + "fooAddress" + ); + + const foo = m.contractAt("Foo", newAddress); + + return { fooFactory, foo }; + }); + + const result = await this.hre.ignition.deploy(moduleDefinition); + + assert.equal(await result.fooFactory.read.isDeployed(), true); + assert.equal(await result.foo.read.x(), 1n); + }); + + it("should be able to use the output of a readEvent in an artifact contract at", async function () { + const artifact = await this.hre.artifacts.readArtifact("Foo"); + + const moduleDefinition = buildModule("FooModule", (m) => { + const account1 = m.getAccount(1); + + const fooFactory = m.contract("FooFactory", [], { from: account1 }); + + const createCall = m.call(fooFactory, "create", []); + + const newAddress = m.readEventArgument( + createCall, + "Deployed", + "fooAddress" + ); + + const foo = m.contractAt("Foo", artifact, newAddress); + + return { fooFactory, foo }; + }); + + const result = await this.hre.ignition.deploy(moduleDefinition); + + assert.equal(await result.fooFactory.read.isDeployed(), true); + assert.equal(await result.foo.read.x(), 1n); + }); + + it("should be able to read an event from a SendDataFuture", async function () { + const moduleDefinition = buildModule("FooModule", (m) => { + const sendEmitter = m.contract("SendDataEmitter"); + + const send = m.send("send_data_event", sendEmitter); + + const output = m.readEventArgument(send, "SendDataEvent", "arg", { + emitter: sendEmitter, + }); + + m.call(sendEmitter, "validateEmitted", [output]); + + return { sendEmitter }; + }); + + const result = await this.hre.ignition.deploy(moduleDefinition); + + assert.equal(await result.sendEmitter.read.wasEmitted(), true); + }); + + it("should be able to use the output of a readEvent with an indexed tuple result", async function () { + const moduleDefinition = buildModule("FooModule", (m) => { + const tupleContract = m.contract("TupleEmitter"); + + const tupleCall = m.call(tupleContract, "emitTuple"); + + const arg1 = m.readEventArgument(tupleCall, "TupleEvent", "arg1", { + id: "arg1", + }); + const arg2 = m.readEventArgument(tupleCall, "TupleEvent", 1, { + id: "arg2", + }); + + m.call(tupleContract, "verifyArg1", [arg1], { id: "call1" }); + m.call(tupleContract, "verifyArg2", [arg2], { id: "call2" }); + + return { tupleContract }; + }); + + const result = await this.hre.ignition.deploy(moduleDefinition); + + assert.equal(await result.tupleContract.read.arg1Captured(), true); + assert.equal(await result.tupleContract.read.arg2Captured(), true); + }); +}); diff --git a/packages/hardhat-ignition/test/module-api/existing-contract.ts b/packages/hardhat-ignition/test/module-api/existing-contract.ts new file mode 100644 index 00000000000..2b50dbb73aa --- /dev/null +++ b/packages/hardhat-ignition/test/module-api/existing-contract.ts @@ -0,0 +1,55 @@ +/* eslint-disable import/no-unused-modules */ +import { buildModule } from "@nomicfoundation/ignition-core"; +import { assert } from "chai"; + +import { useEphemeralIgnitionProject } from "../test-helpers/use-ignition-project"; + +describe("existing contract", () => { + useEphemeralIgnitionProject("minimal"); + + it("should be able to use an existing contract", async function () { + await this.hre.run("compile", { quiet: true }); + + const barArtifact = await this.hre.artifacts.readArtifact("Bar"); + const usesContractArtifact = await this.hre.artifacts.readArtifact( + "UsesContract" + ); + + const firstModuleDefinition = buildModule("FirstModule", (m) => { + const bar = m.contract("Bar"); + const usesContract = m.contract("UsesContract", [ + "0x0000000000000000000000000000000000000000", + ]); + + return { bar, usesContract }; + }); + + const firstResult = await this.hre.ignition.deploy(firstModuleDefinition); + + const barAddress: string = firstResult.bar.address; + const usesContractAddress: string = firstResult.usesContract.address; + + const secondModuleDefinition = buildModule("SecondModule", (m) => { + const bar = m.contractAt("Bar", barArtifact, barAddress); + const usesContract = m.contractAt( + "UsesContract", + usesContractArtifact, + usesContractAddress + ); + + m.call(usesContract, "setAddress", [bar]); + + return { bar, usesContract }; + }); + + const result = await this.hre.ignition.deploy(secondModuleDefinition); + + assert.isDefined(result.bar); + assert.isDefined(result.usesContract); + + const usedAddress = + (await result.usesContract.read.contractAddress()) as string; + + assert.equal(usedAddress.toLowerCase(), result.bar.address.toLowerCase()); + }); +}); diff --git a/packages/hardhat-ignition/test/module-api/fully-qualified-names.ts b/packages/hardhat-ignition/test/module-api/fully-qualified-names.ts new file mode 100644 index 00000000000..9a3c911809b --- /dev/null +++ b/packages/hardhat-ignition/test/module-api/fully-qualified-names.ts @@ -0,0 +1,39 @@ +import { buildModule } from "@nomicfoundation/ignition-core"; +import { assert } from "chai"; + +import { useFileIgnitionProject } from "../test-helpers/use-ignition-project"; + +describe("fully qualified names", () => { + describe("where there are multiple contracts with the same name in the project", () => { + useFileIgnitionProject( + "multiple-contracts-with-same-name", + "contract-deploy" + ); + + it("should deploy contracts by referring using fully qualified names", async function () { + const LaunchModule = buildModule("Apollo", (m) => { + const rocket1 = m.contract( + "contracts/Rocket1.sol:Rocket", + ["Rocket 1"], + { + id: "Rocket1", + } + ); + const rocket2 = m.contract( + "contracts/Rocket2.sol:Rocket", + ["Rocket 2"], + { + id: "Rocket2", + } + ); + + return { rocket1, rocket2 }; + }); + + const result = await this.hre.ignition.deploy(LaunchModule); + + assert.equal(await result.rocket1.read.name(), "Rocket 1"); + assert.equal(await result.rocket2.read.name(), "Rocket 2"); + }); + }); +}); diff --git a/packages/hardhat-ignition/test/module-api/libraries.ts b/packages/hardhat-ignition/test/module-api/libraries.ts new file mode 100644 index 00000000000..5ccefc9c788 --- /dev/null +++ b/packages/hardhat-ignition/test/module-api/libraries.ts @@ -0,0 +1,128 @@ +/* eslint-disable import/no-unused-modules */ +import { buildModule } from "@nomicfoundation/ignition-core"; +import { assert } from "chai"; + +import { useEphemeralIgnitionProject } from "../test-helpers/use-ignition-project"; + +describe("libraries", () => { + useEphemeralIgnitionProject("minimal"); + + it("should be able to deploy a contract that depends on a hardhat library", async function () { + const moduleDefinition = buildModule("WithLibModule", (m) => { + const rubbishMath = m.library("RubbishMath"); + const dependsOnLib = m.contract("DependsOnLib", [], { + libraries: { + RubbishMath: rubbishMath, + }, + }); + + return { rubbishMath, dependsOnLib }; + }); + + const result = await this.hre.ignition.deploy(moduleDefinition); + + assert.isDefined(result); + const contractThatDependsOnLib = result.dependsOnLib; + + const libBasedAddtion = await contractThatDependsOnLib.read.addThreeNumbers( + [1, 2, 3] + ); + + assert.equal(libBasedAddtion, 6); + }); + + it("should be able to deploy a contract that depends on an artifact library", async function () { + await this.hre.run("compile", { quiet: true }); + + const libraryArtifact = await this.hre.artifacts.readArtifact( + "RubbishMath" + ); + + const moduleDefinition = buildModule("ArtifactLibraryModule", (m) => { + const rubbishMath = m.library("RubbishMath", libraryArtifact); + const dependsOnLib = m.contract("DependsOnLib", [], { + libraries: { + RubbishMath: rubbishMath, + }, + }); + + return { rubbishMath, dependsOnLib }; + }); + + const result = await this.hre.ignition.deploy(moduleDefinition); + + assert.isDefined(result); + const contractThatDependsOnLib = result.dependsOnLib; + + const libBasedAddtion = await contractThatDependsOnLib.read.addThreeNumbers( + [1, 2, 3] + ); + + assert.equal(libBasedAddtion, 6); + }); + + it("should deploy a contract with an existing library", async function () { + const libraryModuleDefinition = buildModule("LibraryModule", (m) => { + const rubbishMath = m.library("RubbishMath"); + + return { rubbishMath }; + }); + + const libDeployResult = await this.hre.ignition.deploy( + libraryModuleDefinition + ); + + const libAddress = libDeployResult.rubbishMath.address; + + const moduleDefinition = buildModule("ConsumingLibModule", (m) => { + const rubbishMath = m.contractAt("RubbishMath", libAddress); + + const dependsOnLib = m.contract("DependsOnLib", [], { + libraries: { + RubbishMath: rubbishMath, + }, + }); + + return { dependsOnLib }; + }); + + const result = await this.hre.ignition.deploy(moduleDefinition); + + assert.equal(await libDeployResult.rubbishMath.read.add([1, 2]), 3); + assert.equal(await result.dependsOnLib.read.addThreeNumbers([1, 2, 3]), 6); + }); + + it("should be able to deploy a library that depends on a library", async function () { + const moduleDefinition = buildModule("ArtifactLibraryModule", (m) => { + const rubbishMath = m.library("RubbishMath"); + + const libDependsOnLib = m.library("LibDependsOnLib", { + libraries: { + RubbishMath: rubbishMath, + }, + }); + + const dependsOnLibThatDependsOnLib = m.contract( + "DependsOnLibThatDependsOnLib", + [], + { + libraries: { + LibDependsOnLib: libDependsOnLib, + }, + } + ); + + return { rubbishMath, libDependsOnLib, dependsOnLibThatDependsOnLib }; + }); + + const result = await this.hre.ignition.deploy(moduleDefinition); + + assert.isDefined(result); + const contractThatDependsOnLibOnLib = result.dependsOnLibThatDependsOnLib; + + const libBasedAddtion = + await contractThatDependsOnLibOnLib.read.addThreeNumbers([1, 2, 3]); + + assert.equal(libBasedAddtion, 6); + }); +}); diff --git a/packages/hardhat-ignition/test/module-api/params.ts b/packages/hardhat-ignition/test/module-api/params.ts new file mode 100644 index 00000000000..d76c90bb169 --- /dev/null +++ b/packages/hardhat-ignition/test/module-api/params.ts @@ -0,0 +1,183 @@ +/* eslint-disable import/no-unused-modules */ +import { buildModule } from "@nomicfoundation/ignition-core"; +import { assert } from "chai"; + +import { useEphemeralIgnitionProject } from "../test-helpers/use-ignition-project"; + +describe("module parameters", () => { + useEphemeralIgnitionProject("minimal"); + + it("should be able to retrieve a default number", async function () { + const moduleDefinition = buildModule("WithDefaultModule", (m) => { + const myNumber = m.getParameter("MyNumber", 42); + + const foo = m.contract("Foo"); + + m.call(foo, "incByPositiveNumber", [myNumber]); + + return { foo }; + }); + + const result = await this.hre.ignition.deploy(moduleDefinition); + + const v = await result.foo.read.x(); + + assert.equal(v, 43n); + }); + + it("should be able to override a default number", async function () { + const moduleDefinition = buildModule("WithDefaultModule", (m) => { + const myNumber = m.getParameter("MyNumber", 10); + + const foo = m.contract("Foo"); + + m.call(foo, "incByPositiveNumber", [myNumber]); + + return { foo }; + }); + + const result = await this.hre.ignition.deploy(moduleDefinition, { + parameters: { + WithDefaultModule: { + MyNumber: 20, + }, + }, + }); + + assert.equal(await result.foo.read.x(), 21n); + }); + + it("should be able to retrieve a default string", async function () { + const moduleDefinition = buildModule("WithDefaultStringModule", (m) => { + const myString = m.getParameter("MyString", "Example"); + + const greeter = m.contract("Greeter", [myString]); + + return { greeter }; + }); + + const result = await this.hre.ignition.deploy(moduleDefinition); + + const v = await result.greeter.read.getGreeting(); + + assert.equal(v, "Example"); + }); + + it("should be able to override a default string", async function () { + const moduleDefinition = buildModule("WithDefaultStringModule", (m) => { + const myString = m.getParameter("MyString", "Example"); + + const greeter = m.contract("Greeter", [myString]); + + return { greeter }; + }); + + const result = await this.hre.ignition.deploy(moduleDefinition, { + parameters: { + WithDefaultStringModule: { + MyString: "NotExample", + }, + }, + }); + + assert.equal(await result.greeter.read.getGreeting(), "NotExample"); + }); + + it("should be able to retrieve a default AccountRuntimeValue", async function () { + const moduleDefinition = buildModule("WithDefaultAccountModule", (m) => { + const newOwner = m.getParameter("newOwner", m.getAccount(1)); + + const ownerContract = m.contract("Owner", [], { from: m.getAccount(0) }); + + m.call(ownerContract, "setOwner", [newOwner]); + + return { ownerContract }; + }); + + const result = await this.hre.ignition.deploy(moduleDefinition); + + const v = (await result.ownerContract.read.owner()) as string; + + const accounts = await this.hre.network.provider.send("eth_accounts"); + + assert.equal(v.toLowerCase(), accounts[1]); + }); + + it("should be able to override a default AccountRuntimeValue", async function () { + const moduleDefinition = buildModule("WithDefaultAccountModule", (m) => { + const newOwner = m.getParameter("newOwner", m.getAccount(1)); + + const ownerContract = m.contract("Owner", [], { from: m.getAccount(0) }); + + m.call(ownerContract, "setOwner", [newOwner]); + + return { ownerContract }; + }); + + const accounts = await this.hre.network.provider.send("eth_accounts"); + + const result = await this.hre.ignition.deploy(moduleDefinition, { + parameters: { + WithDefaultAccountModule: { + newOwner: accounts[2], + }, + }, + }); + + const v = (await result.ownerContract.read.owner()) as string; + + assert.equal(v.toLowerCase(), accounts[2]); + }); +}); + +describe("params validation", () => { + useEphemeralIgnitionProject("minimal"); + + it("should throw if no parameters object provided", async function () { + await this.hre.run("compile", { quiet: true }); + + const userModule = buildModule("UserModule", (m) => { + const myNumber = m.getParameter("MyNumber"); + + const foo = m.contract("Foo"); + + m.call(foo, "incByPositiveNumber", [myNumber]); + + return { foo }; + }); + + const deployPromise = this.hre.ignition.deploy(userModule); + + await assert.isRejected( + deployPromise, + "Module parameter 'MyNumber' requires a value but was given none" + ); + }); + + it("should throw if parameter missing from parameters", async function () { + await this.hre.run("compile", { quiet: true }); + + const userModule = buildModule("UserModule", (m) => { + const myNumber = m.getParameter("MyNumber"); + + const foo = m.contract("Foo"); + + m.call(foo, "incByPositiveNumber", [myNumber]); + + return { foo }; + }); + + const deployPromise = this.hre.ignition.deploy(userModule, { + parameters: { + UserModule: { + NotMyNumber: 11, + }, + }, + }); + + await assert.isRejected( + deployPromise, + "Module parameter 'MyNumber' requires a value but was given none" + ); + }); +}); diff --git a/packages/hardhat-ignition/test/module-api/static-calls.ts b/packages/hardhat-ignition/test/module-api/static-calls.ts new file mode 100644 index 00000000000..fd603e5f739 --- /dev/null +++ b/packages/hardhat-ignition/test/module-api/static-calls.ts @@ -0,0 +1,180 @@ +/* eslint-disable import/no-unused-modules */ +import { buildModule } from "@nomicfoundation/ignition-core"; +import { assert } from "chai"; + +import { useEphemeralIgnitionProject } from "../test-helpers/use-ignition-project"; + +describe("static calls", () => { + useEphemeralIgnitionProject("minimal"); + + it("should be able to use the output of a static call in a contract at", async function () { + const moduleDefinition = buildModule("FooModule", (m) => { + const account1 = m.getAccount(1); + + const fooFactory = m.contract("FooFactory", [], { from: account1 }); + + const createCall = m.call(fooFactory, "create", []); + + const newAddress = m.staticCall(fooFactory, "deployed", [], 0, { + after: [createCall], + }); + + const foo = m.contractAt("Foo", newAddress); + + return { fooFactory, foo }; + }); + + const result = await this.hre.ignition.deploy(moduleDefinition); + + assert.equal(await result.fooFactory.read.isDeployed(), true); + assert.equal(await result.foo.read.x(), 1n); + }); + + it("should be able to use the output of a static call in an artifact contract at", async function () { + const artifact = await this.hre.artifacts.readArtifact("Foo"); + + const moduleDefinition = buildModule("FooModule", (m) => { + const account1 = m.getAccount(1); + + const fooFactory = m.contract("FooFactory", [], { from: account1 }); + + const createCall = m.call(fooFactory, "create", []); + + const newAddress = m.staticCall(fooFactory, "deployed", [], 0, { + after: [createCall], + }); + + const foo = m.contractAt("Foo", artifact, newAddress); + + return { fooFactory, foo }; + }); + + const result = await this.hre.ignition.deploy(moduleDefinition); + + assert.equal(await result.fooFactory.read.isDeployed(), true); + assert.equal(await result.foo.read.x(), 1n); + }); + + it("should be able to use the output of a static call function in a contract at (with arg)", async function () { + const moduleDefinition = buildModule("FooModule", (m) => { + const account1 = m.getAccount(1); + + const fooFactory = m.contract("FooFactory", [], { from: account1 }); + + const createCall = m.call(fooFactory, "create", []); + + const newAddress = m.staticCall(fooFactory, "allDeployed", [0], 0, { + after: [createCall], + }); + + const foo = m.contractAt("Foo", newAddress); + + return { fooFactory, foo }; + }); + + const result = await this.hre.ignition.deploy(moduleDefinition); + + assert.equal(await result.fooFactory.read.isDeployed(), true); + assert.equal(await result.foo.read.x(), 1n); + }); + + it("should be able to use the output of a static call function in a contract at (with function signature)", async function () { + const moduleDefinition = buildModule("FooModule", (m) => { + const account1 = m.getAccount(1); + + const fooFactory = m.contract("FooFactory", [], { from: account1 }); + + const createCall = m.call(fooFactory, "create", []); + + const newAddress = m.staticCall( + fooFactory, + "getDeployed(uint256)", + [0], + 0, + { + after: [createCall], + } + ); + + const foo = m.contractAt("Foo", newAddress); + + return { fooFactory, foo }; + }); + + const result = await this.hre.ignition.deploy(moduleDefinition); + + assert.equal(await result.fooFactory.read.isDeployed(), true); + assert.equal(await result.foo.read.x(), 1n); + }); + + it("should be able to use the output of a static call with an indexed tuple result", async function () { + const moduleDefinition = buildModule("FooModule", (m) => { + const tupleContract = m.contract("TupleReturn"); + + const arg1 = m.staticCall(tupleContract, "getTuple", [], "arg1", { + id: "arg1", + }); + const arg2 = m.staticCall(tupleContract, "getTuple", [], "arg2", { + id: "arg2", + }); + + m.call(tupleContract, "verifyArg1", [arg1], { id: "call1" }); + m.call(tupleContract, "verifyArg2", [arg2], { id: "call2" }); + + return { tupleContract }; + }); + + const result = await this.hre.ignition.deploy(moduleDefinition); + + assert.equal(await result.tupleContract.read.arg1Captured(), true); + assert.equal(await result.tupleContract.read.arg2Captured(), true); + }); + + it("should not be able to use the output of a non-address static call in a contract at", async function () { + const moduleDefinition = buildModule("FooModule", (m) => { + const account1 = m.getAccount(1); + + const fooFactory = m.contract("FooFactory", [], { from: account1 }); + + const createCall = m.call(fooFactory, "create", []); + + const nonAddress = m.staticCall(fooFactory, "nonAddressResult", [], 0, { + after: [createCall], + }); + + const foo = m.contractAt("Foo", nonAddress); + + return { fooFactory, foo }; + }); + + await assert.isRejected( + this.hre.ignition.deploy(moduleDefinition), + /Future 'FooModule#FooFactory.nonAddressResult' must be a valid address/ + ); + }); + + it("should not be able to use the output of a non-address static call in an artifact contract at", async function () { + const artifact = await this.hre.artifacts.readArtifact("Foo"); + + const moduleDefinition = buildModule("FooModule", (m) => { + const account1 = m.getAccount(1); + + const fooFactory = m.contract("FooFactory", [], { from: account1 }); + + const createCall = m.call(fooFactory, "create", []); + + const nonAddress = m.staticCall(fooFactory, "nonAddressResult", [], 0, { + after: [createCall], + }); + + const foo = m.contractAt("Foo", artifact, nonAddress); + + return { fooFactory, foo }; + }); + + await assert.isRejected( + this.hre.ignition.deploy(moduleDefinition), + /Future 'FooModule#FooFactory.nonAddressResult' must be a valid address/ + ); + }); +}); diff --git a/packages/hardhat-ignition/test/module-api/use-module.ts b/packages/hardhat-ignition/test/module-api/use-module.ts new file mode 100644 index 00000000000..27a48945866 --- /dev/null +++ b/packages/hardhat-ignition/test/module-api/use-module.ts @@ -0,0 +1,77 @@ +/* eslint-disable import/no-unused-modules */ +import { buildModule } from "@nomicfoundation/ignition-core"; +import { assert } from "chai"; + +import { useEphemeralIgnitionProject } from "../test-helpers/use-ignition-project"; + +describe("useModule", function () { + useEphemeralIgnitionProject("minimal"); + + describe("returning futures from module usage", () => { + it("using useModule", async function () { + const thirdPartyModule = buildModule("ThirdPartySubmodule", (m) => { + const foo = m.contract("Foo"); + + return { foo }; + }); + + const userModule = buildModule("UserModule", (m) => { + const { foo } = m.useModule(thirdPartyModule); + + m.call(foo, "inc"); + + return { foo }; + }); + + const result = await this.hre.ignition.deploy(userModule); + + assert.equal(await result.foo.read.x(), 2n); + }); + }); + + describe("modules depending on other modules contracts", () => { + it("should execute all in a module before any that depends on a contract within the module", async function () { + const firstSecondAndThirdModule = buildModule( + "SecondAndThirdCallModule", + (m) => { + const trace = m.contract("Trace", ["first"]); + + const secondCall = m.call(trace, "addEntry", ["second"]); + + m.call(trace, "addEntry", ["third"], { + id: "third_add_entry", + after: [secondCall], + }); + + return { trace }; + } + ); + + const fourthCallModule = buildModule("FourthCallModule", (m) => { + const { trace } = m.useModule(firstSecondAndThirdModule); + + m.call(trace, "addEntry", ["fourth"]); + + return { trace }; + }); + + const userModule = buildModule("UserModule", (m) => { + const { trace } = m.useModule(fourthCallModule); + + return { trace }; + }); + + const result = await this.hre.ignition.deploy(userModule); + + const entry1 = await result.trace.read.entries([0n]); + const entry2 = await result.trace.read.entries([1n]); + const entry3 = await result.trace.read.entries([2n]); + const entry4 = await result.trace.read.entries([3n]); + + assert.deepStrictEqual( + [entry1, entry2, entry3, entry4], + ["first", "second", "third", "fourth"] + ); + }); + }); +}); diff --git a/packages/hardhat-ignition/test/module-parameters.ts b/packages/hardhat-ignition/test/module-parameters.ts new file mode 100644 index 00000000000..5e476c4bd09 --- /dev/null +++ b/packages/hardhat-ignition/test/module-parameters.ts @@ -0,0 +1,190 @@ +/* eslint-disable import/no-unused-modules */ +import { buildModule } from "@nomicfoundation/ignition-core"; +import { assert } from "chai"; + +import { useEphemeralIgnitionProject } from "./test-helpers/use-ignition-project"; + +describe("module parameters", () => { + describe("a standard hardhat project", () => { + useEphemeralIgnitionProject("lock"); + + it("should run if provided with a valid module parameters file", async function () { + await this.hre.run( + { + scope: "ignition", + task: "deploy", + }, + { + modulePath: "./ignition/modules/Lock.ts", + parameters: "./ignition/modules/parameters.json", + } + ); + }); + + it("should run if provided with a valid module parameters file in JSON5 format", async function () { + await this.hre.run( + { + scope: "ignition", + task: "deploy", + }, + { + modulePath: "./ignition/modules/Lock.ts", + parameters: "./ignition/modules/parameters-json5.json5", + } + ); + }); + + it("should run if provided with a valid module parameters file encoding a bigint as a string", async function () { + await this.hre.run( + { + scope: "ignition", + task: "deploy", + }, + { + modulePath: "./ignition/modules/Lock.ts", + parameters: "./ignition/modules/parameters-bigints-as-strings.json", + } + ); + }); + + it("should fail if the module path is invalid", async function () { + await assert.isRejected( + this.hre.run( + { + scope: "ignition", + task: "deploy", + }, + { + modulePath: "./ignition/modules/nonexistant.ts", + } + ), + /Could not find a module file at the path: .\/ignition\/modules\/nonexistant.ts/ + ); + }); + + it("should fail if the module parameters path is invalid", async function () { + await assert.isRejected( + this.hre.run( + { + scope: "ignition", + task: "deploy", + }, + { + modulePath: "./ignition/modules/nonexistant.ts", + parameters: "./ignition/modules/nonexistant.json", + } + ), + /Could not find a module file at the path: .\/ignition\/modules\/nonexistant.ts/ + ); + }); + + it("should fail if parameters file number is larger than allowed", async function () { + await assert.isRejected( + this.hre.run( + { + scope: "ignition", + task: "deploy", + }, + { + modulePath: "./ignition/modules/Lock.ts", + parameters: "./ignition/modules/parameters-too-large.json", + } + ), + /Parameter "unlockTime" exceeds maximum safe integer size. Encode the value as a string using bigint notation: `\${value}n`/ + ); + }); + + it("should use a global parameter if no module parameter is available", async function () { + const ignitionModule = buildModule("Test", (m) => { + const unlockTime = m.getParameter("unlockTime"); + + const lock = m.contract("Lock", [unlockTime]); + + return { lock }; + }); + + const result = await this.hre.ignition.deploy(ignitionModule, { + parameters: { $global: { unlockTime: 1893499200000 } }, + }); + + assert.equal(await result.lock.read.unlockTime(), 1893499200000); + }); + + it("should use a global parameter instead of the default value", async function () { + const ignitionModule = buildModule("Test", (m) => { + const unlockTime = m.getParameter("unlockTime", 100); + + const lock = m.contract("Lock", [unlockTime]); + + return { lock }; + }); + + const result = await this.hre.ignition.deploy(ignitionModule, { + parameters: { $global: { unlockTime: 1893499200000 } }, + }); + + assert.equal(await result.lock.read.unlockTime(), 1893499200000); + }); + + it("should use the module parameter even if global parameters exist but not that specific parameter", async function () { + const ignitionModule = buildModule("Test", (m) => { + const unlockTime = m.getParameter("moduleLevelParam"); + + const lock = m.contract("Lock", [unlockTime]); + + return { lock }; + }); + + const result = await this.hre.ignition.deploy(ignitionModule, { + parameters: { + $global: { globalLevelParam: "should-not-be-read" }, + Test: { + moduleLevelParam: 1893499200000, + }, + }, + }); + + assert.equal(await result.lock.read.unlockTime(), 1893499200000); + }); + + it("should use the global parameter even if module parameters exist but not that specific parameter", async function () { + const ignitionModule = buildModule("Test", (m) => { + const unlockTime = m.getParameter("globalLevelParam"); + + const lock = m.contract("Lock", [unlockTime]); + + return { lock }; + }); + + const result = await this.hre.ignition.deploy(ignitionModule, { + parameters: { + $global: { globalLevelParam: 1893499200000 }, + Test: { + moduleLevelParam: "should-not-be-read", + }, + }, + }); + + assert.equal(await result.lock.read.unlockTime(), 1893499200000); + }); + + it("should use a module parameter instead of a global parameter if both are present", async function () { + const ignitionModule = buildModule("Test", (m) => { + const unlockTime = m.getParameter("unlockTime", 100); + + const lock = m.contract("Lock", [unlockTime]); + + return { lock }; + }); + + const result = await this.hre.ignition.deploy(ignitionModule, { + parameters: { + $global: { unlockTime: 1893499200000 }, + Test: { unlockTime: 9876543210000 }, + }, + }); + + assert.equal(await result.lock.read.unlockTime(), 9876543210000); + }); + }); +}); diff --git a/packages/hardhat-ignition/test/plan/index.ts b/packages/hardhat-ignition/test/plan/index.ts new file mode 100644 index 00000000000..af4af6dc632 --- /dev/null +++ b/packages/hardhat-ignition/test/plan/index.ts @@ -0,0 +1,31 @@ +/* eslint-disable import/no-unused-modules */ +import { assert } from "chai"; +import { emptyDirSync, readdir } from "fs-extra"; +import path from "path"; + +import { useEphemeralIgnitionProject } from "../test-helpers/use-ignition-project"; + +describe("visualize", () => { + useEphemeralIgnitionProject("minimal"); + + it("should create a visualization", async function () { + const visualizationPath = path.resolve("../minimal/cache/visualization"); + emptyDirSync(visualizationPath); + + await this.hre.run("compile", { quiet: true }); + await this.hre.run( + { + scope: "ignition", + task: "visualize", + }, + { + noOpen: true, + modulePath: "./ignition/modules/MyModule.js", + } + ); + + const files = await readdir(visualizationPath); + + assert(files.includes("index.html")); + }); +}); diff --git a/packages/hardhat-ignition/test/setup.ts b/packages/hardhat-ignition/test/setup.ts new file mode 100644 index 00000000000..83ca4a59226 --- /dev/null +++ b/packages/hardhat-ignition/test/setup.ts @@ -0,0 +1,11 @@ +/* eslint-disable import/no-unused-modules */ +import chai from "chai"; +import chaiAsPromised from "chai-as-promised"; +import sinon from "sinon"; + +chai.use(chaiAsPromised); +chai.config.truncateThreshold = 1000; + +afterEach(() => { + sinon.restore(); +}); diff --git a/packages/hardhat-ignition/test/strategies/create2.ts b/packages/hardhat-ignition/test/strategies/create2.ts new file mode 100644 index 00000000000..193aa01b68e --- /dev/null +++ b/packages/hardhat-ignition/test/strategies/create2.ts @@ -0,0 +1,254 @@ +/* eslint-disable import/no-unused-modules */ +import { buildModule } from "@nomicfoundation/ignition-core"; +import { assert } from "chai"; +import { HardhatRuntimeEnvironment } from "hardhat/types"; + +import { presignedTx } from "../test-helpers/createX-tx"; +import { externallyLoadedContractArtifact } from "../test-helpers/externally-loaded-contract"; +import { mineBlock } from "../test-helpers/mine-block"; +import { + useEphemeralIgnitionProject, + useFileIgnitionProject, +} from "../test-helpers/use-ignition-project"; +import { waitForPendingTxs } from "../test-helpers/wait-for-pending-txs"; + +describe("create2", function () { + const example32ByteSalt = + "0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef"; + const anotherExample32ByteSalt = + "0xabcde67890abcdef1234567890abcdef1234567890abcdef1234567890abcdef"; + + const EXPECTED_FOO_CREATE2_ADDRESS = + "0xA901a97D596320CC5b4E61f6B315F6128fAfF10B"; + const EXPECTED_BAR_CREATE2_ADDRESS = + "0x5985C19bc6ba6f9b3f9350Ba6c8156c8A9876E1a"; + const EXPECTED_CUSTOM_SALT_FOO_CREATE2_ADDRESS = + "0x2FbECc7173383C5878FF8EC336da0775CbF77fF7"; + + const moduleDefinition = buildModule("FooModule", (m) => { + // Use a known bytecode to ensure the same address is generated + // via create2 + const foo = m.contract("Foo", externallyLoadedContractArtifact); + + return { foo }; + }); + + describe("non-hardhat network", function () { + describe("preexisting createX contract", function () { + useEphemeralIgnitionProject("create2-exists-chain"); + + beforeEach(async function () { + await deployCreateXFactory(this.hre); + }); + + [ + "0x70997970C51812dc3A010C7d01b50e0d17dc79C8", + "0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC", + "0x90F79bf6EB2c4f870365E785982E1f101E93b906", + ].forEach((accountAddress) => { + it(`should deploy a contract from account <${accountAddress}> using the createX factory to the expected address`, async function () { + const deployPromise = this.hre.ignition.deploy(moduleDefinition, { + strategy: "create2", + defaultSender: accountAddress, + strategyConfig: { + salt: example32ByteSalt, + }, + }); + + await waitForPendingTxs(this.hre, 1, deployPromise); + await mineBlock(this.hre); + + const result = await deployPromise; + + assert.equal(result.foo.address, EXPECTED_FOO_CREATE2_ADDRESS); + + assert.equal(this.hre.network.config.chainId, 1); + assert.equal(await result.foo.read.x(), Number(1)); + }); + }); + + it(`should support endowing eth to the deployed contract`, async function () { + const deployPromise = this.hre.ignition.deploy( + buildModule("ValueModule", (m) => { + const foo = m.contract("Foo", [], { + value: 1_000_000_000n, + }); + + return { foo }; + }), + { + strategy: "create2", + strategyConfig: { + salt: example32ByteSalt, + }, + } + ); + + await waitForPendingTxs(this.hre, 1, deployPromise); + await mineBlock(this.hre); + + const result = await deployPromise; + + const balance = await this.hre.network.provider.request({ + method: "eth_getBalance", + params: [result.foo.address, "latest"], + }); + + assert.equal(balance, 1_000_000_000n); + }); + + it(`should throw if you attempt to endow when the constructor isn't payable`, async function () { + await assert.isRejected( + this.hre.ignition.deploy( + buildModule("ValueModule", (m) => { + const foo = m.contract("Unpayable", [], { + value: 1_000_000_000n, + }); + + return { foo }; + }), + { + strategy: "create2", + strategyConfig: { + salt: example32ByteSalt, + }, + } + ), + /Simulating the transaction failed with error: Reverted with custom error FailedContractCreation/ + ); + }); + + it("should deploy with a custom salt", async function () { + const deployPromise = this.hre.ignition.deploy(moduleDefinition, { + strategy: "create2", + strategyConfig: { + salt: anotherExample32ByteSalt, + }, + }); + + await waitForPendingTxs(this.hre, 1, deployPromise); + await mineBlock(this.hre); + + const result = await deployPromise; + + assert.equal( + result.foo.address, + EXPECTED_CUSTOM_SALT_FOO_CREATE2_ADDRESS + ); + + assert.equal(this.hre.network.config.chainId, 1); + assert.equal(await result.foo.read.x(), Number(1)); + }); + }); + + describe("no preexisting createX contract", function () { + useEphemeralIgnitionProject("create2-not-exists-chain"); + + it("should throw when no createX contract exists on the network", async function () { + assert.equal(this.hre.network.config.chainId, 88888); + await assert.isRejected( + this.hre.ignition.deploy(moduleDefinition, { + strategy: "create2", + strategyConfig: { + salt: example32ByteSalt, + }, + }), + /CreateX not deployed on current network 88888/ + ); + }); + }); + }); + + describe("hardhat network", function () { + useEphemeralIgnitionProject("minimal"); + + it("should deploy a createX factory then use it to deploy the given contract", async function () { + const deployPromise = this.hre.ignition.deploy(moduleDefinition, { + strategy: "create2", + strategyConfig: { + salt: example32ByteSalt, + }, + }); + + await waitForPendingTxs(this.hre, 1, deployPromise); + await mineBlock(this.hre); + + const result = await deployPromise; + + assert.equal(result.foo.address, EXPECTED_FOO_CREATE2_ADDRESS); + + assert.equal(this.hre.network.config.chainId, 31337); + assert.equal(await result.foo.read.x(), Number(1)); + }); + + it("should use an existing createX factory to deploy the given contract", async function () { + // Run create2 once deploying the factory + const firstDeployPromise = this.hre.ignition.deploy(moduleDefinition, { + strategy: "create2", + strategyConfig: { + salt: example32ByteSalt, + }, + }); + + await waitForPendingTxs(this.hre, 1, firstDeployPromise); + await mineBlock(this.hre); + + await firstDeployPromise; + + // Run a second deploy, this time leveraging the existing create2 factory + const secondDeployPromise = this.hre.ignition.deploy( + buildModule("Second", (m) => { + const bar = m.contract("Bar"); + + return { bar }; + }), + { + strategy: "create2", + strategyConfig: { + salt: example32ByteSalt, + }, + } + ); + + await waitForPendingTxs(this.hre, 1, secondDeployPromise); + await mineBlock(this.hre); + + const secondDeployResult = await secondDeployPromise; + + assert.equal( + secondDeployResult.bar.address, + EXPECTED_BAR_CREATE2_ADDRESS + ); + assert(await secondDeployResult.bar.read.isBar()); + }); + }); + + describe("config", function () { + useFileIgnitionProject("create2-bad-config", "attempt-bad-config"); + + it("should throw if salt is not defined in Hardhat config", async function () { + await assert.isRejected( + this.hre.run( + { scope: "ignition", task: "deploy" }, + { + modulePath: "./ignition/modules/MyModule.js", + strategy: "create2", + } + ), + /IGN1102: Missing required strategy configuration parameter 'salt' for the strategy 'create2'/ + ); + }); + }); +}); + +async function deployCreateXFactory(hre: HardhatRuntimeEnvironment) { + await hre.network.provider.request({ + method: "hardhat_setBalance", + params: ["0xeD456e05CaAb11d66C4c797dD6c1D6f9A7F352b5", "0x58D15E176280000"], + }); + + await hre.network.provider.request({ + method: "eth_sendRawTransaction", + params: [presignedTx], + }); +} diff --git a/packages/hardhat-ignition/test/strategies/generic-strategy-constraints.ts b/packages/hardhat-ignition/test/strategies/generic-strategy-constraints.ts new file mode 100644 index 00000000000..e74f0b71011 --- /dev/null +++ b/packages/hardhat-ignition/test/strategies/generic-strategy-constraints.ts @@ -0,0 +1,241 @@ +import { buildModule } from "@nomicfoundation/ignition-core"; +import { assert } from "chai"; + +import { mineBlock } from "../test-helpers/mine-block"; +import { useEphemeralIgnitionProject } from "../test-helpers/use-ignition-project"; +import { waitForPendingTxs } from "../test-helpers/wait-for-pending-txs"; + +const strategies = ["basic", "create2"] as const; + +const exampleConfig = { + basic: {}, + create2: { + salt: "0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef", + }, +} as const; + +describe("strategies - generic constraints", function () { + strategies.forEach((strategy) => { + describe(strategy, function () { + useEphemeralIgnitionProject("minimal"); + + it("should deploy a contract", async function () { + const moduleDefinition = buildModule("FooModule", (m) => { + const foo = m.contract("Foo"); + + return { foo }; + }); + + const deployPromise = this.hre.ignition.deploy(moduleDefinition, { + strategy, + strategyConfig: exampleConfig[strategy], + }); + + await waitForPendingTxs(this.hre, 1, deployPromise); + await mineBlock(this.hre); + + const result = await deployPromise; + + assert.isDefined(result.foo.address); + + assert.equal(await result.foo.read.x(), Number(1)); + }); + + it("should deploy multiple contracts", async function () { + const moduleDefinition = buildModule("FooModule", (m) => { + const foo = m.contract("Foo"); + const bar = m.contract("Bar"); + + return { foo, bar }; + }); + + const deployPromise = this.hre.ignition.deploy(moduleDefinition, { + strategy, + strategyConfig: exampleConfig[strategy], + }); + + await waitForPendingTxs(this.hre, 2, deployPromise); + await mineBlock(this.hre); + + const result = await deployPromise; + + assert.isDefined(result.foo.address); + assert.isDefined(result.bar.address); + + assert.equal(await result.foo.read.x(), Number(1)); + assert.equal(await result.bar.read.isBar(), true); + }); + + it("should call a contract function", async function () { + const moduleDefinition = buildModule("FooModule", (m) => { + const foo = m.contract("Foo"); + + m.call(foo, "inc"); + + return { foo }; + }); + + const deployPromise = this.hre.ignition.deploy(moduleDefinition, { + strategy, + strategyConfig: exampleConfig[strategy], + }); + + await waitForPendingTxs(this.hre, 1, deployPromise); + await mineBlock(this.hre); + await waitForPendingTxs(this.hre, 1, deployPromise); + await mineBlock(this.hre); + + const result = await deployPromise; + + assert.isDefined(result.foo.address); + + assert.equal(await result.foo.read.x(), Number(2)); + }); + + it("should static call a contract function", async function () { + const moduleDefinition = buildModule("FooModule", (m) => { + const foo = m.contract("Foo"); + + const firstInc = m.call(foo, "inc", [], { id: "inc1" }); + const secondInc = m.call(foo, "inc", [], { + id: "inc2", + after: [firstInc], + }); + + const counter = m.staticCall(foo, "x", [], 0, { + id: "inc3", + after: [secondInc], + }); + + m.call(foo, "incByPositiveNumber", [counter]); + + return { foo }; + }); + + const deployPromise = this.hre.ignition.deploy(moduleDefinition, { + strategy, + strategyConfig: exampleConfig[strategy], + }); + + await waitForPendingTxs(this.hre, 1, deployPromise); + await mineBlock(this.hre); + await waitForPendingTxs(this.hre, 1, deployPromise); + await mineBlock(this.hre); + await waitForPendingTxs(this.hre, 1, deployPromise); + await mineBlock(this.hre); + await waitForPendingTxs(this.hre, 1, deployPromise); + await mineBlock(this.hre); + + const result = await deployPromise; + + assert.isDefined(result.foo.address); + + assert.equal(await result.foo.read.x(), Number(6)); + }); + + it("should support using existing contracts", async function () { + const moduleDefinition = buildModule("FooModule", (m) => { + const foo = m.contract("Foo"); + + return { foo }; + }); + + const deployPromise = this.hre.ignition.deploy(moduleDefinition); + + await waitForPendingTxs(this.hre, 1, deployPromise); + await mineBlock(this.hre); + + const result = await deployPromise; + + const fooAddress = result.foo.address; + + const contractAtDefinition = buildModule("ContractAtModule", (m) => { + const contractAtFoo = m.contractAt("Foo", fooAddress); + + m.call(contractAtFoo, "inc"); + + return { contractAtFoo }; + }); + + const contractAtPromise = this.hre.ignition.deploy( + contractAtDefinition, + { + strategy, + strategyConfig: exampleConfig[strategy], + } + ); + + await waitForPendingTxs(this.hre, 1, contractAtPromise); + await mineBlock(this.hre); + + const contractAtResult = await contractAtPromise; + + assert.equal(await contractAtResult.contractAtFoo.read.x(), Number(2)); + }); + + it("should read an event emitted from a constructor", async function () { + const moduleDefinition = buildModule("FooModule", (m) => { + const foo = m.contract("EventArgValue"); + + const arg = m.readEventArgument(foo, "EventValue", "value"); + + // will revert if the event argument is not equal to 42 + m.call(foo, "validateEmitted", [arg]); + + return { foo }; + }); + + const deployPromise = this.hre.ignition.deploy(moduleDefinition, { + strategy, + strategyConfig: exampleConfig[strategy], + }); + + await waitForPendingTxs(this.hre, 1, deployPromise); + await mineBlock(this.hre); + await waitForPendingTxs(this.hre, 1, deployPromise); + await mineBlock(this.hre); + + const result = await deployPromise; + + assert.isDefined(result.foo.address); + + assert.equal(await result.foo.read.argWasValidated(), true); + }); + + it("should read an event emitted from a function", async function () { + const moduleDefinition = buildModule("FooModule", (m) => { + const foo = m.contract("SendDataEmitter"); + + const eventCall = m.call(foo, "emitEvent"); + + const arg = m.readEventArgument(eventCall, "SendDataEvent", "arg", { + emitter: foo, + }); + + // will revert if the event argument is not equal to 42 + m.call(foo, "validateEmitted", [arg]); + + return { foo }; + }); + + const deployPromise = this.hre.ignition.deploy(moduleDefinition, { + strategy, + strategyConfig: exampleConfig[strategy], + }); + + await waitForPendingTxs(this.hre, 1, deployPromise); + await mineBlock(this.hre); + await waitForPendingTxs(this.hre, 1, deployPromise); + await mineBlock(this.hre); + await waitForPendingTxs(this.hre, 1, deployPromise); + await mineBlock(this.hre); + + const result = await deployPromise; + + assert.isDefined(result.foo.address); + + assert.equal(await result.foo.read.wasEmitted(), true); + }); + }); + }); +}); diff --git a/packages/hardhat-ignition/test/strategies/only-built-in-strategies.ts b/packages/hardhat-ignition/test/strategies/only-built-in-strategies.ts new file mode 100644 index 00000000000..0c0ce70461b --- /dev/null +++ b/packages/hardhat-ignition/test/strategies/only-built-in-strategies.ts @@ -0,0 +1,20 @@ +import { assert } from "chai"; + +import { useEphemeralIgnitionProject } from "../test-helpers/use-ignition-project"; + +describe("strategies - only built in strategies", function () { + useEphemeralIgnitionProject("minimal"); + + it("should throw if a non-recognized strategy is specified", async function () { + await assert.isRejected( + this.hre.run( + { scope: "ignition", task: "deploy" }, + { + modulePath: "./ignition/modules/MyModule.js", + strategy: "non-recognized-strategy", + } + ), + /Invalid strategy name, must be either 'basic' or 'create2'/ + ); + }); +}); diff --git a/packages/hardhat-ignition/test/test-helpers/clear-pending-transactions-from-memory-pool.ts b/packages/hardhat-ignition/test/test-helpers/clear-pending-transactions-from-memory-pool.ts new file mode 100644 index 00000000000..04044b50a01 --- /dev/null +++ b/packages/hardhat-ignition/test/test-helpers/clear-pending-transactions-from-memory-pool.ts @@ -0,0 +1,33 @@ +import { assert } from "chai"; +import { HardhatRuntimeEnvironment } from "hardhat/types"; + +export async function clearPendingTransactionsFromMemoryPool( + hre: HardhatRuntimeEnvironment +): Promise { + const pendingBlockBefore = await hre.network.provider.send( + "eth_getBlockByNumber", + ["pending", false] + ); + + assert( + pendingBlockBefore.transactions.length > 0, + "Clearing an empty mempool" + ); + + for (const hash of pendingBlockBefore.transactions) { + await hre.network.provider.request({ + method: "hardhat_dropTransaction", + params: [hash], + }); + } + + const pendingBlockAfter = await hre.network.provider.send( + "eth_getBlockByNumber", + ["pending", false] + ); + + assert( + pendingBlockAfter.transactions.length === 0, + "All blocks should be cleared" + ); +} diff --git a/packages/hardhat-ignition/test/test-helpers/createX-tx.ts b/packages/hardhat-ignition/test/test-helpers/createX-tx.ts new file mode 100644 index 00000000000..2df94f2a7a3 --- /dev/null +++ b/packages/hardhat-ignition/test/test-helpers/createX-tx.ts @@ -0,0 +1,2 @@ +export const presignedTx = + "0xf92f698085174876e800832dc6c08080b92f1660a06040523060805234801561001457600080fd5b50608051612e3e6100d860003960008181610603015281816107050152818161082b015281816108d50152818161127f01528181611375015281816113e00152818161141f015281816114a7015281816115b3015281816117d20152818161183d0152818161187c0152818161190401528181611ac501528181611c7801528181611ce301528181611d2201528181611daa01528181611fe901528181612206015281816122f20152818161244d015281816124a601526125820152612e3e6000f3fe60806040526004361061018a5760003560e01c806381503da1116100d6578063d323826a1161007f578063e96deee411610059578063e96deee414610395578063f5745aba146103a8578063f9664498146103bb57600080fd5b8063d323826a1461034f578063ddda0acb1461036f578063e437252a1461038257600080fd5b80639c36a286116100b05780639c36a28614610316578063a7db93f214610329578063c3fe107b1461033c57600080fd5b806381503da1146102d0578063890c283b146102e357806398e810771461030357600080fd5b80632f990e3f116101385780636cec2536116101125780636cec25361461027d57806374637a7a1461029d5780637f565360146102bd57600080fd5b80632f990e3f1461023757806331a7c8c81461024a57806342d654fc1461025d57600080fd5b806327fe18221161016957806327fe1822146101f15780632852527a1461020457806328ddd0461461021757600080fd5b8062d84acb1461018f57806326307668146101cb57806326a32fc7146101de575b600080fd5b6101a261019d366004612915565b6103ce565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b6101a26101d9366004612994565b6103e6565b6101a26101ec3660046129db565b610452565b6101a26101ff3660046129db565b6104de565b6101a2610212366004612a39565b610539565b34801561022357600080fd5b506101a2610232366004612a90565b6106fe565b6101a2610245366004612aa9565b61072a565b6101a2610258366004612aa9565b6107bb565b34801561026957600080fd5b506101a2610278366004612b1e565b6107c9565b34801561028957600080fd5b506101a2610298366004612a90565b610823565b3480156102a957600080fd5b506101a26102b8366004612b4a565b61084f565b6101a26102cb3660046129db565b611162565b6101a26102de366004612b74565b6111e8565b3480156102ef57600080fd5b506101a26102fe366004612bac565b611276565b6101a2610311366004612bce565b6112a3565b6101a2610324366004612994565b611505565b6101a2610337366004612c49565b6116f1565b6101a261034a366004612aa9565b611964565b34801561035b57600080fd5b506101a261036a366004612cd9565b6119ed565b6101a261037d366004612c49565b611a17565b6101a2610390366004612bce565b611e0c565b6101a26103a3366004612915565b611e95565b6101a26103b6366004612bce565b611ea4565b6101a26103c9366004612b74565b611f2d565b60006103dd8585858533611a17565b95945050505050565b6000806103f2846120db565b90508083516020850134f59150610408826123d3565b604051819073ffffffffffffffffffffffffffffffffffffffff8416907fb8fda7e00c6b06a2b54e58521bc5894fee35f1090e5a3bb6390bfe2b98b497f790600090a35092915050565b60006104d86104d260408051437fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101406020830152419282019290925260608101919091524260808201524460a08201524660c08201523360e08201526000906101000160405160208183030381529060405280519060200120905090565b836103e6565b92915050565b600081516020830134f090506104f3816123d3565b60405173ffffffffffffffffffffffffffffffffffffffff8216907f4db17dd5e4732fb6da34a148104a592783ca119a1e7bb8829eba6cbadef0b51190600090a2919050565b600080610545856120db565b905060008460601b90506040517f3d602d80600a3d3981f3363d3d373d3d3d363d7300000000000000000000000081528160148201527f5af43d82803e903d91602b57fd5bf300000000000000000000000000000000006028820152826037826000f593505073ffffffffffffffffffffffffffffffffffffffff8316610635576040517fc05cee7a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001660048201526024015b60405180910390fd5b604051829073ffffffffffffffffffffffffffffffffffffffff8516907fb8fda7e00c6b06a2b54e58521bc5894fee35f1090e5a3bb6390bfe2b98b497f790600090a36000808473ffffffffffffffffffffffffffffffffffffffff1634876040516106a19190612d29565b60006040518083038185875af1925050503d80600081146106de576040519150601f19603f3d011682016040523d82523d6000602084013e6106e3565b606091505b50915091506106f382828961247d565b505050509392505050565b60006104d87f00000000000000000000000000000000000000000000000000000000000000008361084f565b60006107b36107aa60408051437fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101406020830152419282019290925260608101919091524260808201524460a08201524660c08201523360e08201526000906101000160405160208183030381529060405280519060200120905090565b85858533611a17565b949350505050565b60006107b3848484336112a3565b60006040518260005260ff600b53836020527f21c35dbe1b344a2488cf3321d6ce542f8e9f305544ff09e4993a62319a497c1f6040526055600b20601452806040525061d694600052600160345350506017601e20919050565b60006104d8827f00000000000000000000000000000000000000000000000000000000000000006107c9565b600060607f9400000000000000000000000000000000000000000000000000000000000000610887600167ffffffffffffffff612d45565b67ffffffffffffffff16841115610902576040517f3c55ab3b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016600482015260240161062c565b836000036109c7576040517fd60000000000000000000000000000000000000000000000000000000000000060208201527fff00000000000000000000000000000000000000000000000000000000000000821660218201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606087901b1660228201527f800000000000000000000000000000000000000000000000000000000000000060368201526037015b6040516020818303038152906040529150611152565b607f8411610a60576040517fd60000000000000000000000000000000000000000000000000000000000000060208201527fff0000000000000000000000000000000000000000000000000000000000000080831660218301527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b16602283015260f886901b1660368201526037016109b1565b60ff8411610b1f576040517fd70000000000000000000000000000000000000000000000000000000000000060208201527fff0000000000000000000000000000000000000000000000000000000000000080831660218301527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b1660228301527f8100000000000000000000000000000000000000000000000000000000000000603683015260f886901b1660378201526038016109b1565b61ffff8411610bff576040517fd80000000000000000000000000000000000000000000000000000000000000060208201527fff00000000000000000000000000000000000000000000000000000000000000821660218201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606087901b1660228201527f820000000000000000000000000000000000000000000000000000000000000060368201527fffff00000000000000000000000000000000000000000000000000000000000060f086901b1660378201526039016109b1565b62ffffff8411610ce0576040517fd90000000000000000000000000000000000000000000000000000000000000060208201527fff00000000000000000000000000000000000000000000000000000000000000821660218201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606087901b1660228201527f830000000000000000000000000000000000000000000000000000000000000060368201527fffffff000000000000000000000000000000000000000000000000000000000060e886901b166037820152603a016109b1565b63ffffffff8411610dc2576040517fda0000000000000000000000000000000000000000000000000000000000000060208201527fff00000000000000000000000000000000000000000000000000000000000000821660218201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606087901b1660228201527f840000000000000000000000000000000000000000000000000000000000000060368201527fffffffff0000000000000000000000000000000000000000000000000000000060e086901b166037820152603b016109b1565b64ffffffffff8411610ea5576040517fdb0000000000000000000000000000000000000000000000000000000000000060208201527fff00000000000000000000000000000000000000000000000000000000000000821660218201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606087901b1660228201527f850000000000000000000000000000000000000000000000000000000000000060368201527fffffffffff00000000000000000000000000000000000000000000000000000060d886901b166037820152603c016109b1565b65ffffffffffff8411610f89576040517fdc0000000000000000000000000000000000000000000000000000000000000060208201527fff00000000000000000000000000000000000000000000000000000000000000821660218201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606087901b1660228201527f860000000000000000000000000000000000000000000000000000000000000060368201527fffffffffffff000000000000000000000000000000000000000000000000000060d086901b166037820152603d016109b1565b66ffffffffffffff841161106e576040517fdd0000000000000000000000000000000000000000000000000000000000000060208201527fff00000000000000000000000000000000000000000000000000000000000000821660218201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606087901b1660228201527f870000000000000000000000000000000000000000000000000000000000000060368201527fffffffffffffff0000000000000000000000000000000000000000000000000060c886901b166037820152603e016109b1565b6040517fde0000000000000000000000000000000000000000000000000000000000000060208201527fff00000000000000000000000000000000000000000000000000000000000000821660218201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606087901b1660228201527f880000000000000000000000000000000000000000000000000000000000000060368201527fffffffffffffffff00000000000000000000000000000000000000000000000060c086901b166037820152603f0160405160208183030381529060405291505b5080516020909101209392505050565b60006104d86111e260408051437fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101406020830152419282019290925260608101919091524260808201524460a08201524660c08201523360e08201526000906101000160405160208183030381529060405280519060200120905090565b83611505565b600061126f61126860408051437fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101406020830152419282019290925260608101919091524260808201524460a08201524660c08201523360e08201526000906101000160405160208183030381529060405280519060200120905090565b8484610539565b9392505050565b600061126f83837f00000000000000000000000000000000000000000000000000000000000000006119ed565b60008451602086018451f090506112b9816123d3565b60405173ffffffffffffffffffffffffffffffffffffffff8216907f4db17dd5e4732fb6da34a148104a592783ca119a1e7bb8829eba6cbadef0b51190600090a26000808273ffffffffffffffffffffffffffffffffffffffff168560200151876040516113279190612d29565b60006040518083038185875af1925050503d8060008114611364576040519150601f19603f3d011682016040523d82523d6000602084013e611369565b606091505b5091509150816113c9577f0000000000000000000000000000000000000000000000000000000000000000816040517fa57ca23900000000000000000000000000000000000000000000000000000000815260040161062c929190612d94565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001631156114fb578373ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163160405160006040518083038185875af1925050503d8060008114611495576040519150601f19603f3d011682016040523d82523d6000602084013e61149a565b606091505b509092509050816114fb577f0000000000000000000000000000000000000000000000000000000000000000816040517fc2b3f44500000000000000000000000000000000000000000000000000000000815260040161062c929190612d94565b5050949350505050565b600080611511846120db565b905060006040518060400160405280601081526020017f67363d3d37363d34f03d5260086018f30000000000000000000000000000000081525090506000828251602084016000f5905073ffffffffffffffffffffffffffffffffffffffff81166115e0576040517fc05cee7a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016600482015260240161062c565b604051839073ffffffffffffffffffffffffffffffffffffffff8316907f2feea65dd4e9f9cbd86b74b7734210c59a1b2981b5b137bd0ee3e208200c906790600090a361162c83610823565b935060008173ffffffffffffffffffffffffffffffffffffffff1634876040516116569190612d29565b60006040518083038185875af1925050503d8060008114611693576040519150601f19603f3d011682016040523d82523d6000602084013e611698565b606091505b505090506116a681866124ff565b60405173ffffffffffffffffffffffffffffffffffffffff8616907f4db17dd5e4732fb6da34a148104a592783ca119a1e7bb8829eba6cbadef0b51190600090a25050505092915050565b6000806116fd876120db565b9050808651602088018651f59150611714826123d3565b604051819073ffffffffffffffffffffffffffffffffffffffff8416907fb8fda7e00c6b06a2b54e58521bc5894fee35f1090e5a3bb6390bfe2b98b497f790600090a36000808373ffffffffffffffffffffffffffffffffffffffff168660200151886040516117849190612d29565b60006040518083038185875af1925050503d80600081146117c1576040519150601f19603f3d011682016040523d82523d6000602084013e6117c6565b606091505b509150915081611826577f0000000000000000000000000000000000000000000000000000000000000000816040517fa57ca23900000000000000000000000000000000000000000000000000000000815260040161062c929190612d94565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000163115611958578473ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163160405160006040518083038185875af1925050503d80600081146118f2576040519150601f19603f3d011682016040523d82523d6000602084013e6118f7565b606091505b50909250905081611958577f0000000000000000000000000000000000000000000000000000000000000000816040517fc2b3f44500000000000000000000000000000000000000000000000000000000815260040161062c929190612d94565b50505095945050505050565b60006107b36119e460408051437fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101406020830152419282019290925260608101919091524260808201524460a08201524660c08201523360e08201526000906101000160405160208183030381529060405280519060200120905090565b858585336116f1565b6000604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b600080611a23876120db565b905060006040518060400160405280601081526020017f67363d3d37363d34f03d5260086018f30000000000000000000000000000000081525090506000828251602084016000f5905073ffffffffffffffffffffffffffffffffffffffff8116611af2576040517fc05cee7a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016600482015260240161062c565b604051839073ffffffffffffffffffffffffffffffffffffffff8316907f2feea65dd4e9f9cbd86b74b7734210c59a1b2981b5b137bd0ee3e208200c906790600090a3611b3e83610823565b935060008173ffffffffffffffffffffffffffffffffffffffff1687600001518a604051611b6c9190612d29565b60006040518083038185875af1925050503d8060008114611ba9576040519150601f19603f3d011682016040523d82523d6000602084013e611bae565b606091505b50509050611bbc81866124ff565b60405173ffffffffffffffffffffffffffffffffffffffff8616907f4db17dd5e4732fb6da34a148104a592783ca119a1e7bb8829eba6cbadef0b51190600090a260608573ffffffffffffffffffffffffffffffffffffffff1688602001518a604051611c299190612d29565b60006040518083038185875af1925050503d8060008114611c66576040519150601f19603f3d011682016040523d82523d6000602084013e611c6b565b606091505b50909250905081611ccc577f0000000000000000000000000000000000000000000000000000000000000000816040517fa57ca23900000000000000000000000000000000000000000000000000000000815260040161062c929190612d94565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000163115611dfe578673ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163160405160006040518083038185875af1925050503d8060008114611d98576040519150601f19603f3d011682016040523d82523d6000602084013e611d9d565b606091505b50909250905081611dfe577f0000000000000000000000000000000000000000000000000000000000000000816040517fc2b3f44500000000000000000000000000000000000000000000000000000000815260040161062c929190612d94565b505050505095945050505050565b60006103dd611e8c60408051437fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101406020830152419282019290925260608101919091524260808201524460a08201524660c08201523360e08201526000906101000160405160208183030381529060405280519060200120905090565b868686866116f1565b60006103dd85858585336116f1565b60006103dd611f2460408051437fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101406020830152419282019290925260608101919091524260808201524460a08201524660c08201523360e08201526000906101000160405160208183030381529060405280519060200120905090565b86868686611a17565b6000808360601b90506040517f3d602d80600a3d3981f3363d3d373d3d3d363d7300000000000000000000000081528160148201527f5af43d82803e903d91602b57fd5bf3000000000000000000000000000000000060288201526037816000f092505073ffffffffffffffffffffffffffffffffffffffff8216612016576040517fc05cee7a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016600482015260240161062c565b60405173ffffffffffffffffffffffffffffffffffffffff8316907f4db17dd5e4732fb6da34a148104a592783ca119a1e7bb8829eba6cbadef0b51190600090a26000808373ffffffffffffffffffffffffffffffffffffffff1634866040516120809190612d29565b60006040518083038185875af1925050503d80600081146120bd576040519150601f19603f3d011682016040523d82523d6000602084013e6120c2565b606091505b50915091506120d282828861247d565b50505092915050565b60008060006120e9846125b3565b9092509050600082600281111561210257612102612e02565b1480156121205750600081600281111561211e5761211e612e02565b145b1561215e57604080513360208201524691810191909152606081018590526080016040516020818303038152906040528051906020012092506123cc565b600082600281111561217257612172612e02565b1480156121905750600181600281111561218e5761218e612e02565b145b156121b0576121a9338560009182526020526040902090565b92506123cc565b60008260028111156121c4576121c4612e02565b03612233576040517f13b3a2a100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016600482015260240161062c565b600182600281111561224757612247612e02565b1480156122655750600081600281111561226357612263612e02565b145b1561227e576121a9468560009182526020526040902090565b600182600281111561229257612292612e02565b1480156122b0575060028160028111156122ae576122ae612e02565b145b1561231f576040517f13b3a2a100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016600482015260240161062c565b61239a60408051437fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101406020830152419282019290925260608101919091524260808201524460a08201524660c08201523360e08201526000906101000160405160208183030381529060405280519060200120905090565b84036123a657836123c9565b604080516020810186905201604051602081830303815290604052805190602001205b92505b5050919050565b73ffffffffffffffffffffffffffffffffffffffff8116158061240b575073ffffffffffffffffffffffffffffffffffffffff81163b155b1561247a576040517fc05cee7a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016600482015260240161062c565b50565b82158061249f575073ffffffffffffffffffffffffffffffffffffffff81163b155b156124fa577f0000000000000000000000000000000000000000000000000000000000000000826040517fa57ca23900000000000000000000000000000000000000000000000000000000815260040161062c929190612d94565b505050565b811580612520575073ffffffffffffffffffffffffffffffffffffffff8116155b80612540575073ffffffffffffffffffffffffffffffffffffffff81163b155b156125af576040517fc05cee7a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016600482015260240161062c565b5050565b600080606083901c3314801561261057508260141a60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167f0100000000000000000000000000000000000000000000000000000000000000145b1561262057506000905080915091565b606083901c3314801561265a57507fff00000000000000000000000000000000000000000000000000000000000000601484901a60f81b16155b1561266b5750600090506001915091565b33606084901c036126825750600090506002915091565b606083901c1580156126db57508260141a60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167f0100000000000000000000000000000000000000000000000000000000000000145b156126ec5750600190506000915091565b606083901c15801561272557507fff00000000000000000000000000000000000000000000000000000000000000601484901a60f81b16155b1561273557506001905080915091565b606083901c61274a5750600190506002915091565b8260141a60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167f0100000000000000000000000000000000000000000000000000000000000000036127a55750600290506000915091565b8260141a60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166000036127e15750600290506001915091565b506002905080915091565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f83011261282c57600080fd5b813567ffffffffffffffff80821115612847576128476127ec565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561288d5761288d6127ec565b816040528381528660208588010111156128a657600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000604082840312156128d857600080fd5b6040516040810181811067ffffffffffffffff821117156128fb576128fb6127ec565b604052823581526020928301359281019290925250919050565b60008060008060a0858703121561292b57600080fd5b84359350602085013567ffffffffffffffff8082111561294a57600080fd5b6129568883890161281b565b9450604087013591508082111561296c57600080fd5b506129798782880161281b565b92505061298986606087016128c6565b905092959194509250565b600080604083850312156129a757600080fd5b82359150602083013567ffffffffffffffff8111156129c557600080fd5b6129d18582860161281b565b9150509250929050565b6000602082840312156129ed57600080fd5b813567ffffffffffffffff811115612a0457600080fd5b6107b38482850161281b565b803573ffffffffffffffffffffffffffffffffffffffff81168114612a3457600080fd5b919050565b600080600060608486031215612a4e57600080fd5b83359250612a5e60208501612a10565b9150604084013567ffffffffffffffff811115612a7a57600080fd5b612a868682870161281b565b9150509250925092565b600060208284031215612aa257600080fd5b5035919050565b600080600060808486031215612abe57600080fd5b833567ffffffffffffffff80821115612ad657600080fd5b612ae28783880161281b565b94506020860135915080821115612af857600080fd5b50612b058682870161281b565b925050612b1585604086016128c6565b90509250925092565b60008060408385031215612b3157600080fd5b82359150612b4160208401612a10565b90509250929050565b60008060408385031215612b5d57600080fd5b612b6683612a10565b946020939093013593505050565b60008060408385031215612b8757600080fd5b612b9083612a10565b9150602083013567ffffffffffffffff8111156129c557600080fd5b60008060408385031215612bbf57600080fd5b50508035926020909101359150565b60008060008060a08587031215612be457600080fd5b843567ffffffffffffffff80821115612bfc57600080fd5b612c088883890161281b565b95506020870135915080821115612c1e57600080fd5b50612c2b8782880161281b565b935050612c3b86604087016128c6565b915061298960808601612a10565b600080600080600060c08688031215612c6157600080fd5b85359450602086013567ffffffffffffffff80821115612c8057600080fd5b612c8c89838a0161281b565b95506040880135915080821115612ca257600080fd5b50612caf8882890161281b565b935050612cbf87606088016128c6565b9150612ccd60a08701612a10565b90509295509295909350565b600080600060608486031215612cee57600080fd5b8335925060208401359150612b1560408501612a10565b60005b83811015612d20578181015183820152602001612d08565b50506000910152565b60008251612d3b818460208701612d05565b9190910192915050565b67ffffffffffffffff828116828216039080821115612d8d577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b5092915050565b73ffffffffffffffffffffffffffffffffffffffff831681526040602082015260008251806040840152612dcf816060850160208701612d05565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016060019392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fdfea164736f6c6343000817000a1ca005f70bf8a1493291468f36ef23b05eb3a4f1807f6b4022942a4104b7537bfc36a029528c0c29546c81e7d78b0277ef87031541bdc96427b246ecedb6d74cd3ed62"; diff --git a/packages/hardhat-ignition/test/test-helpers/externally-loaded-contract.ts b/packages/hardhat-ignition/test/test-helpers/externally-loaded-contract.ts new file mode 100644 index 00000000000..cd8f2a6172f --- /dev/null +++ b/packages/hardhat-ignition/test/test-helpers/externally-loaded-contract.ts @@ -0,0 +1,94 @@ +/** + * This is the artifact of a contract that is not part of the compilation output. + * + * Based on the following Solidity: + * + * ``` + contract ExternallyLoadedContract { + bool public isExternallyLoaded = true; + uint256 public x = 1; + + function buildMessage( + string memory message + ) public pure returns (string memory) { + return string.concat("A message: ", message); + } + + function inc() public returns (uint256) { + x++; + return x; + } + } + * ``` + */ +export const externallyLoadedContractArtifact = { + _format: "hh-sol-artifact-1", + contractName: "ExternallyLoadedContract", + sourceName: "contracts/Foo.sol", + abi: [ + { + inputs: [ + { + internalType: "string", + name: "message", + type: "string", + }, + ], + name: "buildMessage", + outputs: [ + { + internalType: "string", + name: "", + type: "string", + }, + ], + stateMutability: "pure", + type: "function", + }, + { + inputs: [], + name: "inc", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [], + name: "isExternallyLoaded", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "x", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + ], + bytecode: + "0x608060405260016000806101000a81548160ff0219169083151502179055506001805534801561002e57600080fd5b506105208061003e6000396000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c80630c55699c14610051578063371303c01461006f578063ae78e06b1461008d578063c4a5693d146100ab575b600080fd5b6100596100db565b6040516100669190610156565b60405180910390f35b6100776100e1565b6040516100849190610156565b60405180910390f35b610095610103565b6040516100a2919061018c565b60405180910390f35b6100c560048036038101906100c09190610301565b610114565b6040516100d291906103c9565b60405180910390f35b60015481565b6000600160008154809291906100f69061041a565b9190505550600154905090565b60008054906101000a900460ff1681565b60608160405160200161012791906104c4565b6040516020818303038152906040529050919050565b6000819050919050565b6101508161013d565b82525050565b600060208201905061016b6000830184610147565b92915050565b60008115159050919050565b61018681610171565b82525050565b60006020820190506101a1600083018461017d565b92915050565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61020e826101c5565b810181811067ffffffffffffffff8211171561022d5761022c6101d6565b5b80604052505050565b60006102406101a7565b905061024c8282610205565b919050565b600067ffffffffffffffff82111561026c5761026b6101d6565b5b610275826101c5565b9050602081019050919050565b82818337600083830152505050565b60006102a461029f84610251565b610236565b9050828152602081018484840111156102c0576102bf6101c0565b5b6102cb848285610282565b509392505050565b600082601f8301126102e8576102e76101bb565b5b81356102f8848260208601610291565b91505092915050565b600060208284031215610317576103166101b1565b5b600082013567ffffffffffffffff811115610335576103346101b6565b5b610341848285016102d3565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015610384578082015181840152602081019050610369565b60008484015250505050565b600061039b8261034a565b6103a58185610355565b93506103b5818560208601610366565b6103be816101c5565b840191505092915050565b600060208201905081810360008301526103e38184610390565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006104258261013d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203610457576104566103eb565b5b600182019050919050565b7f41206d6573736167653a20000000000000000000000000000000000000000000815250565b600081905092915050565b600061049e8261034a565b6104a88185610488565b93506104b8818560208601610366565b80840191505092915050565b60006104cf82610462565b600b820191506104df8284610493565b91508190509291505056fea2646970667358221220d6f949c606fe2cf1b3274ef889cd952363a9558f9f5027ee18f03fe4c4cbaee864736f6c63430008130033", + deployedBytecode: + "0x608060405234801561001057600080fd5b506004361061004c5760003560e01c80630c55699c14610051578063371303c01461006f578063ae78e06b1461008d578063c4a5693d146100ab575b600080fd5b6100596100db565b6040516100669190610156565b60405180910390f35b6100776100e1565b6040516100849190610156565b60405180910390f35b610095610103565b6040516100a2919061018c565b60405180910390f35b6100c560048036038101906100c09190610301565b610114565b6040516100d291906103c9565b60405180910390f35b60015481565b6000600160008154809291906100f69061041a565b9190505550600154905090565b60008054906101000a900460ff1681565b60608160405160200161012791906104c4565b6040516020818303038152906040529050919050565b6000819050919050565b6101508161013d565b82525050565b600060208201905061016b6000830184610147565b92915050565b60008115159050919050565b61018681610171565b82525050565b60006020820190506101a1600083018461017d565b92915050565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61020e826101c5565b810181811067ffffffffffffffff8211171561022d5761022c6101d6565b5b80604052505050565b60006102406101a7565b905061024c8282610205565b919050565b600067ffffffffffffffff82111561026c5761026b6101d6565b5b610275826101c5565b9050602081019050919050565b82818337600083830152505050565b60006102a461029f84610251565b610236565b9050828152602081018484840111156102c0576102bf6101c0565b5b6102cb848285610282565b509392505050565b600082601f8301126102e8576102e76101bb565b5b81356102f8848260208601610291565b91505092915050565b600060208284031215610317576103166101b1565b5b600082013567ffffffffffffffff811115610335576103346101b6565b5b610341848285016102d3565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015610384578082015181840152602081019050610369565b60008484015250505050565b600061039b8261034a565b6103a58185610355565b93506103b5818560208601610366565b6103be816101c5565b840191505092915050565b600060208201905081810360008301526103e38184610390565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006104258261013d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203610457576104566103eb565b5b600182019050919050565b7f41206d6573736167653a20000000000000000000000000000000000000000000815250565b600081905092915050565b600061049e8261034a565b6104a88185610488565b93506104b8818560208601610366565b80840191505092915050565b60006104cf82610462565b600b820191506104df8284610493565b91508190509291505056fea2646970667358221220d6f949c606fe2cf1b3274ef889cd952363a9558f9f5027ee18f03fe4c4cbaee864736f6c63430008130033", + linkReferences: {}, + deployedLinkReferences: {}, +} as const; diff --git a/packages/hardhat-ignition/test/test-helpers/get-balance-for.ts b/packages/hardhat-ignition/test/test-helpers/get-balance-for.ts new file mode 100644 index 00000000000..8b0caba3498 --- /dev/null +++ b/packages/hardhat-ignition/test/test-helpers/get-balance-for.ts @@ -0,0 +1,16 @@ +import { HardhatRuntimeEnvironment } from "hardhat/types"; + +/** + * Get latest balance for an address. + */ +export async function getBalanceFor( + hre: HardhatRuntimeEnvironment, + address: string +): Promise { + const balance = await hre.network.provider.send("eth_getBalance", [ + address, + "latest", + ]); + + return BigInt(balance); +} diff --git a/packages/hardhat-ignition/test/test-helpers/mine-block.ts b/packages/hardhat-ignition/test/test-helpers/mine-block.ts new file mode 100644 index 00000000000..24092427d0c --- /dev/null +++ b/packages/hardhat-ignition/test/test-helpers/mine-block.ts @@ -0,0 +1,5 @@ +import { HardhatRuntimeEnvironment } from "hardhat/types"; + +export function mineBlock(hre: HardhatRuntimeEnvironment): Promise { + return hre.network.provider.send("evm_mine"); +} diff --git a/packages/hardhat-ignition/test/test-helpers/sleep.ts b/packages/hardhat-ignition/test/test-helpers/sleep.ts new file mode 100644 index 00000000000..d95e4b68e46 --- /dev/null +++ b/packages/hardhat-ignition/test/test-helpers/sleep.ts @@ -0,0 +1,2 @@ +export const sleep = (timeout: number) => + new Promise((res) => setTimeout(res, timeout)); diff --git a/packages/hardhat-ignition/test/test-helpers/test-ignition-helper.ts b/packages/hardhat-ignition/test/test-helpers/test-ignition-helper.ts new file mode 100644 index 00000000000..36d4498e9ed --- /dev/null +++ b/packages/hardhat-ignition/test/test-helpers/test-ignition-helper.ts @@ -0,0 +1,212 @@ +import { + deploy, + DeployConfig, + DeploymentParameters, + DeploymentResultType, + EIP1193Provider, + Future, + IgnitionModule, + IgnitionModuleResult, + isContractFuture, + StrategyConfig, + SuccessfulDeploymentResult, +} from "@nomicfoundation/ignition-core"; +import { HardhatPluginError } from "hardhat/plugins"; +import { HardhatRuntimeEnvironment } from "hardhat/types"; +import { + createPublicClient, + custom, + getContract, + GetContractReturnType, +} from "viem"; +import { hardhat } from "viem/chains"; + +import { HardhatArtifactResolver } from "../../src/hardhat-artifact-resolver"; +import { errorDeploymentResultToExceptionMessage } from "../../src/utils/error-deployment-result-to-exception-message"; + +export type IgnitionModuleResultsTToViemContracts< + ContractNameT extends string, + IgnitionModuleResultsT extends IgnitionModuleResult +> = { + [contract in keyof IgnitionModuleResultsT]: TypeChainViemContractByName; +}; + +// TODO: This is a very permissive type to maintain the existing tests. +// We should work it up to the equivalent of the Viem Ignition helper. +// That implies solving how we get post compile type information for contracts. +export interface TypeChainViemContractByName { + address: string; + read: any; + write: any; +} + +export class TestIgnitionHelper { + public type = "test"; + + private _provider: EIP1193Provider; + private _deploymentDir: string | undefined; + + constructor( + private _hre: HardhatRuntimeEnvironment, + private _config?: Partial, + provider?: EIP1193Provider, + deploymentDir?: string + ) { + this._provider = provider ?? this._hre.network.provider; + this._deploymentDir = deploymentDir; + } + + public async deploy< + ModuleIdT extends string, + ContractNameT extends string, + IgnitionModuleResultsT extends IgnitionModuleResult, + StrategyT extends keyof StrategyConfig = "basic" + >( + ignitionModule: IgnitionModule< + ModuleIdT, + ContractNameT, + IgnitionModuleResultsT + >, + { + parameters = {}, + config: perDeployConfig = {}, + strategy: strategyName, + strategyConfig, + defaultSender = undefined, + }: { + parameters?: DeploymentParameters; + config?: Partial; + strategy?: StrategyT; + strategyConfig?: StrategyConfig[StrategyT]; + defaultSender?: string; + } = { + parameters: {}, + config: {}, + } + ): Promise< + IgnitionModuleResultsTToViemContracts + > { + const accounts = (await this._hre.network.provider.request({ + method: "eth_accounts", + })) as string[]; + + const artifactResolver = new HardhatArtifactResolver(this._hre); + + const resolvedConfig: Partial = { + ...this._config, + ...perDeployConfig, + }; + + const result = await deploy({ + config: resolvedConfig, + provider: this._provider, + deploymentDir: this._deploymentDir, + artifactResolver, + ignitionModule, + deploymentParameters: parameters, + accounts, + defaultSender, + strategy: strategyName, + strategyConfig, + }); + + if (result.type !== DeploymentResultType.SUCCESSFUL_DEPLOYMENT) { + const message = errorDeploymentResultToExceptionMessage(result); + + throw new HardhatPluginError("hardhat-ignition-test", message); + } + + const publicClient = createPublicClient({ + chain: hardhat, + transport: custom(this._hre.network.provider), + }); + + return this._toViemContracts( + this._hre, + ignitionModule, + result, + publicClient + ); + } + + private async _toViemContracts< + ModuleIdT extends string, + ContractNameT extends string, + IgnitionModuleResultsT extends IgnitionModuleResult + >( + hre: HardhatRuntimeEnvironment, + ignitionModule: IgnitionModule< + ModuleIdT, + ContractNameT, + IgnitionModuleResultsT + >, + result: SuccessfulDeploymentResult, + publicClient: any + ): Promise< + IgnitionModuleResultsTToViemContracts + > { + return Object.fromEntries( + await Promise.all( + Object.entries(ignitionModule.results).map( + async ([name, contractFuture]) => [ + name, + await this._getContract( + hre, + contractFuture, + result.contracts[contractFuture.id], + publicClient + ), + ] + ) + ) + ); + } + + private async _getContract( + hre: HardhatRuntimeEnvironment, + future: Future, + deployedContract: { address: string; contractName: string }, + publicClient: any + ): Promise { + if (!isContractFuture(future)) { + throw new HardhatPluginError( + "hardhat-ignition-viem", + `Expected contract future but got ${future.id} with type ${future.type} instead` + ); + } + + const contract: any = getContract({ + address: this._ensureAddressFormat(deployedContract.address), + abi: await this._loadAbiFromHHArtifactFolder( + hre, + deployedContract.contractName + ), + client: { public: publicClient }, + }); + + return contract; + } + + private _ensureAddressFormat(address: string): `0x${string}` { + if (!address.startsWith("0x")) { + return `0x${address}`; + } + + return `0x${address.slice(2)}`; + } + + private async _loadAbiFromHHArtifactFolder( + hre: HardhatRuntimeEnvironment, + contractName: string + ): Promise { + const artifact = await hre.artifacts.readArtifact(contractName); + + if (artifact === undefined) { + throw new Error( + `Test error: no hardcoded abi for contract ${contractName}` + ); + } + + return artifact.abi; + } +} diff --git a/packages/hardhat-ignition/test/test-helpers/type-helper.ts b/packages/hardhat-ignition/test/test-helpers/type-helper.ts new file mode 100644 index 00000000000..4d858925468 --- /dev/null +++ b/packages/hardhat-ignition/test/test-helpers/type-helper.ts @@ -0,0 +1,29 @@ +/** + * Given an object generate the type that is an array of the strings + * of the objects properties. + * + * @example + * type ExpectedConfigOptions = keyListOf + * Where ExpectedConfigOptions is the type level tuple: + * ``` + * [ + * "blockPollingInterval", + * "maxFeeBumps", + * "requiredConfirmations", + * "timeBeforeBumpingFees" + * ] + * ``` + */ +export type KeyListOf = ConvertObjectToTypeArray< + ConvertUnionToObject> +>; + +type ConvertUnionToObject = { + [key in U]: ConvertUnionToObject>; +}; + +type ConvertObjectToTypeArray = {} extends O + ? [] + : { + [key in keyof O]: [key, ...ConvertObjectToTypeArray]; + }[keyof O]; diff --git a/packages/hardhat-ignition/test/test-helpers/use-ignition-project.ts b/packages/hardhat-ignition/test/test-helpers/use-ignition-project.ts new file mode 100644 index 00000000000..7f2bbceb96b --- /dev/null +++ b/packages/hardhat-ignition/test/test-helpers/use-ignition-project.ts @@ -0,0 +1,224 @@ +import { DeployConfig, IgnitionModule } from "@nomicfoundation/ignition-core"; +import { ensureDirSync, removeSync } from "fs-extra"; +import { resetHardhatContext } from "hardhat/plugins-testing"; +import { HardhatRuntimeEnvironment } from "hardhat/types"; +import path from "path"; + +import { clearPendingTransactionsFromMemoryPool } from "./clear-pending-transactions-from-memory-pool"; +import { TestIgnitionHelper } from "./test-ignition-helper"; +import { waitForPendingTxs } from "./wait-for-pending-txs"; + +declare module "mocha" { + interface Context { + hre: HardhatRuntimeEnvironment & { ignition: TestIgnitionHelper }; + deploymentDir: string | undefined; + runControlledDeploy: ( + ignitionModule: IgnitionModule, + chainUpdates: (c: TestChainHelper) => Promise + ) => ReturnType; + config: Partial; + } +} + +const defaultTestConfig: DeployConfig = { + maxFeeBumps: 5, + timeBeforeBumpingFees: 3 * 60 * 1000, + blockPollingInterval: 200, + requiredConfirmations: 1, + disableFeeBumping: false, +}; + +export function useEphemeralIgnitionProject(fixtureProjectName: string) { + beforeEach("Load environment", async function () { + process.chdir( + path.join(__dirname, "../fixture-projects", fixtureProjectName) + ); + + const hre = require("hardhat"); + + await hre.network.provider.send("evm_setAutomine", [true]); + await hre.run("compile", { quiet: true }); + + this.hre = hre; + (this.hre as any).originalIgnition = this.hre.ignition; + this.hre.ignition = new TestIgnitionHelper(hre); + this.deploymentDir = undefined; + }); + + afterEach("reset hardhat context", function () { + resetHardhatContext(); + }); +} + +export function useFileIgnitionProject( + fixtureProjectName: string, + deploymentId: string, + config?: Partial +) { + beforeEach("Load environment", async function () { + process.chdir( + path.join(__dirname, "../fixture-projects", fixtureProjectName) + ); + + const hre = require("hardhat"); + + const deploymentDir = path.join( + path.resolve( + __dirname, + `../fixture-projects/${fixtureProjectName}/ignition` + ), + "deployments", + deploymentId + ); + + this.hre = hre; + this.hre.ignition = new TestIgnitionHelper(hre); + this.deploymentDir = deploymentDir; + + await hre.run("compile", { quiet: true }); + + const testConfig: Partial = { + ...defaultTestConfig, + ...config, + }; + + this.config = testConfig; + + ensureDirSync(deploymentDir); + + this.runControlledDeploy = ( + ignitionModule: IgnitionModule, + chainUpdates: (c: TestChainHelper) => Promise = async () => {} + ) => { + return runDeploy( + deploymentDir, + ignitionModule, + { hre, config: testConfig }, + chainUpdates + ); + }; + }); + + afterEach("reset hardhat context", function () { + resetHardhatContext(); + + if (this.deploymentDir === undefined) { + throw new Error( + "Deployment dir not set during cleanup of file based project" + ); + } + + removeSync(this.deploymentDir); + }); +} + +async function runDeploy( + deploymentDir: string, + ignitionModule: IgnitionModule, + { + hre, + config = {}, + }: { hre: HardhatRuntimeEnvironment; config?: Partial }, + chainUpdates: (c: TestChainHelper) => Promise = async () => {} +): Promise> { + const { ignitionHelper: ignitionHelper, kill: killFn } = + setupIgnitionHelperRiggedToThrow(hre, deploymentDir, config); + + try { + const deployPromise = ignitionHelper.deploy(ignitionModule, { + config, + }); + + const chainHelper = new TestChainHelper(hre, deployPromise, killFn); + + const [result] = await Promise.all([ + deployPromise, + chainUpdates(chainHelper), + ]); + + return result; + } catch (error) { + if (error instanceof Error && error.message === "Killing deploy process") { + return {}; + } + + throw error; + } +} + +function setupIgnitionHelperRiggedToThrow( + hre: HardhatRuntimeEnvironment, + deploymentDir: string, + config: Partial = {} +): { + ignitionHelper: TestIgnitionHelper; + kill: () => void; +} { + let trigger: boolean = false; + + const kill = () => { + trigger = true; + }; + + const proxiedProvider = new Proxy(hre.network.provider, { + get(target: any, key) { + if (trigger) { + trigger = false; + throw new Error("Killing deploy process"); + } + + return target[key]; + }, + }); + + const ignitionHelper = new TestIgnitionHelper( + hre, + config, + proxiedProvider, + deploymentDir + ); + + return { ignitionHelper, kill }; +} + +export class TestChainHelper { + constructor( + private _hre: HardhatRuntimeEnvironment, + private _deployPromise: Promise, + private _exitFn: () => void + ) {} + + public async waitForPendingTxs(expectedCount: number) { + await waitForPendingTxs(this._hre, expectedCount, this._deployPromise); + } + + /** + * Mine the next block, optionally waiting for pending transactions to + * build up before mining. + * + * @param pendingTxToAwait - the number of pending tx that should be in + * the block before mining + */ + public async mineBlock(pendingTxToAwait: number = 0) { + if (pendingTxToAwait > 0) { + await waitForPendingTxs(this._hre, pendingTxToAwait, this._deployPromise); + } + + return this._hre.network.provider.send("evm_mine"); + } + + public async clearMempool(pendingTxToAwait: number = 0) { + if (pendingTxToAwait > 0) { + await waitForPendingTxs(this._hre, pendingTxToAwait, this._deployPromise); + } + + return clearPendingTransactionsFromMemoryPool(this._hre); + } + + /** + * Exit from the deploy on the next block tick. + */ + public exitDeploy() { + this._exitFn(); + } +} diff --git a/packages/hardhat-ignition/test/test-helpers/wait-for-pending-txs.ts b/packages/hardhat-ignition/test/test-helpers/wait-for-pending-txs.ts new file mode 100644 index 00000000000..eb3f91ffc3d --- /dev/null +++ b/packages/hardhat-ignition/test/test-helpers/wait-for-pending-txs.ts @@ -0,0 +1,32 @@ +const sleep = (timeout: number) => + new Promise((res) => setTimeout(res, timeout)); + +/** + * Wait until there are at least `expectedCount` transactions in the mempool + */ +export async function waitForPendingTxs( + hre: any, + expectedCount: number, + finished: Promise +) { + let stopWaiting = false; + finished.finally(() => { + stopWaiting = true; + }); + + while (true) { + if (stopWaiting) { + return; + } + const pendingBlock = await hre.network.provider.send( + "eth_getBlockByNumber", + ["pending", false] + ); + + if (pendingBlock.transactions.length >= expectedCount) { + return; + } + + await sleep(50); + } +} diff --git a/packages/hardhat-ignition/test/ui/helpers/calculate-batch-display.ts b/packages/hardhat-ignition/test/ui/helpers/calculate-batch-display.ts new file mode 100644 index 00000000000..64559c32429 --- /dev/null +++ b/packages/hardhat-ignition/test/ui/helpers/calculate-batch-display.ts @@ -0,0 +1,228 @@ +import { assert } from "chai"; + +import { calculateBatchDisplay } from "../../../src/ui/helpers/calculate-batch-display"; +import { + UiFuture, + UiFutureStatusType, + UiState, + UiStateDeploymentStatus, +} from "../../../src/ui/types"; + +import { testFormat } from "./test-format"; + +const exampleState: UiState = { + status: UiStateDeploymentStatus.DEPLOYING, + chainId: 31337, + moduleName: "ExampleModule", + deploymentDir: "/users/example", + batches: [], + currentBatch: 1, + result: null, + warnings: [], + isResumed: false, + maxFeeBumps: 0, + disableFeeBumping: false, + gasBumps: {}, + strategy: null, + ledger: false, + ledgerMessage: "", + ledgerMessageIsDisplayed: false, +}; + +describe("ui - calculate batch display", () => { + it("should render a batch with a single running future", () => { + const expectedText = testFormat(` + Batch #1 + Executing ExampleModule#Token... + `); + + assertBatchText( + [ + { + status: { + type: UiFutureStatusType.UNSTARTED, + }, + futureId: "ExampleModule#Token", + }, + ], + 3, + expectedText + ); + }); + + it("should render a batch with a single completed future", () => { + const expectedText = testFormat(` + Batch #1 + Executed ExampleModule#Token + `); + + assertBatchText( + [ + { + status: { + type: UiFutureStatusType.SUCCESS, + }, + futureId: "ExampleModule#Token", + }, + ], + 3, + expectedText + ); + }); + + it("should render a batch with a single failed future", () => { + const expectedText = testFormat(` + Batch #1 + Failed ExampleModule#Token + `); + + assertBatchText( + [ + { + status: { + type: UiFutureStatusType.ERRORED, + message: "The transaction reverted", + }, + futureId: "ExampleModule#Token", + }, + ], + 3, + expectedText + ); + }); + + it("should render a batch with a single timed out future", () => { + const expectedText = testFormat(` + Batch #1 + Timed out ExampleModule#Token + `); + + assertBatchText( + [ + { + status: { + type: UiFutureStatusType.TIMEDOUT, + }, + futureId: "ExampleModule#Token", + }, + ], + 3, + expectedText + ); + }); + + it("should render a batch with a single held future", () => { + const expectedText = testFormat(` + Batch #1 + Held ExampleModule#Token + `); + + assertBatchText( + [ + { + status: { + type: UiFutureStatusType.HELD, + heldId: 1, + reason: "Waiting for multisig signoff", + }, + futureId: "ExampleModule#Token", + }, + ], + 3, + expectedText + ); + }); + + it("should render a complex batch in multiple states", () => { + const expectedText = testFormat(` + Batch #1 + Failed ExampleModule#Dex + Held ExampleModule#ENS + Timed out ExampleModule#Registry + Executed ExampleModule#Router + Executing ExampleModule#Token... + `); + + assertBatchText( + [ + { + status: { + type: UiFutureStatusType.UNSTARTED, + }, + futureId: "ExampleModule#Token", + }, + { + status: { + type: UiFutureStatusType.ERRORED, + message: "The transaction reverted", + }, + futureId: "ExampleModule#Dex", + }, + { + status: { + type: UiFutureStatusType.SUCCESS, + }, + futureId: "ExampleModule#Router", + }, + { + status: { + type: UiFutureStatusType.TIMEDOUT, + }, + futureId: "ExampleModule#Registry", + }, + { + status: { + type: UiFutureStatusType.HELD, + heldId: 1, + reason: "Waiting for multisig signoff", + }, + futureId: "ExampleModule#ENS", + }, + ], + 7, + expectedText + ); + }); + + it("should render a batch when using a ledger device", () => { + const expectedText = testFormat(` + Batch #1 + Executing ExampleModule#Token... + + Ledger: Waiting for confirmation on device + `); + + assertBatchText( + [ + { + status: { + type: UiFutureStatusType.UNSTARTED, + }, + futureId: "ExampleModule#Token", + }, + ], + 3, + expectedText, + { + ledger: true, + ledgerMessage: "Waiting for confirmation on device", + } + ); + }); +}); + +function assertBatchText( + batch: UiFuture[], + expectedHeight: number, + expectedText: string, + extraState?: Partial +) { + const { text: actualText, height } = calculateBatchDisplay({ + ...exampleState, + batches: [batch], + ...extraState, + }); + + assert.equal(height, expectedHeight); + assert.equal(actualText, expectedText); +} diff --git a/packages/hardhat-ignition/test/ui/helpers/calculate-deploying-module-panel-display.ts b/packages/hardhat-ignition/test/ui/helpers/calculate-deploying-module-panel-display.ts new file mode 100644 index 00000000000..3fbbc7adbb6 --- /dev/null +++ b/packages/hardhat-ignition/test/ui/helpers/calculate-deploying-module-panel-display.ts @@ -0,0 +1,119 @@ +import { assert } from "chai"; +import chalk from "chalk"; +import path from "path"; + +import { calculateDeployingModulePanel } from "../../../src/ui/helpers/calculate-deploying-module-panel"; +import { UiState, UiStateDeploymentStatus } from "../../../src/ui/types"; + +import { testFormat } from "./test-format"; + +describe("ui - calculate starting message display", () => { + const exampleState: UiState = { + status: UiStateDeploymentStatus.UNSTARTED, + chainId: 31337, + moduleName: "ExampleModule", + deploymentDir: "/users/example", + batches: [], + currentBatch: 0, + result: null, + warnings: [], + isResumed: null, + maxFeeBumps: 0, + disableFeeBumping: false, + gasBumps: {}, + strategy: "basic", + ledger: false, + ledgerMessage: "", + ledgerMessageIsDisplayed: false, + }; + + it("should display the deploying module message", () => { + const expectedText = testFormat(` + Hardhat Ignition 🚀 + + ${chalk.bold(`Deploying [ ExampleModule ]`)} + `); + + const actualText = calculateDeployingModulePanel(exampleState); + + assert.equal(actualText, expectedText); + }); + + it("should include the strategy if it is something other than basic", () => { + const expectedText = testFormat(` + Hardhat Ignition 🚀 + + ${chalk.bold(`Deploying [ ExampleModule ] with strategy create2`)} + `); + + const actualText = calculateDeployingModulePanel({ + ...exampleState, + strategy: "create2", + }); + + assert.equal(actualText, expectedText); + }); + + it("should display reconciliation warnings", () => { + const expectedText = testFormat(` + Hardhat Ignition 🚀 + + ${chalk.bold(`Deploying [ ExampleModule ]`)} + + ${chalk.yellow( + "Warning - previously executed futures are not in the module:" + )} + ${chalk.yellow(" - MyModule#Contract1")} + ${chalk.yellow(" - MyModule#Contract1.call1")} + ${chalk.yellow(" - MyModule#Contract2")} + `); + + const actualText = calculateDeployingModulePanel({ + ...exampleState, + warnings: [ + "MyModule#Contract1", + "MyModule#Contract1.call1", + "MyModule#Contract2", + ], + }); + + assert.equal(actualText, expectedText); + }); + + it("should display a message when the deployment is being resumed and the path is not in the CWD", () => { + const expectedText = testFormat(` + Hardhat Ignition 🚀 + + ${chalk.bold(`Resuming existing deployment from /users/example`)} + + ${chalk.bold(`Deploying [ ExampleModule ]`)} + `); + + const actualText = calculateDeployingModulePanel({ + ...exampleState, + isResumed: true, + }); + + assert.equal(actualText, expectedText); + }); + + it("should display a message when the deployment is being resumed and the path is not in the CWD", () => { + const expectedText = testFormat(` + Hardhat Ignition 🚀 + + ${chalk.bold( + `Resuming existing deployment from .${path.sep}ignition${path.sep}deployments${path.sep}foo` + )} + + ${chalk.bold(`Deploying [ ExampleModule ]`)} + `); + + const actualText = calculateDeployingModulePanel({ + ...exampleState, + isResumed: true, + deploymentDir: `${process.cwd()}/ignition/deployments/foo`, + }); + + assert.equal(actualText, expectedText); + }); +}); diff --git a/packages/hardhat-ignition/test/ui/helpers/calculate-deployment-complete-display.ts b/packages/hardhat-ignition/test/ui/helpers/calculate-deployment-complete-display.ts new file mode 100644 index 00000000000..5e59cc92a55 --- /dev/null +++ b/packages/hardhat-ignition/test/ui/helpers/calculate-deployment-complete-display.ts @@ -0,0 +1,317 @@ +import { + DeploymentCompleteEvent, + DeploymentResultType, + ExecutionErrorDeploymentResult, + ExecutionEventType, + PreviousRunErrorDeploymentResult, + ReconciliationErrorDeploymentResult, + ValidationErrorDeploymentResult, +} from "@nomicfoundation/ignition-core"; +import { assert } from "chai"; +import chalk from "chalk"; + +import { calculateDeploymentCompleteDisplay } from "../../../src/ui/helpers/calculate-deployment-complete-display"; +import { UiBatches, UiFutureStatusType } from "../../../src/ui/types"; + +import { testFormat } from "./test-format"; + +describe("ui - calculate deployment complete display", () => { + const exampleAddress = "0x1F98431c8aD98523631AE4a59f267346ea31F984"; + const differentAddress = "0x0011223344556677889900112233445566778899"; + + const exampleMultipleBatches: UiBatches = [ + [ + { + status: { + type: UiFutureStatusType.SUCCESS, + result: "0x0", + }, + futureId: "MyModule#MyContract1", + }, + ], + ]; + + const exampleNoBatches: UiBatches = []; + + describe("successful deployment", () => { + it("should render a sucessful deployment", () => { + const expectedText = testFormat(` + [ MyModule ] successfully deployed 🚀 + + ${chalk.bold("Deployed Addresses")} + + MyModule#Token - 0x1F98431c8aD98523631AE4a59f267346ea31F984 + MyModule#AnotherToken - 0x0011223344556677889900112233445566778899`); + + const event: DeploymentCompleteEvent = { + type: ExecutionEventType.DEPLOYMENT_COMPLETE, + result: { + type: DeploymentResultType.SUCCESSFUL_DEPLOYMENT, + contracts: { + "MyModule#Token": { + id: "MyModule#Token", + address: exampleAddress, + contractName: "Token", + }, + "MyModule#AnotherToken": { + id: "MyModule#AnotherToken", + address: differentAddress, + contractName: "AnotherToken", + }, + }, + }, + }; + + const actualText = calculateDeploymentCompleteDisplay(event, { + moduleName: "MyModule", + isResumed: false, + batches: exampleMultipleBatches, + deploymentDir: "", + }); + + assert.equal(actualText, expectedText); + }); + + it("should render a sucessful deployment with no contracts", () => { + const expectedText = testFormat(` + [ MyModule ] successfully deployed 🚀 + + ${chalk.bold("Deployed Addresses")} + + ${chalk.italic("No contracts were deployed")}`); + + const event: DeploymentCompleteEvent = { + type: ExecutionEventType.DEPLOYMENT_COMPLETE, + result: { + type: DeploymentResultType.SUCCESSFUL_DEPLOYMENT, + contracts: {}, + }, + }; + + const actualText = calculateDeploymentCompleteDisplay(event, { + moduleName: "MyModule", + isResumed: false, + batches: exampleMultipleBatches, + deploymentDir: "", + }); + + assert.equal(actualText, expectedText); + }); + + it("should render a resumed deployment with no new deployments", () => { + const expectedText = testFormat(` + [ MyModule ] Nothing new to deploy based on previous execution stored in test + + ${chalk.bold("Deployed Addresses")} + + ${chalk.italic("No contracts were deployed")}`); + + const event: DeploymentCompleteEvent = { + type: ExecutionEventType.DEPLOYMENT_COMPLETE, + result: { + type: DeploymentResultType.SUCCESSFUL_DEPLOYMENT, + contracts: {}, + }, + }; + + const actualText = calculateDeploymentCompleteDisplay(event, { + moduleName: "MyModule", + isResumed: true, + batches: exampleNoBatches, + deploymentDir: "test", + }); + + assert.equal(actualText, expectedText); + }); + }); + + describe("validation failures", () => { + it("should render multiple validation errors on multiple futures", () => { + const expectedText = testFormat(` + [ MyModule ] validation failed ⛔ + + The module contains futures that would fail to execute: + + MyModule#MyContract: + - The number of params does not match the constructor + - The name of the contract is invalid + + MyModule#AnotherContract: + - No library provided + + Update the invalid futures and rerun the deployment.`); + + const result: ValidationErrorDeploymentResult = { + type: DeploymentResultType.VALIDATION_ERROR, + errors: { + "MyModule#MyContract": [ + "The number of params does not match the constructor", + "The name of the contract is invalid", + ], + "MyModule#AnotherContract": ["No library provided"], + }, + }; + + const event: DeploymentCompleteEvent = { + type: ExecutionEventType.DEPLOYMENT_COMPLETE, + result, + }; + + const actualText = calculateDeploymentCompleteDisplay(event, { + moduleName: "MyModule", + isResumed: false, + batches: exampleMultipleBatches, + deploymentDir: "", + }); + + assert.equal(actualText, expectedText); + }); + }); + + describe("reconciliation errors", () => { + it("should render a multiple reconciliation errors on multiple futures", () => { + const expectedText = testFormat(` + [ MyModule ] reconciliation failed ⛔ + + The module contains changes to executed futures: + + MyModule#MyContract: + - The params don't match + - The value doesn't match + + MyModule#AnotherContract: + - The artifact bytecode has changed + + Consider modifying your module to remove the inconsistencies with deployed futures.`); + + const result: ReconciliationErrorDeploymentResult = { + type: DeploymentResultType.RECONCILIATION_ERROR, + errors: { + "MyModule#MyContract": [ + "The params don't match", + "The value doesn't match", + ], + "MyModule#AnotherContract": ["The artifact bytecode has changed"], + }, + }; + + const event: DeploymentCompleteEvent = { + type: ExecutionEventType.DEPLOYMENT_COMPLETE, + result, + }; + + const actualText = calculateDeploymentCompleteDisplay(event, { + moduleName: "MyModule", + isResumed: false, + batches: exampleMultipleBatches, + deploymentDir: "", + }); + + assert.equal(actualText, expectedText); + }); + }); + + describe("previous run errors", () => { + it("should render a multiple previous run errors on multiple futures", () => { + const expectedText = testFormat(` + [ MyModule ] deployment cancelled ⛔ + + These futures failed or timed out on a previous run: + - MyModule#MyContract + - MyModule#AnotherContract + + Use the ${chalk.italic("wipe")} task to reset them.`); + + const result: PreviousRunErrorDeploymentResult = { + type: DeploymentResultType.PREVIOUS_RUN_ERROR, + errors: { + "MyModule#MyContract": ["The previous run failed"], + "MyModule#AnotherContract": ["The previous run timed out"], + }, + }; + + const event: DeploymentCompleteEvent = { + type: ExecutionEventType.DEPLOYMENT_COMPLETE, + result, + }; + + const actualText = calculateDeploymentCompleteDisplay(event, { + moduleName: "MyModule", + isResumed: false, + batches: exampleMultipleBatches, + deploymentDir: "", + }); + + assert.equal(actualText, expectedText); + }); + }); + + describe("execution errors", () => { + it("should render an execution failure with multiple of each problem type", () => { + const expectedText = testFormat(` + [ MyModule ] failed ⛔ + + Futures timed out with transactions unconfirmed after maximum fee bumps: + - MyModule#MyContract1 + - MyModule#AnotherContract1 + + Futures failed during execution: + - MyModule#MyContract3: Reverted with reason x + - MyModule#AnotherContract3: Reverted with reason y + + To learn how to handle these errors: https://hardhat.org/ignition-errors + + Held: + - MyModule#MyContract2: Vote is not complete + - MyModule#AnotherContract2: Server timed out`); + + const result: ExecutionErrorDeploymentResult = { + type: DeploymentResultType.EXECUTION_ERROR, + started: [], + timedOut: [ + { futureId: "MyModule#MyContract1", networkInteractionId: 1 }, + { futureId: "MyModule#AnotherContract1", networkInteractionId: 3 }, + ], + held: [ + { + futureId: "MyModule#MyContract2", + heldId: 1, + reason: "Vote is not complete", + }, + { + futureId: "MyModule#AnotherContract2", + heldId: 3, + reason: "Server timed out", + }, + ], + failed: [ + { + futureId: "MyModule#MyContract3", + networkInteractionId: 1, + error: "Reverted with reason x", + }, + { + futureId: "MyModule#AnotherContract3", + networkInteractionId: 3, + error: "Reverted with reason y", + }, + ], + successful: [], + }; + + const event: DeploymentCompleteEvent = { + type: ExecutionEventType.DEPLOYMENT_COMPLETE, + result, + }; + + const actualText = calculateDeploymentCompleteDisplay(event, { + moduleName: "MyModule", + isResumed: false, + batches: exampleMultipleBatches, + deploymentDir: "", + }); + + assert.equal(actualText, expectedText); + }); + }); +}); diff --git a/packages/hardhat-ignition/test/ui/helpers/calculate-deployment-status-display.ts b/packages/hardhat-ignition/test/ui/helpers/calculate-deployment-status-display.ts new file mode 100644 index 00000000000..b4f5e3dae16 --- /dev/null +++ b/packages/hardhat-ignition/test/ui/helpers/calculate-deployment-status-display.ts @@ -0,0 +1,184 @@ +import { StatusResult } from "@nomicfoundation/ignition-core"; +import { assert } from "chai"; +import chalk from "chalk"; + +import { calculateDeploymentStatusDisplay } from "../../../src/ui/helpers/calculate-deployment-status-display"; + +import { testFormat } from "./test-format"; + +describe("ui - calculate deployment status display", () => { + const exampleAddress = "0x1F98431c8aD98523631AE4a59f267346ea31F984"; + const differentAddress = "0x0011223344556677889900112233445566778899"; + + const exampleStatusResult = { + chainId: 1, + started: [], + timedOut: [], + held: [], + failed: [], + successful: [], + contracts: {}, + }; + + describe("successful deployment", () => { + it("should render a sucessful deployment", () => { + const expectedText = testFormat(` + Deployment deployment-01 (chainId: 1) was successful + + ${chalk.bold("Deployed Addresses")} + + MyModule#Token - 0x1F98431c8aD98523631AE4a59f267346ea31F984 + MyModule#AnotherToken - 0x0011223344556677889900112233445566778899`); + + const statusResult: StatusResult = { + ...exampleStatusResult, + successful: ["MyModule#Token", "MyModule#AnotherToken"], + contracts: { + "MyModule#Token": { + id: "MyModule#Token", + address: exampleAddress, + contractName: "Token", + sourceName: "contracts/Token.sol", + abi: [], + }, + "MyModule#AnotherToken": { + id: "MyModule#AnotherToken", + address: differentAddress, + contractName: "AnotherToken", + sourceName: "contracts/AnotherToken.sol", + abi: [], + }, + }, + }; + + const actualText = calculateDeploymentStatusDisplay( + "deployment-01", + statusResult + ); + + assert.equal(actualText, expectedText); + }); + + it("should render a sucessful deployment with no deploys", () => { + const expectedText = testFormat(` + Deployment deployment-01 (chainId: 1) was successful + + ${chalk.italic("No contracts were deployed")}`); + + const statusResult: StatusResult = { + ...exampleStatusResult, + successful: ["MyModule#a_call"], + contracts: {}, + }; + + const actualText = calculateDeploymentStatusDisplay( + "deployment-01", + statusResult + ); + + assert.equal(actualText, expectedText); + }); + }); + + describe("failed deployment", () => { + it("should render an execution failure with multiple of each problem type", () => { + const expectedText = testFormat(` + Deployment deployment-01 (chainId: 1) failed + + Futures timed out with transactions unconfirmed after maximum fee bumps: + - MyModule:MyContract1 + - MyModule:AnotherContract1 + + Futures failed during execution: + - MyModule:MyContract3: Reverted with reason x + - MyModule:AnotherContract3: Reverted with reason y + + To learn how to handle these errors: https://hardhat.org/ignition-errors + + Futures where held by the strategy: + - MyModule:MyContract2: Vote is not complete + - MyModule:AnotherContract2: Server timed out`); + + const statusResult: StatusResult = { + chainId: 1, + started: [], + timedOut: [ + { futureId: "MyModule:MyContract1", networkInteractionId: 1 }, + { futureId: "MyModule:AnotherContract1", networkInteractionId: 3 }, + ], + held: [ + { + futureId: "MyModule:MyContract2", + heldId: 1, + reason: "Vote is not complete", + }, + { + futureId: "MyModule:AnotherContract2", + heldId: 3, + reason: "Server timed out", + }, + ], + failed: [ + { + futureId: "MyModule:MyContract3", + networkInteractionId: 1, + error: "Reverted with reason x", + }, + { + futureId: "MyModule:AnotherContract3", + networkInteractionId: 3, + error: "Reverted with reason y", + }, + ], + successful: ["MyModule#Token", "MyModule#AnotherToken"], + contracts: { + "MyModule#Token": { + id: "MyModule#Token", + address: exampleAddress, + contractName: "Token", + sourceName: "contracts/Token.sol", + abi: [], + }, + "MyModule#AnotherToken": { + id: "MyModule#AnotherToken", + address: differentAddress, + contractName: "AnotherToken", + sourceName: "contracts/AnotherToken.sol", + abi: [], + }, + }, + }; + + const actualText = calculateDeploymentStatusDisplay( + "deployment-01", + statusResult + ); + + assert.equal(actualText, expectedText); + }); + }); + + describe("deployment with started but unfinished futures (e.g. simulation errors)", () => { + it("should render a sucessful deployment", () => { + const expectedText = testFormat(` + Deployment deployment-01 (chainId: 1) has futures that have started but not completed + + - MyModule#Token + - MyModule#AnotherToken + + Please rerun your deployment.`); + + const statusResult: StatusResult = { + ...exampleStatusResult, + started: ["MyModule#Token", "MyModule#AnotherToken"], + }; + + const actualText = calculateDeploymentStatusDisplay( + "deployment-01", + statusResult + ); + + assert.equal(actualText, expectedText); + }); + }); +}); diff --git a/packages/hardhat-ignition/test/ui/helpers/calculate-list-transactions-display.ts b/packages/hardhat-ignition/test/ui/helpers/calculate-list-transactions-display.ts new file mode 100644 index 00000000000..d1c950e9547 --- /dev/null +++ b/packages/hardhat-ignition/test/ui/helpers/calculate-list-transactions-display.ts @@ -0,0 +1,77 @@ +import { TransactionStatus } from "@nomicfoundation/ignition-core"; +import { assert } from "chai"; + +import { calculateListTransactionsDisplay } from "../../../src/ui/helpers/calculate-list-transactions-display"; + +describe("calculateListTransactionsDisplay", function () { + it("should serialize a bigint in transaction params", () => { + const result = calculateListTransactionsDisplay("1", [ + { + status: TransactionStatus.SUCCESS, + type: "DEPLOYMENT_EXECUTION_STATE", + txHash: + "0x65c7c0850d014fe44aced2249b3b3523c3a29e5e40b6388b6d84b28c0345b9e1", + from: "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266", + name: "BasicContract", + address: "0x74e720c9B362ae3A65fF356ad62866511486BBBc", + params: [BigInt(42)], + value: BigInt(10), + }, + ]); + + const expected = `Logging transactions for deployment 1 + +Transaction 1: + - Type: Contract Deployment + - Status: SUCCESS + - TxHash: 0x65c7c0850d014fe44aced2249b3b3523c3a29e5e40b6388b6d84b28c0345b9e1 + - From: 0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266 + - Name: BasicContract + - Address: 0x74e720c9B362ae3A65fF356ad62866511486BBBc + - Params: ['42n'] + - Value: '10n' + +`; + + assert.equal(result, expected); + }); + + it("should serialize bigints in nested transaction params", () => { + const result = calculateListTransactionsDisplay("1", [ + { + status: TransactionStatus.SUCCESS, + type: "DEPLOYMENT_EXECUTION_STATE", + txHash: + "0x65c7c0850d014fe44aced2249b3b3523c3a29e5e40b6388b6d84b28c0345b9e1", + from: "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266", + name: "BasicContract", + address: "0x74e720c9B362ae3A65fF356ad62866511486BBBc", + params: [ + 1, + 2, + "A", + "B", + [BigInt(42), BigInt(43)], + { sub: { a: BigInt(44) } }, + ], + value: BigInt(10), + }, + ]); + + const expected = `Logging transactions for deployment 1 + +Transaction 1: + - Type: Contract Deployment + - Status: SUCCESS + - TxHash: 0x65c7c0850d014fe44aced2249b3b3523c3a29e5e40b6388b6d84b28c0345b9e1 + - From: 0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266 + - Name: BasicContract + - Address: 0x74e720c9B362ae3A65fF356ad62866511486BBBc + - Params: [1,2,'A','B',['42n','43n'],{sub:{a:'44n'}}] + - Value: '10n' + +`; + + assert.equal(result, expected); + }); +}); diff --git a/packages/hardhat-ignition/test/ui/helpers/calculate-starting-message.ts b/packages/hardhat-ignition/test/ui/helpers/calculate-starting-message.ts new file mode 100644 index 00000000000..1eb12ba1447 --- /dev/null +++ b/packages/hardhat-ignition/test/ui/helpers/calculate-starting-message.ts @@ -0,0 +1,34 @@ +import { assert } from "chai"; +import chalk from "chalk"; + +import { calculateStartingMessage } from "../../../src/ui/helpers/calculate-starting-message"; + +describe("ui - calculate starting message display", () => { + it("should display the starting message", () => { + const expectedText = `Hardhat Ignition starting for [ MyModule ]...`; + + const actualText = calculateStartingMessage({ + moduleName: "MyModule", + deploymentDir: "/users/example", + }); + + assert.equal(actualText, expectedText); + }); + + it("should display the warning for an ephemeral network", () => { + const warningMessage = `You are running Hardhat Ignition against an in-process instance of Hardhat Network. +This will execute the deployment, but the results will be lost. +You can use --network to deploy to a different network.`; + + const expectedText = `${chalk.yellow( + chalk.bold(warningMessage) + )}\n\nHardhat Ignition starting for [ MyModule ]...`; + + const actualText = calculateStartingMessage({ + moduleName: "MyModule", + deploymentDir: undefined, + }); + + assert.equal(actualText, expectedText); + }); +}); diff --git a/packages/hardhat-ignition/test/ui/helpers/test-format.ts b/packages/hardhat-ignition/test/ui/helpers/test-format.ts new file mode 100644 index 00000000000..6bc238a42f6 --- /dev/null +++ b/packages/hardhat-ignition/test/ui/helpers/test-format.ts @@ -0,0 +1,18 @@ +/** + * Formats a multiline string to make appear closer to the command line + * when inside a test file. The first line is ignored, and the whitespace + * at the start of the line is removed. + */ +export function testFormat(expected: string): string { + const lines = expected + .toString() + .substring(1) // Remove the first newline + .split("\n"); + + // calcualte the length of the whitespace prefix based on the first line + const whitespacePrefixLength = lines[0].search(/\S/); + + return lines + .map((line) => line.substring(whitespacePrefixLength)) // strip prefix whitespace + .join("\n"); +} diff --git a/packages/hardhat-ignition/test/ui/pretty-event-handler.ts b/packages/hardhat-ignition/test/ui/pretty-event-handler.ts new file mode 100644 index 00000000000..b3274d1a288 --- /dev/null +++ b/packages/hardhat-ignition/test/ui/pretty-event-handler.ts @@ -0,0 +1,72 @@ +import { assert } from "chai"; + +import { PrettyEventHandler } from "../../src/ui/pretty-event-handler"; + +describe("ui - pretty event handler", () => { + describe("ledger", () => { + it("should set a message on connection start", () => { + const eventHandler = new PrettyEventHandler(undefined, true); + + eventHandler.ledgerConnectionStart(); + + assert.equal(eventHandler.state.ledgerMessage, "Connecting wallet"); + assert.isTrue(eventHandler.state.ledger); + assert.isTrue(eventHandler.state.ledgerMessageIsDisplayed); + }); + + it("should set a message on connection success", () => { + const eventHandler = new PrettyEventHandler(undefined, true); + + eventHandler.ledgerConnectionSuccess(); + + assert.equal(eventHandler.state.ledgerMessage, "Wallet connected"); + }); + + it("should set a message on connection failure", () => { + const eventHandler = new PrettyEventHandler(undefined, true); + + eventHandler.ledgerConnectionFailure(); + + assert.equal( + eventHandler.state.ledgerMessage, + "Wallet connection failed" + ); + }); + + it("should set a message on confirmation start", () => { + const eventHandler = new PrettyEventHandler(undefined, true); + + eventHandler.ledgerConfirmationStart(); + + assert.equal( + eventHandler.state.ledgerMessage, + "Waiting for confirmation on device" + ); + assert.isTrue(eventHandler.state.ledger); + assert.isTrue(eventHandler.state.ledgerMessageIsDisplayed); + }); + + it("should set a message on confirmation success", () => { + const eventHandler = new PrettyEventHandler(undefined, true); + + eventHandler.ledgerConfirmationSuccess(); + + assert.equal( + eventHandler.state.ledgerMessage, + "Transaction approved by device" + ); + assert.isFalse(eventHandler.state.ledger); + }); + + it("should set a message on confirmation failure", () => { + const eventHandler = new PrettyEventHandler(undefined, true); + + eventHandler.ledgerConfirmationFailure(); + + assert.equal( + eventHandler.state.ledgerMessage, + "Transaction confirmation failed" + ); + }); + }); +}); diff --git a/packages/hardhat-ignition/test/utils/bigintReviver.ts b/packages/hardhat-ignition/test/utils/bigintReviver.ts new file mode 100644 index 00000000000..029094e9bdd --- /dev/null +++ b/packages/hardhat-ignition/test/utils/bigintReviver.ts @@ -0,0 +1,19 @@ +import { assert } from "chai"; + +import { bigintReviver } from "../../src/utils/bigintReviver"; + +describe("bigintReviver", function () { + it('should convert number strings ending with "n" to BigInt', function () { + assert.deepEqual(JSON.parse('{"a":"1n"}', bigintReviver), { a: BigInt(1) }); + }); + + it("should throw if a number is bigger than Number.MAX_SAFE_INTEGER", function () { + assert.throws(() => { + JSON.parse('{"a":9007199254740992}', bigintReviver); + }, `Parameter "a" exceeds maximum safe integer size. Encode the value as a string using bigint notation: \`$\{value\}n\``); + }); + + it("should not convert regular numbers", function () { + assert.deepEqual(JSON.parse('{"a":1}', bigintReviver), { a: 1 }); + }); +}); diff --git a/packages/hardhat-ignition/test/utils/error-deployment-result-to-exception-message.ts b/packages/hardhat-ignition/test/utils/error-deployment-result-to-exception-message.ts new file mode 100644 index 00000000000..4323e8317bd --- /dev/null +++ b/packages/hardhat-ignition/test/utils/error-deployment-result-to-exception-message.ts @@ -0,0 +1,210 @@ +import { + DeploymentResultType, + ExecutionErrorDeploymentResult, + PreviousRunErrorDeploymentResult, + ReconciliationErrorDeploymentResult, + ValidationErrorDeploymentResult, +} from "@nomicfoundation/ignition-core"; +import { assert } from "chai"; + +import { errorDeploymentResultToExceptionMessage } from "../../src/utils/error-deployment-result-to-exception-message"; + +describe("display error deployment result", () => { + describe("validation", () => { + it("should display a validation error", () => { + const result: ValidationErrorDeploymentResult = { + type: DeploymentResultType.VALIDATION_ERROR, + errors: { + "MyModule:MyContract": [ + "The number of params does not match the constructor", + "The name of the contract is invalid", + ], + "MyModule:AnotherContract": ["No library provided"], + }, + }; + + assert.equal( + errorDeploymentResultToExceptionMessage(result), + `The deployment wasn't run because of the following validation errors: + + * MyModule:MyContract: The number of params does not match the constructor + * MyModule:MyContract: The name of the contract is invalid + * MyModule:AnotherContract: No library provided` + ); + }); + }); + + describe("reconciliation", () => { + it("should display a reconciliation error", () => { + const result: ReconciliationErrorDeploymentResult = { + type: DeploymentResultType.RECONCILIATION_ERROR, + errors: { + "MyModule:MyContract": [ + "The params don't match", + "The value doesn't match", + ], + "MyModule:AnotherContract": ["The future is timed out"], + }, + }; + + assert.equal( + errorDeploymentResultToExceptionMessage(result), + `The deployment wasn't run because of the following reconciliation errors: + + * MyModule:MyContract: The params don\'t match + * MyModule:MyContract: The value doesn\'t match + * MyModule:AnotherContract: The future is timed out` + ); + }); + }); + + describe("previous run", () => { + it("should display a previous run error", () => { + const result: PreviousRunErrorDeploymentResult = { + type: DeploymentResultType.PREVIOUS_RUN_ERROR, + errors: { + "MyModule:MyContract": ["The previous run failed"], + "MyModule:AnotherContract": ["The previous run timed out"], + }, + }; + + assert.equal( + errorDeploymentResultToExceptionMessage(result), + `The deployment wasn't run because of the following errors in a previous run: + + * MyModule:MyContract: The previous run failed + * MyModule:AnotherContract: The previous run timed out` + ); + }); + }); + + describe("execution", () => { + it("should display an execution error with timeouts", () => { + const result: ExecutionErrorDeploymentResult = { + type: DeploymentResultType.EXECUTION_ERROR, + started: [], + timedOut: [ + { futureId: "MyModule:MyContract", networkInteractionId: 1 }, + { futureId: "MyModule:AnotherContract", networkInteractionId: 3 }, + ], + held: [], + failed: [], + successful: [], + }; + + assert.equal( + errorDeploymentResultToExceptionMessage(result), + `The deployment wasn't successful, there were timeouts: + +Timed out: + + * MyModule:MyContract/1 + * MyModule:AnotherContract/3` + ); + }); + + it("should display an execution error with holds", () => { + const result: ExecutionErrorDeploymentResult = { + type: DeploymentResultType.EXECUTION_ERROR, + started: [], + timedOut: [], + held: [ + { + futureId: "MyModule:MyContract", + heldId: 1, + reason: "Vote is not complete", + }, + { + futureId: "MyModule:AnotherContract", + heldId: 3, + reason: "Server timed out", + }, + ], + failed: [], + successful: [], + }; + + assert.equal( + errorDeploymentResultToExceptionMessage(result), + `The deployment wasn't successful, there were holds: + +Held: + + * MyModule:MyContract/1: Vote is not complete + * MyModule:AnotherContract/3: Server timed out` + ); + }); + + it("should display an execution error with execution failures", () => { + const result: ExecutionErrorDeploymentResult = { + type: DeploymentResultType.EXECUTION_ERROR, + started: [], + timedOut: [], + held: [], + failed: [ + { + futureId: "MyModule:MyContract", + networkInteractionId: 1, + error: "Reverted with reason x", + }, + { + futureId: "MyModule:AnotherContract", + networkInteractionId: 3, + error: "Reverted with reason y", + }, + ], + successful: [], + }; + + assert.equal( + errorDeploymentResultToExceptionMessage(result), + `The deployment wasn't successful, there were failures: + +Failures: + + * MyModule:MyContract/1: Reverted with reason x + * MyModule:AnotherContract/3: Reverted with reason y` + ); + }); + + it("should display an execution error with both timeouts and execution failures", () => { + const result: ExecutionErrorDeploymentResult = { + type: DeploymentResultType.EXECUTION_ERROR, + started: [], + timedOut: [ + { futureId: "MyModule:FirstContract", networkInteractionId: 1 }, + { futureId: "MyModule:SecondContract", networkInteractionId: 3 }, + ], + held: [], + failed: [ + { + futureId: "MyModule:ThirdContract", + networkInteractionId: 1, + error: "Reverted with reason x", + }, + { + futureId: "MyModule:FourthContract", + networkInteractionId: 3, + error: "Reverted with reason y", + }, + ], + successful: [], + }; + + assert.equal( + errorDeploymentResultToExceptionMessage(result), + `The deployment wasn't successful, there were timeouts and failures: + +Timed out: + + * MyModule:FirstContract/1 + * MyModule:SecondContract/3 + +Failures: + + * MyModule:ThirdContract/1: Reverted with reason x + * MyModule:FourthContract/3: Reverted with reason y` + ); + }); + }); +}); diff --git a/packages/hardhat-ignition/test/utils/load-module.ts b/packages/hardhat-ignition/test/utils/load-module.ts new file mode 100644 index 00000000000..75b33bf2bb8 --- /dev/null +++ b/packages/hardhat-ignition/test/utils/load-module.ts @@ -0,0 +1,30 @@ +/* eslint-disable import/no-unused-modules */ +import { assert } from "chai"; + +import { loadModule } from "../../src/utils/load-module"; +import { useEphemeralIgnitionProject } from "../test-helpers/use-ignition-project"; + +describe("loadModule", function () { + useEphemeralIgnitionProject("user-modules"); + + it("should throw if the full path to the module does not exist", () => { + assert.throws( + () => loadModule("ignition", "./ignition/modules/Fake.js"), + "Could not find a module file at the path: ./ignition/modules/Fake.js" + ); + }); + + it("should throw if the full path to the module is outside the module directory", () => { + const unixErrorMessage = `The referenced module file ./hardhat.config.js is outside the module directory ignition/modules`; + + const expectedErrorMessage = + process.platform === "win32" + ? unixErrorMessage.replace("ignition/modules", "ignition\\modules") + : unixErrorMessage; + + assert.throws( + () => loadModule("ignition", "./hardhat.config.js"), + expectedErrorMessage + ); + }); +}); diff --git a/packages/hardhat-ignition/test/utils/resolve-deployment-id.ts b/packages/hardhat-ignition/test/utils/resolve-deployment-id.ts new file mode 100644 index 00000000000..8532411addf --- /dev/null +++ b/packages/hardhat-ignition/test/utils/resolve-deployment-id.ts @@ -0,0 +1,28 @@ +import { assert } from "chai"; + +import { resolveDeploymentId } from "../../src/utils/resolve-deployment-id"; + +describe("deploy id rules", () => { + const exampleChainId = 31337; + + it("should use the user provided id if one is provided", () => { + const deploymentId = resolveDeploymentId( + "my-deployment-id", + exampleChainId + ); + + assert.equal(deploymentId, "my-deployment-id"); + }); + + it("should generate a default id based on the chainId if the user provided no deploymentId", () => { + const deploymentId = resolveDeploymentId(undefined, exampleChainId); + + assert.equal(deploymentId, "chain-31337"); + }); + + it("should throw if the user provided an invalid deploymentId", () => { + assert.throws(() => { + resolveDeploymentId("deployment/test", exampleChainId); + }, /The deployment-id "deployment\/test" contains banned characters, ids can only contain alphanumerics, dashes or underscores/); + }); +}); diff --git a/packages/hardhat-ignition/test/verify/getApiKeyAndUrls.ts b/packages/hardhat-ignition/test/verify/getApiKeyAndUrls.ts new file mode 100644 index 00000000000..1761ba53d5b --- /dev/null +++ b/packages/hardhat-ignition/test/verify/getApiKeyAndUrls.ts @@ -0,0 +1,83 @@ +import { assert } from "chai"; + +import { getApiKeyAndUrls } from "../../src/utils/getApiKeyAndUrls"; + +describe("getApiKeyAndUrls", function () { + it("should return the correct API URLs when given a string", function () { + const apiKeyList = getApiKeyAndUrls("testApiKey", { + network: "mainnet", + chainId: 1, + urls: { + apiURL: "https://api.etherscan.io/api", + browserURL: "https://etherscan.io", + }, + }); + + assert.deepEqual(apiKeyList, [ + "testApiKey", + "https://api.etherscan.io/api", + "https://etherscan.io", + ]); + }); + + it("should return the correct API URLs when given an apiKey object", function () { + const apiKeyList = getApiKeyAndUrls( + { + goerli: "goerliApiKey", + sepolia: "sepoliaApiKey", + }, + { + network: "goerli", + chainId: 5, + urls: { + apiURL: "https://api-goerli.etherscan.io/api", + browserURL: "https://goerli.etherscan.io", + }, + } + ); + + assert.deepEqual(apiKeyList, [ + "goerliApiKey", + "https://api-goerli.etherscan.io/api", + "https://goerli.etherscan.io", + ]); + }); + + it("should return the correct API URLs when given a string and the network is not mainnet", function () { + const apiKeyList = getApiKeyAndUrls("goerliApiKey", { + network: "goerli", + chainId: 5, + urls: { + apiURL: "https://api-goerli.etherscan.io/api", + browserURL: "https://goerli.etherscan.io", + }, + }); + + assert.deepEqual(apiKeyList, [ + "goerliApiKey", + "https://api-goerli.etherscan.io/api", + "https://goerli.etherscan.io", + ]); + }); + + it("should throw when given an object and a nonexistent network name", function () { + assert.throws( + () => + getApiKeyAndUrls( + { + goerli: "goerliApiKey", + sepolia: "sepoliaApiKey", + }, + { + network: "mainnet", + chainId: 1, + urls: { + apiURL: "https://api.etherscan.io/api", + browserURL: "https://etherscan.io", + }, + } + ), + /No etherscan API key configured for network mainnet/ + ); + }); +}); diff --git a/packages/hardhat-ignition/test/verify/index.ts b/packages/hardhat-ignition/test/verify/index.ts new file mode 100644 index 00000000000..9de5b840e1b --- /dev/null +++ b/packages/hardhat-ignition/test/verify/index.ts @@ -0,0 +1,35 @@ +/* eslint-disable import/no-unused-modules */ +import { assert } from "chai"; + +import { useEphemeralIgnitionProject } from "../test-helpers/use-ignition-project"; + +describe("verify", function () { + describe("when there is no etherscan API key configured", function () { + useEphemeralIgnitionProject("verify-no-api-key"); + + it("should throw in the verify task", async function () { + await assert.isRejected( + this.hre.run( + { scope: "ignition", task: "verify" }, + { + deploymentId: "test", + } + ), + /No etherscan API key configured/ + ); + }); + + it("should throw in the deploy task", async function () { + await assert.isRejected( + this.hre.run( + { scope: "ignition", task: "deploy" }, + { + modulePath: "any", + verify: true, + } + ), + /No etherscan API key configured/ + ); + }); + }); +}); diff --git a/packages/hardhat-ignition/test/verify/verifyEtherscanContract.ts b/packages/hardhat-ignition/test/verify/verifyEtherscanContract.ts new file mode 100644 index 00000000000..f671205826a --- /dev/null +++ b/packages/hardhat-ignition/test/verify/verifyEtherscanContract.ts @@ -0,0 +1,56 @@ +import type { Etherscan } from "@nomicfoundation/hardhat-verify/etherscan"; + +import { assert } from "chai"; + +import { verifyEtherscanContract } from "../../src/utils/verifyEtherscanContract"; + +describe("verifyEtherscanContract", function () { + let etherscanInstance: any; + const contractInfo = { + address: "0x123", + compilerVersion: "v0.8.0", + sourceCode: "sourceCode", + name: "name", + args: "args", + }; + + beforeEach(function () { + etherscanInstance = { + verify: async () => ({ message: "guid" }), + getVerificationStatus: async () => ({ + isSuccess: () => true, + message: "message", + }), + getContractUrl: () => "url", + }; + }); + + it("should return a success object when verification succeeds", async function () { + const result = await verifyEtherscanContract( + etherscanInstance as Etherscan, + contractInfo + ); + + assert.deepEqual(result, { + type: "success", + contractURL: "url", + }); + }); + + it("should return a failure object when verification is not successful", async function () { + etherscanInstance.getVerificationStatus = async () => ({ + isSuccess: () => false, + message: "message", + }); + + const result = await verifyEtherscanContract( + etherscanInstance as Etherscan, + contractInfo + ); + + assert.deepEqual(result, { + type: "failure", + reason: new Error("message"), + }); + }); +}); diff --git a/packages/hardhat-ignition/tsconfig.json b/packages/hardhat-ignition/tsconfig.json new file mode 100644 index 00000000000..6e021cd5c92 --- /dev/null +++ b/packages/hardhat-ignition/tsconfig.json @@ -0,0 +1,16 @@ +{ + "extends": "../../config/typescript/tsconfig.json", + "compilerOptions": { + "target": "ES2022", + "outDir": "dist", + "composite": true, + "jsx": "react-jsx" + }, + "references": [ + { "path": "../hardhat-ignition-core" }, + { "path": "../hardhat-core" }, + { "path": "../hardhat-network-helpers" }, + { "path": "../hardhat-verify" }, + { "path": "../hardhat-ignition-ui/tsconfig.node.json" } + ] +} diff --git a/packages/hardhat-ledger/.gitignore b/packages/hardhat-ledger/.gitignore new file mode 100644 index 00000000000..b0ee1244f1b --- /dev/null +++ b/packages/hardhat-ledger/.gitignore @@ -0,0 +1,97 @@ +# Node modules +/node_modules + +# Compilation output +/build-test/ +/dist + +# Code coverage artifacts +/coverage +/.nyc_output + +/*.js +/*.js.map +/*.d.ts +/*.d.ts.map +/builtin-tasks +/common +/internal +/types +/utils + +# Below is Github's node gitignore template, +# ignoring the node_modules part, as it'd ignore every node_modules, and we have some for testing + +# Logs +logs +*.log + +# Diagnostic reports (https://nodejs.org/api/report.html) +report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +#node_modules/ +jspm_packages/ + +# TypeScript v1 declaration files +typings/ + +# Optional eslint cache +.eslintcache + +# Optional REPL history +.node_repl_history + +# Output of 'pnpm pack' +*.tgz + +# parcel-bundler cache (https://parceljs.org/) +.cache + +# next.js build output +.next + +# nuxt.js build output +.nuxt + +# vuepress build output +.vuepress/dist + +# Serverless directories +.serverless/ + +# FuseBox cache +.fusebox/ + +# DynamoDB Local files +.dynamodb/ + +test/fixture-projects/*/artifacts +test/fixture-projects/*/cache diff --git a/packages/hardhat-ledger/.mocharc.json b/packages/hardhat-ledger/.mocharc.json new file mode 100644 index 00000000000..d00ceb4138e --- /dev/null +++ b/packages/hardhat-ledger/.mocharc.json @@ -0,0 +1,5 @@ +{ + "require": "ts-node/register/files", + "ignore": ["test/fixture-projects/**/*"], + "timeout": 10000 +} diff --git a/packages/hardhat-ledger/.prettierignore b/packages/hardhat-ledger/.prettierignore new file mode 100644 index 00000000000..8b59d6f54cb --- /dev/null +++ b/packages/hardhat-ledger/.prettierignore @@ -0,0 +1,7 @@ +/node_modules +/dist +/test/fixture-projects/**/artifacts +/test/fixture-projects/**/artifacts-dir +/test/fixture-projects/**/cache +CHANGELOG.md +.nyc_output diff --git a/packages/hardhat-ledger/CHANGELOG.md b/packages/hardhat-ledger/CHANGELOG.md new file mode 100644 index 00000000000..d96d33292e6 --- /dev/null +++ b/packages/hardhat-ledger/CHANGELOG.md @@ -0,0 +1,7 @@ +# @nomicfoundation/hardhat-ledger + +## 1.0.1 + +### Patch Changes + +- d8793639e: Pinned version of @ledgerhq/hw-app-eth because the latest version has breaking changes diff --git a/packages/hardhat-ledger/LICENSE b/packages/hardhat-ledger/LICENSE new file mode 100644 index 00000000000..3b7e8c7eabb --- /dev/null +++ b/packages/hardhat-ledger/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2023 Nomic Foundation + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/packages/hardhat-ledger/README.md b/packages/hardhat-ledger/README.md new file mode 100644 index 00000000000..89c4574b21b --- /dev/null +++ b/packages/hardhat-ledger/README.md @@ -0,0 +1,106 @@ +[![npm](https://img.shields.io/npm/v/@nomicfoundation/hardhat-ledger.svg)](https://www.npmjs.com/package/@nomicfoundation/hardhat-ledger) [![hardhat](https://hardhat.org/buidler-plugin-badge.svg?1)](https://hardhat.org) + +# hardhat-ledger + +[Hardhat](https://hardhat.org) plugin for integration with a [Ledger hardware wallet](https://www.ledger.com/). + +## What + +This plugin extends the Hardhat provider enabling it to work with a connected Ledger wallet seamlessly. + +## Installation + +```bash +npm install --save-dev @nomicfoundation/hardhat-ledger +``` + +And add the following statement to your `hardhat.config.js`: + +```js +require("@nomicfoundation/hardhat-ledger"); +``` + +Or, if you are using TypeScript, add this to your `hardhat.config.ts`: + +```js +import "@nomicfoundation/hardhat-ledger"; +``` + +## Tasks + +This plugin creates no additional tasks. + +## Environment extensions + +This plugin adds nothing to the Hardhat Runtime Environment. + +## Provider extensions + +The provider supplied by Hardhat will be extended using [`extendProvider`](https://hardhat.org/hardhat-runner/docs/advanced/building-plugins#extending-the-hardhat-provider), decorating it to be a `LedgerProvider`. Any successive calls to `extendProvider` will be added on top of this. + +A `LedgerProvider` knows how to connect and interact with a Ledger wallet + +## Usage + +The only additional step to make this plugin work is to configure it properly through the Hardhat Config. For example, in your `hardhat.config.js`: + +```js +require("@nomicfoundation/hardhat-ledger"); + +module.exports = { + networks: { + hardhat: { + ledgerAccounts: [ + "0xa809931e3b38059adae9bc5455bc567d0509ab92", + "0xda6a52afdae5ff66aa786da68754a227331f56e3", + "0xbc307688a80ec5ed0edc1279c44c1b34f7746bda", + ], + }, + }, +}; +``` + +This will make those three accounts available to the `LedgerProvider`. If you try to send a transaction or sign something using any of those accounts, the provider will try to connect to the Ledger wallet and find a derivation path for that address. By default, the derivation paths that are tried start from `m/44'/60'/0'/0'/0` and go way up to `44'/60'/20'/0'/0`. + +If you want to use the provider, you could, for example in a task: + +```js +task("sign", "Signs a message", async (_, hre) => { + const message = + "0x5417aa2a18a44da0675524453ff108c545382f0d7e26605c56bba47c21b5e979"; + const account = "0xa809931e3b38059adae9bc5455bc567d0509ab92"; + + const signature = await hre.network.provider.request({ + method: "personal_sign", + params: [ + "0x5417aa2a18a44da0675524453ff108c545382f0d7e26605c56bba47c21b5e979", + account, + ], + }); + + console.log( + "Signed message", + message, + "for Ledger account", + account, + "and got", + signature + ); +}); +``` + +## Errors + +The package throws and exports a few [errors](https://github.com/NomicFoundation/hardhat/blob/feat/main/packages/hardhat-core/src/config.ts). In case you ever need to catch and check for them, you can use the `public static` method present on each of them. For example: + +```ts +try { + //(...) +} catch (error) { + if (DerivationPathError.isDerivationPathError(error)) { + // error is a DerivationPathError + } +} +``` + +Same for the other errors, all have their corresponding `.isXXXError()` method. diff --git a/packages/hardhat-ledger/package.json b/packages/hardhat-ledger/package.json new file mode 100644 index 00000000000..e57dd416e85 --- /dev/null +++ b/packages/hardhat-ledger/package.json @@ -0,0 +1,79 @@ +{ + "name": "@nomicfoundation/hardhat-ledger", + "version": "1.0.1", + "description": "Hardhat plugin for the Ledger hardware wallet", + "homepage": "https://github.com/nomicfoundation/hardhat/tree/main/packages/hardhat-ledger", + "repository": "github:nomicfoundation/hardhat", + "author": "Nomic Foundation", + "license": "MIT", + "main": "dist/src/index.js", + "types": "dist/src/index.d.ts", + "keywords": [ + "ethereum", + "smart-contracts", + "hardhat", + "hardhat-plugin", + "ledger", + "hardware-wallet" + ], + "scripts": { + "lint": "pnpm prettier --check && pnpm eslint", + "lint:fix": "pnpm prettier --write && pnpm eslint --fix", + "eslint": "eslint 'src/**/*.ts' 'test/**/*.ts'", + "prettier": "prettier \"**/*.{js,md,json}\"", + "pretest": "cd ../.. && pnpm build", + "test": "mocha --recursive \"test/**/*.ts\" -c --exit", + "coverage": "nyc pnpm test -- --reporter min", + "build": "tsc --build .", + "prepublishOnly": "pnpm build", + "clean": "rimraf dist" + }, + "files": [ + "dist/src/", + "src/", + "LICENSE", + "README.md" + ], + "dependencies": { + "@ledgerhq/errors": "^6.12.6", + "@ledgerhq/hw-app-eth": "6.33.6", + "@ledgerhq/hw-transport": "^6.28.4", + "@ledgerhq/hw-transport-node-hid": "^6.27.13", + "@nomicfoundation/ethereumjs-util": "9.0.2", + "chalk": "^2.4.2", + "debug": "^4.1.1", + "env-paths": "^2.2.0", + "ethers": "^6.1.0", + "fs-extra": "^7.0.1", + "io-ts": "1.10.4", + "ora": "^5.4.1" + }, + "devDependencies": { + "@nomicfoundation/eslint-plugin-hardhat-internal-rules": "workspace:^", + "@nomicfoundation/eslint-plugin-slow-imports": "workspace:^", + "@types/chai": "^4.2.0", + "@types/fs-extra": "^5.1.0", + "@types/mocha": ">=9.1.0", + "@types/node": "^16.0.0", + "@types/sinon": "^9.0.8", + "@typescript-eslint/eslint-plugin": "5.61.0", + "@typescript-eslint/parser": "5.61.0", + "chai": "^4.2.0", + "eslint": "^8.44.0", + "eslint-config-prettier": "8.3.0", + "eslint-plugin-import": "2.27.5", + "eslint-plugin-no-only-tests": "3.0.0", + "eslint-plugin-prettier": "3.4.0", + "hardhat": "workspace:^2.16.0", + "mocha": "^10.0.0", + "nyc": "^15.1.0", + "prettier": "2.4.1", + "rimraf": "^3.0.2", + "sinon": "^9.0.0", + "ts-node": "^10.8.0", + "typescript": "~5.0.0" + }, + "peerDependencies": { + "hardhat": "^2.16.0" + } +} diff --git a/packages/hardhat-ledger/src/errors.ts b/packages/hardhat-ledger/src/errors.ts new file mode 100644 index 00000000000..073edc325e7 --- /dev/null +++ b/packages/hardhat-ledger/src/errors.ts @@ -0,0 +1,70 @@ +import type { TransportError } from "@ledgerhq/errors"; +import { NomicLabsHardhatPluginError } from "hardhat/plugins"; + +export class HardhatLedgerError extends NomicLabsHardhatPluginError { + constructor(message: string, parent?: Error) { + super("@nomiclabs/hardhat-ledger", message, parent); + } +} + +export class HardhatLedgerNotControlledAddressError extends HardhatLedgerError { + public static instanceOf( + other: any + ): other is HardhatLedgerNotControlledAddressError { + return ( + other !== undefined && + other !== null && + other._isNotControlledAddressError === true + ); + } + + private readonly _isNotControlledAddressError = true; + + constructor(message: string, public address: string) { + super(message); + } +} + +export class HardhatLedgerConnectionError extends HardhatLedgerError { + public static instanceOf(other: any): other is HardhatLedgerConnectionError { + return ( + other !== undefined && other !== null && other._isConnectionError === true + ); + } + + private readonly _isConnectionError = true; + + constructor(error: Error) { + let errorMessage = `There was an error trying to establish a connection to the Ledger wallet: "${error.message}". + +Make sure your Ledger is connected and unlocked, and that the Ethereum app is open. +`; + + if (error.name === "TransportError") { + const transportError = error as TransportError; + errorMessage += ` +The error id was: ${transportError.id} +`; + } + + super(errorMessage); + } +} + +export class HardhatLedgerDerivationPathError extends HardhatLedgerError { + public static instanceOf( + other: any + ): other is HardhatLedgerDerivationPathError { + return ( + other !== undefined && + other !== null && + other._isDerivationPathError === true + ); + } + + private readonly _isDerivationPathError = true; + + constructor(message: string, public path: string) { + super(message); + } +} diff --git a/packages/hardhat-ledger/src/index.ts b/packages/hardhat-ledger/src/index.ts new file mode 100644 index 00000000000..1db9768c5dc --- /dev/null +++ b/packages/hardhat-ledger/src/index.ts @@ -0,0 +1,22 @@ +import { extendConfig, extendProvider } from "hardhat/config"; + +import "./type-extensions"; + +export * from "./errors"; + +extendConfig((config, userConfig) => { + // set ledgerAccounts to the user configured value, or to [] if there isn't any + for (const networkName of Object.keys(config.networks)) { + config.networks[networkName].ledgerAccounts = + userConfig.networks?.[networkName]?.ledgerAccounts ?? []; + } +}); + +extendProvider(async (provider, config, network) => { + const { createLedgerProvider } = await import( + "./internal/create-ledger-provider" + ); + + const networkConfig = config.networks[network]; + return createLedgerProvider(provider, networkConfig); +}); diff --git a/packages/hardhat-ledger/src/internal/cache.ts b/packages/hardhat-ledger/src/internal/cache.ts new file mode 100644 index 00000000000..b9886eb18e8 --- /dev/null +++ b/packages/hardhat-ledger/src/internal/cache.ts @@ -0,0 +1,44 @@ +import type { Paths } from "env-paths"; +import fs from "fs-extra"; +import path from "path"; + +type CacheableJson = Record; + +export const CACHE_FILE_NAME = "accounts.json"; +const PACKAGE_NAME = "hardhat"; + +export async function write(json: T) { + const ledgerCacheFile = await getLedgerCacheFile(CACHE_FILE_NAME); + await fs.writeJSON(ledgerCacheFile, json); +} + +export async function read(): Promise { + const ledgerCacheFile = await getLedgerCacheFile(CACHE_FILE_NAME); + try { + const file: T = await fs.readJSON(ledgerCacheFile); + return file; + } catch (error) {} +} + +async function getLedgerCacheFile(fileName: string): Promise { + const ledgerCacheDir = await getLedgerCacheDir(); + return path.join(ledgerCacheDir, fileName); +} + +async function getLedgerCacheDir(): Promise { + const cache = await getCacheDir(); + const compilersCache = path.join(cache, "ledger"); + await fs.ensureDir(compilersCache); + return compilersCache; +} + +async function getCacheDir(): Promise { + const { cache } = await generatePaths(PACKAGE_NAME); + await fs.ensureDir(cache); + return cache; +} + +async function generatePaths(packageName: string): Promise { + const { default: envPaths } = await import("env-paths"); + return envPaths(packageName); +} diff --git a/packages/hardhat-ledger/src/internal/create-ledger-provider.ts b/packages/hardhat-ledger/src/internal/create-ledger-provider.ts new file mode 100644 index 00000000000..142d07339b6 --- /dev/null +++ b/packages/hardhat-ledger/src/internal/create-ledger-provider.ts @@ -0,0 +1,15 @@ +import { EIP1193Provider, NetworkConfig } from "hardhat/types"; + +import { LedgerProvider } from "../provider"; +import { withSpinners } from "./with-spinners"; + +export function createLedgerProvider( + provider: EIP1193Provider, + networkConfig: NetworkConfig +): LedgerProvider { + const accounts = networkConfig.ledgerAccounts; + + const ledgerProvider = new LedgerProvider({ accounts }, provider); + + return withSpinners(ledgerProvider); +} diff --git a/packages/hardhat-ledger/src/internal/utils.ts b/packages/hardhat-ledger/src/internal/utils.ts new file mode 100644 index 00000000000..429866b826f --- /dev/null +++ b/packages/hardhat-ledger/src/internal/utils.ts @@ -0,0 +1,4 @@ +export function toHex(value: string | Buffer): string { + const stringValue = typeof value === "string" ? value : value.toString("hex"); + return stringValue.startsWith("0x") ? stringValue : `0x${stringValue}`; +} diff --git a/packages/hardhat-ledger/src/internal/with-spinners.ts b/packages/hardhat-ledger/src/internal/with-spinners.ts new file mode 100644 index 00000000000..4a057e4435c --- /dev/null +++ b/packages/hardhat-ledger/src/internal/with-spinners.ts @@ -0,0 +1,43 @@ +import ora from "ora"; +import EventEmitter from "events"; + +export function withSpinners(emitter: T): T { + attachSpinner(emitter, { + startText: "[hardhat-ledger] Connecting wallet", + eventPrefix: "connection", + }); + + attachSpinner(emitter, { + startText: "[hardhat-ledger] Waiting for confirmation", + eventPrefix: "confirmation", + }); + + const derivationSpinner = attachSpinner(emitter, { + startText: "[hardhat-ledger] Finding derivation path", + eventPrefix: "derivation", + }); + emitter.on( + "derivation_progress", + (path: string, index: number) => + (derivationSpinner.text = `[hardhat-ledger] Deriving address #${index} (path "${path}")`) + ); + + return emitter; +} + +function attachSpinner( + emmiter: EventEmitter, + spinnerOptions: { + startText: string; + eventPrefix: string; + } +): ora.Ora { + const { startText, eventPrefix } = spinnerOptions; + const spinner = ora(startText); + + emmiter.on(`${eventPrefix}_start`, () => spinner.start()); + emmiter.on(`${eventPrefix}_success`, () => spinner.succeed()); + emmiter.on(`${eventPrefix}_failure`, () => spinner.fail()); + + return spinner; +} diff --git a/packages/hardhat-ledger/src/internal/wrap-transport.ts b/packages/hardhat-ledger/src/internal/wrap-transport.ts new file mode 100644 index 00000000000..1e57f399b36 --- /dev/null +++ b/packages/hardhat-ledger/src/internal/wrap-transport.ts @@ -0,0 +1,8 @@ +import Eth from "@ledgerhq/hw-app-eth"; +import Transport from "@ledgerhq/hw-transport"; + +import { EthWrapper } from "../types"; + +export function wrapTransport(transport: Transport): EthWrapper { + return new Eth(transport); +} diff --git a/packages/hardhat-ledger/src/provider.ts b/packages/hardhat-ledger/src/provider.ts new file mode 100644 index 00000000000..84b3237973e --- /dev/null +++ b/packages/hardhat-ledger/src/provider.ts @@ -0,0 +1,431 @@ +import { ethers } from "ethers"; +import * as t from "io-ts"; + +import { isValidAddress } from "@nomicfoundation/ethereumjs-util"; + +import { isEIP712Message, ledgerService } from "@ledgerhq/hw-app-eth"; +import TransportNodeHid from "@ledgerhq/hw-transport-node-hid"; +import { EIP712Message } from "@ledgerhq/hw-app-eth/lib/modules/EIP712"; +import { EIP1193Provider, RequestArguments } from "hardhat/types"; +import { validateParams } from "hardhat/internal/core/jsonrpc/types/input/validation"; +import { rpcTransactionRequest } from "hardhat/internal/core/jsonrpc/types/input/transactionRequest"; +import { + rpcAddress, + rpcData, + rpcQuantityToBigInt, +} from "hardhat/internal/core/jsonrpc/types/base-types"; +import { ProviderWrapperWithChainId } from "hardhat/internal/core/providers/chainId"; +import { HardhatError } from "hardhat/internal/core/errors"; +import { ERRORS } from "hardhat/internal/core/errors-list"; + +import * as cache from "./internal/cache"; +import { toHex } from "./internal/utils"; +import { wrapTransport } from "./internal/wrap-transport"; +import { LedgerOptions, EthWrapper, Signature, Paths } from "./types"; +import { + HardhatLedgerConnectionError, + HardhatLedgerDerivationPathError, + HardhatLedgerError, + HardhatLedgerNotControlledAddressError, +} from "./errors"; + +export class LedgerProvider extends ProviderWrapperWithChainId { + public static readonly MAX_DERIVATION_ACCOUNTS = 20; + public static readonly DEFAULT_TIMEOUT = 3000; + + public readonly paths: Paths = {}; // { address: path } + public name: string = "LedgerProvider"; + + protected _eth: EthWrapper | undefined; + + public static async create( + options: LedgerOptions, + wrappedProvider: EIP1193Provider + ) { + const provider = new LedgerProvider(options, wrappedProvider); + await provider.init(); + return provider; + } + + constructor( + public readonly options: LedgerOptions, + _wrappedProvider: EIP1193Provider + ) { + super(_wrappedProvider); + + this.options.accounts = options.accounts.map((account) => { + if (!isValidAddress(account)) { + throw new HardhatLedgerError( + `The following ledger address from the config is invalid: ${account}` + ); + } + return account.toLowerCase(); + }); + } + + public get eth(): EthWrapper { + if (this._eth === undefined) { + throw new HardhatError(ERRORS.GENERAL.UNINITIALIZED_PROVIDER); + } + return this._eth; + } + + public async init(): Promise { + // If init is called concurrently, it can cause the Ledger to throw + // because the transport might be in use. This is a known problem but shouldn't happen + // as init is not called manually. More info read: https://github.com/NomicFoundation/hardhat/pull/4008#discussion_r1233258204 + + if (this._eth === undefined) { + const openTimeout = + this.options.openTimeout ?? LedgerProvider.DEFAULT_TIMEOUT; + + const connectionTimeout = + this.options.connectionTimeout ?? LedgerProvider.DEFAULT_TIMEOUT; + + try { + this.emit("connection_start"); + + const transport = await TransportNodeHid.create( + openTimeout, + connectionTimeout + ); + this._eth = wrapTransport(transport); + + this.emit("connection_success"); + } catch (error) { + this.emit("connection_failure"); + + if (error instanceof Error) { + throw new HardhatLedgerConnectionError(error); + } + + throw error; + } + } + + try { + const paths = await cache.read(); + if (paths !== undefined) { + Object.assign(this.paths, paths); + } + } catch (error) {} + } + + public async request(args: RequestArguments): Promise { + const params = this._getParams(args); + + if (args.method === "eth_accounts") { + const accounts = (await this._wrappedProvider.request(args)) as string[]; + return [...accounts, ...this.options.accounts]; + } + + if (this._methodRequiresSignature(args.method)) { + try { + if (args.method === "eth_sign") { + return await this._ethSign(params); + } + + if (args.method === "personal_sign") { + return await this._personalSign(params); + } + + if (args.method === "eth_signTypedData_v4") { + return await this._ethSignTypedDataV4(params); + } + + if (args.method === "eth_sendTransaction" && params.length > 0) { + return await this._ethSendTransaction(params); + } + } catch (error) { + // We skip non controlled errors and forward them to the wrapped provider + if (!HardhatLedgerNotControlledAddressError.instanceOf(error)) { + throw error; + } + } + } + + return this._wrappedProvider.request(args); + } + + private _methodRequiresSignature(method: string): boolean { + return [ + "personal_sign", + "eth_sign", + "eth_signTypedData_v4", + "eth_sendTransaction", + ].includes(method); + } + + private async _ethSign(params: any[]): Promise { + if (params.length > 0) { + const [address, data] = validateParams(params, rpcAddress, rpcData); + + await this._requireControlledInit(address); + + if (address !== undefined) { + if (data === undefined) { + throw new HardhatError(ERRORS.NETWORK.ETHSIGN_MISSING_DATA_PARAM); + } + + const path = await this._derivePath(address); + const signature = await this._withConfirmation(() => + this.eth.signPersonalMessage(path, data.toString("hex")) + ); + return this._toRpcSig(signature); + } + } + } + + private async _personalSign(params: any[]): Promise { + if (params.length > 0) { + const [data, address] = validateParams(params, rpcData, rpcAddress); + + await this._requireControlledInit(address); + + if (data !== undefined) { + if (address === undefined) { + throw new HardhatError( + ERRORS.NETWORK.PERSONALSIGN_MISSING_ADDRESS_PARAM + ); + } + + const path = await this._derivePath(address); + const signature = await this._withConfirmation(() => + this.eth.signPersonalMessage(path, data.toString("hex")) + ); + return this._toRpcSig(signature); + } + } + } + + private async _ethSignTypedDataV4(params: any[]): Promise { + const [address, data] = validateParams(params, rpcAddress, t.any as any); + + await this._requireControlledInit(address); + + if (data === undefined) { + throw new HardhatError(ERRORS.NETWORK.ETHSIGN_MISSING_DATA_PARAM); + } + + let typedMessage: EIP712Message; + try { + typedMessage = typeof data === "string" ? JSON.parse(data) : data; + + if (!isEIP712Message(typedMessage)) { + throw new HardhatError( + ERRORS.NETWORK.ETHSIGN_TYPED_DATA_V4_INVALID_DATA_PARAM + ); + } + } catch { + throw new HardhatError( + ERRORS.NETWORK.ETHSIGN_TYPED_DATA_V4_INVALID_DATA_PARAM + ); + } + + const { types, domain, message, primaryType } = typedMessage; + const { EIP712Domain: _, ...structTypes } = types; + + const path = await this._derivePath(address); + const signature = await this._withConfirmation(async () => { + try { + return await this.eth.signEIP712Message(path, typedMessage); + } catch (error) { + return this.eth.signEIP712HashedMessage( + path, + ethers.TypedDataEncoder.hashDomain(domain), + ethers.TypedDataEncoder.hashStruct(primaryType, structTypes, message) + ); + } + }); + + return this._toRpcSig(signature); + } + + private async _ethSendTransaction(params: any[]): Promise { + const [txRequest] = validateParams(params, rpcTransactionRequest); + + await this._requireControlledInit(txRequest.from); + + if (txRequest.gas === undefined) { + throw new HardhatError(ERRORS.NETWORK.MISSING_TX_PARAM_TO_SIGN_LOCALLY, { + param: "gas", + }); + } + + const hasGasPrice = txRequest.gasPrice !== undefined; + const hasEip1559Fields = + txRequest.maxFeePerGas !== undefined || + txRequest.maxPriorityFeePerGas !== undefined; + + if (!hasGasPrice && !hasEip1559Fields) { + throw new HardhatError(ERRORS.NETWORK.MISSING_FEE_PRICE_FIELDS); + } + + if (hasGasPrice && hasEip1559Fields) { + throw new HardhatError(ERRORS.NETWORK.INCOMPATIBLE_FEE_PRICE_FIELDS); + } + + if (hasEip1559Fields && txRequest.maxFeePerGas === undefined) { + throw new HardhatError(ERRORS.NETWORK.MISSING_TX_PARAM_TO_SIGN_LOCALLY, { + param: "maxFeePerGas", + }); + } + + if (hasEip1559Fields && txRequest.maxPriorityFeePerGas === undefined) { + throw new HardhatError(ERRORS.NETWORK.MISSING_TX_PARAM_TO_SIGN_LOCALLY, { + param: "maxPriorityFeePerGas", + }); + } + + const path = await this._derivePath(txRequest.from); + + if (txRequest.nonce === undefined) { + txRequest.nonce = await this._getNonce(txRequest.from); + } + + const chainId = await this._getChainId(); + + const baseTx: ethers.TransactionLike = { + chainId, + gasLimit: txRequest.gas, + gasPrice: txRequest.gasPrice, + maxFeePerGas: txRequest.maxFeePerGas, + maxPriorityFeePerGas: txRequest.maxPriorityFeePerGas, + nonce: Number(txRequest.nonce), + value: txRequest.value, + }; + if (txRequest.to !== undefined) { + baseTx.to = toHex(txRequest.to); + } + if (txRequest.data !== undefined) { + baseTx.data = toHex(txRequest.data); + } + + const txToSign = + ethers.Transaction.from(baseTx).unsignedSerialized.substring(2); + + const resolution = await ledgerService.resolveTransaction(txToSign, {}, {}); + + const signature = await this._withConfirmation(() => + this.eth.signTransaction(path, txToSign, resolution) + ); + + const rawTransaction = ethers.Transaction.from({ + ...baseTx, + signature: { + v: toHex(signature.v), + r: toHex(signature.r), + s: toHex(signature.s), + }, + }).serialized; + + return this._wrappedProvider.request({ + method: "eth_sendRawTransaction", + params: [rawTransaction], + }); + } + + private async _derivePath(addressToFindAsBuffer: Buffer): Promise { + const addressToFind = toHex(addressToFindAsBuffer).toLowerCase(); + + if (this.paths[addressToFind] !== undefined) { + return this.paths[addressToFind]; + } + + this.emit("derivation_start"); + + let path = ""; + try { + for ( + let account = 0; + account <= LedgerProvider.MAX_DERIVATION_ACCOUNTS; + account++ + ) { + path = `44'/60'/${account}'/0/0`; + + this.emit("derivation_progress", path, account); + + const wallet = await this.eth.getAddress(path); + const address = wallet.address.toLowerCase(); + + if (address === addressToFind) { + this.emit("derivation_success", path); + this.paths[addressToFind] = path; + + void cache.write(this.paths); // hanging promise + + return path; + } + } + } catch (error) { + const message = (error as Error).message; + + this.emit("derivation_failure"); + throw new HardhatLedgerDerivationPathError( + `There was an error trying to derivate path ${path}: "${message}". The wallet might be connected but locked or in the wrong app.`, + path + ); + } + + this.emit("derivation_failure"); + throw new HardhatLedgerDerivationPathError( + `Could not find a valid derivation path for ${addressToFind}. Paths from m/44'/60'/0'/0/0 to m/44'/60'/${LedgerProvider.MAX_DERIVATION_ACCOUNTS}'/0/0 were searched.`, + path + ); + } + + private async _withConfirmation any>( + func: T + ): Promise> { + try { + this.emit("confirmation_start"); + const result = await func(); + this.emit("confirmation_success"); + + return result; + } catch (error) { + this.emit("confirmation_failure"); + throw new HardhatLedgerError((error as Error).message); + } + } + + private async _toRpcSig(signature: Signature): Promise { + const { toRpcSig, toBuffer } = await import( + "@nomicfoundation/ethereumjs-util" + ); + + return toRpcSig( + BigInt(signature.v - 27), + toBuffer(toHex(signature.r)), + toBuffer(toHex(signature.s)) + ); + } + + private async _getNonce(address: Buffer): Promise { + const { bufferToHex } = await import("@nomicfoundation/ethereumjs-util"); + + const response = (await this._wrappedProvider.request({ + method: "eth_getTransactionCount", + params: [bufferToHex(address), "pending"], + })) as string; + + return rpcQuantityToBigInt(response); + } + + private async _requireControlledInit(address: Buffer): Promise { + this._requireControlledAddress(address); + await this.init(); + } + + private _requireControlledAddress(address: Buffer): void { + const hexAddress = toHex(address).toLowerCase(); + const isControlledAddress = this.options.accounts.includes(hexAddress); + + if (!isControlledAddress) { + throw new HardhatLedgerNotControlledAddressError( + "Tried to send a transaction with an address we don't control.", + hexAddress + ); + } + } +} diff --git a/packages/hardhat-ledger/src/type-extensions.ts b/packages/hardhat-ledger/src/type-extensions.ts new file mode 100644 index 00000000000..c1614a9ecc0 --- /dev/null +++ b/packages/hardhat-ledger/src/type-extensions.ts @@ -0,0 +1,17 @@ +import "hardhat/types/config"; + +declare module "hardhat/types/config" { + interface HardhatNetworkUserConfig { + ledgerAccounts?: string[]; + } + interface HardhatNetworkConfig { + ledgerAccounts: string[]; + } + + interface HttpNetworkUserConfig { + ledgerAccounts?: string[]; + } + interface HttpNetworkConfig { + ledgerAccounts: string[]; + } +} diff --git a/packages/hardhat-ledger/src/types.ts b/packages/hardhat-ledger/src/types.ts new file mode 100644 index 00000000000..f0d1f157353 --- /dev/null +++ b/packages/hardhat-ledger/src/types.ts @@ -0,0 +1,23 @@ +import Eth from "@ledgerhq/hw-app-eth"; + +export interface EthWrapper { + getAddress: Eth["getAddress"]; + signPersonalMessage: Eth["signPersonalMessage"]; + signEIP712Message: Eth["signEIP712Message"]; + signEIP712HashedMessage: Eth["signEIP712HashedMessage"]; + signTransaction: Eth["signTransaction"]; +} + +export interface Signature { + v: number; + s: string; + r: string; +} + +export interface LedgerOptions { + openTimeout?: number; + connectionTimeout?: number; + accounts: string[]; +} + +export type Paths = Record; // { address: path } diff --git a/packages/hardhat-web3-legacy/test/.eslintrc.js b/packages/hardhat-ledger/test/.eslintrc.js similarity index 100% rename from packages/hardhat-web3-legacy/test/.eslintrc.js rename to packages/hardhat-ledger/test/.eslintrc.js diff --git a/packages/hardhat-ledger/test/errors.ts b/packages/hardhat-ledger/test/errors.ts new file mode 100644 index 00000000000..3791f8d624b --- /dev/null +++ b/packages/hardhat-ledger/test/errors.ts @@ -0,0 +1,80 @@ +import { assert } from "chai"; + +import { + HardhatLedgerConnectionError, + HardhatLedgerDerivationPathError, + HardhatLedgerError, + HardhatLedgerNotControlledAddressError, +} from "../src/errors"; + +describe("HardhatLedgerError", () => { + it("should set the plugin name of the error", () => { + const error = new HardhatLedgerError(""); + assert.equal(error.pluginName, "@nomiclabs/hardhat-ledger"); + }); + + it("should set the message of the error", () => { + const message = "Some message"; + const error = new HardhatLedgerError(message); + assert.equal(error.message, message); + }); +}); + +describe("HardhatLedgerNotControlledAddressError", () => { + it("should set the message of the error", () => { + const message = "Look, a message"; + const error = new HardhatLedgerNotControlledAddressError(message, ""); + assert.equal(error.message, message); + }); + + it("should store the address", () => { + const address = "0x3d6e2674e40ea221b4a48663d28eff77af564a50"; + const error = new HardhatLedgerNotControlledAddressError("", address); + assert.equal(error.address, address); + }); + + it("should detect a HardhatLedgerNotControlledAddressError", () => { + assert.isFalse( + HardhatLedgerNotControlledAddressError.instanceOf(new Error()) + ); + assert.isTrue( + HardhatLedgerNotControlledAddressError.instanceOf( + new HardhatLedgerNotControlledAddressError("", "") + ) + ); + }); +}); + +describe("HardhatLedgerDerivationPathError", () => { + it("should set the message of the error", () => { + const message = "Yet another message"; + const error = new HardhatLedgerDerivationPathError(message, ""); + assert.equal(error.message, message); + }); + + it("should store the path", () => { + const path = "44'/60'/0'/0/0"; + const error = new HardhatLedgerDerivationPathError("", path); + assert.equal(error.path, path); + }); + + it("should detect a HardhatLedgerDerivationPathError", () => { + assert.isFalse(HardhatLedgerDerivationPathError.instanceOf(new Error())); + assert.isTrue( + HardhatLedgerDerivationPathError.instanceOf( + new HardhatLedgerDerivationPathError("", "") + ) + ); + }); +}); + +describe("HardhatLedgerConnectionError", () => { + it("should detect a HardhatLegerConnectionError", () => { + assert.isFalse(HardhatLedgerConnectionError.instanceOf(new Error())); + assert.isTrue( + HardhatLedgerConnectionError.instanceOf( + new HardhatLedgerConnectionError(new Error("")) + ) + ); + }); +}); diff --git a/packages/hardhat-ledger/test/internal/cache.ts b/packages/hardhat-ledger/test/internal/cache.ts new file mode 100644 index 00000000000..c24dd698969 --- /dev/null +++ b/packages/hardhat-ledger/test/internal/cache.ts @@ -0,0 +1,50 @@ +import { assert } from "chai"; +import envPaths from "env-paths"; +import fs from "fs-extra"; +import sinon from "sinon"; +import path from "path"; + +import * as cache from "../../src/internal/cache"; + +describe("cache", () => { + let fsStub: sinon.SinonStubbedInstance; + let cacheDir: string; + + beforeEach(() => { + const { cache: cachePath } = envPaths("hardhat"); + + cacheDir = path.join(cachePath, "ledger", cache.CACHE_FILE_NAME); + fsStub = sinon.stub(fs); + }); + + afterEach(() => { + sinon.restore(); + }); + + describe("write", () => { + it("should write the supplied json to the ledger cache file", async () => { + const json = { some: "json" }; + await cache.write(json); + + // We need to do this by hand cause sinon does not play nice with overloads + const args = fsStub.writeJSON.getCall(0).args; + + assert.equal(args.length, 2); + assert.equal(args[0], cacheDir); + assert.deepEqual(args[1], json); + }); + }); + + describe("read", () => { + it("should read the ledger cache file", async () => { + const json = { another: "json" }; + + // We need to do this cast cause sinon does not play nice with overloads + fsStub.readJSON.returns(Promise.resolve(json) as any); + + const result = await cache.read(); + + assert.deepEqual(result, json); + }); + }); +}); diff --git a/packages/hardhat-ledger/test/internal/create-ledger-provider.ts b/packages/hardhat-ledger/test/internal/create-ledger-provider.ts new file mode 100644 index 00000000000..2a05abb363f --- /dev/null +++ b/packages/hardhat-ledger/test/internal/create-ledger-provider.ts @@ -0,0 +1,54 @@ +import { assert } from "chai"; +import sinon from "sinon"; + +import { NetworkConfig } from "hardhat/types"; + +import { EthereumMockedProvider } from "../mocks"; +import { createLedgerProvider } from "../../src/internal/create-ledger-provider"; +import * as spinners from "../../src/internal/with-spinners"; + +describe("createLedgerProvider", () => { + let mockedProvider: EthereumMockedProvider; + + beforeEach(() => { + mockedProvider = new EthereumMockedProvider(); + }); + + it("should pass the ledgerAccounts from the config to the LedgerProvider", () => { + const ledgerAccounts = [ + "0x704ad3adfa9eae2be46c907ef5325d0fabe17353", + "0xf4416d306caa15dd4cdf4cd882cd764a6b2aa9b2", + "0xe149ff2797adc146aa2d68d3df3e819c3c38e762", + "0x343fe45cd2d785a5f2e97a00de8436f9c42ef444", + ]; + const config = { ledgerAccounts } as NetworkConfig; + const ledgerProvider = createLedgerProvider(mockedProvider, config); + + assert.deepEqual(ledgerProvider.options.accounts, ledgerAccounts); + }); + + it("should pass the provider to the LedgerProvider", async () => { + const config = { + ledgerAccounts: ["0xf4416d306caa15dd4cdf4cd882cd764a6b2aa9b2"], + } as NetworkConfig; + const ledgerProvider = createLedgerProvider(mockedProvider, config); + const requestStub = sinon.stub(mockedProvider, "request"); + + await ledgerProvider.request({ method: "eth_blockNumber" }); + + sinon.assert.calledOnceWithExactly(requestStub, { + method: "eth_blockNumber", + }); + }); + + it("should return a new LedgerProvider with spinners handlers attached", () => { + const withSpinnerSpy = sinon.spy(spinners, "withSpinners"); + + const config = { + ledgerAccounts: ["0xe149ff2797adc146aa2d68d3df3e819c3c38e762"], + } as NetworkConfig; + const ledgerProvider = createLedgerProvider(mockedProvider, config); + + sinon.assert.calledOnceWithExactly(withSpinnerSpy, ledgerProvider); + }); +}); diff --git a/packages/hardhat-ledger/test/internal/utils.ts b/packages/hardhat-ledger/test/internal/utils.ts new file mode 100644 index 00000000000..6f7c20a9ea6 --- /dev/null +++ b/packages/hardhat-ledger/test/internal/utils.ts @@ -0,0 +1,20 @@ +import { assert } from "chai"; +import { toHex } from "../../src/internal/utils"; + +describe("toHex", () => { + it("should append 0x to the supplied string value", () => { + assert.equal(toHex("123"), "0x123"); + }); + + it("should not append 0x if the supplied string value already has it", () => { + assert.equal(toHex("0x123"), "0x123"); + }); + + it("should return the 0x hex representation of the Buffer", () => { + // "736f6d6520737472696e67".toString("hex") === "736f6d6520737472696e67" + assert.equal( + toHex(Buffer.from("some string", "utf8")), + "0x736f6d6520737472696e67" + ); + }); +}); diff --git a/packages/hardhat-ledger/test/internal/with-spinners.ts b/packages/hardhat-ledger/test/internal/with-spinners.ts new file mode 100644 index 00000000000..d744a7fc4ac --- /dev/null +++ b/packages/hardhat-ledger/test/internal/with-spinners.ts @@ -0,0 +1,54 @@ +import { assert } from "chai"; +import sinon from "sinon"; +import EventEmitter from "events"; +import * as spinners from "../../src/internal/with-spinners"; + +describe("withSpinners", () => { + let eventEmitter: EventEmitter; + + function containsArray(baseArray: Array, values: string[]) { + return values.every((value) => baseArray.includes(value)); + } + + beforeEach(() => { + eventEmitter = new EventEmitter(); + }); + + afterEach(() => { + sinon.restore(); + }); + + it("should attach the connection events", () => { + const emitter = spinners.withSpinners(eventEmitter); + assert.isTrue( + containsArray(emitter.eventNames(), [ + "connection_start", + "connection_success", + "connection_failure", + ]) + ); + }); + + it("should attach the derivation events", () => { + const emitter = spinners.withSpinners(eventEmitter); + assert.isTrue( + containsArray(emitter.eventNames(), [ + "derivation_start", + "derivation_success", + "derivation_failure", + "derivation_progress", + ]) + ); + }); + + it("should attach the confirmation events", () => { + const emitter = spinners.withSpinners(eventEmitter); + assert.isTrue( + containsArray(emitter.eventNames(), [ + "confirmation_start", + "confirmation_success", + "confirmation_failure", + ]) + ); + }); +}); diff --git a/packages/hardhat-ledger/test/mocks.ts b/packages/hardhat-ledger/test/mocks.ts new file mode 100644 index 00000000000..8423da4de25 --- /dev/null +++ b/packages/hardhat-ledger/test/mocks.ts @@ -0,0 +1,10 @@ +import EventEmitter from "events"; + +import { EIP1193Provider, RequestArguments } from "hardhat/types"; + +export class EthereumMockedProvider + extends EventEmitter + implements EIP1193Provider +{ + public async request(_args: RequestArguments): Promise {} +} diff --git a/packages/hardhat-ledger/test/provider.ts b/packages/hardhat-ledger/test/provider.ts new file mode 100644 index 00000000000..0ea5c3a9876 --- /dev/null +++ b/packages/hardhat-ledger/test/provider.ts @@ -0,0 +1,756 @@ +import { assert } from "chai"; +import sinon from "sinon"; + +import Eth from "@ledgerhq/hw-app-eth"; +import TransportNodeHid from "@ledgerhq/hw-transport-node-hid"; +import Transport from "@ledgerhq/hw-transport"; +import { EIP712Message } from "@ledgerhq/hw-app-eth/lib/modules/EIP712"; +import { TransportError } from "@ledgerhq/errors"; + +import { RequestArguments } from "hardhat/types"; + +import * as ethWrapper from "../src/internal/wrap-transport"; +import * as cache from "../src/internal/cache"; +import { LedgerProvider } from "../src/provider"; +import { EthWrapper, LedgerOptions } from "../src/types"; +import { + HardhatLedgerConnectionError, + HardhatLedgerDerivationPathError, +} from "../src/errors"; +import { EthereumMockedProvider } from "./mocks"; + +describe("LedgerProvider", () => { + let accounts: string[]; + let mockedProvider: EthereumMockedProvider; + let ethInstanceStub: sinon.SinonStubbedInstance; + let cacheStub: sinon.SinonStubbedInstance; + let provider: LedgerProvider; + + function stubTransport(transport: Transport) { + return sinon + .stub(TransportNodeHid, "create") + .returns(Promise.resolve(transport)); + } + + beforeEach(() => { + accounts = [ + "0xa809931e3b38059adae9bc5455bc567d0509ab92", + "0xda6a52afdae5ff66aa786da68754a227331f56e3", + "0xbc307688a80ec5ed0edc1279c44c1b34f7746bda", + ]; + mockedProvider = new EthereumMockedProvider(); + ethInstanceStub = sinon.createStubInstance(Eth); + cacheStub = sinon.stub(cache); + + sinon.stub(ethWrapper, "wrapTransport").returns(ethInstanceStub); + cacheStub.read.returns(Promise.resolve(undefined)); + + provider = new LedgerProvider({ accounts }, mockedProvider); + }); + + afterEach(() => { + sinon.restore(); + }); + + describe("instance", () => { + it("should lowercase all accounts", () => { + const uppercaseAccounts = [ + "0xA809931E3B38059ADAE9BC5455BC567D0509AB92", + "0xDA6A52AFDAE5FF66AA786DA68754A227331F56E3", + "0xBC307688A80EC5ED0EDC1279C44C1B34F7746BDA", + ]; + const uppercaseProvider = new LedgerProvider( + { accounts: uppercaseAccounts }, + mockedProvider + ); + const lowercasedAccounts = uppercaseAccounts.map((account) => + account.toLowerCase() + ); + + assert.deepEqual(uppercaseProvider.options.accounts, lowercasedAccounts); + }); + + it("should check for valid ethereum addresses", () => { + assert.throws( + () => + new LedgerProvider( + { + accounts: [ + "0xe149ff2797adc146aa2d68d3df3e819c3c38e762", + "0x1", + "0x343fe45cd2d785a5F2e97a00de8436f9c42Ef444", + ], + }, + mockedProvider + ), + "The following ledger address from the config is invalid: 0x1" + ); + }); + }); + + describe("create", () => { + beforeEach(() => { + stubTransport(new Transport()); + }); + + it("should return a provider instance", async () => { + const newProvider = await LedgerProvider.create( + { accounts }, + mockedProvider + ); + assert.instanceOf(newProvider, LedgerProvider); + }); + + it("should init the provider", async () => { + const spy = sinon.spy(LedgerProvider.prototype, "init"); + await LedgerProvider.create({ accounts }, mockedProvider); + assert.isTrue(spy.calledOnce); + }); + }); + + describe("init", () => { + let transport: Transport; + let createStub: sinon.SinonStub; + + beforeEach(() => { + transport = new Transport(); + createStub = stubTransport(transport); + }); + + it("should call the create method on TransportNodeHid", async () => { + await provider.init(); + + sinon.assert.calledOnceWithExactly( + createStub, + LedgerProvider.DEFAULT_TIMEOUT, + LedgerProvider.DEFAULT_TIMEOUT + ); + }); + + it("should only init once on multiple calls", async () => { + await provider.init(); + await provider.init(); + await provider.init(); + + sinon.assert.calledOnceWithExactly( + createStub, + LedgerProvider.DEFAULT_TIMEOUT, + LedgerProvider.DEFAULT_TIMEOUT + ); + }); + + it("should pass the timeout options to the Transport creation", async () => { + const options: LedgerOptions = { + accounts, + openTimeout: 1000, + connectionTimeout: 5432, + }; + const newProvider = new LedgerProvider(options, mockedProvider); + await newProvider.init(); + + sinon.assert.calledOnceWithExactly( + createStub, + options.openTimeout, + options.connectionTimeout + ); + }); + + it("should create an eth instance", async () => { + await provider.init(); + assert.instanceOf(provider.eth, Eth); + }); + + it("should throw a ledger provider error if create does", async () => { + const createError = new Error("Test Error"); + createStub.throws(createError); + + try { + await provider.init(); + } catch (error) { + if (!HardhatLedgerConnectionError.instanceOf(error)) { + assert.fail("Expected a ConnectionError"); + } + assert.include( + error.message, + `There was an error trying to establish a connection to the Ledger wallet: "${createError.message}".` + ); + } + }); + + it("should throw an error with the proper explanation if a transport error is thrown", async () => { + const createError = new TransportError( + "Transport Error", + "Transport Error Id" + ); + createStub.throws(createError); + + try { + await provider.init(); + } catch (error) { + if (!HardhatLedgerConnectionError.instanceOf(error)) { + assert.fail("Expected a ConnectionError"); + } + assert.include( + error.message, + `There was an error trying to establish a connection to the Ledger wallet: "${createError.message}".` + ); + assert.include(error.message, `The error id was: ${createError.id}`); + } + }); + + it("should start the paths cache with what the cache returns", async () => { + const newPaths = { + "0xe149ff2797adc146aa2d68d3df3e819c3c38e762": "44'/60'/0'/0/0", + }; + const oldPaths = { ...provider.paths }; // new object + + cacheStub.read.returns(Promise.resolve(newPaths)); + await provider.init(); + + assert.deepEqual(oldPaths, {}); + assert.deepEqual(newPaths, provider.paths); + }); + + describe("events", () => { + let emitSpy: sinon.SinonSpy; + + beforeEach(() => { + emitSpy = sinon.spy(provider, "emit"); + }); + + it("should emit the connection_start event", async () => { + await provider.init(); + sinon.assert.calledWithExactly(emitSpy, "connection_start"); + }); + + it("should emit the connection_success event if everything goes right", async () => { + await provider.init(); + sinon.assert.calledWithExactly(emitSpy, "connection_start"); + }); + + it("should emit the connection_failure if the connection fails", async () => { + try { + createStub.throws(new Error()); + await provider.init(); + } catch (error) {} + sinon.assert.calledWithExactly(emitSpy, "connection_failure"); + }); + }); + }); + + describe("request", () => { + let path: string; + let account: { address: string; publicKey: string }; + let rsv: { v: number; r: string; s: string }; + let txRsv: { v: string; r: string; s: string }; + let signature: string; + let dataToSign: string; + let typedMessage: EIP712Message; + let initSpy: sinon.SinonSpy; + + beforeEach(async () => { + stubTransport(new Transport()); + + initSpy = sinon.spy(provider, "init"); + + path = "44'/60'/1'/0/0"; + account = { + address: accounts[1], + publicKey: "0x1", + }; + ethInstanceStub.getAddress.callsFake(async (searchedPath: string) => + searchedPath === path ? account : { address: "0x0", publicKey: "0x0" } + ); + + rsv = { + v: 55, + r: "4f4c17305743700648bc4f6cd3038ec6f6af0df73e31757007b7f59df7bee88d", + s: "7e1941b264348e80c78c4027afc65a87b0a5e43e86742b8ca0823584c6788fd0", + }; + txRsv = { + v: "f4f5", + r: "4ab14d7e96a8bc7390cfffa0260d4b82848428ce7f5b8dd367d13bf31944b6c0", + s: "3cc226daa6a2f4e22334c59c2e04ac72672af72907ec9c4a601189858ba60069", + }; + signature = + "0x4f4c17305743700648bc4f6cd3038ec6f6af0df73e31757007b7f59df7bee88d7e1941b264348e80c78c4027afc65a87b0a5e43e86742b8ca0823584c6788fd01c"; + dataToSign = + "0x5417aa2a18a44da0675524453ff108c545382f0d7e26605c56bba47c21b5e979"; + + typedMessage = { + types: { + EIP712Domain: [ + { name: "name", type: "string" }, + { name: "version", type: "string" }, + { name: "chainId", type: "uint256" }, + { name: "verifyingContract", type: "address" }, + ], + Person: [ + { name: "name", type: "string" }, + { name: "wallet", type: "address" }, + ], + Mail: [ + { name: "from", type: "Person" }, + { name: "to", type: "Person" }, + { name: "contents", type: "string" }, + ], + }, + primaryType: "Mail", + domain: { + name: "Ether Mail", + version: "1", + chainId: 1, + verifyingContract: "0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC", + }, + message: { + from: { + name: "Cow", + wallet: "0xCD2a3d9F938E13CD947Ec05AbC7FE734Df8DD826", + }, + to: { + name: "Bob", + wallet: "0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB", + }, + contents: "Hello, Bob!", + }, + }; + }); + + describe("unsupported methods", () => { + it("should not init the provider if and unsupported JSONRPC method is called", async () => { + sinon.stub(mockedProvider, "request"); + await provider.request({ method: "eth_blockNumber" }); + await provider.request({ method: "eth_getBlockByNumber" }); + await provider.request({ method: "net_version" }); + + sinon.assert.notCalled(initSpy); + }); + + it("should forward unsupported JSONRPC methods to the wrapped provider", async () => { + const requestStub = sinon.stub(mockedProvider, "request"); + + const blockNumberArgs = { + method: "eth_blockNumber", + params: [1, 2, 3], + }; + await provider.request(blockNumberArgs); + + const netVersionArgs = { + method: "eth_getBlockByNumber", + params: ["2.0"], + }; + await provider.request(netVersionArgs); + + sinon.assert.calledTwice(requestStub); + sinon.assert.calledWith(requestStub.getCall(0), blockNumberArgs); + sinon.assert.calledWith(requestStub.getCall(1), netVersionArgs); + }); + }); + + describe("supported (sign) methods", () => { + it("should forward to the wrapped provider if the address doing the signing is not controlled", async () => { + const requestStub = sinon.stub(mockedProvider, "request"); + + // the address is not on the accounts the providers manage + const uncontrolledAddress = + "0x76F8654a8e981A4a5D634c2d3cE56E195a65c319"; + + const requestArgs = [ + { + method: "eth_sign", + params: [uncontrolledAddress, dataToSign], + }, + { + method: "personal_sign", + params: [dataToSign, uncontrolledAddress], + }, + { + method: "eth_signTypedData_v4", + params: [uncontrolledAddress, typedMessage], + }, + { + method: "eth_sendTransaction", + params: [ + { + from: uncontrolledAddress, + to: accounts[1], + value: "0x100", + gas: "0x1000000", + gasPrice: "0x100", + gasLimit: "0x1000000", + }, + ], + }, + ]; + + for (const [index, args] of requestArgs.entries()) { + await provider.request(args); + sinon.assert.calledWithExactly(requestStub.getCall(index), args); + } + + sinon.assert.notCalled(initSpy); + }); + + it("should return the configured and base accounts when the JSONRPC eth_accounts method is called", async () => { + const baseAccounts = [ + "0x18225dbbd263d5a01ac537db4d1eefc12fae8b24", + "0x704ad3adfa9eae2be46c907ef5325d0fabe17353", + ]; + sinon.stub(mockedProvider, "request").callsFake(async (args) => { + if (args.method === "eth_accounts") { + return baseAccounts; + } + }); + + const resultAccounts = await provider.request({ + method: "eth_accounts", + }); + assert.deepEqual([...baseAccounts, ...accounts], resultAccounts); + sinon.assert.notCalled(initSpy); + }); + + it("should call the ledger's signPersonalMessage method when the JSONRPC personal_sign method is called", async () => { + const stub = ethInstanceStub.signPersonalMessage.returns( + Promise.resolve(rsv) + ); + + const resultSignature = await provider.request({ + method: "personal_sign", + params: [dataToSign, account.address], + }); + + sinon.assert.calledOnceWithExactly(stub, path, dataToSign.slice(2)); // slices 0x + assert.deepEqual(signature, resultSignature); + sinon.assert.calledOnce(initSpy); + }); + + it("should call the ledger's signPersonalMessage method when the JSONRPC eth_sign method is called", async () => { + const stub = ethInstanceStub.signPersonalMessage.returns( + Promise.resolve(rsv) + ); + + const resultSignature = await provider.request({ + method: "eth_sign", + params: [account.address, dataToSign], + }); + + sinon.assert.calledOnceWithExactly(stub, path, dataToSign.slice(2)); // slices 0x + assert.deepEqual(signature, resultSignature); + sinon.assert.calledOnce(initSpy); + }); + + it("should call the ledger's signEIP712Message method when the JSONRPC eth_signTypedData_v4 method is called", async () => { + const stub = ethInstanceStub.signEIP712Message.returns( + Promise.resolve(rsv) + ); + + const resultSignature = await provider.request({ + method: "eth_signTypedData_v4", + params: [account.address, typedMessage], + }); + + sinon.assert.calledOnceWithExactly(stub, path, typedMessage); + assert.deepEqual(signature, resultSignature); + sinon.assert.calledOnce(initSpy); + }); + + it("should call the ledger's signEIP712HashedMessage method when the JSONRPC eth_signTypedData_v4 method is called", async () => { + ethInstanceStub.signEIP712Message.throws("Unsupported Ledger"); + + const stub = ethInstanceStub.signEIP712HashedMessage.returns( + Promise.resolve(rsv) + ); + + const resultSignature = await provider.request({ + method: "eth_signTypedData_v4", + params: [account.address, typedMessage], + }); + + sinon.assert.calledOnceWithExactly( + stub, + path, + "0xf2cee375fa42b42143804025fc449deafd50cc031ca257e0b194a650a912090f", // hash domain + "0xc52c0ee5d84264471806290a3f2c4cecfc5490626bf912d01f240d7a274b371e" // hash struct + ); + assert.deepEqual(signature, resultSignature); + sinon.assert.calledOnce(initSpy); + }); + + it("should call the ledger's signTransaction method when the JSONRPC eth_sendTransaction method is called", async () => { + const numberToRpcQuantity = (n: number | bigint) => + `0x${n.toString(16)}`; + + const tx = + "0xf8626464830f4240949f649fe750340a295dddbbd7e1ec8f378cf24b43648082f4f5a04ab14d7e96a8bc7390cfffa0260d4b82848428ce7f5b8dd367d13bf31944b6c0a03cc226daa6a2f4e22334c59c2e04ac72672af72907ec9c4a601189858ba60069"; + + const requestStub = sinon.stub(); + sinon.replace( + mockedProvider, + "request", + async (args: RequestArguments) => { + requestStub(args); + + switch (args.method) { + case "eth_chainId": + return "0x7a69"; + case "eth_getTransactionCount": + return "0x64"; + case "eth_sendRawTransaction": + return tx; + } + } + ); + + const signTransactionStub = ethInstanceStub.signTransaction.returns( + Promise.resolve(txRsv) + ); + + const resultTx = await provider.request({ + method: "eth_sendTransaction", + params: [ + { + from: account.address, + to: accounts[1], + value: numberToRpcQuantity(100), + gas: numberToRpcQuantity(1000000), + gasPrice: numberToRpcQuantity(100), + gasLimit: numberToRpcQuantity(1000000), + }, + ], + }); + + sinon.assert.calledOnceWithExactly( + signTransactionStub, + path, + "01e1827a696464830f424094da6a52afdae5ff66aa786da68754a227331f56e36480c0", + { + nfts: [], + erc20Tokens: [], + externalPlugin: [], + plugin: [], + domains: [], + } + ); + sinon.assert.calledWithExactly(requestStub.getCall(0), { + method: "eth_getTransactionCount", + params: [account.address, "pending"], + }); + sinon.assert.calledWithExactly(requestStub.getCall(1), { + method: "eth_chainId", + }); + sinon.assert.calledWithExactly(requestStub.getCall(2), { + method: "eth_sendRawTransaction", + params: [ + "0x01f864827a696464830f424094da6a52afdae5ff66aa786da68754a227331f56e36480c080a04ab14d7e96a8bc7390cfffa0260d4b82848428ce7f5b8dd367d13bf31944b6c0a03cc226daa6a2f4e22334c59c2e04ac72672af72907ec9c4a601189858ba60069", + ], + }); + assert.equal(tx, resultTx); + sinon.assert.calledOnce(initSpy); + }); + }); + + describe("path derivation", () => { + async function requestPersonalSign() { + ethInstanceStub.signPersonalMessage.returns(Promise.resolve(rsv)); + await provider.request({ + method: "personal_sign", + params: [dataToSign, account.address], + }); + } + + it("should cache the derived path from the supplied accounts", async () => { + await requestPersonalSign(); + await requestPersonalSign(); + await requestPersonalSign(); + await requestPersonalSign(); + + sinon.assert.calledTwice(ethInstanceStub.getAddress); + sinon.assert.calledWith(ethInstanceStub.getAddress, "44'/60'/0'/0/0"); + sinon.assert.calledWith(ethInstanceStub.getAddress, "44'/60'/1'/0/0"); + }); + + it("should cache the path per address on the paths property", async () => { + await requestPersonalSign(); + await requestPersonalSign(); + + assert.deepEqual(provider.paths, { [accounts[1]]: path }); + }); + + it("should write the cache with the new paths", async () => { + await requestPersonalSign(); + await requestPersonalSign(); + await requestPersonalSign(); + + sinon.assert.calledOnceWithExactly(cacheStub.write, { + [accounts[1]]: path, + }); + }); + + it("should not break if caching fails", async () => { + cacheStub.write.returns(Promise.reject(new Error("Write error"))); + + let hasThrown = false; + try { + await requestPersonalSign(); + } catch (error) { + console.log(error); + hasThrown = true; + } + + assert.isFalse(hasThrown); + }); + + it("should throw a DerivationPathError if trying to get the address fails", async () => { + const errorMessage = "Getting the address broke"; + ethInstanceStub.getAddress.throws(new Error(errorMessage)); + try { + await requestPersonalSign(); + } catch (error) { + const errorPath = "44'/60'/0'/0/0"; + if (!HardhatLedgerDerivationPathError.instanceOf(error)) { + assert.fail("Expected a DerivationPathError"); + } + assert.equal(error.path, errorPath); + assert.equal( + (error as HardhatLedgerDerivationPathError).message, + `There was an error trying to derivate path ${errorPath}: "${errorMessage}". The wallet might be connected but locked or in the wrong app.` + ); + } + }); + + it("should throw a DerivationPathError if the max number of derivations is searched without a result", async () => { + try { + ethInstanceStub.getAddress.callsFake(async () => ({ + address: "0x0", + publicKey: "0x0", + })); + await requestPersonalSign(); + } catch (error) { + const errorPath = `44'/60'/${LedgerProvider.MAX_DERIVATION_ACCOUNTS}'/0/0`; + if (!HardhatLedgerDerivationPathError.instanceOf(error)) { + assert.fail("Expected a DerivationPathError"); + } + assert.equal(error.path, errorPath); + assert.equal( + (error as HardhatLedgerDerivationPathError).message, + `Could not find a valid derivation path for ${accounts[1]}. Paths from m/44'/60'/0'/0/0 to m/${errorPath} were searched.` + ); + } + }); + }); + + describe("events", () => { + let emitSpy: sinon.SinonSpy; + + beforeEach(() => { + emitSpy = sinon.spy(provider, "emit"); + }); + + describe("confirmation", () => { + it("should emit the confirmation_start event when a request for signing is made", async () => { + ethInstanceStub.signPersonalMessage.returns(Promise.resolve(rsv)); + await provider.request({ + method: "personal_sign", + params: [dataToSign, account.address], + }); + + sinon.assert.calledWithExactly(emitSpy, "confirmation_start"); + }); + + it("should emit the confirmation_success event when a request for signing goes OK", async () => { + ethInstanceStub.signPersonalMessage.returns(Promise.resolve(rsv)); + await provider.request({ + method: "eth_sign", + params: [account.address, dataToSign], + }); + + sinon.assert.calledWithExactly(emitSpy, "confirmation_success"); + }); + + it("should emit the confirmation_failure event when a request for signing breaks", async () => { + ethInstanceStub.signEIP712Message.throws(new Error()); + ethInstanceStub.signEIP712HashedMessage.throws(new Error()); + try { + await provider.request({ + method: "eth_signTypedData_v4", + params: [account.address, typedMessage], + }); + } catch (error) {} + + sinon.assert.calledWithExactly(emitSpy, "confirmation_failure"); + }); + }); + + describe("derivation", () => { + async function requestSign() { + ethInstanceStub.signPersonalMessage.returns(Promise.resolve(rsv)); + await provider.request({ + method: "eth_sign", + params: [account.address, dataToSign], + }); + } + + it("should emit the derivation_start event when a request for signing is made", async () => { + await requestSign(); + sinon.assert.calledWithExactly(emitSpy, "derivation_start"); + }); + + it("should emit the derivation_progress event with the derived paths when a request for signing is made", async () => { + await requestSign(); + sinon.assert.calledWithExactly( + emitSpy, + "derivation_progress", + "44'/60'/0'/0/0", + 0 + ); + sinon.assert.calledWithExactly( + emitSpy, + "derivation_progress", + "44'/60'/1'/0/0", + 1 + ); + }); + + it("should emit the derivation_success event with the path when a request for signing is made and succeeds", async () => { + await requestSign(); + sinon.assert.calledWithExactly( + emitSpy, + "derivation_success", + "44'/60'/1'/0/0" + ); + }); + + it("should emit the derivation_failure event when a request for signing is made and breaks", async () => { + try { + ethInstanceStub.getAddress.throws(new Error()); + await requestSign(); + } catch (error) {} + sinon.assert.calledWithExactly(emitSpy, "derivation_failure"); + }); + + it("should emit the derivation_failure event when a request for signing is made and can't find a valid path", async () => { + try { + ethInstanceStub.getAddress.callsFake(async () => ({ + address: "0x0", + publicKey: "0x0", + })); + await requestSign(); + } catch (error) {} + sinon.assert.calledWithExactly(emitSpy, "derivation_failure"); + }); + }); + + describe("eth_accounts", () => { + beforeEach(() => { + // eth_accounts will be called to merge the accounts + sinon.stub(mockedProvider, "request").returns(Promise.resolve([])); + }); + + it("should not emit a connection or derivation event with eth_accounts", async () => { + await provider.request({ method: "eth_accounts" }); + sinon.assert.notCalled(emitSpy); + }); + }); + }); + }); +}); diff --git a/packages/hardhat-web3-legacy/tsconfig.json b/packages/hardhat-ledger/tsconfig.json similarity index 100% rename from packages/hardhat-web3-legacy/tsconfig.json rename to packages/hardhat-ledger/tsconfig.json diff --git a/packages/hardhat-network-helpers/.eslintrc.js b/packages/hardhat-network-helpers/.eslintrc.js index 889740f226d..c6de07705a1 100644 --- a/packages/hardhat-network-helpers/.eslintrc.js +++ b/packages/hardhat-network-helpers/.eslintrc.js @@ -1,7 +1,24 @@ +const { + slowImportsCommonIgnoredModules, +} = require("../../config/eslint/constants"); + module.exports = { extends: [`${__dirname}/../../config/eslint/eslintrc.js`], parserOptions: { project: `${__dirname}/tsconfig.json`, sourceType: "module", }, + overrides: [ + { + files: ["src/index.ts"], + rules: { + "@nomicfoundation/slow-imports/no-top-level-external-import": [ + "error", + { + ignoreModules: [...slowImportsCommonIgnoredModules], + }, + ], + }, + }, + ], }; diff --git a/packages/hardhat-network-helpers/.gitignore b/packages/hardhat-network-helpers/.gitignore index 80110bdc12d..8707b8ac84f 100644 --- a/packages/hardhat-network-helpers/.gitignore +++ b/packages/hardhat-network-helpers/.gitignore @@ -21,10 +21,6 @@ # Logs logs *.log -npm-debug.log* -yarn-debug.log* -yarn-error.log* -lerna-debug.log* # Diagnostic reports (https://nodejs.org/api/report.html) report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json @@ -63,21 +59,15 @@ jspm_packages/ # TypeScript v1 declaration files typings/ -# Optional npm cache directory -.npm - # Optional eslint cache .eslintcache # Optional REPL history .node_repl_history -# Output of 'npm pack' +# Output of 'pnpm pack' *.tgz -# Yarn Integrity file -.yarn-integrity - # parcel-bundler cache (https://parceljs.org/) .cache diff --git a/packages/hardhat-network-helpers/.prettierignore b/packages/hardhat-network-helpers/.prettierignore index c66ddcfc8ab..2ef4541cbc9 100644 --- a/packages/hardhat-network-helpers/.prettierignore +++ b/packages/hardhat-network-helpers/.prettierignore @@ -10,3 +10,4 @@ /test/fixture-projects/**/artifacts /test/fixture-projects/**/cache CHANGELOG.md +!.eslintrc.js diff --git a/packages/hardhat-network-helpers/CHANGELOG.md b/packages/hardhat-network-helpers/CHANGELOG.md index 6c554ac9e17..4e1454d79e1 100644 --- a/packages/hardhat-network-helpers/CHANGELOG.md +++ b/packages/hardhat-network-helpers/CHANGELOG.md @@ -1,5 +1,17 @@ # @nomicfoundation/hardhat-network-helpers +## 1.0.10 + +### Patch Changes + +- 43d75470c: Added support for using network helpers on anvil network (thanks @tmigone!) + +## 1.0.9 + +### Patch Changes + +- 9715d4195: Added support for receiving Date instances in `increaseTo` network helper (thanks @Saty248) + ## 1.0.8 ### Patch Changes diff --git a/packages/hardhat-network-helpers/LICENSE b/packages/hardhat-network-helpers/LICENSE index 3b8858c5558..3b7e8c7eabb 100644 --- a/packages/hardhat-network-helpers/LICENSE +++ b/packages/hardhat-network-helpers/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2019 Nomic Labs LLC +Copyright (c) 2023 Nomic Foundation Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/packages/hardhat-network-helpers/package.json b/packages/hardhat-network-helpers/package.json index 18d28fe3194..a2e4aa1835f 100644 --- a/packages/hardhat-network-helpers/package.json +++ b/packages/hardhat-network-helpers/package.json @@ -1,6 +1,6 @@ { "name": "@nomicfoundation/hardhat-network-helpers", - "version": "1.0.8", + "version": "1.0.10", "description": "Hardhat utils for testing", "homepage": "https://github.com/nomicfoundation/hardhat/tree/main/packages/hardhat-network-helpers", "repository": "github:nomicfoundation/hardhat", @@ -15,13 +15,14 @@ "testing" ], "scripts": { - "lint": "yarn prettier --check && yarn eslint", - "lint:fix": "yarn prettier --write && yarn eslint --fix", + "lint": "pnpm prettier --check && pnpm eslint", + "lint:fix": "pnpm prettier --write && pnpm eslint --fix", "eslint": "eslint 'src/**/*.ts' 'test/**/*.ts'", "prettier": "prettier \"**/*.{js,md,json}\"", + "pretest": "cd ../.. && pnpm build", "test": "mocha --recursive \"test/**/*.ts\" --exit", "build": "tsc --build .", - "prepublishOnly": "yarn build", + "prepublishOnly": "pnpm build", "clean": "rimraf dist internal types *.{d.ts,js}{,.map} build-test tsconfig.tsbuildinfo" }, "files": [ @@ -40,25 +41,28 @@ "ethereumjs-util": "^7.1.4" }, "devDependencies": { + "@nomicfoundation/eslint-plugin-hardhat-internal-rules": "workspace:^", + "@nomicfoundation/eslint-plugin-slow-imports": "workspace:^", "@types/chai": "^4.2.0", + "@types/chai-as-promised": "^7.1.3", "@types/mocha": ">=9.1.0", - "@types/node": "^14.0.0", - "@typescript-eslint/eslint-plugin": "5.53.0", - "@typescript-eslint/parser": "5.53.0", + "@types/node": "^16.0.0", + "@typescript-eslint/eslint-plugin": "5.61.0", + "@typescript-eslint/parser": "5.61.0", "chai": "^4.2.0", "chai-as-promised": "^7.1.1", - "eslint": "^7.29.0", + "eslint": "^8.44.0", "eslint-config-prettier": "8.3.0", - "eslint-plugin-import": "2.24.1", + "eslint-plugin-import": "2.27.5", "eslint-plugin-no-only-tests": "3.0.0", "eslint-plugin-prettier": "3.4.0", - "ethers": "^5.0.0", - "hardhat": "^2.9.5", + "ethers-v5": "npm:ethers@5", + "hardhat": "workspace:^2.9.5", "mocha": "^10.0.0", "prettier": "2.4.1", "rimraf": "^3.0.2", "ts-node": "^10.8.0", - "typescript": "~4.7.4" + "typescript": "~5.0.0" }, "peerDependencies": { "hardhat": "^2.9.5" diff --git a/packages/hardhat-network-helpers/src/errors.ts b/packages/hardhat-network-helpers/src/errors.ts index 2a7214ca693..3746ee0aa0a 100644 --- a/packages/hardhat-network-helpers/src/errors.ts +++ b/packages/hardhat-network-helpers/src/errors.ts @@ -17,7 +17,7 @@ export class FixtureSnapshotError extends CustomError { super( `There was an error reverting the snapshot of the fixture. -This might be caused by using nested loadFixture calls in a test, for example by using multiple beforeEach calls. This is not supported yet.`, +This might be caused by using hardhat_reset and loadFixture calls in a testcase.`, parent ); } diff --git a/packages/hardhat-network-helpers/src/helpers/reset.ts b/packages/hardhat-network-helpers/src/helpers/reset.ts index ad1fc5cd09f..70abd2aafa0 100644 --- a/packages/hardhat-network-helpers/src/helpers/reset.ts +++ b/packages/hardhat-network-helpers/src/helpers/reset.ts @@ -1,4 +1,6 @@ import type { NumberLike } from "../types"; +import { clearSnapshots } from "../loadFixture"; + import { getHardhatProvider, toNumber } from "../utils"; export async function reset( @@ -6,7 +8,7 @@ export async function reset( blockNumber?: NumberLike ): Promise { const provider = await getHardhatProvider(); - + await clearSnapshots(); if (url === undefined) { await provider.request({ method: "hardhat_reset", diff --git a/packages/hardhat-network-helpers/src/helpers/time/increaseTo.ts b/packages/hardhat-network-helpers/src/helpers/time/increaseTo.ts index e86f15090d8..3dc166a5a38 100644 --- a/packages/hardhat-network-helpers/src/helpers/time/increaseTo.ts +++ b/packages/hardhat-network-helpers/src/helpers/time/increaseTo.ts @@ -2,16 +2,19 @@ import type { NumberLike } from "../../types"; import { getHardhatProvider, toRpcQuantity, toBigInt } from "../../utils"; import { mine } from "../mine"; +import { millis } from "./duration"; /** * Mines a new block whose timestamp is `timestamp` * - * @param timestamp Must be bigger than the latest block's timestamp + * @param timestamp Can be `Date` or Epoch seconds. Must be bigger than the latest block's timestamp */ -export async function increaseTo(timestamp: NumberLike): Promise { +export async function increaseTo(timestamp: NumberLike | Date): Promise { const provider = await getHardhatProvider(); - const normalizedTimestamp = toBigInt(timestamp); + const normalizedTimestamp = toBigInt( + timestamp instanceof Date ? millis(timestamp.valueOf()) : timestamp + ); await provider.request({ method: "evm_setNextBlockTimestamp", diff --git a/packages/hardhat-network-helpers/src/loadFixture.ts b/packages/hardhat-network-helpers/src/loadFixture.ts index 76d53c3a743..0a1101abbb9 100644 --- a/packages/hardhat-network-helpers/src/loadFixture.ts +++ b/packages/hardhat-network-helpers/src/loadFixture.ts @@ -68,3 +68,10 @@ export async function loadFixture(fixture: Fixture): Promise { return data; } } + +/** + * Clears every existing snapshot. + */ +export async function clearSnapshots() { + snapshots = []; +} diff --git a/packages/hardhat-network-helpers/src/utils.ts b/packages/hardhat-network-helpers/src/utils.ts index 53d6b2305b9..8935752a728 100644 --- a/packages/hardhat-network-helpers/src/utils.ts +++ b/packages/hardhat-network-helpers/src/utils.ts @@ -5,31 +5,31 @@ import type { NumberLike } from "./types"; import { HardhatNetworkHelpersError, OnlyHardhatNetworkError } from "./errors"; -let cachedIsHardhatNetwork: boolean; -async function checkIfHardhatNetwork( +let cachedIsDevelopmentNetwork: boolean; +async function checkIfDevelopmentNetwork( provider: EIP1193Provider, networkName: string ): Promise { let version: string | undefined; - if (cachedIsHardhatNetwork === undefined) { + if (cachedIsDevelopmentNetwork === undefined) { try { version = (await provider.request({ method: "web3_clientVersion", })) as string; - cachedIsHardhatNetwork = version - .toLowerCase() - .startsWith("hardhatnetwork"); + cachedIsDevelopmentNetwork = + version.toLowerCase().startsWith("hardhatnetwork") || + version.toLowerCase().startsWith("anvil"); } catch (e) { - cachedIsHardhatNetwork = false; + cachedIsDevelopmentNetwork = false; } } - if (!cachedIsHardhatNetwork) { + if (!cachedIsDevelopmentNetwork) { throw new OnlyHardhatNetworkError(networkName, version); } - return cachedIsHardhatNetwork; + return cachedIsDevelopmentNetwork; } export async function getHardhatProvider(): Promise { @@ -37,7 +37,7 @@ export async function getHardhatProvider(): Promise { const provider = hre.network.provider; - await checkIfHardhatNetwork(provider, hre.network.name); + await checkIfDevelopmentNetwork(provider, hre.network.name); return hre.network.provider; } diff --git a/packages/hardhat-network-helpers/test/helpers/getStorageAt.ts b/packages/hardhat-network-helpers/test/helpers/getStorageAt.ts index 46de0a16241..06236298dc7 100644 --- a/packages/hardhat-network-helpers/test/helpers/getStorageAt.ts +++ b/packages/hardhat-network-helpers/test/helpers/getStorageAt.ts @@ -1,6 +1,6 @@ import { assert } from "chai"; import { BN } from "ethereumjs-util"; -import { ethers } from "ethers"; +import { ethers } from "ethers-v5"; import * as hh from "../../src"; import { BlockTag, NumberLike } from "../../src/types"; diff --git a/packages/hardhat-network-helpers/test/helpers/mine.ts b/packages/hardhat-network-helpers/test/helpers/mine.ts index 97945826d1b..8cf7674389a 100644 --- a/packages/hardhat-network-helpers/test/helpers/mine.ts +++ b/packages/hardhat-network-helpers/test/helpers/mine.ts @@ -1,6 +1,6 @@ import { assert } from "chai"; import { BN } from "ethereumjs-util"; -import { ethers } from "ethers"; +import { ethers } from "ethers-v5"; import * as hh from "../../src"; import { NumberLike } from "../../src/types"; diff --git a/packages/hardhat-network-helpers/test/helpers/mineUpTo.ts b/packages/hardhat-network-helpers/test/helpers/mineUpTo.ts index bce852065a8..3010630e270 100644 --- a/packages/hardhat-network-helpers/test/helpers/mineUpTo.ts +++ b/packages/hardhat-network-helpers/test/helpers/mineUpTo.ts @@ -1,6 +1,6 @@ import { assert } from "chai"; import { BN } from "ethereumjs-util"; -import { ethers } from "ethers"; +import { ethers } from "ethers-v5"; import * as hh from "../../src"; import { useEnvironment } from "../test-utils"; diff --git a/packages/hardhat-network-helpers/test/helpers/reset.ts b/packages/hardhat-network-helpers/test/helpers/reset.ts index 8a8845aea71..c312eea9535 100644 --- a/packages/hardhat-network-helpers/test/helpers/reset.ts +++ b/packages/hardhat-network-helpers/test/helpers/reset.ts @@ -1,9 +1,7 @@ import { assert } from "chai"; - import * as hh from "../../src"; import { INFURA_URL } from "../setup"; import { useEnvironment } from "../test-utils"; - describe("resetWithoutFork", function () { useEnvironment("simple"); @@ -26,12 +24,12 @@ describe("resetWithoutFork", function () { const mainnetBlockNumber = await hh.time.latestBlock(); - // fork goerli - await hh.reset(INFURA_URL.replace("mainnet", "goerli")); + // fork sepolia + await hh.reset(INFURA_URL.replace("mainnet", "sepolia")); - const goerliBlockNumber = await hh.time.latestBlock(); + const sepoliaBlockNumber = await hh.time.latestBlock(); - const blockNumberDelta = Math.abs(mainnetBlockNumber - goerliBlockNumber); + const blockNumberDelta = Math.abs(mainnetBlockNumber - sepoliaBlockNumber); // check that there is a significative difference between the latest // block numbers of each chain @@ -56,3 +54,13 @@ describe("resetWithoutFork", function () { assert.equal(olderMainnetBlockNumber, mainnetBlockNumber - 1000); }); }); + +describe("should clear snapshot upon reset", function () { + useEnvironment("simple"); + it("checks if the snapshot is cleared upon hardhat_reset", async function () { + const snapshotBeforeReset = await hh.takeSnapshot(); + await hh.reset(); + const snapshotAfterReset = await hh.takeSnapshot(); + assert.equal(snapshotBeforeReset.snapshotId, snapshotAfterReset.snapshotId); + }); +}); diff --git a/packages/hardhat-network-helpers/test/helpers/setBalance.ts b/packages/hardhat-network-helpers/test/helpers/setBalance.ts index 040a26a7707..1af4b3c88de 100644 --- a/packages/hardhat-network-helpers/test/helpers/setBalance.ts +++ b/packages/hardhat-network-helpers/test/helpers/setBalance.ts @@ -1,6 +1,6 @@ import { assert } from "chai"; import { BN } from "ethereumjs-util"; -import { ethers } from "ethers"; +import { ethers } from "ethers-v5"; import * as hh from "../../src"; import { NumberLike } from "../../src/types"; diff --git a/packages/hardhat-network-helpers/test/helpers/setBlockGasLimit.ts b/packages/hardhat-network-helpers/test/helpers/setBlockGasLimit.ts index 5604bf0f48a..0a717d924cf 100644 --- a/packages/hardhat-network-helpers/test/helpers/setBlockGasLimit.ts +++ b/packages/hardhat-network-helpers/test/helpers/setBlockGasLimit.ts @@ -1,6 +1,6 @@ import { assert } from "chai"; import { BN } from "ethereumjs-util"; -import { ethers } from "ethers"; +import { ethers } from "ethers-v5"; import * as hh from "../../src"; import { NumberLike } from "../../src/types"; diff --git a/packages/hardhat-network-helpers/test/helpers/setNextBlockBaseFeePerGas.ts b/packages/hardhat-network-helpers/test/helpers/setNextBlockBaseFeePerGas.ts index 85b078a25a4..e9404cb8912 100644 --- a/packages/hardhat-network-helpers/test/helpers/setNextBlockBaseFeePerGas.ts +++ b/packages/hardhat-network-helpers/test/helpers/setNextBlockBaseFeePerGas.ts @@ -1,6 +1,6 @@ import { assert } from "chai"; import { BN } from "ethereumjs-util"; -import { ethers } from "ethers"; +import { ethers } from "ethers-v5"; import * as hh from "../../src"; import { NumberLike } from "../../src/types"; diff --git a/packages/hardhat-network-helpers/test/helpers/setNonce.ts b/packages/hardhat-network-helpers/test/helpers/setNonce.ts index b1f5ea7a45a..2e619a72374 100644 --- a/packages/hardhat-network-helpers/test/helpers/setNonce.ts +++ b/packages/hardhat-network-helpers/test/helpers/setNonce.ts @@ -1,6 +1,6 @@ import { assert } from "chai"; import { BN } from "ethereumjs-util"; -import { ethers } from "ethers"; +import { ethers } from "ethers-v5"; import * as hh from "../../src"; import { NumberLike } from "../../src/types"; diff --git a/packages/hardhat-network-helpers/test/helpers/setPrevRandao.ts b/packages/hardhat-network-helpers/test/helpers/setPrevRandao.ts index a42db5b6ce9..b1dbe96060f 100644 --- a/packages/hardhat-network-helpers/test/helpers/setPrevRandao.ts +++ b/packages/hardhat-network-helpers/test/helpers/setPrevRandao.ts @@ -1,6 +1,6 @@ import { assert } from "chai"; import { BN } from "ethereumjs-util"; -import { ethers } from "ethers"; +import { ethers } from "ethers-v5"; import * as hh from "../../src"; import { NumberLike } from "../../src/types"; @@ -18,7 +18,7 @@ describe("setPrevRandao", function () { return BigInt(block.mixHash); }; - it("should allow setting the next block's prevrandao", async function () { + it("should allow setting the next block's prevRandao", async function () { await hh.setPrevRandao(12345); await hh.mine(); diff --git a/packages/hardhat-network-helpers/test/helpers/setStorageAt.ts b/packages/hardhat-network-helpers/test/helpers/setStorageAt.ts index 18aac66834c..62de3116291 100644 --- a/packages/hardhat-network-helpers/test/helpers/setStorageAt.ts +++ b/packages/hardhat-network-helpers/test/helpers/setStorageAt.ts @@ -1,6 +1,6 @@ import { assert } from "chai"; import { BN } from "ethereumjs-util"; -import { ethers } from "ethers"; +import { ethers } from "ethers-v5"; import * as hh from "../../src"; import { toPaddedRpcQuantity } from "../../src/utils"; diff --git a/packages/hardhat-network-helpers/test/helpers/time/advanceBlock.ts b/packages/hardhat-network-helpers/test/helpers/time/advanceBlock.ts index 352462d2718..ea7ffebbc60 100644 --- a/packages/hardhat-network-helpers/test/helpers/time/advanceBlock.ts +++ b/packages/hardhat-network-helpers/test/helpers/time/advanceBlock.ts @@ -1,6 +1,6 @@ import { assert } from "chai"; import { BN } from "ethereumjs-util"; -import { ethers } from "ethers"; +import { ethers } from "ethers-v5"; import * as hh from "../../../src"; import { NumberLike } from "../../../src/types"; diff --git a/packages/hardhat-network-helpers/test/helpers/time/advanceBlockTo.ts b/packages/hardhat-network-helpers/test/helpers/time/advanceBlockTo.ts index 44c4031bee1..6d6d6315e47 100644 --- a/packages/hardhat-network-helpers/test/helpers/time/advanceBlockTo.ts +++ b/packages/hardhat-network-helpers/test/helpers/time/advanceBlockTo.ts @@ -1,6 +1,6 @@ import { assert } from "chai"; import { BN } from "ethereumjs-util"; -import { ethers } from "ethers"; +import { ethers } from "ethers-v5"; import * as hh from "../../../src"; import { useEnvironment } from "../../test-utils"; diff --git a/packages/hardhat-network-helpers/test/helpers/time/increase.ts b/packages/hardhat-network-helpers/test/helpers/time/increase.ts index 719fa169a9b..ce14bc809ce 100644 --- a/packages/hardhat-network-helpers/test/helpers/time/increase.ts +++ b/packages/hardhat-network-helpers/test/helpers/time/increase.ts @@ -1,6 +1,6 @@ import { assert } from "chai"; import { BN } from "ethereumjs-util"; -import { ethers } from "ethers"; +import { ethers } from "ethers-v5"; import * as hh from "../../../src"; import { NumberLike } from "../../../src/types"; diff --git a/packages/hardhat-network-helpers/test/helpers/time/increaseTo.ts b/packages/hardhat-network-helpers/test/helpers/time/increaseTo.ts index 9e4301cd79c..b57c452149c 100644 --- a/packages/hardhat-network-helpers/test/helpers/time/increaseTo.ts +++ b/packages/hardhat-network-helpers/test/helpers/time/increaseTo.ts @@ -1,6 +1,6 @@ import { assert } from "chai"; import { BN } from "ethereumjs-util"; -import { ethers } from "ethers"; +import { ethers } from "ethers-v5"; import * as hh from "../../../src"; import { useEnvironment } from "../../test-utils"; @@ -91,6 +91,19 @@ describe("time#increaseTo", function () { assert.equal(newTimestamp, endTimestamp); assert(endTimestamp - initialTimestamp === 3600); }); + + it(`should accept an argument of type [Date]`, async function () { + const initialTimestamp = await hh.time.latest(); + + const newTimestamp = initialTimestamp + 3600; + // multiply by 1000 because Date accepts Epoch millis + await hh.time.increaseTo(new Date(newTimestamp * 1000)); + + const endTimestamp = await hh.time.latest(); + + assert.equal(newTimestamp, endTimestamp); + assert(endTimestamp - initialTimestamp === 3600); + }); }); }); diff --git a/packages/hardhat-shorthand/.gitignore b/packages/hardhat-shorthand/.gitignore index c00d7e72963..4aca21f18d7 100644 --- a/packages/hardhat-shorthand/.gitignore +++ b/packages/hardhat-shorthand/.gitignore @@ -15,10 +15,6 @@ # Logs logs *.log -npm-debug.log* -yarn-debug.log* -yarn-error.log* -lerna-debug.log* # Diagnostic reports (https://nodejs.org/api/report.html) report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json @@ -57,21 +53,15 @@ jspm_packages/ # TypeScript v1 declaration files typings/ -# Optional npm cache directory -.npm - # Optional eslint cache .eslintcache # Optional REPL history .node_repl_history -# Output of 'npm pack' +# Output of 'pnpm pack' *.tgz -# Yarn Integrity file -.yarn-integrity - # parcel-bundler cache (https://parceljs.org/) .cache diff --git a/packages/hardhat-shorthand/LICENSE b/packages/hardhat-shorthand/LICENSE index 3b8858c5558..3b7e8c7eabb 100644 --- a/packages/hardhat-shorthand/LICENSE +++ b/packages/hardhat-shorthand/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2019 Nomic Labs LLC +Copyright (c) 2023 Nomic Foundation Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/packages/hardhat-shorthand/package.json b/packages/hardhat-shorthand/package.json index 4bd3900b7ee..afb53737e16 100644 --- a/packages/hardhat-shorthand/package.json +++ b/packages/hardhat-shorthand/package.json @@ -17,13 +17,14 @@ "cli" ], "scripts": { - "lint": "yarn prettier --check && yarn eslint", - "lint:fix": "yarn prettier --write && yarn eslint --fix", + "lint": "pnpm prettier --check && pnpm eslint", + "lint:fix": "pnpm prettier --write && pnpm eslint --fix", "eslint": "eslint 'src/**/*.ts' 'test/**/*.ts'", "prettier": "prettier \"**/*.{js,md,json}\"", + "pretest": "cd ../.. && pnpm build", "test": "mocha --recursive \"test/**/*.ts\" --exit", "build": "tsc --build .", - "prepublishOnly": "yarn build", + "prepublishOnly": "pnpm build", "clean": "rimraf dist" }, "files": [ @@ -33,24 +34,28 @@ "README.md" ], "devDependencies": { + "@nomicfoundation/eslint-plugin-hardhat-internal-rules": "workspace:^", + "@nomicfoundation/eslint-plugin-slow-imports": "workspace:^", "@types/chai": "^4.2.0", + "@types/debug": "^4.1.4", "@types/fs-extra": "^5.1.0", "@types/mocha": ">=9.1.0", - "@types/node": "^14.0.0", - "@typescript-eslint/eslint-plugin": "5.53.0", - "@typescript-eslint/parser": "5.53.0", + "@types/node": "^16.0.0", + "@types/semver": "^6.0.2", + "@typescript-eslint/eslint-plugin": "5.61.0", + "@typescript-eslint/parser": "5.61.0", "chai": "^4.2.0", - "eslint": "^7.29.0", + "eslint": "^8.44.0", "eslint-config-prettier": "8.3.0", - "eslint-plugin-import": "2.24.1", + "eslint-plugin-import": "2.27.5", "eslint-plugin-no-only-tests": "3.0.0", "eslint-plugin-prettier": "3.4.0", - "hardhat": "^2.0.0", + "hardhat": "workspace:^2.0.0", "mocha": "^10.0.0", "prettier": "2.4.1", "rimraf": "^3.0.2", "ts-node": "^10.8.0", - "typescript": "~4.7.4" + "typescript": "~5.0.0" }, "dependencies": { "@fvictorio/tabtab": "^0.0.3", diff --git a/packages/hardhat-shorthand/src/completion.ts b/packages/hardhat-shorthand/src/completion.ts old mode 100755 new mode 100644 diff --git a/packages/hardhat-shorthand/src/index.ts b/packages/hardhat-shorthand/src/index.ts old mode 100755 new mode 100644 diff --git a/packages/hardhat-solhint/.eslintrc.js b/packages/hardhat-solhint/.eslintrc.js index 889740f226d..c6de07705a1 100644 --- a/packages/hardhat-solhint/.eslintrc.js +++ b/packages/hardhat-solhint/.eslintrc.js @@ -1,7 +1,24 @@ +const { + slowImportsCommonIgnoredModules, +} = require("../../config/eslint/constants"); + module.exports = { extends: [`${__dirname}/../../config/eslint/eslintrc.js`], parserOptions: { project: `${__dirname}/tsconfig.json`, sourceType: "module", }, + overrides: [ + { + files: ["src/index.ts"], + rules: { + "@nomicfoundation/slow-imports/no-top-level-external-import": [ + "error", + { + ignoreModules: [...slowImportsCommonIgnoredModules], + }, + ], + }, + }, + ], }; diff --git a/packages/hardhat-solhint/.gitignore b/packages/hardhat-solhint/.gitignore index c00d7e72963..4aca21f18d7 100644 --- a/packages/hardhat-solhint/.gitignore +++ b/packages/hardhat-solhint/.gitignore @@ -15,10 +15,6 @@ # Logs logs *.log -npm-debug.log* -yarn-debug.log* -yarn-error.log* -lerna-debug.log* # Diagnostic reports (https://nodejs.org/api/report.html) report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json @@ -57,21 +53,15 @@ jspm_packages/ # TypeScript v1 declaration files typings/ -# Optional npm cache directory -.npm - # Optional eslint cache .eslintcache # Optional REPL history .node_repl_history -# Output of 'npm pack' +# Output of 'pnpm pack' *.tgz -# Yarn Integrity file -.yarn-integrity - # parcel-bundler cache (https://parceljs.org/) .cache diff --git a/packages/hardhat-solhint/CHANGELOG.md b/packages/hardhat-solhint/CHANGELOG.md index 97e3f64503d..a0060168883 100644 --- a/packages/hardhat-solhint/CHANGELOG.md +++ b/packages/hardhat-solhint/CHANGELOG.md @@ -1,5 +1,24 @@ # @nomiclabs/hardhat-solhint +## 4.0.1 + +### Patch Changes + +- efa905d: Fix for corrupted Hardhat peer dependency version from pnpm. + +## 4.0.0 + +### Major Changes + +- cc79bd7: Ensured the check task exits with exit code 1 when solhint raises any errors; this is a breaking change since the check task would previously always exit with exit code 0 +- 9cae5e7: Updated solhint dependency to [v5.0.2](https://github.com/protofire/solhint/releases/tag/v5.0.2) + +## 3.1.0 + +### Minor Changes + +- bcb688f: Added support for `.solhintignore` files (thanks @yhuard!) + ## 3.0.1 ### Patch Changes diff --git a/packages/hardhat-solhint/LICENSE b/packages/hardhat-solhint/LICENSE index 3b8858c5558..3b7e8c7eabb 100644 --- a/packages/hardhat-solhint/LICENSE +++ b/packages/hardhat-solhint/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2019 Nomic Labs LLC +Copyright (c) 2023 Nomic Foundation Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/packages/hardhat-solhint/package.json b/packages/hardhat-solhint/package.json index eee048881f0..c1f15363d05 100644 --- a/packages/hardhat-solhint/package.json +++ b/packages/hardhat-solhint/package.json @@ -18,13 +18,14 @@ "linter" ], "scripts": { - "lint": "yarn prettier --check && yarn eslint", - "lint:fix": "yarn prettier --write && yarn eslint --fix", + "lint": "pnpm prettier --check && pnpm eslint", + "lint:fix": "pnpm prettier --write && pnpm eslint --fix", "eslint": "eslint 'src/**/*.ts' 'test/**/*.ts'", "prettier": "prettier \"**/*.{js,md,json}\"", + "pretest": "cd ../.. && pnpm build", "test": "mocha --recursive \"test/**/*.ts\" --exit", "build": "tsc --build .", - "prepublishOnly": "yarn build", + "prepublishOnly": "pnpm build", "clean": "rimraf dist" }, "files": [ @@ -37,26 +38,29 @@ "solhint": "^3.4.0" }, "devDependencies": { + "@nomicfoundation/eslint-plugin-hardhat-internal-rules": "workspace:^", + "@nomicfoundation/eslint-plugin-slow-imports": "workspace:^", "@types/chai": "^4.2.0", "@types/fs-extra": "^5.1.0", "@types/mocha": ">=9.1.0", - "@types/node": "^14.0.0", - "@typescript-eslint/eslint-plugin": "5.53.0", - "@typescript-eslint/parser": "5.53.0", + "@types/node": "^16.0.0", + "@types/sinon": "^9.0.8", + "@typescript-eslint/eslint-plugin": "5.61.0", + "@typescript-eslint/parser": "5.61.0", "chai": "^4.2.0", - "eslint": "^7.29.0", + "eslint": "^8.44.0", "eslint-config-prettier": "8.3.0", - "eslint-plugin-import": "2.24.1", + "eslint-plugin-import": "2.27.5", "eslint-plugin-no-only-tests": "3.0.0", "eslint-plugin-prettier": "3.4.0", "fs-extra": "^7.0.1", - "hardhat": "^2.0.0", + "hardhat": "workspace:^2.0.0", "mocha": "^10.0.0", "prettier": "2.4.1", "rimraf": "^3.0.2", "sinon": "^9.0.0", "ts-node": "^10.8.0", - "typescript": "~4.7.4" + "typescript": "~5.0.0" }, "peerDependencies": { "hardhat": "^2.0.0" diff --git a/packages/hardhat-solhint/src/index.ts b/packages/hardhat-solhint/src/index.ts index fabe552bd41..5b5c6a514e4 100644 --- a/packages/hardhat-solhint/src/index.ts +++ b/packages/hardhat-solhint/src/index.ts @@ -1,7 +1,7 @@ import * as fs from "fs"; import { subtask, task } from "hardhat/config"; import { NomicLabsHardhatPluginError } from "hardhat/internal/core/errors"; -import { join } from "path"; +import { join, relative } from "path"; function getDefaultConfig() { return { @@ -43,6 +43,19 @@ async function hasConfigFile(rootDirectory: string) { return false; } +function readIgnore(rootDirectory: string) { + try { + return fs + .readFileSync(join(rootDirectory, ".solhintignore")) + .toString() + .split("\n") + .map((i) => i.trim()) + .filter(Boolean); + } catch (e) { + return []; + } +} + async function getSolhintConfig(rootDirectory: string) { let solhintConfig; const { @@ -73,6 +86,14 @@ async function getSolhintConfig(rootDirectory: string) { ); } + const configExcludeFiles = Array.isArray(solhintConfig.excludedFiles) + ? solhintConfig.excludedFiles + : []; + solhintConfig.excludedFiles = [ + ...configExcludeFiles, + ...readIgnore(rootDirectory), + ]; + return solhintConfig; } @@ -83,10 +104,19 @@ function printReport(reports: any) { subtask("hardhat-solhint:run-solhint", async (_, { config }) => { const { processPath } = require("solhint/lib/index"); - return processPath( - join(config.paths.sources, "**", "*.sol").replace(/\\/g, "/"), - await getSolhintConfig(config.paths.root) - ); + + // Create a glob pattern that matches all the .sol files within the sources folder + const solFilesGlob = join(config.paths.sources, "**", "*.sol"); + + // Make glob pattern relative to Hardhat's root directory + // See https://github.com/kaelzhang/node-ignore/tree/5.2.4#1-pathname-should-be-a-pathrelatived-pathname + const relativeGlob = relative(config.paths.root, solFilesGlob); + + // Fix for Windows users: replace back-slashes with forward-slashes + // See https://github.com/isaacs/node-glob/tree/v8.0.3#windows + const normalizedGlob = relativeGlob.replace(/\\/g, "/"); + + return processPath(normalizedGlob, await getSolhintConfig(config.paths.root)); }); task("check", async (_, { run }, runSuper) => { @@ -97,4 +127,16 @@ task("check", async (_, { run }, runSuper) => { const reports = await run("hardhat-solhint:run-solhint"); printReport(reports); + + const errorsCount = reports.reduce( + (acc: number, i: { errorCount: number }) => { + return acc + i.errorCount; + }, + 0 + ); + + if (errorsCount > 0) { + process.exitCode = 1; + return; + } }); diff --git a/packages/hardhat-solhint/test/fixture-projects/no-errors-project/.solhint.json b/packages/hardhat-solhint/test/fixture-projects/no-errors-project/.solhint.json new file mode 100644 index 00000000000..3b8ee84ad41 --- /dev/null +++ b/packages/hardhat-solhint/test/fixture-projects/no-errors-project/.solhint.json @@ -0,0 +1,3 @@ +{ + "extends": "solhint:all" +} diff --git a/packages/hardhat-solhint/test/fixture-projects/no-errors-project/contracts/Greeter.sol b/packages/hardhat-solhint/test/fixture-projects/no-errors-project/contracts/Greeter.sol new file mode 100644 index 00000000000..38d74f1e21a --- /dev/null +++ b/packages/hardhat-solhint/test/fixture-projects/no-errors-project/contracts/Greeter.sol @@ -0,0 +1,15 @@ +pragma solidity ^0.8.28; + + +contract Greeter { + + string greeting; + constructor(string memory _greeting) public { + greeting = _greeting; + } + + function greet() public view returns (string memory) { + return greeting; + } + +} diff --git a/packages/hardhat-web3-legacy/test/fixture-projects/hardhat-project/hardhat.config.js b/packages/hardhat-solhint/test/fixture-projects/no-errors-project/hardhat.config.js similarity index 100% rename from packages/hardhat-web3-legacy/test/fixture-projects/hardhat-project/hardhat.config.js rename to packages/hardhat-solhint/test/fixture-projects/no-errors-project/hardhat.config.js diff --git a/packages/hardhat-solhint/test/fixture-projects/solhintignore-project/.solhint.json b/packages/hardhat-solhint/test/fixture-projects/solhintignore-project/.solhint.json new file mode 100644 index 00000000000..d5ee2d67005 --- /dev/null +++ b/packages/hardhat-solhint/test/fixture-projects/solhintignore-project/.solhint.json @@ -0,0 +1,4 @@ +{ + "extends": "solhint:all", + "excludedFiles": ["contracts/Greeter3.sol"] +} diff --git a/packages/hardhat-solhint/test/fixture-projects/solhintignore-project/.solhintignore b/packages/hardhat-solhint/test/fixture-projects/solhintignore-project/.solhintignore new file mode 100644 index 00000000000..847f2d4893d --- /dev/null +++ b/packages/hardhat-solhint/test/fixture-projects/solhintignore-project/.solhintignore @@ -0,0 +1 @@ +contracts/Greeter2.sol diff --git a/packages/hardhat-vyper/test/fixture-projects/mixed-language/contracts/Greeter.sol b/packages/hardhat-solhint/test/fixture-projects/solhintignore-project/contracts/Greeter.sol similarity index 100% rename from packages/hardhat-vyper/test/fixture-projects/mixed-language/contracts/Greeter.sol rename to packages/hardhat-solhint/test/fixture-projects/solhintignore-project/contracts/Greeter.sol diff --git a/packages/hardhat-solhint/test/fixture-projects/solhintignore-project/contracts/Greeter2.sol b/packages/hardhat-solhint/test/fixture-projects/solhintignore-project/contracts/Greeter2.sol new file mode 100644 index 00000000000..3fbd23afe6c --- /dev/null +++ b/packages/hardhat-solhint/test/fixture-projects/solhintignore-project/contracts/Greeter2.sol @@ -0,0 +1,15 @@ +pragma solidity ^0.5.1; + +contract Greeter2 { + string greeting; + string bad; + + constructor(string memory _greeting) public { + greeting = _greeting; + bad = "baaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaad"; + } + + function greet() public view returns (string memory) { + return greeting; + } +} diff --git a/packages/hardhat-solhint/test/fixture-projects/solhintignore-project/contracts/Greeter3.sol b/packages/hardhat-solhint/test/fixture-projects/solhintignore-project/contracts/Greeter3.sol new file mode 100644 index 00000000000..8d82db2ef04 --- /dev/null +++ b/packages/hardhat-solhint/test/fixture-projects/solhintignore-project/contracts/Greeter3.sol @@ -0,0 +1,15 @@ +pragma solidity ^0.5.1; + +contract Greeter3 { + string greeting; + string bad; + + constructor(string memory _greeting) public { + greeting = _greeting; + bad = "baaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaad"; + } + + function greet() public view returns (string memory) { + return greeting; + } +} diff --git a/packages/hardhat-web3/test/fixture-projects/hardhat-project/hardhat.config.js b/packages/hardhat-solhint/test/fixture-projects/solhintignore-project/hardhat.config.js similarity index 100% rename from packages/hardhat-web3/test/fixture-projects/hardhat-project/hardhat.config.js rename to packages/hardhat-solhint/test/fixture-projects/solhintignore-project/hardhat.config.js diff --git a/packages/hardhat-solhint/test/tests.ts b/packages/hardhat-solhint/test/tests.ts index 690c0a00db8..9247b337741 100644 --- a/packages/hardhat-solhint/test/tests.ts +++ b/packages/hardhat-solhint/test/tests.ts @@ -36,11 +36,50 @@ describe("Solhint plugin", function () { ); }); - it("should run the check task without throwing an error", async function () { + it("should run the check task and set the exit code to 1", async function () { const consoleLogStub = sinon.stub(console, "log"); await this.env.run("check"); assert.isTrue(consoleLogStub.calledOnce); + assert.strictEqual(process.exitCode, 1); consoleLogStub.restore(); + process.exitCode = undefined; + }); + }); + + describe("Project with no errors", function () { + useEnvironment("no-errors-project"); + + it("should run the check task and not set the exit code", async function () { + const consoleLogStub = sinon.stub(console, "log"); + await this.env.run("check"); + assert.isTrue(consoleLogStub.calledOnce); + assert.strictEqual(process.exitCode, undefined); + }); + }); + + describe("Project with .solhintignore file", function () { + useEnvironment("solhintignore-project"); + + it("should not return a report for the ignored files", async function () { + const reports = await this.env.run("hardhat-solhint:run-solhint"); + // Greeter.sol is not ignored, Solhint should return a report + assert.isTrue( + reports.some((report: any) => + report.file.includes("contracts/Greeter.sol") + ) + ); + // Greeter2.sol is ignored in the .solhintignore file, Solhint should not return a report + assert.isFalse( + reports.some((report: any) => + report.file.includes("contracts/Greeter2.sol") + ) + ); + // Greeter3.sol is ignored in the .solhint.json file, Solhint should not return a report + assert.isFalse( + reports.some((report: any) => + report.file.includes("contracts/Greeter2.sol") + ) + ); }); }); diff --git a/packages/hardhat-solpp/.eslintrc.js b/packages/hardhat-solpp/.eslintrc.js index 889740f226d..c6de07705a1 100644 --- a/packages/hardhat-solpp/.eslintrc.js +++ b/packages/hardhat-solpp/.eslintrc.js @@ -1,7 +1,24 @@ +const { + slowImportsCommonIgnoredModules, +} = require("../../config/eslint/constants"); + module.exports = { extends: [`${__dirname}/../../config/eslint/eslintrc.js`], parserOptions: { project: `${__dirname}/tsconfig.json`, sourceType: "module", }, + overrides: [ + { + files: ["src/index.ts"], + rules: { + "@nomicfoundation/slow-imports/no-top-level-external-import": [ + "error", + { + ignoreModules: [...slowImportsCommonIgnoredModules], + }, + ], + }, + }, + ], }; diff --git a/packages/hardhat-solpp/.gitignore b/packages/hardhat-solpp/.gitignore index c00d7e72963..4aca21f18d7 100644 --- a/packages/hardhat-solpp/.gitignore +++ b/packages/hardhat-solpp/.gitignore @@ -15,10 +15,6 @@ # Logs logs *.log -npm-debug.log* -yarn-debug.log* -yarn-error.log* -lerna-debug.log* # Diagnostic reports (https://nodejs.org/api/report.html) report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json @@ -57,21 +53,15 @@ jspm_packages/ # TypeScript v1 declaration files typings/ -# Optional npm cache directory -.npm - # Optional eslint cache .eslintcache # Optional REPL history .node_repl_history -# Output of 'npm pack' +# Output of 'pnpm pack' *.tgz -# Yarn Integrity file -.yarn-integrity - # parcel-bundler cache (https://parceljs.org/) .cache diff --git a/packages/hardhat-solpp/LICENSE b/packages/hardhat-solpp/LICENSE index 3b8858c5558..3b7e8c7eabb 100644 --- a/packages/hardhat-solpp/LICENSE +++ b/packages/hardhat-solpp/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2019 Nomic Labs LLC +Copyright (c) 2023 Nomic Foundation Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/packages/hardhat-solpp/README.md b/packages/hardhat-solpp/README.md index 386490a54cf..760e72d35f9 100644 --- a/packages/hardhat-solpp/README.md +++ b/packages/hardhat-solpp/README.md @@ -38,7 +38,7 @@ Install it, run `npx hardhat compile` and solc will compile the solpp generated ## Configuration -This plugin can by configured by setting a `solpp` entry in `hardhat.config.js`. Its options are: +This plugin can be configured by setting a `solpp` entry in `hardhat.config.js`. Its options are: - `defs`: is an object where each property is the symbol's name and its value is the actual definition. Definitions can be numbers, string, expressions, lists, or functions. For more detail about symbols you can check [solpp README](https://github.com/merklejerk/solpp). - `cwd: string`: directory where the contracts are located, it will be used for flattening purposes, by default it will be the project's source directory. diff --git a/packages/hardhat-solpp/package.json b/packages/hardhat-solpp/package.json index 790862f71c4..c6be7b6cdad 100644 --- a/packages/hardhat-solpp/package.json +++ b/packages/hardhat-solpp/package.json @@ -18,13 +18,14 @@ "solpp" ], "scripts": { - "lint": "yarn prettier --check && yarn eslint", - "lint:fix": "yarn prettier --write && yarn eslint --fix", + "lint": "pnpm prettier --check && pnpm eslint", + "lint:fix": "pnpm prettier --write && pnpm eslint --fix", "eslint": "eslint 'src/**/*.ts' 'test/**/*.ts'", "prettier": "prettier \"**/*.{js,md,json}\"", + "pretest": "cd ../.. && pnpm build", "test": "mocha --recursive \"test/**/*.ts\" --exit", "build": "tsc --build .", - "prepublishOnly": "yarn build", + "prepublishOnly": "pnpm build", "clean": "rimraf dist" }, "files": [ @@ -38,24 +39,26 @@ "solpp": "^0.11.5" }, "devDependencies": { + "@nomicfoundation/eslint-plugin-hardhat-internal-rules": "workspace:^", + "@nomicfoundation/eslint-plugin-slow-imports": "workspace:^", "@types/chai": "^4.2.0", "@types/fs-extra": "^5.1.0", "@types/mocha": ">=9.1.0", - "@types/node": "^14.0.0", - "@typescript-eslint/eslint-plugin": "5.53.0", - "@typescript-eslint/parser": "5.53.0", + "@types/node": "^16.0.0", + "@typescript-eslint/eslint-plugin": "5.61.0", + "@typescript-eslint/parser": "5.61.0", "chai": "^4.2.0", - "eslint": "^7.29.0", + "eslint": "^8.44.0", "eslint-config-prettier": "8.3.0", - "eslint-plugin-import": "2.24.1", + "eslint-plugin-import": "2.27.5", "eslint-plugin-no-only-tests": "3.0.0", "eslint-plugin-prettier": "3.4.0", - "hardhat": "^2.0.0", + "hardhat": "workspace:^2.0.0", "mocha": "^10.0.0", "prettier": "2.4.1", "rimraf": "^3.0.2", "ts-node": "^10.8.0", - "typescript": "~4.7.4" + "typescript": "~5.0.0" }, "peerDependencies": { "hardhat": "^2.0.0" diff --git a/packages/hardhat-solpp/test/fixture-projects/hardhat-project/contracts/B.sol b/packages/hardhat-solpp/test/fixture-projects/hardhat-project/contracts/B.sol index 0fddf74bc48..b8f8d01ed80 100644 --- a/packages/hardhat-solpp/test/fixture-projects/hardhat-project/contracts/B.sol +++ b/packages/hardhat-solpp/test/fixture-projects/hardhat-project/contracts/B.sol @@ -2,7 +2,7 @@ pragma solidity >=0.4.21 <0.6.0; contract B { function bar(uint256 x) pure returns (uint256) { - // Repeat code with a a for loop. + // Repeat code with a for loop. return x /* #for V in range(1,4) */+ $$(V+1)/* #done */; // -> return x + 1 + 2 + 3; } } diff --git a/packages/hardhat-solpp/test/tests.ts b/packages/hardhat-solpp/test/tests.ts index 02cce468da0..5da69c1ee40 100644 --- a/packages/hardhat-solpp/test/tests.ts +++ b/packages/hardhat-solpp/test/tests.ts @@ -19,8 +19,8 @@ export async function expectErrorAsync( } } -describe("Solpp plugin", async function () { - describe("js-config-project", async function () { +describe("Solpp plugin", function () { + describe("js-config-project", function () { useEnvironment("js-config-project"); it("should evaluate symbols as javascript functions", async function () { @@ -36,7 +36,7 @@ describe("Solpp plugin", async function () { }); }); - describe("json-config-project", async function () { + describe("json-config-project", function () { useEnvironment("json-config-project"); it("should load definitions from json", async function () { @@ -54,7 +54,7 @@ describe("Solpp plugin", async function () { }); }); - describe("hardhat-project", async function () { + describe("hardhat-project", function () { useEnvironment("hardhat-project"); it("should create processed contracts in the cache directory", async function () { @@ -102,7 +102,7 @@ describe("Solpp plugin", async function () { }); // This test skipped because solpp won't fail if a contract has an non-defined symbol. - describe.skip("fail-project", async function () { + describe.skip("fail-project", function () { useEnvironment("fail-project"); it("should fail when symbol does not exist", async function () { diff --git a/packages/hardhat-toolbox-viem/.eslintrc.js b/packages/hardhat-toolbox-viem/.eslintrc.js new file mode 100644 index 00000000000..44ed8ed6d59 --- /dev/null +++ b/packages/hardhat-toolbox-viem/.eslintrc.js @@ -0,0 +1,7 @@ +module.exports = { + extends: [`${__dirname}/../../config/eslint/eslintrc.js`], + parserOptions: { + project: `${__dirname}/src/tsconfig.json`, + sourceType: "module", + }, +}; diff --git a/packages/hardhat-toolbox-viem/.gitignore b/packages/hardhat-toolbox-viem/.gitignore new file mode 100644 index 00000000000..bf1014bb516 --- /dev/null +++ b/packages/hardhat-toolbox-viem/.gitignore @@ -0,0 +1,92 @@ +# Node modules +/node_modules + +# Compilation output +/build-test/ +/dist +/internal +/*.js +/*.js.map +/*.d.ts +/*.d.ts.map + +!.eslintrc.js + +# Code coverage artifacts +/coverage +/.nyc_output + +# Below is Github's node gitignore template, +# ignoring the node_modules part, as it'd ignore every node_modules, and we have some for testing + +# Logs +logs +*.log + +# Diagnostic reports (https://nodejs.org/api/report.html) +report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +#node_modules/ +jspm_packages/ + +# TypeScript v1 declaration files +typings/ + +# Optional eslint cache +.eslintcache + +# Optional REPL history +.node_repl_history + +# Output of 'pnpm pack' +*.tgz + +# parcel-bundler cache (https://parceljs.org/) +.cache + +# next.js build output +.next + +# nuxt.js build output +.nuxt + +# vuepress build output +.vuepress/dist + +# Serverless directories +.serverless/ + +# FuseBox cache +.fusebox/ + +# DynamoDB Local files +.dynamodb/ + diff --git a/packages/hardhat-toolbox-viem/.mocharc.json b/packages/hardhat-toolbox-viem/.mocharc.json new file mode 100644 index 00000000000..d00ceb4138e --- /dev/null +++ b/packages/hardhat-toolbox-viem/.mocharc.json @@ -0,0 +1,5 @@ +{ + "require": "ts-node/register/files", + "ignore": ["test/fixture-projects/**/*"], + "timeout": 10000 +} diff --git a/packages/hardhat-toolbox-viem/.prettierignore b/packages/hardhat-toolbox-viem/.prettierignore new file mode 100644 index 00000000000..1961b8ba509 --- /dev/null +++ b/packages/hardhat-toolbox-viem/.prettierignore @@ -0,0 +1,13 @@ +/node_modules +/dist +/internal +/test/fixture-projects/**/artifacts +/test/fixture-projects/**/artifacts-dir +/test/fixture-projects/**/cache +/*.d.ts +/*.d.ts.map +/*.js +/*.js.map +/build-test +CHANGELOG.md +!.eslintrc.js diff --git a/packages/hardhat-toolbox-viem/CHANGELOG.md b/packages/hardhat-toolbox-viem/CHANGELOG.md new file mode 100644 index 00000000000..3d01d2bd31b --- /dev/null +++ b/packages/hardhat-toolbox-viem/CHANGELOG.md @@ -0,0 +1,7 @@ +# @nomicfoundation/hardhat-toolbox-viem + +## 2.0.0 + +### Major Changes + +- 23665f399: Upgraded hardhat-verify dependency diff --git a/packages/hardhat-toolbox-viem/LICENSE b/packages/hardhat-toolbox-viem/LICENSE new file mode 100644 index 00000000000..3b7e8c7eabb --- /dev/null +++ b/packages/hardhat-toolbox-viem/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2023 Nomic Foundation + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/packages/hardhat-toolbox-viem/README.md b/packages/hardhat-toolbox-viem/README.md new file mode 100644 index 00000000000..c6ec6480442 --- /dev/null +++ b/packages/hardhat-toolbox-viem/README.md @@ -0,0 +1,28 @@ +[![npm](https://img.shields.io/npm/v/@nomicfoundation/hardhat-toolbox-viem.svg)](https://www.npmjs.com/package/@nomicfoundation/hardhat-toolbox-viem) [![hardhat](https://hardhat.org/buidler-plugin-badge.svg?1)](https://hardhat.org) + +# Hardhat Toolbox (Viem based) + +The `@nomicfoundation/hardhat-toolbox-viem` plugin bundles all the commonly used packages and Hardhat plugins we recommend to start developing with Hardhat. + +When you use this plugin, you'll be able to: + +- Deploy and interact with your contracts using [Viem](https://viem.sh/) and the [`hardhat-viem`](https://hardhat.org/hardhat-runner/plugins/nomicfoundation-hardhat-viem) plugin. +- Test your contracts with [Mocha](https://mochajs.org/), [Chai](https://chaijs.com/) and [Chai as Promised](https://github.com/domenic/chai-as-promised#chai-assertions-for-promises). Note: the plugin Hardhat Chai Matchers is currently not available for Viem. +- Interact with Hardhat Network with our [Hardhat Network Helpers](https://hardhat.org/hardhat-network-helpers). +- Verify the source code of your contracts with the [hardhat-verify](https://hardhat.org/hardhat-runner/plugins/nomicfoundation-hardhat-verify) plugin. +- Get metrics on the gas used by your contracts with the [hardhat-gas-reporter](https://github.com/cgewecke/hardhat-gas-reporter) plugin. +- Measure your tests coverage with [solidity-coverage](https://github.com/sc-forks/solidity-coverage). + +**Note:** you might want to pin Viem-related dependencies because Viem does not strictly follow semantic versioning for type changes. You can read more [here](https://hardhat.org/hardhat-runner/docs/advanced/using-viem#managing-types-and-version-stability). + +### Usage + +To create a new project that uses the Toolbox, check our [Setting up a project guide](https://hardhat.org/hardhat-runner/docs/guides/project-setup) but select the _Create a TypeScript project (with Viem)_ option instead. + +### Network Helpers + +When the Toolbox is installed using npm 7 or later, its peer dependencies are automatically installed. However, these dependencies won't be listed in the `package.json`. As a result, directly importing the Network Helpers can be problematic for certain tools or IDEs. To address this issue, the Toolbox re-exports the Hardhat Network Helpers. You can use them like this: + +```ts +import helpers from "@nomicfoundation/hardhat-toolbox/network-helpers"; +``` diff --git a/packages/hardhat-toolbox-viem/package.json b/packages/hardhat-toolbox-viem/package.json new file mode 100644 index 00000000000..4d72c811226 --- /dev/null +++ b/packages/hardhat-toolbox-viem/package.json @@ -0,0 +1,95 @@ +{ + "name": "@nomicfoundation/hardhat-toolbox-viem", + "version": "2.0.0", + "description": "Nomic Foundation's recommended bundle of Hardhat plugins (viem based)", + "repository": "github:nomicfoundation/hardhat", + "homepage": "https://github.com/nomicfoundation/hardhat/tree/main/packages/hardhat-toolbox-viem", + "author": "Nomic Foundation", + "contributors": [ + "Nomic Foundation" + ], + "license": "MIT", + "main": "index.js", + "types": "index.d.ts", + "keywords": [ + "ethereum", + "smart-contracts", + "hardhat", + "hardhat-plugin", + "hardhat-viem" + ], + "scripts": { + "lint": "pnpm prettier --check && pnpm eslint", + "lint:fix": "pnpm prettier --write && pnpm eslint --fix", + "eslint": "eslint 'src/**/*.ts' 'test/**/*.ts'", + "prettier": "prettier \"**/*.{js,md,json}\"", + "pretest": "cd ../.. && pnpm build", + "test": "mocha --recursive \"test/**/*.ts\" --exit", + "build": "tsc --build .", + "prepublishOnly": "pnpm build", + "clean": "rimraf dist *.{d.ts,js}{,.map} build-test tsconfig.tsbuildinfo" + }, + "files": [ + "src/", + "internal/", + "*.d.ts", + "*.d.ts.map", + "*.js", + "*.js.map", + "LICENSE", + "README.md" + ], + "dependencies": { + "chai-as-promised": "^7.1.1" + }, + "devDependencies": { + "@nomicfoundation/eslint-plugin-hardhat-internal-rules": "workspace:^", + "@nomicfoundation/eslint-plugin-slow-imports": "workspace:^", + "@nomicfoundation/hardhat-network-helpers": "workspace:^1.0.0", + "@nomicfoundation/hardhat-verify": "workspace:^2.0.0", + "@nomicfoundation/hardhat-viem": "workspace:^1.0.0", + "@types/chai": "^4.2.0", + "@types/chai-as-promised": "^7.1.6", + "@types/mocha": ">=9.1.0", + "@types/node": "^16.0.0", + "@typescript-eslint/eslint-plugin": "5.61.0", + "@typescript-eslint/parser": "5.61.0", + "chai": "^4.2.0", + "eslint": "^8.44.0", + "eslint-config-prettier": "8.3.0", + "eslint-plugin-import": "2.27.5", + "eslint-plugin-no-only-tests": "3.0.0", + "eslint-plugin-prettier": "3.4.0", + "hardhat": "workspace:^2.11.0", + "hardhat-gas-reporter": "^1.0.8", + "mocha": "^10.0.0", + "prettier": "2.4.1", + "rimraf": "^3.0.2", + "solidity-coverage": "^0.8.1", + "ts-node": "^10.8.0", + "typescript": "~5.0.4", + "viem": "^1.15.1" + }, + "peerDependencies": { + "@nomicfoundation/hardhat-network-helpers": "^1.0.0", + "@nomicfoundation/hardhat-verify": "^2.0.0", + "@nomicfoundation/hardhat-viem": "^1.0.0", + "@types/chai": "^4.2.0", + "@types/chai-as-promised": "^7.1.6", + "@types/mocha": ">=9.1.0", + "@types/node": ">=16.0.0", + "chai": "^4.2.0", + "hardhat": "^2.11.0", + "hardhat-gas-reporter": "^1.0.8", + "solidity-coverage": "^0.8.1", + "ts-node": ">=8.0.0", + "typescript": "~5.0.4", + "viem": "^1.15.1" + }, + "bugs": { + "url": "https://github.com/nomicfoundation/hardhat/issues" + }, + "directories": { + "test": "test" + } +} diff --git a/packages/hardhat-toolbox-viem/src/index.ts b/packages/hardhat-toolbox-viem/src/index.ts new file mode 100644 index 00000000000..c3e0f8d0f3d --- /dev/null +++ b/packages/hardhat-toolbox-viem/src/index.ts @@ -0,0 +1,38 @@ +import "@nomicfoundation/hardhat-verify"; +import "@nomicfoundation/hardhat-viem"; +import "hardhat-gas-reporter"; +import "solidity-coverage"; +import "./internal/chai-setup"; + +/** + * If a new official plugin is added, make sure to update: + * - The tsconfig.json file + * - The hardhat-toolbox GitHub workflow + * - The parts of the documentation that install hardhat-toolbox with npm 6 or yarn + * - The list of dependencies that the sample projects install + * - The README + */ + +import { extendConfig } from "hardhat/config"; + +extendConfig((config, userConfig) => { + const configAsAny = config as any; + + // hardhat-gas-reporter doesn't use extendConfig, so + // the values of config.gasReporter and userConfig.gasReporter + // are the same. The userConfigVersion is frozen though, so we + // shouldn't use it. + const gasReporterConfig = + configAsAny.gasReporter as typeof userConfig.gasReporter; + + configAsAny.gasReporter = gasReporterConfig ?? {}; + + if (gasReporterConfig?.enabled === undefined) { + // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions + configAsAny.gasReporter.enabled = process.env.REPORT_GAS ? true : false; + } + + if (gasReporterConfig?.currency === undefined) { + configAsAny.gasReporter.currency = "USD"; + } +}); diff --git a/packages/hardhat-toolbox-viem/src/internal/chai-setup.ts b/packages/hardhat-toolbox-viem/src/internal/chai-setup.ts new file mode 100644 index 00000000000..c0c8e71856c --- /dev/null +++ b/packages/hardhat-toolbox-viem/src/internal/chai-setup.ts @@ -0,0 +1,4 @@ +import chai from "chai"; +import chaiAsPromised from "chai-as-promised"; + +chai.use(chaiAsPromised); diff --git a/packages/hardhat-toolbox-viem/src/network-helpers.ts b/packages/hardhat-toolbox-viem/src/network-helpers.ts new file mode 100644 index 00000000000..71747baddc6 --- /dev/null +++ b/packages/hardhat-toolbox-viem/src/network-helpers.ts @@ -0,0 +1 @@ +export * from "@nomicfoundation/hardhat-network-helpers"; diff --git a/packages/hardhat-toolbox-viem/src/tsconfig.json b/packages/hardhat-toolbox-viem/src/tsconfig.json new file mode 100644 index 00000000000..a703f8f42e2 --- /dev/null +++ b/packages/hardhat-toolbox-viem/src/tsconfig.json @@ -0,0 +1,24 @@ +{ + "extends": "../../../config/typescript/tsconfig.json", + "compilerOptions": { + "outDir": "../", + "rootDirs": ["."], + "composite": true + }, + "include": ["./**/*.ts"], + "exclude": [], + "references": [ + { + "path": "../../hardhat-core/src" + }, + { + "path": "../../hardhat-network-helpers" + }, + { + "path": "../../hardhat-verify/src" + }, + { + "path": "../../hardhat-viem/src" + } + ] +} diff --git a/packages/hardhat-toolbox-viem/test/.eslintrc.js b/packages/hardhat-toolbox-viem/test/.eslintrc.js new file mode 100644 index 00000000000..757fe8a3ca9 --- /dev/null +++ b/packages/hardhat-toolbox-viem/test/.eslintrc.js @@ -0,0 +1,15 @@ +module.exports = { + extends: [`${__dirname}/../.eslintrc.js`], + parserOptions: { + project: `${__dirname}/../tsconfig.json`, + sourceType: "module", + }, + rules: { + "import/no-extraneous-dependencies": [ + "error", + { + devDependencies: true, + }, + ], + }, +}; diff --git a/packages/hardhat-toolbox-viem/test/fixture-projects/only-toolbox/hardhat.config.js b/packages/hardhat-toolbox-viem/test/fixture-projects/only-toolbox/hardhat.config.js new file mode 100644 index 00000000000..dfbbe371ca2 --- /dev/null +++ b/packages/hardhat-toolbox-viem/test/fixture-projects/only-toolbox/hardhat.config.js @@ -0,0 +1 @@ +require("../../../"); diff --git a/packages/hardhat-toolbox-viem/test/fixture-projects/only-toolbox/script.js b/packages/hardhat-toolbox-viem/test/fixture-projects/only-toolbox/script.js new file mode 100644 index 00000000000..7a6ae79dd4b --- /dev/null +++ b/packages/hardhat-toolbox-viem/test/fixture-projects/only-toolbox/script.js @@ -0,0 +1,22 @@ +const assert = require("assert"); +const chai = require("chai"); + +async function main() { + // check that viem exists + assert(viem !== undefined); + + // check that the expected tasks are there + const taskNames = Object.keys(tasks); + assert(taskNames.includes("verify")); + assert(taskNames.includes("coverage")); + + // assert that chai-as-promised is loaded + assert(chai.assert.eventually); +} + +main() + .then(() => process.exit(0)) + .catch((error) => { + console.error(error); + process.exit(1); + }); diff --git a/packages/hardhat-toolbox-viem/test/fixture-projects/with-gas-reporter-config/hardhat.config.js b/packages/hardhat-toolbox-viem/test/fixture-projects/with-gas-reporter-config/hardhat.config.js new file mode 100644 index 00000000000..77263c17342 --- /dev/null +++ b/packages/hardhat-toolbox-viem/test/fixture-projects/with-gas-reporter-config/hardhat.config.js @@ -0,0 +1,7 @@ +require("../../../"); + +module.exports = { + gasReporter: { + enabled: true, + }, +}; diff --git a/packages/hardhat-toolbox-viem/test/helpers.ts b/packages/hardhat-toolbox-viem/test/helpers.ts new file mode 100644 index 00000000000..4fc372b905f --- /dev/null +++ b/packages/hardhat-toolbox-viem/test/helpers.ts @@ -0,0 +1,24 @@ +// load the environment type extensions from the plugins +import type {} from "../src/index"; + +import { resetHardhatContext } from "hardhat/plugins-testing"; +import { HardhatRuntimeEnvironment } from "hardhat/types"; +import path from "path"; + +declare module "mocha" { + interface Context { + env: HardhatRuntimeEnvironment; + } +} + +export function useEnvironment(fixtureProjectName: string) { + beforeEach("Loading hardhat environment", function () { + process.chdir(path.join(__dirname, "fixture-projects", fixtureProjectName)); + + this.env = require("hardhat"); + }); + + afterEach("Resetting hardhat", function () { + resetHardhatContext(); + }); +} diff --git a/packages/hardhat-toolbox-viem/test/test.ts b/packages/hardhat-toolbox-viem/test/test.ts new file mode 100644 index 00000000000..1b77777598a --- /dev/null +++ b/packages/hardhat-toolbox-viem/test/test.ts @@ -0,0 +1,26 @@ +import { assert } from "chai"; + +import { useEnvironment } from "./helpers"; + +describe("hardhat-toolbox-viem", function () { + describe("only-toolbox", function () { + useEnvironment("only-toolbox"); + + it("has all the expected things in the HRE", async function () { + await this.env.run("run", { + noCompile: true, + script: "script.js", + }); + + assert.equal(process.exitCode, 0); + }); + }); + + describe("hardhat-gas-reporter-config", function () { + useEnvironment("with-gas-reporter-config"); + + it("Should not crash while loading the HRE", async function () { + assert.isDefined(this.env); + }); + }); +}); diff --git a/packages/hardhat-toolbox-viem/tsconfig.json b/packages/hardhat-toolbox-viem/tsconfig.json new file mode 100644 index 00000000000..65ecfc33b99 --- /dev/null +++ b/packages/hardhat-toolbox-viem/tsconfig.json @@ -0,0 +1,15 @@ +{ + "extends": "../../config/typescript/tsconfig.json", + "compilerOptions": { + "outDir": "./build-test", + "rootDirs": ["./test"], + "composite": true + }, + "include": ["./test/**/*.ts"], + "exclude": ["./node_modules", "./test/**/hardhat.config.ts"], + "references": [ + { + "path": "./src" + } + ] +} diff --git a/packages/hardhat-toolbox/.gitignore b/packages/hardhat-toolbox/.gitignore index c00d7e72963..574f3e65a78 100644 --- a/packages/hardhat-toolbox/.gitignore +++ b/packages/hardhat-toolbox/.gitignore @@ -4,6 +4,10 @@ # Compilation output /build-test/ /dist +/*.js +/*.js.map +/*.d.ts +/*.d.ts.map # Code coverage artifacts /coverage @@ -15,10 +19,6 @@ # Logs logs *.log -npm-debug.log* -yarn-debug.log* -yarn-error.log* -lerna-debug.log* # Diagnostic reports (https://nodejs.org/api/report.html) report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json @@ -57,21 +57,15 @@ jspm_packages/ # TypeScript v1 declaration files typings/ -# Optional npm cache directory -.npm - # Optional eslint cache .eslintcache # Optional REPL history .node_repl_history -# Output of 'npm pack' +# Output of 'pnpm pack' *.tgz -# Yarn Integrity file -.yarn-integrity - # parcel-bundler cache (https://parceljs.org/) .cache diff --git a/packages/hardhat-toolbox/.prettierignore b/packages/hardhat-toolbox/.prettierignore index 12cbe6bee73..eceda069d50 100644 --- a/packages/hardhat-toolbox/.prettierignore +++ b/packages/hardhat-toolbox/.prettierignore @@ -3,4 +3,10 @@ /test/fixture-projects/**/artifacts /test/fixture-projects/**/artifacts-dir /test/fixture-projects/**/cache +/*.d.ts +/*.d.ts.map +/*.js +/*.js.map +/build-test CHANGELOG.md +!.eslintrc.js diff --git a/packages/hardhat-toolbox/CHANGELOG.md b/packages/hardhat-toolbox/CHANGELOG.md index f0e56c3a1cc..c2c0f80416f 100644 --- a/packages/hardhat-toolbox/CHANGELOG.md +++ b/packages/hardhat-toolbox/CHANGELOG.md @@ -1,5 +1,17 @@ # @nomicfoundation/hardhat-toolbox +## 4.0.0 + +### Major Changes + +- 23665f399: Upgraded typechain and hardhat-verify dependencies + +## 3.0.0 + +### Major Changes + +- 399347f40: The Toolbox and the plugins that it includes are now based on ethers v6 + ## 2.0.2 ### Patch Changes diff --git a/packages/hardhat-toolbox/LICENSE b/packages/hardhat-toolbox/LICENSE index d5cab888171..3b7e8c7eabb 100644 --- a/packages/hardhat-toolbox/LICENSE +++ b/packages/hardhat-toolbox/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2022 Nomic Labs LLC +Copyright (c) 2023 Nomic Foundation Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/packages/hardhat-toolbox/README.md b/packages/hardhat-toolbox/README.md index 0ed50f6b6b3..6bd28326208 100644 --- a/packages/hardhat-toolbox/README.md +++ b/packages/hardhat-toolbox/README.md @@ -6,10 +6,10 @@ The `@nomicfoundation/hardhat-toolbox` plugin bundles all the commonly used pack When you use this plugin, you'll be able to: -- Deploy and interact with your contracts using [ethers.js](https://docs.ethers.io/v5/) and the [`hardhat-ethers`](https://hardhat.org/hardhat-runner/plugins/nomiclabs-hardhat-ethers) plugin. +- Deploy and interact with your contracts using [ethers.js](https://docs.ethers.org/v6/) and the [`hardhat-ethers`](https://hardhat.org/hardhat-runner/plugins/nomicfoundation-hardhat-ethers) plugin. - Test your contracts with [Mocha](https://mochajs.org/), [Chai](https://chaijs.com/) and our own [Hardhat Chai Matchers](https://hardhat.org/hardhat-chai-matchers) plugin. - Interact with Hardhat Network with our [Hardhat Network Helpers](https://hardhat.org/hardhat-network-helpers). -- Verify the source code of your contracts with the [hardhat-etherscan](https://hardhat.org/hardhat-runner/plugins/nomiclabs-hardhat-etherscan) plugin. +- Verify the source code of your contracts with the [hardhat-verify](https://hardhat.org/hardhat-runner/plugins/nomicfoundation-hardhat-verify) plugin. - Get metrics on the gas used by your contracts with the [hardhat-gas-reporter](https://github.com/cgewecke/hardhat-gas-reporter) plugin. - Measure your tests coverage with [solidity-coverage](https://github.com/sc-forks/solidity-coverage). - And, if you are using TypeScript, get type bindings for your contracts with [Typechain](https://github.com/dethcrypto/TypeChain/). @@ -19,3 +19,11 @@ When you use this plugin, you'll be able to: To create a new project that uses the Toolbox, check our [Setting up a project guide](https://hardhat.org/hardhat-runner/docs/guides/project-setup). If you want to migrate an existing Hardhat project to use the Toolbox, read [our migration guide](https://hardhat.org/hardhat-runner/docs/guides/migrating-from-hardhat-waffle). + +### Network Helpers + +When the Toolbox is installed using npm 7 or later, its peer dependencies are automatically installed. However, these dependencies won't be listed in the `package.json`. As a result, directly importing the Network Helpers can be problematic for certain tools or IDEs. To address this issue, the Toolbox re-exports the Hardhat Network Helpers. You can use them like this: + +```ts +import helpers from "@nomicfoundation/hardhat-toolbox/network-helpers"; +``` diff --git a/packages/hardhat-toolbox/package.json b/packages/hardhat-toolbox/package.json index 756773bb134..e1efff8135f 100644 --- a/packages/hardhat-toolbox/package.json +++ b/packages/hardhat-toolbox/package.json @@ -1,7 +1,7 @@ { "name": "@nomicfoundation/hardhat-toolbox", - "version": "2.0.2", - "description": "Nomic Foundation's recommended bundle of Hardhat plugins", + "version": "4.0.0", + "description": "Nomic Foundation's recommended bundle of Hardhat plugins (ethers based)", "repository": "github:nomicfoundation/hardhat", "homepage": "https://github.com/nomicfoundation/hardhat/tree/main/packages/hardhat-toolbox", "author": "Nomic Foundation", @@ -9,81 +9,84 @@ "Nomic Foundation" ], "license": "MIT", - "main": "dist/src/index.js", - "types": "dist/src/index.d.ts", + "main": "index.js", + "types": "index.d.ts", "keywords": [ "ethereum", "smart-contracts", "hardhat", - "hardhat-plugin" + "hardhat-plugin", + "hardhat-ethers" ], "scripts": { - "lint": "yarn prettier --check && yarn eslint", - "lint:fix": "yarn prettier --write && yarn eslint --fix", + "lint": "pnpm prettier --check && pnpm eslint", + "lint:fix": "pnpm prettier --write && pnpm eslint --fix", "eslint": "eslint 'src/**/*.ts' 'test/**/*.ts'", "prettier": "prettier \"**/*.{js,md,json}\"", + "pretest": "cd ../.. && pnpm build", "test": "mocha --recursive \"test/**/*.ts\" --exit", "build": "tsc --build .", - "prepublishOnly": "yarn build", - "clean": "rimraf dist" + "prepublishOnly": "pnpm build", + "clean": "rimraf dist *.{d.ts,js}{,.map} build-test tsconfig.tsbuildinfo" }, "files": [ - "dist/src/", "src/", + "*.d.ts", + "*.d.ts.map", + "*.js", + "*.js.map", "LICENSE", "README.md" ], "dependencies": {}, "devDependencies": { - "@ethersproject/abi": "^5.4.7", - "@ethersproject/providers": "^5.4.7", - "@nomicfoundation/hardhat-network-helpers": "^1.0.0", - "@nomicfoundation/hardhat-chai-matchers": "^1.0.0", - "@nomiclabs/hardhat-ethers": "^2.0.0", - "@nomiclabs/hardhat-etherscan": "^3.0.0", - "@typechain/ethers-v5": "^10.1.0", - "@typechain/hardhat": "^6.1.2", + "@nomicfoundation/eslint-plugin-hardhat-internal-rules": "workspace:^", + "@nomicfoundation/eslint-plugin-slow-imports": "workspace:^", + "@nomicfoundation/hardhat-chai-matchers": "workspace:^2.0.0", + "@nomicfoundation/hardhat-ethers": "workspace:^3.0.0", + "@nomicfoundation/hardhat-network-helpers": "workspace:^1.0.0", + "@nomicfoundation/hardhat-verify": "workspace:^2.0.0", + "@typechain/ethers-v6": "^0.5.0", + "@typechain/hardhat": "^9.0.0", "@types/chai": "^4.2.0", "@types/mocha": ">=9.1.0", - "@types/node": "^14.0.0", - "@typescript-eslint/eslint-plugin": "4.29.2", - "@typescript-eslint/parser": "4.29.2", + "@types/node": "^16.0.0", + "@typescript-eslint/eslint-plugin": "5.61.0", + "@typescript-eslint/parser": "5.61.0", "chai": "^4.2.0", - "eslint": "^7.29.0", + "eslint": "^8.44.0", "eslint-config-prettier": "8.3.0", - "eslint-plugin-import": "2.24.1", + "eslint-plugin-import": "2.27.5", "eslint-plugin-no-only-tests": "3.0.0", "eslint-plugin-prettier": "3.4.0", - "ethers": "^5.4.7", - "hardhat": "^2.11.0", + "ethers": "^6.4.0", + "hardhat": "workspace:^2.11.0", "hardhat-gas-reporter": "^1.0.8", "mocha": "^10.0.0", "prettier": "2.4.1", "rimraf": "^3.0.2", "solidity-coverage": "^0.8.1", "ts-node": "^10.8.0", - "typechain": "^8.1.0", - "typescript": "~4.7.4" + "typechain": "^8.3.1", + "typescript": "~5.0.0" }, "peerDependencies": { - "@ethersproject/abi": "^5.4.7", - "@ethersproject/providers": "^5.4.7", + "@nomicfoundation/hardhat-chai-matchers": "^2.0.0", + "@nomicfoundation/hardhat-ethers": "^3.0.0", "@nomicfoundation/hardhat-network-helpers": "^1.0.0", - "@nomicfoundation/hardhat-chai-matchers": "^1.0.0", - "@nomiclabs/hardhat-ethers": "^2.0.0", - "@nomiclabs/hardhat-etherscan": "^3.0.0", + "@nomicfoundation/hardhat-verify": "^2.0.0", + "@typechain/ethers-v6": "^0.5.0", + "@typechain/hardhat": "^9.0.0", "@types/chai": "^4.2.0", "@types/mocha": ">=9.1.0", - "@types/node": ">=12.0.0", - "@typechain/ethers-v5": "^10.1.0", - "@typechain/hardhat": "^6.1.2", + "@types/node": ">=16.0.0", "chai": "^4.2.0", - "ethers": "^5.4.7", + "ethers": "^6.4.0", "hardhat": "^2.11.0", "hardhat-gas-reporter": "^1.0.8", "solidity-coverage": "^0.8.1", "ts-node": ">=8.0.0", - "typechain": "^8.1.0", + "typechain": "^8.3.0", "typescript": ">=4.5.0" }, "bugs": { diff --git a/packages/hardhat-toolbox/src/index.ts b/packages/hardhat-toolbox/src/index.ts index 8efa0d29029..0a58d631e47 100644 --- a/packages/hardhat-toolbox/src/index.ts +++ b/packages/hardhat-toolbox/src/index.ts @@ -1,6 +1,6 @@ import "@nomicfoundation/hardhat-chai-matchers"; -import "@nomiclabs/hardhat-ethers"; -import "@nomiclabs/hardhat-etherscan"; +import "@nomicfoundation/hardhat-ethers"; +import "@nomicfoundation/hardhat-verify"; import "@typechain/hardhat"; import "hardhat-gas-reporter"; import "solidity-coverage"; diff --git a/packages/hardhat-toolbox/src/network-helpers.ts b/packages/hardhat-toolbox/src/network-helpers.ts new file mode 100644 index 00000000000..71747baddc6 --- /dev/null +++ b/packages/hardhat-toolbox/src/network-helpers.ts @@ -0,0 +1 @@ +export * from "@nomicfoundation/hardhat-network-helpers"; diff --git a/packages/hardhat-toolbox/src/tsconfig.json b/packages/hardhat-toolbox/src/tsconfig.json new file mode 100644 index 00000000000..9f84761f8bf --- /dev/null +++ b/packages/hardhat-toolbox/src/tsconfig.json @@ -0,0 +1,27 @@ +{ + "extends": "../../../config/typescript/tsconfig.json", + "compilerOptions": { + "outDir": "../", + "rootDirs": ["."], + "composite": true + }, + "include": ["./**/*.ts"], + "exclude": [], + "references": [ + { + "path": "../../hardhat-core/src" + }, + { + "path": "../../hardhat-chai-matchers" + }, + { + "path": "../../hardhat-network-helpers" + }, + { + "path": "../../hardhat-ethers/src" + }, + { + "path": "../../hardhat-verify/src" + } + ] +} diff --git a/packages/hardhat-toolbox/test/.eslintrc.js b/packages/hardhat-toolbox/test/.eslintrc.js new file mode 100644 index 00000000000..757fe8a3ca9 --- /dev/null +++ b/packages/hardhat-toolbox/test/.eslintrc.js @@ -0,0 +1,15 @@ +module.exports = { + extends: [`${__dirname}/../.eslintrc.js`], + parserOptions: { + project: `${__dirname}/../tsconfig.json`, + sourceType: "module", + }, + rules: { + "import/no-extraneous-dependencies": [ + "error", + { + devDependencies: true, + }, + ], + }, +}; diff --git a/packages/hardhat-toolbox/test/fixture-projects/only-toolbox/script.js b/packages/hardhat-toolbox/test/fixture-projects/only-toolbox/script.js index c0ebd4b5fab..8552eccb3b9 100644 --- a/packages/hardhat-toolbox/test/fixture-projects/only-toolbox/script.js +++ b/packages/hardhat-toolbox/test/fixture-projects/only-toolbox/script.js @@ -6,9 +6,15 @@ async function main() { // check that the expected tasks are there const taskNames = Object.keys(tasks); + assert(taskNames.includes("verify")); assert(taskNames.includes("coverage")); assert(taskNames.includes("typechain")); + + // check that the expected scopes are there + const scopeNames = Object.keys(scopes); + assert(scopeNames.includes("vars")); + assert(scopeNames.includes("ignition")); } main() diff --git a/packages/hardhat-toolbox/test/helpers.ts b/packages/hardhat-toolbox/test/helpers.ts index e1b159efe32..4fc372b905f 100644 --- a/packages/hardhat-toolbox/test/helpers.ts +++ b/packages/hardhat-toolbox/test/helpers.ts @@ -1,3 +1,6 @@ +// load the environment type extensions from the plugins +import type {} from "../src/index"; + import { resetHardhatContext } from "hardhat/plugins-testing"; import { HardhatRuntimeEnvironment } from "hardhat/types"; import path from "path"; diff --git a/packages/hardhat-toolbox/test/test.ts b/packages/hardhat-toolbox/test/test.ts index b977417f795..f2c16f4d4f9 100644 --- a/packages/hardhat-toolbox/test/test.ts +++ b/packages/hardhat-toolbox/test/test.ts @@ -19,15 +19,20 @@ describe("hardhat-toolbox", function () { describe("hardhat-gas-reporter-config", function () { useEnvironment("with-gas-reporter-config"); - it("Should not crash while loading the HRE", async function () { - assert.isDefined(this.env); + it("Should not crash while loading the HRE", function () { + // TODO: bring back assert.isDefined + // asserts proxying is clashing, it seems to be version related + assert( + this.env !== undefined && this.env !== null, + "The environment should be loaded" + ); }); }); describe("typechain config", function () { useEnvironment("typechain-config"); - it("should disable typechain overrides for js projects", async function () { + it("should disable typechain overrides for js projects", function () { assert.isTrue(this.env.config.typechain.dontOverrideCompile); }); }); diff --git a/packages/hardhat-toolbox/tsconfig.json b/packages/hardhat-toolbox/tsconfig.json index fd844c410b8..65ecfc33b99 100644 --- a/packages/hardhat-toolbox/tsconfig.json +++ b/packages/hardhat-toolbox/tsconfig.json @@ -1,24 +1,15 @@ { "extends": "../../config/typescript/tsconfig.json", "compilerOptions": { - "outDir": "./dist" + "outDir": "./build-test", + "rootDirs": ["./test"], + "composite": true }, - "exclude": ["./dist", "./node_modules", "./test/**/hardhat.config.ts"], + "include": ["./test/**/*.ts"], + "exclude": ["./node_modules", "./test/**/hardhat.config.ts"], "references": [ { - "path": "../hardhat-core/src" - }, - { - "path": "../hardhat-chai-matchers" - }, - { - "path": "../hardhat-network-helpers" - }, - { - "path": "../hardhat-ethers/src" - }, - { - "path": "../hardhat-verify" + "path": "./src" } ] } diff --git a/packages/hardhat-truffle4/.eslintrc.js b/packages/hardhat-truffle4/.eslintrc.js index 266b8d5f244..34b7ef64eaa 100644 --- a/packages/hardhat-truffle4/.eslintrc.js +++ b/packages/hardhat-truffle4/.eslintrc.js @@ -1,3 +1,7 @@ +const { + slowImportsCommonIgnoredModules, +} = require("../../config/eslint/constants"); + module.exports = { extends: [`${__dirname}/../../config/eslint/eslintrc.js`], parserOptions: { @@ -15,4 +19,21 @@ module.exports = { }, ], }, + overrides: [ + { + files: ["src/index.ts"], + rules: { + "@nomicfoundation/slow-imports/no-top-level-external-import": [ + "error", + { + ignoreModules: [ + ...slowImportsCommonIgnoredModules, + "chai", + "@nomiclabs/hardhat-web3-legacy", + ], + }, + ], + }, + }, + ], }; diff --git a/packages/hardhat-truffle4/.gitignore b/packages/hardhat-truffle4/.gitignore index c00d7e72963..4aca21f18d7 100644 --- a/packages/hardhat-truffle4/.gitignore +++ b/packages/hardhat-truffle4/.gitignore @@ -15,10 +15,6 @@ # Logs logs *.log -npm-debug.log* -yarn-debug.log* -yarn-error.log* -lerna-debug.log* # Diagnostic reports (https://nodejs.org/api/report.html) report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json @@ -57,21 +53,15 @@ jspm_packages/ # TypeScript v1 declaration files typings/ -# Optional npm cache directory -.npm - # Optional eslint cache .eslintcache # Optional REPL history .node_repl_history -# Output of 'npm pack' +# Output of 'pnpm pack' *.tgz -# Yarn Integrity file -.yarn-integrity - # parcel-bundler cache (https://parceljs.org/) .cache diff --git a/packages/hardhat-truffle4/.mocharc.json b/packages/hardhat-truffle4/.mocharc.json index 775e35460dd..68af7ce7944 100644 --- a/packages/hardhat-truffle4/.mocharc.json +++ b/packages/hardhat-truffle4/.mocharc.json @@ -2,5 +2,5 @@ "require": "ts-node/register/files", "file": "../common/run-with-ganache", "ignore": ["test/fixture-projects/**/*"], - "timeout": 10000 + "timeout": 60000 } diff --git a/packages/hardhat-truffle4/LICENSE b/packages/hardhat-truffle4/LICENSE index 3b8858c5558..3b7e8c7eabb 100644 --- a/packages/hardhat-truffle4/LICENSE +++ b/packages/hardhat-truffle4/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2019 Nomic Labs LLC +Copyright (c) 2023 Nomic Foundation Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/packages/hardhat-truffle4/package.json b/packages/hardhat-truffle4/package.json index 64214a9985c..11d249dab88 100644 --- a/packages/hardhat-truffle4/package.json +++ b/packages/hardhat-truffle4/package.json @@ -17,13 +17,14 @@ "truffle-contract" ], "scripts": { - "lint": "yarn prettier --check && yarn eslint", - "lint:fix": "yarn prettier --write && yarn eslint --fix", + "lint": "pnpm prettier --check && pnpm eslint", + "lint:fix": "pnpm prettier --write && pnpm eslint --fix", "eslint": "eslint 'src/**/*.ts' 'test/**/*.ts'", "prettier": "prettier \"**/*.{js,md,json}\"", + "pretest": "cd ../.. && pnpm build", "test": "mocha --recursive \"test/**/*.ts\" --exit", "build": "tsc --build .", - "prepublishOnly": "yarn build", + "prepublishOnly": "pnpm build", "clean": "rimraf dist" }, "files": [ @@ -40,25 +41,27 @@ "truffle-contract": "^3.0.7" }, "devDependencies": { - "@nomiclabs/hardhat-web3-legacy": "^2.0.0", + "@nomicfoundation/eslint-plugin-hardhat-internal-rules": "workspace:^", + "@nomicfoundation/eslint-plugin-slow-imports": "workspace:^", + "@nomiclabs/hardhat-web3-legacy": "workspace:^2.0.0", "@types/fs-extra": "^5.1.0", "@types/glob": "^7.1.1", "@types/mocha": ">=9.1.0", - "@types/node": "^14.0.0", - "@typescript-eslint/eslint-plugin": "5.53.0", - "@typescript-eslint/parser": "5.53.0", + "@types/node": "^16.0.0", + "@typescript-eslint/eslint-plugin": "5.61.0", + "@typescript-eslint/parser": "5.61.0", "chai": "^4.2.0", - "eslint": "^7.29.0", + "eslint": "^8.44.0", "eslint-config-prettier": "8.3.0", - "eslint-plugin-import": "2.24.1", + "eslint-plugin-import": "2.27.5", "eslint-plugin-no-only-tests": "3.0.0", "eslint-plugin-prettier": "3.4.0", - "hardhat": "^2.6.4", + "hardhat": "workspace:^2.6.4", "mocha": "^10.0.0", "prettier": "2.4.1", "rimraf": "^3.0.2", "ts-node": "^10.8.0", - "typescript": "~4.7.4", + "typescript": "~5.0.0", "web3": "^0.20.0" }, "peerDependencies": { diff --git a/packages/hardhat-truffle4/src/artifacts.ts b/packages/hardhat-truffle4/src/artifacts.ts index c3d165ca23d..be4b8be430e 100644 --- a/packages/hardhat-truffle4/src/artifacts.ts +++ b/packages/hardhat-truffle4/src/artifacts.ts @@ -113,7 +113,7 @@ export class TruffleEnvironmentArtifacts { if (library !== undefined) { const firstLinkData = linksData[0]; - // link data is exressed in bytes, but the bytecode is hex encoded, so we + // link data is expressed in bytes, but the bytecode is hex encoded, so we // need to multiply everything by 2. const linkPlaceholder = destinationArtifact.bytecode.substr( firstLinkData.start * 2 + 2, // The + 2 is because of the 0x prefix diff --git a/packages/hardhat-truffle4/src/provisioner.ts b/packages/hardhat-truffle4/src/provisioner.ts index 84fc0974458..b5f845ab5cb 100644 --- a/packages/hardhat-truffle4/src/provisioner.ts +++ b/packages/hardhat-truffle4/src/provisioner.ts @@ -1,4 +1,4 @@ -import { wrapWithSolidityErrorsCorrection } from "hardhat/internal/hardhat-network/stack-traces/solidity-errors"; +import type { wrapWithSolidityErrorsCorrection as WrapWithSolidityErrorsCorrectionT } from "hardhat/internal/hardhat-network/stack-traces/solidity-errors"; import { NomicLabsHardhatPluginError } from "hardhat/plugins"; import { NetworkConfig } from "hardhat/types"; import util from "util"; @@ -67,6 +67,11 @@ export class LazyTruffleContractProvisioner { const originalNew = Contract.new; const originalAt = Contract.at; + const { wrapWithSolidityErrorsCorrection } = + require("hardhat/internal/hardhat-network/stack-traces/solidity-errors") as { + wrapWithSolidityErrorsCorrection: typeof WrapWithSolidityErrorsCorrectionT; + }; + Contract.new = async (...args: any[]) => { return wrapWithSolidityErrorsCorrection(async () => { args = await this._ensureTxParamsWithDefaults(args); @@ -175,6 +180,11 @@ export class LazyTruffleContractProvisioner { const originalSendTransaction = original.sendTransaction; const originalRequest = original.request; + const { wrapWithSolidityErrorsCorrection } = + require("hardhat/internal/hardhat-network/stack-traces/solidity-errors") as { + wrapWithSolidityErrorsCorrection: typeof WrapWithSolidityErrorsCorrectionT; + }; + instance[methodName] = async (...args: any[]) => { return wrapWithSolidityErrorsCorrection(async () => { args = await this._ensureTxParamsWithDefaults(args, !isConstant); diff --git a/packages/hardhat-truffle4/test/tests.ts b/packages/hardhat-truffle4/test/tests.ts index c084f256953..a1dca011d41 100644 --- a/packages/hardhat-truffle4/test/tests.ts +++ b/packages/hardhat-truffle4/test/tests.ts @@ -117,7 +117,7 @@ function testArtifactsFunctionality() { } }); - it("Should deploy linked contracts succesfully", async function () { + it("Should deploy linked contracts successfully", async function () { const Lib = this.env.artifacts.require("Lib"); const lib = await Lib.new(); assertIsContractInstance(lib, "addOne"); diff --git a/packages/hardhat-truffle5/.eslintrc.js b/packages/hardhat-truffle5/.eslintrc.js index 889740f226d..acafebd7d20 100644 --- a/packages/hardhat-truffle5/.eslintrc.js +++ b/packages/hardhat-truffle5/.eslintrc.js @@ -1,7 +1,28 @@ +const { + slowImportsCommonIgnoredModules, +} = require("../../config/eslint/constants"); + module.exports = { extends: [`${__dirname}/../../config/eslint/eslintrc.js`], parserOptions: { project: `${__dirname}/tsconfig.json`, sourceType: "module", }, + overrides: [ + { + files: ["src/index.ts"], + rules: { + "@nomicfoundation/slow-imports/no-top-level-external-import": [ + "error", + { + ignoreModules: [ + ...slowImportsCommonIgnoredModules, + "chai", + "@nomiclabs/hardhat-web3", + ], + }, + ], + }, + }, + ], }; diff --git a/packages/hardhat-truffle5/.gitignore b/packages/hardhat-truffle5/.gitignore index c00d7e72963..4aca21f18d7 100644 --- a/packages/hardhat-truffle5/.gitignore +++ b/packages/hardhat-truffle5/.gitignore @@ -15,10 +15,6 @@ # Logs logs *.log -npm-debug.log* -yarn-debug.log* -yarn-error.log* -lerna-debug.log* # Diagnostic reports (https://nodejs.org/api/report.html) report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json @@ -57,21 +53,15 @@ jspm_packages/ # TypeScript v1 declaration files typings/ -# Optional npm cache directory -.npm - # Optional eslint cache .eslintcache # Optional REPL history .node_repl_history -# Output of 'npm pack' +# Output of 'pnpm pack' *.tgz -# Yarn Integrity file -.yarn-integrity - # parcel-bundler cache (https://parceljs.org/) .cache diff --git a/packages/hardhat-truffle5/LICENSE b/packages/hardhat-truffle5/LICENSE index 3b8858c5558..3b7e8c7eabb 100644 --- a/packages/hardhat-truffle5/LICENSE +++ b/packages/hardhat-truffle5/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2019 Nomic Labs LLC +Copyright (c) 2023 Nomic Foundation Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/packages/hardhat-truffle5/README.md b/packages/hardhat-truffle5/README.md index f0ba4df7980..7797a3913e1 100644 --- a/packages/hardhat-truffle5/README.md +++ b/packages/hardhat-truffle5/README.md @@ -15,7 +15,7 @@ This plugin requires [hardhat-web3](https://github.com/nomiclabs/hardhat/tree/ma ## Installation ```bash -npm install --save-dev @nomiclabs/hardhat-truffle5 @nomiclabs/hardhat-web3 web3 +npm install --save-dev @nomiclabs/hardhat-truffle5 @nomiclabs/hardhat-web3 'web3@^1.0.0-beta.36' ``` And add the following statement to your `hardhat.config.js`: diff --git a/packages/hardhat-truffle5/package.json b/packages/hardhat-truffle5/package.json index cc577ed87cd..86c1ae5168a 100644 --- a/packages/hardhat-truffle5/package.json +++ b/packages/hardhat-truffle5/package.json @@ -17,13 +17,14 @@ "truffle-contract" ], "scripts": { - "lint": "yarn prettier --check && yarn eslint", - "lint:fix": "yarn prettier --write && yarn eslint --fix", + "lint": "pnpm prettier --check && pnpm eslint", + "lint:fix": "pnpm prettier --write && pnpm eslint --fix", "eslint": "eslint 'src/**/*.ts' 'test/**/*.ts'", "prettier": "prettier \"**/*.{js,md,json}\"", + "pretest": "cd ../.. && pnpm build", "test": "mocha --recursive \"test/**/*.ts\" --exit", "build": "tsc --build .", - "prepublishOnly": "yarn build", + "prepublishOnly": "pnpm build", "clean": "rimraf dist" }, "files": [ @@ -40,25 +41,27 @@ "fs-extra": "^7.0.1" }, "devDependencies": { - "@nomiclabs/hardhat-web3": "^2.0.0", + "@nomicfoundation/eslint-plugin-hardhat-internal-rules": "workspace:^", + "@nomicfoundation/eslint-plugin-slow-imports": "workspace:^", + "@nomiclabs/hardhat-web3": "workspace:^2.0.0", "@types/fs-extra": "^5.1.0", "@types/glob": "^7.1.1", "@types/mocha": ">=9.1.0", - "@types/node": "^14.0.0", - "@typescript-eslint/eslint-plugin": "5.53.0", - "@typescript-eslint/parser": "5.53.0", + "@types/node": "^16.0.0", + "@typescript-eslint/eslint-plugin": "5.61.0", + "@typescript-eslint/parser": "5.61.0", "chai": "^4.2.0", - "eslint": "^7.29.0", + "eslint": "^8.44.0", "eslint-config-prettier": "8.3.0", - "eslint-plugin-import": "2.24.1", + "eslint-plugin-import": "2.27.5", "eslint-plugin-no-only-tests": "3.0.0", "eslint-plugin-prettier": "3.4.0", - "hardhat": "^2.6.4", + "hardhat": "workspace:^2.6.4", "mocha": "^10.0.0", "prettier": "2.4.1", "rimraf": "^3.0.2", "ts-node": "^10.8.0", - "typescript": "~4.7.4", + "typescript": "~5.0.0", "web3": "^1.0.0-beta.36" }, "peerDependencies": { diff --git a/packages/hardhat-truffle5/src/artifacts.ts b/packages/hardhat-truffle5/src/artifacts.ts index d90f305127e..6b1b542799e 100644 --- a/packages/hardhat-truffle5/src/artifacts.ts +++ b/packages/hardhat-truffle5/src/artifacts.ts @@ -114,7 +114,7 @@ export class TruffleEnvironmentArtifacts { if (library !== undefined) { const firstLinkData = linksData[0]; - // link data is exressed in bytes, but the bytecode is hex encoded, so we + // link data is expressed in bytes, but the bytecode is hex encoded, so we // need to multiply everything by 2. const linkPlaceholder = destinationArtifact.bytecode.substr( firstLinkData.start * 2 + 2, // The + 2 is because of the 0x prefix diff --git a/packages/hardhat-truffle5/test/tests.ts b/packages/hardhat-truffle5/test/tests.ts index 74d4d43cc7c..e9e3a8a5e31 100644 --- a/packages/hardhat-truffle5/test/tests.ts +++ b/packages/hardhat-truffle5/test/tests.ts @@ -110,7 +110,7 @@ function testArtifactsFunctionality() { } }); - it("Should deploy linked contracts succesfully", async function () { + it("Should deploy linked contracts successfully", async function () { const Lib = this.env.artifacts.require("Lib"); const lib = await Lib.new(); assertIsContractInstance(lib, "addOne"); diff --git a/packages/hardhat-verify/.eslintignore b/packages/hardhat-verify/.eslintignore new file mode 100644 index 00000000000..4110ca8786a --- /dev/null +++ b/packages/hardhat-verify/.eslintignore @@ -0,0 +1,8 @@ +.eslintrc.js + +*.d.ts +etherscan.js +index.js + +/build-test +/internal diff --git a/packages/hardhat-verify/.eslintrc.js b/packages/hardhat-verify/.eslintrc.js deleted file mode 100644 index 889740f226d..00000000000 --- a/packages/hardhat-verify/.eslintrc.js +++ /dev/null @@ -1,7 +0,0 @@ -module.exports = { - extends: [`${__dirname}/../../config/eslint/eslintrc.js`], - parserOptions: { - project: `${__dirname}/tsconfig.json`, - sourceType: "module", - }, -}; diff --git a/packages/hardhat-verify/.gitignore b/packages/hardhat-verify/.gitignore index 230538feb0e..de879e94f6d 100644 --- a/packages/hardhat-verify/.gitignore +++ b/packages/hardhat-verify/.gitignore @@ -4,6 +4,11 @@ # Compilation output /build-test/ /dist +/internal +/*.js +/*.js.map +/*.d.ts +/*.d.ts.map # Code coverage artifacts /coverage @@ -15,10 +20,6 @@ # Logs logs *.log -npm-debug.log* -yarn-debug.log* -yarn-error.log* -lerna-debug.log* # Diagnostic reports (https://nodejs.org/api/report.html) report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json @@ -57,21 +58,15 @@ jspm_packages/ # TypeScript v1 declaration files typings/ -# Optional npm cache directory -.npm - # Optional eslint cache .eslintcache # Optional REPL history .node_repl_history -# Output of 'npm pack' +# Output of 'pnpm pack' *.tgz -# Yarn Integrity file -.yarn-integrity - # parcel-bundler cache (https://parceljs.org/) .cache diff --git a/packages/hardhat-verify/.prettierignore b/packages/hardhat-verify/.prettierignore index 8b59d6f54cb..606a44372c9 100644 --- a/packages/hardhat-verify/.prettierignore +++ b/packages/hardhat-verify/.prettierignore @@ -1,5 +1,11 @@ /node_modules /dist +/internal +/*.d.ts +/*.d.ts.map +/*.js +/*.js.map +/build-test /test/fixture-projects/**/artifacts /test/fixture-projects/**/artifacts-dir /test/fixture-projects/**/cache diff --git a/packages/hardhat-verify/CHANGELOG.md b/packages/hardhat-verify/CHANGELOG.md new file mode 100644 index 00000000000..ed689785be9 --- /dev/null +++ b/packages/hardhat-verify/CHANGELOG.md @@ -0,0 +1,64 @@ +# @nomicfoundation/hardhat-verify + +## 2.0.3 + +### Patch Changes + +- e77f1d8a0: Add apiUrl and browserUrl to Sourcify configuration. + +## 2.0.2 + +### Patch Changes + +- 5cab65fb7: Updated chiado urls to avoid redirect + +## 2.0.1 + +### Patch Changes + +- c2155fb26: Added polygonZkEVM and polygonZkEVMTestnet +- c7d87c41a: Fixed case-sensitive address comparison for detecting verified contracts + +## 2.0.0 + +### Major Changes + +- a32e68589: - Added Sourcify as a verification provider. + +## 1.1.1 + +### Patch Changes + +- 4ed196924: Added `base` mainnet + +## 1.1.0 + +### Minor Changes + +- e2fc27766: Exposed the Etherscan class as a public API for third-party consumers. + +## 1.0.4 + +### Patch Changes + +- 0f4411ce0: Added `baseGoerli` testnet. + +## 1.0.3 + +### Patch Changes + +- efe7824e0: Removed the `rinkeby`, `ropsten` and `kovan` deprecated test networks (thanks @pcaversaccio!) + +## 1.0.2 + +### Patch Changes + +- 4028c6e24: Fix URLs for the Aurora networks (thanks @zZoMROT and @ZumZoom!) +- 4028c6e24: Fixed a problem where the `--list-networks` flag wasn't working without passing an address (thanks @clauBv23!) +- 72162dcc7: Success messages are now more generic (thanks @clauBv23!). + +## 1.0.1 + +### Patch Changes + +- 40b371bca: Removed the compilation step from the verify task, and removed the noCompile flag diff --git a/packages/hardhat-verify/LICENSE b/packages/hardhat-verify/LICENSE index 3b8858c5558..3b7e8c7eabb 100644 --- a/packages/hardhat-verify/LICENSE +++ b/packages/hardhat-verify/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2019 Nomic Labs LLC +Copyright (c) 2023 Nomic Foundation Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/packages/hardhat-verify/README.md b/packages/hardhat-verify/README.md index 350c3049d9d..17f58efd833 100644 --- a/packages/hardhat-verify/README.md +++ b/packages/hardhat-verify/README.md @@ -6,7 +6,7 @@ ## What -This plugin helps you verify the source code for your Solidity contracts. At the moment, it supports [Etherscan](https://etherscan.io)-based explorers and explorers compatible with its API like [Blockscout](https://www.blockscout.com/). +This plugin helps you verify the source code for your Solidity contracts. At the moment, it supports [Etherscan](https://etherscan.io)-based explorers, explorers compatible with its API like [Blockscout](https://www.blockscout.com/) and [Sourcify](https://sourcify.dev/). It's smart and it tries to do as much as possible to facilitate the process: @@ -35,7 +35,7 @@ import "@nomicfoundation/hardhat-verify"; ## Tasks -This plugin provides the `verify` task, which allows you to verify contracts through Etherscan's service. +This plugin provides the `verify` task, which allows you to verify contracts through Sourcify and Etherscan's service. ## Environment extensions @@ -43,7 +43,7 @@ This plugin does not extend the environment. ## Usage -You need to add the following Etherscan config to your `hardhat.config.js` file: +You need to add the following Etherscan and Sourcify configs to your `hardhat.config.js` file: ```js module.exports = { @@ -54,6 +54,11 @@ module.exports = { // Your API key for Etherscan // Obtain one at https://etherscan.io/ apiKey: "YOUR_ETHERSCAN_API_KEY" + }, + sourcify: { + // Disabled by default + // Doesn't need an API key + enabled: true } }; ``` @@ -68,7 +73,7 @@ npx hardhat verify --network mainnet DEPLOYED_CONTRACT_ADDRESS "Constructor argu ### Complex arguments -When the constructor has a complex argument list, you'll need to write a javascript module that exports the argument list. The expected format is the same as a constructor list for an [ethers contract](https://docs.ethers.io/v5/api/contract/). For example, if you have a contract like this: +When the constructor has a complex argument list, you'll need to write a javascript module that exports the argument list. The expected format is the same as a constructor list for an [ethers contract](https://docs.ethers.org/v6/single-page/#api_contract__Contract). For example, if you have a contract like this: ```solidity struct Point { @@ -174,6 +179,36 @@ Keep in mind that the name you are giving to the network in `customChains` is th To see which custom chains are supported, run `npx hardhat verify --list-networks`. +### Verifying on Sourcify + +To verify a contract using Sourcify, you need to add to your Hardhat config: + +```js +sourcify: { + enabled: true, + // Optional: specify a different Sourcify server + apiUrl: "https://sourcify.dev/server", + // Optional: specify a different Sourcify repository + browserUrl: "https://repo.sourcify.dev", +} +``` + +and then run the `verify` task, passing the address of the contract and the network where it's deployed: + +```bash +npx hardhat verify --network mainnet DEPLOYED_CONTRACT_ADDRESS +``` + +**Note:** Constructor arguments are not required for Sourcify verification, but you'll need to provide them if you also have Etherscan verification enabled. + +To disable Sourcify verification and suppress related messages, set `enabled` to `false`: + +```js +sourcify: { + enabled: false, +} +``` + ### Using programmatically To call the verification task from within a Hardhat task or script, use the `"verify:verify"` subtask. Assuming the same contract as [above](#complex-arguments), you can run the subtask like this: @@ -208,6 +243,73 @@ hre.run("verify:verify", { } ``` +#### Advanced Usage: Using the Etherscan and Sourcify classes from another plugin + +Both Etherscan and Sourcify classes can be imported from the plugin for direct use. + +- **Etherscan Class Usage** + + ```js + import { Etherscan } from "@nomicfoundation/hardhat-verify/etherscan"; + + const instance = new Etherscan( + "abc123def123", // Etherscan API key + "https://api.etherscan.io/api", // Etherscan API URL + "https://etherscan.io" // Etherscan browser URL + ); + + if (!instance.isVerified("0x123abc...")) { + const { message: guid } = await instance.verify( + // Contract address + "0x123abc...", + // Contract source code + '{"language":"Solidity","sources":{"contracts/Sample.sol":{"content":"// SPDX-Lic..."}},"settings":{ ... }}', + // Contract name + "contracts/Sample.sol:MyContract", + // Compiler version + "v0.8.19+commit.7dd6d404", + // Encoded constructor arguments + "0000000000000000000000000000000000000000000000000000000000000032" + ); + + await sleep(1000); + const verificationStatus = await instance.getVerificationStatus(guid); + + if (verificationStatus.isSuccess()) { + const contractURL = instance.getContractUrl("0x123abc..."); + console.log( + `Successfully verified contract "MyContract" on Etherscan: ${contractURL}` + ); + } + } + ``` + +- **Sourcify Class Usage** + + ```js + import { Sourcify } from "@nomicfoundation/hardhat-verify/sourcify"; + + const instance = new Sourcify( + 1, + "https://sourcify.dev/server", + "https://repo.sourcify.dev" + ); // Set chainId + + if (!instance.isVerified("0x123abc...")) { + const sourcifyResponse = await instance.verify("0x123abc...", { + "metadata.json": "{...}", + "otherFile.sol": "...", + }); + if (sourcifyResponse.isOk()) { + const contractURL = instance.getContractUrl( + "0x123abc...", + sourcifyResponse.status + ); + console.log(`Successfully verified contract on Sourcify: ${contractURL}`); + } + } + ``` + ## How it works The plugin works by fetching the bytecode in the given address and using it to check which contract in your project corresponds to it. Besides that, some sanity checks are performed locally to make sure that the verification won't fail. diff --git a/packages/hardhat-verify/package.json b/packages/hardhat-verify/package.json index 029218e3e3f..43ffdcc4f59 100644 --- a/packages/hardhat-verify/package.json +++ b/packages/hardhat-verify/package.json @@ -1,13 +1,7 @@ { "name": "@nomicfoundation/hardhat-verify", - "version": "1.0.0", + "version": "2.0.3", "description": "Hardhat plugin for verifying contracts", - "homepage": "https://github.com/nomicfoundation/hardhat/tree/main/packages/hardhat-verify", - "repository": "github:nomicfoundation/hardhat", - "author": "Nomic Foundation", - "license": "MIT", - "main": "dist/src/index.js", - "types": "dist/src/index.d.ts", "keywords": [ "ethereum", "smart-contracts", @@ -15,23 +9,35 @@ "hardhat-plugin", "etherscan" ], - "scripts": { - "lint": "yarn prettier --check && yarn eslint", - "lint:fix": "yarn prettier --write && yarn eslint --fix", - "eslint": "eslint 'src/**/*.ts' 'test/**/*.ts'", - "prettier": "prettier \"**/*.{js,md,json}\"", - "test": "mocha --recursive \"test/**/*.ts\" --exit", - "coverage": "nyc yarn test -- --reporter min", - "build": "tsc --build .", - "prepublishOnly": "yarn build", - "clean": "rimraf dist" - }, + "homepage": "https://github.com/nomicfoundation/hardhat/tree/main/packages/hardhat-verify", + "repository": "github:nomicfoundation/hardhat", + "license": "MIT", + "author": "Nomic Foundation", + "main": "index.js", + "types": "index.d.ts", "files": [ "dist/src/", "src/", + "internal/", + "*.d.ts", + "*.d.ts.map", + "*.js", + "*.js.map", "LICENSE", "README.md" ], + "scripts": { + "build": "tsc --build .", + "clean": "rimraf dist internal *.{d.ts,js}{,.map} build-test tsconfig.tsbuildinfo", + "coverage": "nyc pnpm test -- --reporter min", + "eslint": "eslint 'src/**/*.ts' 'test/**/*.ts'", + "lint": "pnpm prettier --check && pnpm eslint", + "lint:fix": "pnpm prettier --write && pnpm eslint --fix", + "prepublishOnly": "pnpm build", + "prettier": "prettier \"**/*.{js,md,json}\"", + "pretest": "cd ../.. && pnpm build", + "test": "mocha --recursive \"test/**/*.ts\" --exit" + }, "dependencies": { "@ethersproject/abi": "^5.1.2", "@ethersproject/address": "^5.0.2", @@ -44,22 +50,25 @@ "undici": "^5.14.0" }, "devDependencies": { - "@nomiclabs/hardhat-ethers": "^2.0.0", + "@nomicfoundation/eslint-plugin-hardhat-internal-rules": "workspace:^", + "@nomicfoundation/eslint-plugin-slow-imports": "workspace:^", + "@nomicfoundation/hardhat-ethers": "workspace:^3.0.0", "@types/chai": "^4.2.0", "@types/chai-as-promised": "^7.1.3", + "@types/debug": "^4.1.4", "@types/lodash.clonedeep": "^4.5.7", "@types/mocha": ">=9.1.0", - "@types/node": "^14.0.0", + "@types/node": "^16.0.0", "@types/semver": "^6.0.2", "@types/sinon": "^9.0.8", "@types/sinon-chai": "^3.2.9", - "@typescript-eslint/eslint-plugin": "5.53.0", - "@typescript-eslint/parser": "5.53.0", + "@typescript-eslint/eslint-plugin": "5.61.0", + "@typescript-eslint/parser": "5.61.0", "chai": "^4.2.0", "chai-as-promised": "^7.1.1", - "eslint": "^7.29.0", + "eslint": "^8.44.0", "eslint-config-prettier": "8.3.0", - "eslint-plugin-import": "2.24.1", + "eslint-plugin-import": "2.27.5", "eslint-plugin-no-only-tests": "3.0.0", "eslint-plugin-prettier": "3.4.0", "ethers": "^5.0.0", @@ -71,7 +80,7 @@ "sinon": "^9.0.0", "sinon-chai": "^3.7.0", "ts-node": "^10.8.0", - "typescript": "~4.7.4" + "typescript": "~5.0.0" }, "peerDependencies": { "hardhat": "^2.0.4" diff --git a/packages/hardhat-verify/src/blockscout.ts b/packages/hardhat-verify/src/blockscout.ts new file mode 100644 index 00000000000..fe1d4fd3929 --- /dev/null +++ b/packages/hardhat-verify/src/blockscout.ts @@ -0,0 +1 @@ +export { Blockscout } from "./internal/blockscout"; diff --git a/packages/hardhat-verify/src/chain-config.ts b/packages/hardhat-verify/src/chain-config.ts deleted file mode 100644 index 434b2a00ca8..00000000000 --- a/packages/hardhat-verify/src/chain-config.ts +++ /dev/null @@ -1,292 +0,0 @@ -import type { Network } from "hardhat/types"; -import type { ChainConfig } from "./types"; - -import { HARDHAT_NETWORK_NAME } from "hardhat/plugins"; -import { ChainConfigNotFoundError, NetworkNotSupportedError } from "./errors"; - -export async function getCurrentChainConfig( - { name, provider }: Network, - customChains: ChainConfig[] -): Promise { - const currentChainId = parseInt(await provider.send("eth_chainId"), 16); - - const currentChainConfig = [ - // custom chains has higher precedence than builtin chains - ...[...customChains].reverse(), // the last entry has higher precedence - ...builtinChains, - ].find(({ chainId }) => chainId === currentChainId); - - if (currentChainConfig === undefined) { - if (name === HARDHAT_NETWORK_NAME) { - throw new NetworkNotSupportedError(name); - } - - throw new ChainConfigNotFoundError(currentChainId); - } - - return currentChainConfig; -} - -// See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-155.md#list-of-chain-ids -export const builtinChains: ChainConfig[] = [ - { - network: "mainnet", - chainId: 1, - urls: { - apiURL: "https://api.etherscan.io/api", - browserURL: "https://etherscan.io", - }, - }, - { - network: "ropsten", - chainId: 3, - urls: { - apiURL: "https://api-ropsten.etherscan.io/api", - browserURL: "https://ropsten.etherscan.io", - }, - }, - { - network: "rinkeby", - chainId: 4, - urls: { - apiURL: "https://api-rinkeby.etherscan.io/api", - browserURL: "https://rinkeby.etherscan.io", - }, - }, - { - network: "goerli", - chainId: 5, - urls: { - apiURL: "https://api-goerli.etherscan.io/api", - browserURL: "https://goerli.etherscan.io", - }, - }, - { - network: "optimisticEthereum", - chainId: 10, - urls: { - apiURL: "https://api-optimistic.etherscan.io/api", - browserURL: "https://optimistic.etherscan.io/", - }, - }, - { - network: "kovan", - chainId: 42, - urls: { - apiURL: "https://api-kovan.etherscan.io/api", - browserURL: "https://kovan.etherscan.io", - }, - }, - { - network: "bsc", - chainId: 56, - urls: { - apiURL: "https://api.bscscan.com/api", - browserURL: "https://bscscan.com", - }, - }, - { - network: "sokol", - chainId: 77, - urls: { - apiURL: "https://blockscout.com/poa/sokol/api", - browserURL: "https://blockscout.com/poa/sokol", - }, - }, - { - network: "bscTestnet", - chainId: 97, - urls: { - apiURL: "https://api-testnet.bscscan.com/api", - browserURL: "https://testnet.bscscan.com", - }, - }, - { - network: "xdai", - chainId: 100, - urls: { - apiURL: "https://api.gnosisscan.io/api", - browserURL: "https://gnosisscan.io", - }, - }, - { - network: "gnosis", - chainId: 100, - urls: { - apiURL: "https://api.gnosisscan.io/api", - browserURL: "https://gnosisscan.io", - }, - }, - { - network: "heco", - chainId: 128, - urls: { - apiURL: "https://api.hecoinfo.com/api", - browserURL: "https://hecoinfo.com", - }, - }, - { - network: "polygon", - chainId: 137, - urls: { - apiURL: "https://api.polygonscan.com/api", - browserURL: "https://polygonscan.com", - }, - }, - { - network: "opera", - chainId: 250, - urls: { - apiURL: "https://api.ftmscan.com/api", - browserURL: "https://ftmscan.com", - }, - }, - { - network: "hecoTestnet", - chainId: 256, - urls: { - apiURL: "https://api-testnet.hecoinfo.com/api", - browserURL: "https://testnet.hecoinfo.com", - }, - }, - { - network: "optimisticGoerli", - chainId: 420, - urls: { - apiURL: "https://api-goerli-optimism.etherscan.io/api", - browserURL: "https://goerli-optimism.etherscan.io/", - }, - }, - { - network: "moonbeam", - chainId: 1284, - urls: { - apiURL: "https://api-moonbeam.moonscan.io/api", - browserURL: "https://moonbeam.moonscan.io", - }, - }, - { - network: "moonriver", - chainId: 1285, - urls: { - apiURL: "https://api-moonriver.moonscan.io/api", - browserURL: "https://moonriver.moonscan.io", - }, - }, - { - network: "moonbaseAlpha", - chainId: 1287, - urls: { - apiURL: "https://api-moonbase.moonscan.io/api", - browserURL: "https://moonbase.moonscan.io/", - }, - }, - { - network: "ftmTestnet", - chainId: 4002, - urls: { - apiURL: "https://api-testnet.ftmscan.com/api", - browserURL: "https://testnet.ftmscan.com", - }, - }, - { - network: "chiado", - chainId: 10200, - urls: { - apiURL: "https://blockscout.chiadochain.net/api", - browserURL: "https://blockscout.chiadochain.net", - }, - }, - { - network: "arbitrumOne", - chainId: 42161, - urls: { - apiURL: "https://api.arbiscan.io/api", - browserURL: "https://arbiscan.io/", - }, - }, - { - network: "avalancheFujiTestnet", - chainId: 43113, - urls: { - apiURL: "https://api-testnet.snowtrace.io/api", - browserURL: "https://testnet.snowtrace.io/", - }, - }, - { - network: "avalanche", - chainId: 43114, - urls: { - apiURL: "https://api.snowtrace.io/api", - browserURL: "https://snowtrace.io/", - }, - }, - { - network: "polygonMumbai", - chainId: 80001, - urls: { - apiURL: "https://api-testnet.polygonscan.com/api", - browserURL: "https://mumbai.polygonscan.com/", - }, - }, - { - network: "arbitrumTestnet", - chainId: 421611, - urls: { - apiURL: "https://api-testnet.arbiscan.io/api", - browserURL: "https://testnet.arbiscan.io/", - }, - }, - { - network: "arbitrumGoerli", - chainId: 421613, - urls: { - apiURL: "https://api-goerli.arbiscan.io/api", - browserURL: "https://goerli.arbiscan.io/", - }, - }, - { - network: "sepolia", - chainId: 11155111, - urls: { - apiURL: "https://api-sepolia.etherscan.io/api", - browserURL: "https://sepolia.etherscan.io", - }, - }, - { - network: "aurora", - chainId: 1313161554, - urls: { - apiURL: "https://explorer.mainnet.aurora.dev/api", - browserURL: "https://aurorascan.dev/", - }, - }, - { - network: "auroraTestnet", - chainId: 1313161555, - urls: { - apiURL: "https://explorer.testnet.aurora.dev/api", - browserURL: "https://testnet.aurorascan.dev", - }, - }, - { - network: "harmony", - chainId: 1666600000, - urls: { - apiURL: "https://ctrver.t.hmny.io/verify", - browserURL: "https://explorer.harmony.one", - }, - }, - { - network: "harmonyTest", - chainId: 1666700000, - urls: { - apiURL: "https://ctrver.t.hmny.io/verify?network=testnet", - browserURL: "https://explorer.pops.one", - }, - }, -]; - -// We are not adding new networks to the core of hardhat-etherscan anymore. -// Please read this to learn how to manually add support for custom networks: -// https://github.com/NomicFoundation/hardhat/tree/main/packages/hardhat-etherscan#adding-support-for-other-networks diff --git a/packages/hardhat-verify/src/config.ts b/packages/hardhat-verify/src/config.ts deleted file mode 100644 index a39bf3187df..00000000000 --- a/packages/hardhat-verify/src/config.ts +++ /dev/null @@ -1,33 +0,0 @@ -import type LodashCloneDeepT from "lodash.clonedeep"; -import chalk from "chalk"; -import { HardhatConfig, HardhatUserConfig } from "hardhat/types"; -import { EtherscanConfig } from "./types"; - -export function etherscanConfigExtender( - config: HardhatConfig, - userConfig: Readonly -): void { - const defaultConfig: EtherscanConfig = { - apiKey: "", - customChains: [], - }; - - if (userConfig.etherscan !== undefined) { - const cloneDeep = require("lodash.clonedeep") as typeof LodashCloneDeepT; - const customConfig = cloneDeep(userConfig.etherscan); - - config.etherscan = { ...defaultConfig, ...customConfig }; - } else { - config.etherscan = defaultConfig; - - // check that there is no etherscan entry in the networks object, since - // this is a common mistake made by users - if (config.networks?.etherscan !== undefined) { - console.warn( - chalk.yellow( - "WARNING: you have an 'etherscan' entry in your networks configuration. This is likely a mistake. The etherscan configuration should be at the root of the configuration, not within the networks object." - ) - ); - } - } -} diff --git a/packages/hardhat-verify/src/errors.ts b/packages/hardhat-verify/src/errors.ts deleted file mode 100644 index 54c0cd7fedb..00000000000 --- a/packages/hardhat-verify/src/errors.ts +++ /dev/null @@ -1,475 +0,0 @@ -import { NomicLabsHardhatPluginError } from "hardhat/plugins"; -import { - ABIArgumentLengthErrorType, - ABIArgumentOverflowErrorType, - ABIArgumentTypeErrorType, -} from "./abi-validation-extras"; -import { TASK_VERIFY_VERIFY } from "./task-names"; - -export class HardhatEtherscanError extends NomicLabsHardhatPluginError { - constructor(message: string, parent?: Error) { - super("@nomicfoundation/hardhat-verify", message, parent); - } -} - -export class MissingAddressError extends HardhatEtherscanError { - constructor() { - super( - "You didn’t provide any address. Please re-run the 'verify' task with the address of the contract you want to verify." - ); - } -} - -export class InvalidAddressError extends HardhatEtherscanError { - constructor(address: string) { - super(`${address} is an invalid address.`); - } -} - -export class InvalidContractNameError extends HardhatEtherscanError { - constructor(contractName: string) { - super(`A valid fully qualified name was expected. Fully qualified names look like this: "contracts/AContract.sol:TheContract" -Instead, this name was received: ${contractName}`); - } -} - -export class MissingApiKeyError extends HardhatEtherscanError { - constructor(network: string) { - super(`You are trying to verify a contract in '${network}', but no API token was found for this network. Please provide one in your hardhat config. For example: - -{ - ... - etherscan: { - apiKey: { - ${network}: 'your API key' - } - } -} - -See https://etherscan.io/apis`); - } -} - -export class InvalidConstructorArgumentsError extends HardhatEtherscanError { - constructor() { - super(`The constructorArguments parameter should be an array. -If your constructor has no arguments pass an empty array. E.g: - - await run("${TASK_VERIFY_VERIFY}", { - , - constructorArguments: [] - };`); - } -} - -export class ExclusiveConstructorArgumentsError extends HardhatEtherscanError { - constructor() { - super( - "The parameters constructorArgsParams and constructorArgsModule are exclusive. Please provide only one of them." - ); - } -} - -export class InvalidConstructorArgumentsModuleError extends HardhatEtherscanError { - constructor(constructorArgsModulePath: string) { - super(`The module ${constructorArgsModulePath} doesn't export a list. The module should look like this: - -module.exports = [ arg1, arg2, ... ];`); - } -} - -export class InvalidLibrariesError extends HardhatEtherscanError { - constructor() { - super(`The libraries parameter should be a dictionary. -If your contract does not have undetectable libraries pass an empty object or omit the argument. E.g: - - await run("${TASK_VERIFY_VERIFY}", { - , - libraries: {} - };`); - } -} - -export class InvalidLibrariesModuleError extends HardhatEtherscanError { - constructor(librariesModulePath: string) { - super(`The module ${librariesModulePath} doesn't export a dictionary. The module should look like this: - -module.exports = { lib1: "0x...", lib2: "0x...", ... };`); - } -} - -export class ImportingModuleError extends HardhatEtherscanError { - constructor(module: string, parent: Error) { - super( - `Importing the module for the ${module} failed. -Reason: ${parent.message}`, - parent - ); - } -} - -export class NetworkNotSupportedError extends HardhatEtherscanError { - constructor(network: string) { - super( - `The selected network is ${network}. Please select a network supported by Etherscan.` - ); - } -} - -export class ChainConfigNotFoundError extends HardhatEtherscanError { - constructor(chainId: number) { - super(`Trying to verify a contract in a network with chain id ${chainId}, but the plugin doesn't recognize it as a supported chain. - -You can manually add support for it by following these instructions: https://hardhat.org/verify-custom-networks - -To see the list of supported networks, run this command: - - npx hardhat verify --list-networks`); - } -} - -export class ContractVerificationRequestError extends HardhatEtherscanError { - constructor(url: string, parent: Error) { - super( - `Failed to send contract verification request. -Endpoint URL: ${url} -Reason: ${parent.message}`, - parent - ); - } -} - -export class ContractVerificationInvalidStatusCodeError extends HardhatEtherscanError { - constructor(url: string, statusCode: number, responseText: string) { - super(`Failed to send contract verification request. -Endpoint URL: ${url} -The HTTP server response is not ok. Status code: ${statusCode} Response text: ${responseText}`); - } -} - -export class ContractVerificationMissingBytecodeError extends HardhatEtherscanError { - constructor(url: string, contractAddress: string) { - super(`Failed to send contract verification request. -Endpoint URL: ${url} -Reason: The Etherscan API responded that the address ${contractAddress} does not have bytecode. -This can happen if the contract was recently deployed and this fact hasn't propagated to the backend yet. -Try waiting for a minute before verifying your contract. If you are invoking this from a script, -try to wait for five confirmations of your contract deployment transaction before running the verification subtask.`); - } -} - -export class ContractStatusPollingError extends HardhatEtherscanError { - constructor(url: string, parent: Error) { - super( - `Failure during etherscan status polling. The verification may still succeed but -should be checked manually. -Endpoint URL: ${url} -Reason: ${parent.message}`, - parent - ); - } -} - -export class ContractStatusPollingInvalidStatusCodeError extends HardhatEtherscanError { - constructor(statusCode: number, responseText: string) { - super( - `The HTTP server response is not ok. Status code: ${statusCode} Response text: ${responseText}` - ); - } -} - -export class ContractStatusPollingResponseNotOkError extends HardhatEtherscanError { - constructor(message: string) { - super(`The Etherscan API responded with a failure status. -The verification may still succeed but should be checked manually. -Reason: ${message}`); - } -} - -export class EtherscanVersionNotSupportedError extends HardhatEtherscanError { - constructor() { - super(`Etherscan only supports compiler versions 0.4.11 and higher. -See https://etherscan.io/solcversions for more information.`); - } -} - -export class DeployedBytecodeNotFoundError extends HardhatEtherscanError { - constructor(address: string, network: string) { - super(`The address ${address} has no bytecode. Is the contract deployed to this network? -The selected network is ${network}.`); - } -} - -export class CompilerVersionsMismatchError extends HardhatEtherscanError { - constructor( - configCompilerVersions: string[], - inferredCompilerVersion: string, - network: string - ) { - const versionDetails = - configCompilerVersions.length > 1 - ? `versions are: ${configCompilerVersions.join(", ")}` - : `version is: ${configCompilerVersions[0]}`; - - super(`The contract you want to verify was compiled with solidity ${inferredCompilerVersion}, but your configured compiler ${versionDetails}. - -Possible causes are: -- You are not in the same commit that was used to deploy the contract. -- Wrong compiler version selected in hardhat config. -- The given address is wrong. -- The selected network (${network}) is wrong.`); - } -} - -export class ContractNotFoundError extends HardhatEtherscanError { - constructor(contractFQN: string) { - super(`The contract ${contractFQN} is not present in your project.`); - } -} - -export class BuildInfoNotFoundError extends HardhatEtherscanError { - constructor(contractFQN: string) { - super(`The contract ${contractFQN} is present in your project, but we couldn't find its sources. -Please make sure that it has been compiled by Hardhat and that it is written in Solidity.`); - } -} - -export class BuildInfoCompilerVersionMismatchError extends HardhatEtherscanError { - constructor( - contractFQN: string, - compilerVersion: string, - isVersionRange: boolean, - buildInfoCompilerVersion: string, - network: string - ) { - const versionDetails = isVersionRange - ? `a solidity version in the range ${compilerVersion}` - : `the solidity version ${compilerVersion}`; - - super(`The contract ${contractFQN} is being compiled with ${buildInfoCompilerVersion}. -However, the contract found in the address provided as argument has its bytecode marked with ${versionDetails}. - -Possible causes are: -- Solidity compiler version settings were modified after the deployment was executed. -- The given address is wrong. -- The selected network (${network}) is wrong.`); - } -} - -export class DeployedBytecodeMismatchError extends HardhatEtherscanError { - constructor(network: string) { - super(`The address provided as argument contains a contract, but its bytecode doesn't match any of your local contracts. - -Possible causes are: - - Contract code changed after the deployment was executed. This includes code for seemingly unrelated contracts. - - A solidity file was added, moved, deleted or renamed after the deployment was executed. This includes files for seemingly unrelated contracts. - - Solidity compiler settings were modified after the deployment was executed (like the optimizer, target EVM, etc.). - - The given address is wrong. - - The selected network (${network}) is wrong.`); - } -} - -export class DeployedBytecodeMultipleMatchesError extends HardhatEtherscanError { - constructor(fqnMatches: string[]) { - super(`More than one contract was found to match the deployed bytecode. -Please use the contract parameter with one of the following contracts: -${fqnMatches.map((x) => ` * ${x}`).join("\n")} - -For example: - -hardhat verify --contract contracts/Example.sol:ExampleContract - -If you are running the verify subtask from within Hardhat instead: - -await run("${TASK_VERIFY_VERIFY}", { -, -contract: "contracts/Example.sol:ExampleContract" -};`); - } -} - -export class DeployedBytecodeDoesNotMatchFQNError extends HardhatEtherscanError { - constructor(contractFQN: string, network: string) { - super(`The address provided as argument contains a contract, but its bytecode doesn't match the contract ${contractFQN}. - -Possible causes are: - - Contract code changed after the deployment was executed. This includes code for seemingly unrelated contracts. - - A solidity file was added, moved, deleted or renamed after the deployment was executed. This includes files for seemingly unrelated contracts. - - Solidity compiler settings were modified after the deployment was executed (like the optimizer, target EVM, etc.). - - The given address is wrong. - - The selected network (${network}) is wrong.`); - } -} - -export class InvalidLibraryAddressError extends HardhatEtherscanError { - constructor( - contractName: string, - libraryName: string, - libraryAddress: string - ) { - super( - `You gave a link for the contract ${contractName} with the library ${libraryName}, but provided this invalid address: ${libraryAddress}` - ); - } -} - -export class DuplicatedLibraryError extends HardhatEtherscanError { - constructor(libraryName: string, libraryFQN: string) { - super( - `The library names ${libraryName} and ${libraryFQN} refer to the same library and were given as two entries in the libraries dictionary. -Remove one of them and review your libraries dictionary before proceeding.` - ); - } -} - -export class LibraryNotFoundError extends HardhatEtherscanError { - constructor( - contractName: string, - libraryName: string, - allLibraries: string[], - detectableLibraries: string[], - undetectableLibraries: string[] - ) { - const contractLibrariesDetails = `This contract uses the following external libraries: -${undetectableLibraries.map((x) => ` * ${x}`).join("\n")} -${detectableLibraries.map((x) => ` * ${x} (optional)`).join("\n")} -${ - detectableLibraries.length > 0 - ? "Libraries marked as optional don't need to be specified since their addresses are autodetected by the plugin." - : "" -}`; - - super(`You gave an address for the library ${libraryName} in the libraries dictionary, which is not one of the libraries of contract ${contractName}. -${ - allLibraries.length > 0 - ? contractLibrariesDetails - : "This contract doesn't use any external libraries." -}`); - } -} - -export class LibraryMultipleMatchesError extends HardhatEtherscanError { - constructor(contractName: string, libraryName: string, fqnMatches: string[]) { - super(`The library name ${libraryName} is ambiguous for the contract ${contractName}. -It may resolve to one of the following libraries: -${fqnMatches.map((x) => ` * ${x}`).join("\n")} - -To fix this, choose one of these fully qualified library names and replace it in your libraries dictionary.`); - } -} - -export class MissingLibrariesError extends HardhatEtherscanError { - constructor( - contractName: string, - allLibraries: string[], - mergedLibraries: string[], - undetectableLibraries: string[] - ) { - const missingLibraries = allLibraries.filter( - (lib) => !mergedLibraries.some((mergedLib) => lib === mergedLib) - ); - - super(`The contract ${contractName} has one or more library addresses that cannot be detected from deployed bytecode. -This can occur if the library is only called in the contract constructor. The missing libraries are: -${missingLibraries.map((x) => ` * ${x}`).join("\n")} - -${ - missingLibraries.length === undetectableLibraries.length - ? "Visit https://hardhat.org/hardhat-runner/plugins/nomiclabs-hardhat-etherscan#libraries-with-undetectable-addresses to learn how to solve this." - : "To solve this, you can add them to your --libraries dictionary with their corresponding addresses." -}`); - } -} - -export class LibraryAddressesMismatchError extends HardhatEtherscanError { - constructor( - conflicts: Array<{ - library: string; - detectedAddress: string; - inputAddress: string; - }> - ) { - super(`The following detected library addresses are different from the ones provided: -${conflicts - .map( - ({ library, inputAddress, detectedAddress }) => - ` * ${library} -given address: ${inputAddress} -detected address: ${detectedAddress}` - ) - .join("\n")} - -You can either fix these addresses in your libraries dictionary or simply remove them to let the plugin autodetect them.`); - } -} - -export class UnexpectedNumberOfFilesError extends HardhatEtherscanError { - constructor() { - super( - "The plugin found an unexpected number of files for this contract. Please report this issue to the Hardhat team." - ); - } -} - -export class ABIArgumentLengthError extends HardhatEtherscanError { - constructor( - sourceName: string, - contractName: string, - error: ABIArgumentLengthErrorType - ) { - const { types: requiredArgs, values: providedArgs } = error.count; - super( - `The constructor for ${sourceName}:${contractName} has ${requiredArgs} parameters -but ${providedArgs} arguments were provided instead.`, - error - ); - } -} - -export class ABIArgumentTypeError extends HardhatEtherscanError { - constructor(error: ABIArgumentTypeErrorType) { - const { value: argValue, argument: argName, reason } = error; - super( - `Value ${argValue} cannot be encoded for the parameter ${argName}. -Encoder error reason: ${reason}`, - error - ); - } -} - -export class ABIArgumentOverflowError extends HardhatEtherscanError { - constructor(error: ABIArgumentOverflowErrorType) { - const { value: argValue, fault: reason, operation } = error; - super( - `Value ${argValue} is not a safe integer and cannot be encoded. -Use a string instead of a plain number. -Encoder error reason: ${reason} fault in ${operation}`, - error - ); - } -} - -export class VerificationAPIUnexpectedMessageError extends HardhatEtherscanError { - constructor(message: string) { - super(`The API responded with an unexpected message. -Please report this issue to the Hardhat team. -Contract verification may have succeeded and should be checked manually. -Message: ${message}`); - } -} - -export class ContractVerificationFailedError extends HardhatEtherscanError { - constructor(message: string, undetectableLibraries: string[]) { - super(`The contract verification failed. -Reason: ${message} -${ - undetectableLibraries.length > 0 - ? ` -This contract makes use of libraries whose addresses are undetectable by the plugin. -Keep in mind that this verification failure may be due to passing in the wrong -address for one of these libraries: -${undetectableLibraries.map((x) => ` * ${x}`).join("\n")}` - : "" -}`); - } -} diff --git a/packages/hardhat-verify/src/etherscan.ts b/packages/hardhat-verify/src/etherscan.ts index 17cdd8b1c5a..c021bc1a93a 100644 --- a/packages/hardhat-verify/src/etherscan.ts +++ b/packages/hardhat-verify/src/etherscan.ts @@ -1,219 +1 @@ -import type { Dispatcher } from "undici"; - -import { - ContractStatusPollingError, - ContractStatusPollingInvalidStatusCodeError, - ContractVerificationRequestError, - ContractVerificationMissingBytecodeError, - ContractVerificationInvalidStatusCodeError, - HardhatEtherscanError, - MissingApiKeyError, - ContractStatusPollingResponseNotOkError, -} from "./errors"; -import { sendGetRequest, sendPostRequest } from "./undici"; - -import { ChainConfig, ApiKey } from "./types"; -import { sleep } from "./utilities"; - -interface EtherscanVerifyRequestParams { - address: string; - sourceCode: string; - sourceName: string; - contractName: string; - compilerVersion: string; - encodedConstructorArguments: string; -} - -// Used for polling the result of the contract verification. -const VERIFICATION_STATUS_POLLING_TIME = 3000; - -export class Etherscan { - private _apiKey: string; - private _apiUrl: string; - private _browserUrl: string; - - constructor(apiKey: ApiKey | undefined, chainConfig: ChainConfig) { - this._apiKey = resolveApiKey(apiKey, chainConfig.network); - this._apiUrl = chainConfig.urls.apiURL; - this._browserUrl = chainConfig.urls.browserURL.trim().replace(/\/$/, ""); - } - - // https://docs.etherscan.io/api-endpoints/contracts#get-contract-source-code-for-verified-contract-source-codes - public async isVerified(address: string) { - const parameters = new URLSearchParams({ - apikey: this._apiKey, - module: "contract", - action: "getsourcecode", - address, - }); - - const url = new URL(this._apiUrl); - url.search = parameters.toString(); - - const response = await sendGetRequest(url); - const json = await response.body.json(); - - if (json.message !== "OK") { - return false; - } - - const sourceCode = json?.result?.[0]?.SourceCode; - return sourceCode !== undefined && sourceCode !== ""; - } - - // https://docs.etherscan.io/api-endpoints/contracts#verify-source-code - public async verify({ - address, - sourceCode, - sourceName, - contractName, - compilerVersion, - encodedConstructorArguments, - }: EtherscanVerifyRequestParams): Promise { - const parameters = new URLSearchParams({ - apikey: this._apiKey, - module: "contract", - action: "verifysourcecode", - contractaddress: address, - sourceCode, - codeformat: "solidity-standard-json-input", - contractname: `${sourceName}:${contractName}`, - compilerversion: `v${compilerVersion}`, - constructorArguements: encodedConstructorArguments, - }); - - let response: Dispatcher.ResponseData; - try { - response = await sendPostRequest( - new URL(this._apiUrl), - parameters.toString() - ); - } catch (error: any) { - throw new ContractVerificationRequestError(this._apiUrl, error); - } - - if (!(response.statusCode >= 200 && response.statusCode <= 299)) { - // This could be always interpreted as JSON if there were any such guarantee in the Etherscan API. - const responseText = await response.body.text(); - throw new ContractVerificationInvalidStatusCodeError( - this._apiUrl, - response.statusCode, - responseText - ); - } - - const etherscanResponse = new EtherscanResponse(await response.body.json()); - - if (etherscanResponse.isBytecodeMissingInNetworkError()) { - throw new ContractVerificationMissingBytecodeError(this._apiUrl, address); - } - - if (!etherscanResponse.isOk()) { - throw new HardhatEtherscanError(etherscanResponse.message); - } - - return etherscanResponse; - } - - // https://docs.etherscan.io/api-endpoints/contracts#check-source-code-verification-submission-status - public async getVerificationStatus(guid: string): Promise { - const parameters = new URLSearchParams({ - apikey: this._apiKey, - module: "contract", - action: "checkverifystatus", - guid, - }); - const url = new URL(this._apiUrl); - url.search = parameters.toString(); - - let response; - try { - response = await sendGetRequest(url); - } catch (error: any) { - throw new ContractStatusPollingError(url.toString(), error); - } - - if (!(response.statusCode >= 200 && response.statusCode <= 299)) { - // This could be always interpreted as JSON if there were any such guarantee in the Etherscan API. - const responseText = await response.body.text(); - - throw new ContractStatusPollingInvalidStatusCodeError( - response.statusCode, - responseText - ); - } - - const etherscanResponse = new EtherscanResponse(await response.body.json()); - - if (etherscanResponse.isPending()) { - await sleep(VERIFICATION_STATUS_POLLING_TIME); - - return this.getVerificationStatus(guid); - } - - if (etherscanResponse.isFailure()) { - return etherscanResponse; - } - - if (!etherscanResponse.isOk()) { - throw new ContractStatusPollingResponseNotOkError( - etherscanResponse.message - ); - } - - return etherscanResponse; - } - - public getContractUrl(address: string) { - return `${this._browserUrl}/address/${address}#code`; - } -} - -class EtherscanResponse { - public readonly status: number; - - public readonly message: string; - - constructor(response: any) { - this.status = parseInt(response.status, 10); - this.message = response.result; - } - - public isPending() { - return this.message === "Pending in queue"; - } - - public isFailure() { - return this.message === "Fail - Unable to verify"; - } - - public isSuccess() { - return this.message === "Pass - Verified"; - } - - public isBytecodeMissingInNetworkError() { - return this.message.startsWith("Unable to locate ContractCode at"); - } - - public isOk() { - return this.status === 1; - } -} - -function resolveApiKey(apiKey: ApiKey | undefined, network: string) { - if (apiKey === undefined || apiKey === "") { - throw new MissingApiKeyError(network); - } - - if (typeof apiKey === "string") { - return apiKey; - } - - const key = apiKey[network]; - - if (key === undefined || key === "") { - throw new MissingApiKeyError(network); - } - - return key; -} +export { Etherscan } from "./internal/etherscan"; diff --git a/packages/hardhat-verify/src/index.ts b/packages/hardhat-verify/src/index.ts index 5c78cb59caf..a012442dca8 100644 --- a/packages/hardhat-verify/src/index.ts +++ b/packages/hardhat-verify/src/index.ts @@ -1,75 +1,58 @@ -import type LodashCloneDeepT from "lodash.clonedeep"; import type { - CompilationJob, - CompilerInput, - DependencyGraph, -} from "hardhat/types"; + ContractInformation, + ExtendedContractInformation, + LibraryToAddress, +} from "./internal/solc/artifacts"; +import type { Bytecode } from "./internal/solc/bytecode"; +import chalk from "chalk"; import { extendConfig, subtask, task, types } from "hardhat/config"; -import { isFullyQualifiedName } from "hardhat/utils/contract-names"; -import { - TASK_COMPILE, - TASK_COMPILE_SOLIDITY_GET_COMPILATION_JOB_FOR_FILE, - TASK_COMPILE_SOLIDITY_GET_COMPILER_INPUT, - TASK_COMPILE_SOLIDITY_GET_DEPENDENCY_GRAPH, -} from "hardhat/builtin-tasks/task-names"; + import { TASK_VERIFY, - TASK_VERIFY_ETHERSCAN_ATTEMPT_VERIFICATION, - TASK_VERIFY_ETHERSCAN_GET_CONTRACT_INFORMATION, - TASK_VERIFY_ETHERSCAN_GET_MINIMAL_INPUT, TASK_VERIFY_GET_VERIFICATION_SUBTASKS, - TASK_VERIFY_RESOLVE_ARGUMENTS, TASK_VERIFY_VERIFY, TASK_VERIFY_ETHERSCAN, -} from "./task-names"; -import { getCurrentChainConfig } from "./chain-config"; -import { etherscanConfigExtender } from "./config"; + TASK_VERIFY_PRINT_SUPPORTED_NETWORKS, + TASK_VERIFY_SOURCIFY, + TASK_VERIFY_SOURCIFY_DISABLED_WARNING, + TASK_VERIFY_GET_CONTRACT_INFORMATION, +} from "./internal/task-names"; +import { + etherscanConfigExtender, + sourcifyConfigExtender, +} from "./internal/config"; import { - MissingAddressError, - InvalidAddressError, - InvalidContractNameError, InvalidConstructorArgumentsError, InvalidLibrariesError, - CompilerVersionsMismatchError, + HardhatVerifyError, ContractNotFoundError, BuildInfoNotFoundError, BuildInfoCompilerVersionMismatchError, - DeployedBytecodeDoesNotMatchFQNError, - UnexpectedNumberOfFilesError, - VerificationAPIUnexpectedMessageError, - ContractVerificationFailedError, -} from "./errors"; + DeployedBytecodeMismatchError, +} from "./internal/errors"; import { - sleep, - encodeArguments, - getCompilerVersions, printSupportedNetworks, - resolveConstructorArguments, - resolveLibraries, -} from "./utilities"; -import { Etherscan } from "./etherscan"; -import { Bytecode } from "./solc/bytecode"; + printVerificationErrors, +} from "./internal/utilities"; import { - ContractInformation, - ExtendedContractInformation, - extractInferredContractInformation, extractMatchingContractInformation, + extractInferredContractInformation, getLibraryInformation, - LibraryToAddress, -} from "./solc/artifacts"; +} from "./internal/solc/artifacts"; -import "./type-extensions"; +import "./internal/type-extensions"; +import "./internal/tasks/etherscan"; +import "./internal/tasks/sourcify"; // Main task args -interface VerifyTaskArgs { +export interface VerifyTaskArgs { address?: string; constructorArgsParams: string[]; constructorArgs?: string; libraries?: string; contract?: string; listNetworks: boolean; - noCompile: boolean; } // verify:verify subtask args @@ -78,17 +61,11 @@ interface VerifySubtaskArgs { constructorArguments: string[]; libraries: LibraryToAddress; contract?: string; - noCompile: boolean; } -// parsed verification args -interface VerificationArgs { - address: string; - constructorArgs: string[]; - libraries: LibraryToAddress; - contractFQN?: string; - listNetworks: boolean; - noCompile: boolean; +export interface VerificationResponse { + success: boolean; + message: string; } interface GetContractInformationArgs { @@ -98,32 +75,21 @@ interface GetContractInformationArgs { libraries: LibraryToAddress; } -interface GetMinimalInputArgs { - sourceName: string; -} - -interface AttemptVerificationArgs { - address: string; - compilerInput: CompilerInput; - contractInformation: ExtendedContractInformation; - verificationInterface: Etherscan; - encodedConstructorArguments: string; -} - -interface VerificationResponse { - success: boolean; - message: string; +export interface VerificationSubtask { + label: string; + subtaskName: string; } extendConfig(etherscanConfigExtender); +extendConfig(sourcifyConfigExtender); /** * Main verification task. * * This is a meta-task that gets all the verification tasks and runs them. - * Right now there's only a "verify-etherscan" task. + * It supports Etherscan and Sourcify. */ -task(TASK_VERIFY, "Verifies a contract on Etherscan") +task(TASK_VERIFY, "Verifies a contract on Etherscan or Sourcify") .addOptionalPositionalParam("address", "Address of the contract to verify") .addOptionalVariadicPositionalParam( "constructorArgsParams", @@ -150,217 +116,76 @@ task(TASK_VERIFY, "Verifies a contract on Etherscan") "Use if the deployed bytecode matches more than one contract in your project" ) .addFlag("listNetworks", "Print the list of supported networks") - .addFlag("noCompile", "Don't compile before running the task") .setAction(async (taskArgs: VerifyTaskArgs, { run }) => { - const verificationArgs: VerificationArgs = await run( - TASK_VERIFY_RESOLVE_ARGUMENTS, - taskArgs - ); + if (taskArgs.listNetworks) { + await run(TASK_VERIFY_PRINT_SUPPORTED_NETWORKS); + return; + } - const verificationSubtasks: string[] = await run( + const verificationSubtasks: VerificationSubtask[] = await run( TASK_VERIFY_GET_VERIFICATION_SUBTASKS ); - for (const verificationSubtask of verificationSubtasks) { - await run(verificationSubtask, verificationArgs); - } - }); - -subtask(TASK_VERIFY_RESOLVE_ARGUMENTS) - .addOptionalParam("address") - .addOptionalParam("constructorArgsParams", undefined, [], types.any) - .addOptionalParam("constructorArgs", undefined, undefined, types.inputFile) - .addOptionalParam("libraries", undefined, undefined, types.inputFile) - .addOptionalParam("contract") - .addFlag("listNetworks") - .addFlag("noCompile") - .setAction( - async ({ - address, - constructorArgsParams, - constructorArgs: constructorArgsModule, - contract, - libraries: librariesModule, - listNetworks, - noCompile, - }: VerifyTaskArgs): Promise => { - if (address === undefined) { - throw new MissingAddressError(); - } - - const { isAddress } = await import("@ethersproject/address"); - if (!isAddress(address)) { - throw new InvalidAddressError(address); + const errors: Record = {}; + for (const { label, subtaskName } of verificationSubtasks) { + try { + await run(subtaskName, taskArgs); + } catch (error) { + errors[label] = error as HardhatVerifyError; } + } - if (contract !== undefined && !isFullyQualifiedName(contract)) { - throw new InvalidContractNameError(contract); - } - - const constructorArgs = await resolveConstructorArguments( - constructorArgsParams, - constructorArgsModule - ); - - const libraries = await resolveLibraries(librariesModule); - - return { - address, - constructorArgs, - libraries, - contractFQN: contract, - listNetworks, - noCompile, - }; + const hasErrors = Object.keys(errors).length > 0; + if (hasErrors) { + printVerificationErrors(errors); + process.exit(1); } - ); + }); -/** - * Returns a list of verification subtasks. - */ -subtask(TASK_VERIFY_GET_VERIFICATION_SUBTASKS, async (): Promise => { - return [TASK_VERIFY_ETHERSCAN]; +subtask( + TASK_VERIFY_PRINT_SUPPORTED_NETWORKS, + "Prints the supported networks list" +).setAction(async ({}, { config }) => { + await printSupportedNetworks(config.etherscan.customChains); }); -/** - * Main Etherscan verification subtask. - * - * Verifies a contract in Etherscan by coordinating various subtasks related - * to contract verification. - */ -subtask(TASK_VERIFY_ETHERSCAN) - .addParam("address") - .addParam("constructorArgs", undefined, undefined, types.any) - .addParam("libraries", undefined, undefined, types.any) - .addOptionalParam("contractFQN") - .addFlag("listNetworks") - .addFlag("noCompile") - .setAction( - async ( - { - address, - constructorArgs, - libraries, - contractFQN, - listNetworks, - noCompile, - }: VerificationArgs, - { config, network, run } - ) => { - if (listNetworks) { - await printSupportedNetworks(config.etherscan.customChains); - return; - } - - const chainConfig = await getCurrentChainConfig( - network, - config.etherscan.customChains - ); - - const etherscan = new Etherscan(config.etherscan.apiKey, chainConfig); - - const isVerified = await etherscan.isVerified(address); - if (isVerified) { - const contractURL = etherscan.getContractUrl(address); - console.log(`The contract ${address} has already been verified. -${contractURL}`); - return; - } - - const configCompilerVersions = await getCompilerVersions(config.solidity); - - const deployedBytecode = await Bytecode.getDeployedContractBytecode( - address, - network.provider, - network.name - ); - - const matchingCompilerVersions = - await deployedBytecode.getMatchingVersions(configCompilerVersions); - // don't error if the bytecode appears to be OVM bytecode, because we can't infer a specific OVM solc version from the bytecode - if (matchingCompilerVersions.length === 0 && !deployedBytecode.isOvm()) { - throw new CompilerVersionsMismatchError( - configCompilerVersions, - deployedBytecode.getVersion(), - network.name - ); - } - - // Make sure that contract artifacts are up-to-date - if (!noCompile) { - await run(TASK_COMPILE, { quiet: true }); - } - - const contractInformation: ExtendedContractInformation = await run( - TASK_VERIFY_ETHERSCAN_GET_CONTRACT_INFORMATION, - { - contractFQN, - deployedBytecode, - matchingCompilerVersions, - libraries, - } - ); - - const minimalInput: CompilerInput = await run( - TASK_VERIFY_ETHERSCAN_GET_MINIMAL_INPUT, - { - sourceName: contractInformation.sourceName, - } - ); - - const encodedConstructorArguments = await encodeArguments( - contractInformation.contractOutput.abi, - contractInformation.sourceName, - contractInformation.contractName, - constructorArgs - ); - - // First, try to verify the contract using the minimal input - const { success: minimalInputVerificationSuccess }: VerificationResponse = - await run(TASK_VERIFY_ETHERSCAN_ATTEMPT_VERIFICATION, { - address, - compilerInput: minimalInput, - contractInformation, - verificationInterface: etherscan, - encodedConstructorArguments, - }); - - if (minimalInputVerificationSuccess) { - return; - } - - console.log(`We tried verifying your contract ${contractInformation.contractName} without including any unrelated one, but it failed. -Trying again with the full solc input used to compile and deploy it. -This means that unrelated contracts may be displayed on Etherscan... -`); +subtask( + TASK_VERIFY_GET_VERIFICATION_SUBTASKS, + async (_, { config, userConfig }): Promise => { + const verificationSubtasks: VerificationSubtask[] = []; - // If verifying with the minimal input failed, try again with the full compiler input - const { - success: fullCompilerInputVerificationSuccess, - message: verificationMessage, - }: VerificationResponse = await run( - TASK_VERIFY_ETHERSCAN_ATTEMPT_VERIFICATION, - { - address, - compilerInput: contractInformation.compilerInput, - contractInformation, - verificationInterface: etherscan, - encodedConstructorArguments, - } - ); + if (config.etherscan.enabled) { + verificationSubtasks.push({ + label: "Etherscan", + subtaskName: TASK_VERIFY_ETHERSCAN, + }); + } - if (fullCompilerInputVerificationSuccess) { - return; - } + if (config.sourcify.enabled) { + verificationSubtasks.push({ + label: "Sourcify", + subtaskName: TASK_VERIFY_SOURCIFY, + }); + } else if (userConfig.sourcify?.enabled === undefined) { + verificationSubtasks.unshift({ + label: "Common", + subtaskName: TASK_VERIFY_SOURCIFY_DISABLED_WARNING, + }); + } - throw new ContractVerificationFailedError( - verificationMessage, - contractInformation.undetectableLibraries + if (!config.etherscan.enabled && !config.sourcify.enabled) { + console.warn( + chalk.yellow( + `[WARNING] No verification services are enabled. Please enable at least one verification service in your configuration.` + ) ); } - ); -subtask(TASK_VERIFY_ETHERSCAN_GET_CONTRACT_INFORMATION) + return verificationSubtasks; + } +); + +subtask(TASK_VERIFY_GET_CONTRACT_INFORMATION) .addParam("deployedBytecode", undefined, undefined, types.any) .addParam("matchingCompilerVersions", undefined, undefined, types.any) .addParam("libraries", undefined, undefined, types.any) @@ -378,12 +203,7 @@ subtask(TASK_VERIFY_ETHERSCAN_GET_CONTRACT_INFORMATION) let contractInformation: ContractInformation | null; if (contractFQN !== undefined) { - let artifactExists; - try { - artifactExists = await artifacts.artifactExists(contractFQN); - } catch (error) { - artifactExists = false; - } + const artifactExists = await artifacts.artifactExists(contractFQN); if (!artifactExists) { throw new ContractNotFoundError(contractFQN); @@ -414,10 +234,7 @@ subtask(TASK_VERIFY_ETHERSCAN_GET_CONTRACT_INFORMATION) ); if (contractInformation === null) { - throw new DeployedBytecodeDoesNotMatchFQNError( - contractFQN, - network.name - ); + throw new DeployedBytecodeMismatchError(network.name, contractFQN); } } else { contractInformation = await extractInferredContractInformation( @@ -441,132 +258,21 @@ subtask(TASK_VERIFY_ETHERSCAN_GET_CONTRACT_INFORMATION) } ); -subtask(TASK_VERIFY_ETHERSCAN_GET_MINIMAL_INPUT) - .addParam("sourceName") - .setAction(async ({ sourceName }: GetMinimalInputArgs, { run }) => { - const cloneDeep = require("lodash.clonedeep") as typeof LodashCloneDeepT; - const dependencyGraph: DependencyGraph = await run( - TASK_COMPILE_SOLIDITY_GET_DEPENDENCY_GRAPH, - { sourceNames: [sourceName] } - ); - - const resolvedFiles = dependencyGraph - .getResolvedFiles() - .filter((resolvedFile) => resolvedFile.sourceName === sourceName); - - if (resolvedFiles.length !== 1) { - throw new UnexpectedNumberOfFilesError(); - } - - const compilationJob: CompilationJob = await run( - TASK_COMPILE_SOLIDITY_GET_COMPILATION_JOB_FOR_FILE, - { - dependencyGraph, - file: resolvedFiles[0], - } - ); - - const minimalInput: CompilerInput = await run( - TASK_COMPILE_SOLIDITY_GET_COMPILER_INPUT, - { - compilationJob, - } - ); - - return cloneDeep(minimalInput); - }); - -subtask(TASK_VERIFY_ETHERSCAN_ATTEMPT_VERIFICATION) - .addParam("address") - .addParam("compilerInput", undefined, undefined, types.any) - .addParam("contractInformation", undefined, undefined, types.any) - .addParam("verificationInterface", undefined, undefined, types.any) - .addParam("encodedConstructorArguments") - .setAction( - async ({ - address, - compilerInput, - contractInformation, - verificationInterface, - encodedConstructorArguments, - }: AttemptVerificationArgs): Promise => { - // Ensure the linking information is present in the compiler input; - compilerInput.settings.libraries = contractInformation.libraries; - - const { message: guid } = await verificationInterface.verify({ - address, - sourceCode: JSON.stringify(compilerInput), - sourceName: contractInformation.sourceName, - contractName: contractInformation.contractName, - compilerVersion: contractInformation.solcLongVersion, - encodedConstructorArguments, - }); - - console.log(`Successfully submitted source code for contract -${contractInformation.sourceName}:${contractInformation.contractName} at ${address} -for verification on the block explorer. Waiting for verification result... -`); - - // Compilation is bound to take some time so there's no sense in requesting status immediately. - await sleep(700); - const verificationStatus = - await verificationInterface.getVerificationStatus(guid); - - if (!(verificationStatus.isFailure() || verificationStatus.isSuccess())) { - // Reaching this point shouldn't be possible unless the API is behaving in a new way. - throw new VerificationAPIUnexpectedMessageError( - verificationStatus.message - ); - } - - if (verificationStatus.isSuccess()) { - const contractURL = verificationInterface.getContractUrl(address); - console.log(`Successfully verified contract ${contractInformation.contractName} on Etherscan. -${contractURL}`); - } - - return { - success: verificationStatus.isSuccess(), - message: verificationStatus.message, - }; - } - ); - /** * This subtask is used for backwards compatibility. - * It validates the parameters as it is done in TASK_VERIFY_RESOLVE_ARGUMENTS - * and calls TASK_VERIFY_ETHERSCAN directly. + * TODO [remove-verify-subtask]: if you're going to remove this subtask, + * update TASK_VERIFY_ETHERSCAN and TASK_VERIFY_ETHERSCAN_RESOLVE_ARGUMENTS accordingly */ subtask(TASK_VERIFY_VERIFY) .addOptionalParam("address") .addOptionalParam("constructorArguments", undefined, [], types.any) .addOptionalParam("libraries", undefined, {}, types.any) .addOptionalParam("contract") - .addFlag("noCompile") .setAction( async ( - { - address, - constructorArguments, - libraries, - contract, - noCompile, - }: VerifySubtaskArgs, + { address, constructorArguments, libraries, contract }: VerifySubtaskArgs, { run } ) => { - if (address === undefined) { - throw new MissingAddressError(); - } - - const { isAddress } = await import("@ethersproject/address"); - if (!isAddress(address)) { - throw new InvalidAddressError(address); - } - - if (contract !== undefined && !isFullyQualifiedName(contract)) { - throw new InvalidContractNameError(contract); - } - // This can only happen if the subtask is invoked from within Hardhat by a user script or another task. if (!Array.isArray(constructorArguments)) { throw new InvalidConstructorArgumentsError(); @@ -578,10 +284,9 @@ subtask(TASK_VERIFY_VERIFY) await run(TASK_VERIFY_ETHERSCAN, { address, - constructorArgs: constructorArguments, + constructorArgsParams: constructorArguments, libraries, - contractFQN: contract, - noCompile, + contract, }); } ); diff --git a/packages/hardhat-verify/src/abi-validation-extras.ts b/packages/hardhat-verify/src/internal/abi-validation-extras.ts similarity index 100% rename from packages/hardhat-verify/src/abi-validation-extras.ts rename to packages/hardhat-verify/src/internal/abi-validation-extras.ts diff --git a/packages/hardhat-verify/src/internal/blockscout.chain-config.ts b/packages/hardhat-verify/src/internal/blockscout.chain-config.ts new file mode 100644 index 00000000000..f72250c6ccc --- /dev/null +++ b/packages/hardhat-verify/src/internal/blockscout.chain-config.ts @@ -0,0 +1,21 @@ +import type { ChainConfig } from "../types"; + +// See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-155.md#list-of-chain-ids +export const builtinChains: ChainConfig[] = [ + { + network: "mainnet", + chainId: 1, + urls: { + apiURL: "https://eth.blockscout.com/api", + browserURL: "https://eth.blockscout.com/", + }, + }, + { + network: "sepolia", + chainId: 11155111, + urls: { + apiURL: "https://eth-sepolia.blockscout.com/api", + browserURL: "https://eth-sepolia.blockscout.com/", + }, + }, +]; diff --git a/packages/hardhat-verify/src/internal/blockscout.ts b/packages/hardhat-verify/src/internal/blockscout.ts new file mode 100644 index 00000000000..9380e7b0e96 --- /dev/null +++ b/packages/hardhat-verify/src/internal/blockscout.ts @@ -0,0 +1,175 @@ +import type { EthereumProvider } from "hardhat/types"; +import type { ChainConfig } from "../types"; + +import { HARDHAT_NETWORK_NAME } from "hardhat/plugins"; + +import { + ChainConfigNotFoundError, + HardhatNetworkNotSupportedError, +} from "./errors"; +import { ValidationResponse } from "./utilities"; +import { builtinChains } from "./blockscout.chain-config"; + +import { Etherscan } from "./etherscan"; + +/** + * Blockscout verification provider for verifying smart contracts. + */ +export class Blockscout { + private _etherscan: Etherscan; + + /** + * Create a new instance of the Blockscout verification provider. + * @param apiUrl - The Blockscout API URL, e.g. https://eth.blockscout.com/api. + * @param browserUrl - The Blockscout browser URL, e.g. https://eth.blockscout.com. + */ + constructor(public apiUrl: string, public browserUrl: string) { + this._etherscan = new Etherscan("api_key", apiUrl, browserUrl); + } + + public static async getCurrentChainConfig( + networkName: string, + ethereumProvider: EthereumProvider, + customChains: ChainConfig[] + ): Promise { + const currentChainId = parseInt( + await ethereumProvider.send("eth_chainId"), + 16 + ); + + const currentChainConfig = [ + // custom chains has higher precedence than builtin chains + ...[...customChains].reverse(), // the last entry has higher precedence + ...builtinChains, + ].find(({ chainId }) => chainId === currentChainId); + + if (currentChainConfig === undefined) { + if (networkName === HARDHAT_NETWORK_NAME) { + throw new HardhatNetworkNotSupportedError(); + } + + throw new ChainConfigNotFoundError(currentChainId); + } + + return currentChainConfig; + } + + public static fromChainConfig(chainConfig: ChainConfig): Blockscout { + const apiUrl = chainConfig.urls.apiURL; + const browserUrl = chainConfig.urls.browserURL.trim().replace(/\/$/, ""); + + return new Blockscout(apiUrl, browserUrl); + } + + /** + * Check if a smart contract is verified on Blockscout. + * @link https://docs.blockscout.com/for-users/api/rpc-endpoints/contract#get-contract-source-code-for-a-verified-contract + * @param address - The address of the smart contract. + * @returns True if the contract is verified, false otherwise. + * @throws {NetworkRequestError} if there is an error on the request. + * @throws {ContractVerificationInvalidStatusCodeError} if the API returns an invalid status code. + */ + public async isVerified(address: string): Promise { + return this._etherscan.isVerified(address); + } + + /** + * Verify a smart contract on Blockscout. + * @link https://docs.blockscout.com/for-users/api/rpc-endpoints/contract#verify-a-contract-with-standard-input-json-file + * @param contractAddress - The address of the smart contract to verify. + * @param sourceCode - The source code of the smart contract. + * @param contractName - The name of the smart contract, e.g. "contracts/Sample.sol:MyContract" + * @param compilerVersion - The version of the Solidity compiler used, e.g. `v0.8.19+commit.7dd6d404` + * @returns A promise that resolves to an `BlockscoutResponse` object. + * @throws {NetworkRequestError} if there is an error on the request. + * @throws {ContractVerificationInvalidStatusCodeError} if the API returns an invalid status code. + * @throws {ContractVerificationMissingBytecodeError} if the bytecode is not found on the block explorer. + * @throws {ContractAlreadyVerifiedError} if the contract is already verified. + * @throws {HardhatVerifyError} if the response status is not OK. + */ + public async verify( + contractAddress: string, + sourceCode: string, + contractName: string, + compilerVersion: string + ): Promise { + const etherscanResponse = await this._etherscan.verify( + contractAddress, + sourceCode, + contractName, + compilerVersion, + "" + ); + + return new BlockscoutResponse( + etherscanResponse.status, + etherscanResponse.message + ); + } + + /** + * Get the verification status of a smart contract from Blockscout. + * This method performs polling of the verification status if it's pending. + * @link https://docs.blockscout.com/for-users/api/rpc-endpoints/contract#return-status-of-a-verification-attempt + * @param guid - The verification GUID to check. + * @returns A promise that resolves to an `BlockscoutResponse` object. + * @throws {NetworkRequestError} if there is an error on the request. + * @throws {ContractStatusPollingInvalidStatusCodeError} if the API returns an invalid status code. + * @throws {ContractStatusPollingResponseNotOkError} if the response status is not OK. + */ + public async getVerificationStatus( + guid: string + ): Promise { + const etherscanResponse = await this._etherscan.getVerificationStatus(guid); + + return new BlockscoutResponse( + etherscanResponse.status, + etherscanResponse.message + ); + } + + /** + * Get the Blockscout URL for viewing a contract's details. + * @param address - The address of the smart contract. + * @returns The URL to view the contract on Blockscout's website. + */ + public getContractUrl(address: string): string { + return `${this.browserUrl}/address/${address}#code`; + } +} + +class BlockscoutResponse implements ValidationResponse { + public readonly status: number; + public readonly message: string; + + constructor(status: number, message: string) { + this.status = status; + this.message = message; + } + + public isPending() { + return this.message === "Pending in queue"; + } + + public isFailure() { + return this.message === "Fail - Unable to verify"; + } + + public isSuccess() { + return this.message === "Pass - Verified"; + } + + public isAlreadyVerified() { + return ( + // returned by blockscout + this.message.startsWith("Smart-contract already verified") || + // returned by etherscan + this.message.startsWith("Contract source code already verified") || + this.message.startsWith("Already Verified") + ); + } + + public isOk() { + return this.status === 1; + } +} diff --git a/packages/hardhat-verify/src/internal/chain-config.ts b/packages/hardhat-verify/src/internal/chain-config.ts new file mode 100644 index 00000000000..b02295898a2 --- /dev/null +++ b/packages/hardhat-verify/src/internal/chain-config.ts @@ -0,0 +1,272 @@ +import type { ChainConfig } from "../types"; + +// See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-155.md#list-of-chain-ids +export const builtinChains: ChainConfig[] = [ + { + network: "mainnet", + chainId: 1, + urls: { + apiURL: "https://api.etherscan.io/api", + browserURL: "https://etherscan.io", + }, + }, + { + network: "goerli", + chainId: 5, + urls: { + apiURL: "https://api-goerli.etherscan.io/api", + browserURL: "https://goerli.etherscan.io", + }, + }, + { + network: "optimisticEthereum", + chainId: 10, + urls: { + apiURL: "https://api-optimistic.etherscan.io/api", + browserURL: "https://optimistic.etherscan.io/", + }, + }, + { + network: "bsc", + chainId: 56, + urls: { + apiURL: "https://api.bscscan.com/api", + browserURL: "https://bscscan.com", + }, + }, + { + network: "sokol", + chainId: 77, + urls: { + apiURL: "https://blockscout.com/poa/sokol/api", + browserURL: "https://blockscout.com/poa/sokol", + }, + }, + { + network: "bscTestnet", + chainId: 97, + urls: { + apiURL: "https://api-testnet.bscscan.com/api", + browserURL: "https://testnet.bscscan.com", + }, + }, + { + network: "xdai", + chainId: 100, + urls: { + apiURL: "https://api.gnosisscan.io/api", + browserURL: "https://gnosisscan.io", + }, + }, + { + network: "gnosis", + chainId: 100, + urls: { + apiURL: "https://api.gnosisscan.io/api", + browserURL: "https://gnosisscan.io", + }, + }, + { + network: "heco", + chainId: 128, + urls: { + apiURL: "https://api.hecoinfo.com/api", + browserURL: "https://hecoinfo.com", + }, + }, + { + network: "polygon", + chainId: 137, + urls: { + apiURL: "https://api.polygonscan.com/api", + browserURL: "https://polygonscan.com", + }, + }, + { + network: "opera", + chainId: 250, + urls: { + apiURL: "https://api.ftmscan.com/api", + browserURL: "https://ftmscan.com", + }, + }, + { + network: "hecoTestnet", + chainId: 256, + urls: { + apiURL: "https://api-testnet.hecoinfo.com/api", + browserURL: "https://testnet.hecoinfo.com", + }, + }, + { + network: "optimisticGoerli", + chainId: 420, + urls: { + apiURL: "https://api-goerli-optimism.etherscan.io/api", + browserURL: "https://goerli-optimism.etherscan.io/", + }, + }, + { + network: "polygonZkEVM", + chainId: 1101, + urls: { + apiURL: "https://api-zkevm.polygonscan.com/api", + browserURL: "https://zkevm.polygonscan.com", + }, + }, + { + network: "moonbeam", + chainId: 1284, + urls: { + apiURL: "https://api-moonbeam.moonscan.io/api", + browserURL: "https://moonbeam.moonscan.io", + }, + }, + { + network: "moonriver", + chainId: 1285, + urls: { + apiURL: "https://api-moonriver.moonscan.io/api", + browserURL: "https://moonriver.moonscan.io", + }, + }, + { + network: "moonbaseAlpha", + chainId: 1287, + urls: { + apiURL: "https://api-moonbase.moonscan.io/api", + browserURL: "https://moonbase.moonscan.io/", + }, + }, + { + network: "polygonZkEVMTestnet", + chainId: 1442, + urls: { + apiURL: "https://api-testnet-zkevm.polygonscan.com/api", + browserURL: "https://testnet-zkevm.polygonscan.com", + }, + }, + { + network: "ftmTestnet", + chainId: 4002, + urls: { + apiURL: "https://api-testnet.ftmscan.com/api", + browserURL: "https://testnet.ftmscan.com", + }, + }, + { + network: "base", + chainId: 8453, + urls: { + apiURL: "https://api.basescan.org/api", + browserURL: "https://basescan.org/", + }, + }, + { + network: "chiado", + chainId: 10200, + urls: { + apiURL: "https://gnosis-chiado.blockscout.com/api", + browserURL: "https://gnosis-chiado.blockscout.com", + }, + }, + { + network: "arbitrumOne", + chainId: 42161, + urls: { + apiURL: "https://api.arbiscan.io/api", + browserURL: "https://arbiscan.io/", + }, + }, + { + network: "avalancheFujiTestnet", + chainId: 43113, + urls: { + apiURL: "https://api-testnet.snowtrace.io/api", + browserURL: "https://testnet.snowtrace.io/", + }, + }, + { + network: "avalanche", + chainId: 43114, + urls: { + apiURL: "https://api.snowtrace.io/api", + browserURL: "https://snowtrace.io/", + }, + }, + { + network: "polygonMumbai", + chainId: 80001, + urls: { + apiURL: "https://api-testnet.polygonscan.com/api", + browserURL: "https://mumbai.polygonscan.com/", + }, + }, + { + network: "baseGoerli", + chainId: 84531, + urls: { + apiURL: "https://api-goerli.basescan.org/api", + browserURL: "https://goerli.basescan.org/", + }, + }, + { + network: "arbitrumTestnet", + chainId: 421611, + urls: { + apiURL: "https://api-testnet.arbiscan.io/api", + browserURL: "https://testnet.arbiscan.io/", + }, + }, + { + network: "arbitrumGoerli", + chainId: 421613, + urls: { + apiURL: "https://api-goerli.arbiscan.io/api", + browserURL: "https://goerli.arbiscan.io/", + }, + }, + { + network: "sepolia", + chainId: 11155111, + urls: { + apiURL: "https://api-sepolia.etherscan.io/api", + browserURL: "https://sepolia.etherscan.io", + }, + }, + { + network: "aurora", + chainId: 1313161554, + urls: { + apiURL: "https://explorer.mainnet.aurora.dev/api", + browserURL: "https://explorer.mainnet.aurora.dev", + }, + }, + { + network: "auroraTestnet", + chainId: 1313161555, + urls: { + apiURL: "https://explorer.testnet.aurora.dev/api", + browserURL: "https://explorer.testnet.aurora.dev", + }, + }, + { + network: "harmony", + chainId: 1666600000, + urls: { + apiURL: "https://ctrver.t.hmny.io/verify", + browserURL: "https://explorer.harmony.one", + }, + }, + { + network: "harmonyTest", + chainId: 1666700000, + urls: { + apiURL: "https://ctrver.t.hmny.io/verify?network=testnet", + browserURL: "https://explorer.pops.one", + }, + }, + // We are not adding new networks to the core of hardhat-verify anymore. + // Please read this to learn how to manually add support for custom networks: + // https://github.com/NomicFoundation/hardhat/tree/main/packages/hardhat-verify#adding-support-for-other-networks +]; diff --git a/packages/hardhat-verify/src/internal/config.ts b/packages/hardhat-verify/src/internal/config.ts new file mode 100644 index 00000000000..d6747f3f0b2 --- /dev/null +++ b/packages/hardhat-verify/src/internal/config.ts @@ -0,0 +1,46 @@ +import type LodashCloneDeepT from "lodash.clonedeep"; +import type { HardhatConfig, HardhatUserConfig } from "hardhat/types"; +import type { EtherscanConfig, SourcifyConfig } from "../types"; + +import chalk from "chalk"; + +export function etherscanConfigExtender( + config: HardhatConfig, + userConfig: Readonly +): void { + const defaultEtherscanConfig: EtherscanConfig = { + apiKey: "", + customChains: [], + enabled: true, + }; + const cloneDeep = require("lodash.clonedeep") as typeof LodashCloneDeepT; + const userEtherscanConfig = cloneDeep(userConfig.etherscan); + config.etherscan = { ...defaultEtherscanConfig, ...userEtherscanConfig }; + + // check that there is no etherscan entry in the networks object, since + // this is a common mistake made by users + if ( + userConfig.etherscan === undefined && + config.networks?.etherscan !== undefined + ) { + console.warn( + chalk.yellow( + "WARNING: you have an 'etherscan' entry in your networks configuration. This is likely a mistake. The etherscan configuration should be at the root of the configuration, not within the networks object." + ) + ); + } +} + +export function sourcifyConfigExtender( + config: HardhatConfig, + userConfig: Readonly +): void { + const defaultSourcifyConfig: SourcifyConfig = { + enabled: false, + apiUrl: "https://sourcify.dev/server", + browserUrl: "https://repo.sourcify.dev", + }; + const cloneDeep = require("lodash.clonedeep") as typeof LodashCloneDeepT; + const userSourcifyConfig = cloneDeep(userConfig.sourcify); + config.sourcify = { ...defaultSourcifyConfig, ...userSourcifyConfig }; +} diff --git a/packages/hardhat-verify/src/internal/errors.ts b/packages/hardhat-verify/src/internal/errors.ts new file mode 100644 index 00000000000..a023cad2f57 --- /dev/null +++ b/packages/hardhat-verify/src/internal/errors.ts @@ -0,0 +1,460 @@ +import { NomicLabsHardhatPluginError } from "hardhat/plugins"; +import { + ABIArgumentLengthErrorType, + ABIArgumentOverflowErrorType, + ABIArgumentTypeErrorType, +} from "./abi-validation-extras"; +import { TASK_VERIFY_VERIFY } from "./task-names"; + +export class HardhatVerifyError extends NomicLabsHardhatPluginError { + constructor(message: string, parent?: Error) { + super("@nomicfoundation/hardhat-verify", message, parent); + } +} + +export class MissingAddressError extends HardhatVerifyError { + constructor() { + super( + "You didn’t provide any address. Please re-run the 'verify' task with the address of the contract you want to verify." + ); + } +} + +export class InvalidAddressError extends HardhatVerifyError { + constructor(address: string) { + super(`${address} is an invalid address.`); + } +} + +export class InvalidContractNameError extends HardhatVerifyError { + constructor(contractName: string) { + super(`A valid fully qualified name was expected. Fully qualified names look like this: "contracts/AContract.sol:TheContract" +Instead, this name was received: ${contractName}`); + } +} + +export class MissingApiKeyError extends HardhatVerifyError { + constructor(network: string) { + super(`You are trying to verify a contract in '${network}', but no API token was found for this network. Please provide one in your hardhat config. For example: + +{ + ... + etherscan: { + apiKey: { + ${network}: 'your API key' + } + } +} + +See https://etherscan.io/apis`); + } +} + +export class InvalidConstructorArgumentsError extends HardhatVerifyError { + constructor() { + super(`The constructorArguments parameter should be an array. +If your constructor has no arguments pass an empty array. E.g: + + await run("${TASK_VERIFY_VERIFY}", { + , + constructorArguments: [] + };`); + } +} + +export class ExclusiveConstructorArgumentsError extends HardhatVerifyError { + constructor() { + super( + "The parameters constructorArgsParams and constructorArgsModule are exclusive. Please provide only one of them." + ); + } +} + +export class InvalidConstructorArgumentsModuleError extends HardhatVerifyError { + constructor(constructorArgsModulePath: string) { + super(`The module ${constructorArgsModulePath} doesn't export a list. The module should look like this: + +module.exports = [ arg1, arg2, ... ];`); + } +} + +export class InvalidLibrariesError extends HardhatVerifyError { + constructor() { + super(`The libraries parameter should be a dictionary. +If your contract does not have undetectable libraries pass an empty object or omit the argument. E.g: + + await run("${TASK_VERIFY_VERIFY}", { + , + libraries: {} + };`); + } +} + +export class InvalidLibrariesModuleError extends HardhatVerifyError { + constructor(librariesModulePath: string) { + super(`The module ${librariesModulePath} doesn't export a dictionary. The module should look like this: + +module.exports = { lib1: "0x...", lib2: "0x...", ... };`); + } +} + +export class ImportingModuleError extends HardhatVerifyError { + constructor(module: string, parent: Error) { + super( + `Importing the module for the ${module} failed. +Reason: ${parent.message}`, + parent + ); + } +} + +export class HardhatNetworkNotSupportedError extends HardhatVerifyError { + constructor() { + super( + `The selected network is "hardhat", which is not supported for contract verification. + +If you intended to use a different network, ensure that you provide the --network parameter when running the command. + +For example: npx hardhat verify --network ` + ); + } +} + +export class ChainConfigNotFoundError extends HardhatVerifyError { + constructor(chainId: number) { + super(`Trying to verify a contract in a network with chain id ${chainId}, but the plugin doesn't recognize it as a supported chain. + +You can manually add support for it by following these instructions: https://hardhat.org/verify-custom-networks + +To see the list of supported networks, run this command: + + npx hardhat verify --list-networks`); + } +} + +export class ContractVerificationInvalidStatusCodeError extends HardhatVerifyError { + constructor(url: string, statusCode: number, responseText: string) { + super(`Failed to send contract verification request. +Endpoint URL: ${url} +The HTTP server response is not ok. Status code: ${statusCode} Response text: ${responseText}`); + } +} + +export class ContractVerificationMissingBytecodeError extends HardhatVerifyError { + constructor(url: string, contractAddress: string) { + super(`Failed to send contract verification request. +Endpoint URL: ${url} +Reason: The Etherscan API responded that the address ${contractAddress} does not have bytecode. +This can happen if the contract was recently deployed and this fact hasn't propagated to the backend yet. +Try waiting for a minute before verifying your contract. If you are invoking this from a script, +try to wait for five confirmations of your contract deployment transaction before running the verification subtask.`); + } +} + +export class ContractStatusPollingInvalidStatusCodeError extends HardhatVerifyError { + constructor(statusCode: number, responseText: string) { + super( + `The HTTP server response is not ok. Status code: ${statusCode} Response text: ${responseText}` + ); + } +} + +export class ContractStatusPollingResponseNotOkError extends HardhatVerifyError { + constructor(message: string) { + super(`The Etherscan API responded with a failure status. +The verification may still succeed but should be checked manually. +Reason: ${message}`); + } +} + +export class EtherscanVersionNotSupportedError extends HardhatVerifyError { + constructor() { + super(`Etherscan only supports compiler versions 0.4.11 and higher. +See https://etherscan.io/solcversions for more information.`); + } +} + +export class DeployedBytecodeNotFoundError extends HardhatVerifyError { + constructor(address: string, network: string) { + super(`The address ${address} has no bytecode. Is the contract deployed to this network? +The selected network is ${network}.`); + } +} + +export class CompilerVersionsMismatchError extends HardhatVerifyError { + constructor( + configCompilerVersions: string[], + inferredCompilerVersion: string, + network: string + ) { + const versionDetails = + configCompilerVersions.length > 1 + ? `versions are: ${configCompilerVersions.join(", ")}` + : `version is: ${configCompilerVersions[0]}`; + + super(`The contract you want to verify was compiled with solidity ${inferredCompilerVersion}, but your configured compiler ${versionDetails}. + +Possible causes are: +- You are not in the same commit that was used to deploy the contract. +- Wrong compiler version selected in hardhat config. +- The given address is wrong. +- The selected network (${network}) is wrong.`); + } +} + +export class ContractNotFoundError extends HardhatVerifyError { + constructor(contractFQN: string) { + super(`The contract ${contractFQN} is not present in your project.`); + } +} + +export class BuildInfoNotFoundError extends HardhatVerifyError { + constructor(contractFQN: string) { + super(`The contract ${contractFQN} is present in your project, but we couldn't find its sources. +Please make sure that it has been compiled by Hardhat and that it is written in Solidity.`); + } +} + +export class BuildInfoCompilerVersionMismatchError extends HardhatVerifyError { + constructor( + contractFQN: string, + compilerVersion: string, + isVersionRange: boolean, + buildInfoCompilerVersion: string, + network: string + ) { + const versionDetails = isVersionRange + ? `a solidity version in the range ${compilerVersion}` + : `the solidity version ${compilerVersion}`; + + super(`The contract ${contractFQN} is being compiled with ${buildInfoCompilerVersion}. +However, the contract found in the address provided as argument has its bytecode marked with ${versionDetails}. + +Possible causes are: +- Solidity compiler version settings were modified after the deployment was executed. +- The given address is wrong. +- The selected network (${network}) is wrong.`); + } +} + +export class DeployedBytecodeMismatchError extends HardhatVerifyError { + constructor(network: string, contractFQN?: string) { + const contractDetails = + typeof contractFQN === "string" + ? `the contract ${contractFQN}.` + : `any of your local contracts.`; + super(`The address provided as argument contains a contract, but its bytecode doesn't match ${contractDetails} + +Possible causes are: + - The artifact for that contract is outdated or missing. You can try compiling the project again with the --force flag before re-running the verification. + - The contract's code changed after the deployment was executed. Sometimes this happens by changes in seemingly unrelated contracts. + - The solidity compiler settings were modified after the deployment was executed (like the optimizer, target EVM, etc.) + - The given address is wrong. + - The selected network (${network}) is wrong.`); + } +} + +export class DeployedBytecodeMultipleMatchesError extends HardhatVerifyError { + constructor(fqnMatches: string[]) { + super(`More than one contract was found to match the deployed bytecode. +Please use the contract parameter with one of the following contracts: +${fqnMatches.map((x) => ` * ${x}`).join("\n")} + +For example: + +hardhat verify --contract contracts/Example.sol:ExampleContract + +If you are running the verify subtask from within Hardhat instead: + +await run("${TASK_VERIFY_VERIFY}", { +, +contract: "contracts/Example.sol:ExampleContract" +};`); + } +} + +export class InvalidLibraryAddressError extends HardhatVerifyError { + constructor( + contractName: string, + libraryName: string, + libraryAddress: string + ) { + super( + `You gave a link for the contract ${contractName} with the library ${libraryName}, but provided this invalid address: ${libraryAddress}` + ); + } +} + +export class DuplicatedLibraryError extends HardhatVerifyError { + constructor(libraryName: string, libraryFQN: string) { + super( + `The library names ${libraryName} and ${libraryFQN} refer to the same library and were given as two entries in the libraries dictionary. +Remove one of them and review your libraries dictionary before proceeding.` + ); + } +} + +export class LibraryNotFoundError extends HardhatVerifyError { + constructor( + contractName: string, + libraryName: string, + allLibraries: string[], + detectableLibraries: string[], + undetectableLibraries: string[] + ) { + const contractLibrariesDetails = `This contract uses the following external libraries: +${undetectableLibraries.map((x) => ` * ${x}`).join("\n")} +${detectableLibraries.map((x) => ` * ${x} (optional)`).join("\n")} +${ + detectableLibraries.length > 0 + ? "Libraries marked as optional don't need to be specified since their addresses are autodetected by the plugin." + : "" +}`; + + super(`You gave an address for the library ${libraryName} in the libraries dictionary, which is not one of the libraries of contract ${contractName}. +${ + allLibraries.length > 0 + ? contractLibrariesDetails + : "This contract doesn't use any external libraries." +}`); + } +} + +export class LibraryMultipleMatchesError extends HardhatVerifyError { + constructor(contractName: string, libraryName: string, fqnMatches: string[]) { + super(`The library name ${libraryName} is ambiguous for the contract ${contractName}. +It may resolve to one of the following libraries: +${fqnMatches.map((x) => ` * ${x}`).join("\n")} + +To fix this, choose one of these fully qualified library names and replace it in your libraries dictionary.`); + } +} + +export class MissingLibrariesError extends HardhatVerifyError { + constructor( + contractName: string, + allLibraries: string[], + mergedLibraries: string[], + undetectableLibraries: string[] + ) { + const missingLibraries = allLibraries.filter( + (lib) => !mergedLibraries.some((mergedLib) => lib === mergedLib) + ); + + super(`The contract ${contractName} has one or more library addresses that cannot be detected from deployed bytecode. +This can occur if the library is only called in the contract constructor. The missing libraries are: +${missingLibraries.map((x) => ` * ${x}`).join("\n")} + +${ + missingLibraries.length === undetectableLibraries.length + ? "Visit https://hardhat.org/hardhat-runner/plugins/nomicfoundation-hardhat-verify#libraries-with-undetectable-addresses to learn how to solve this." + : "To solve this, you can add them to your --libraries dictionary with their corresponding addresses." +}`); + } +} + +export class LibraryAddressesMismatchError extends HardhatVerifyError { + constructor( + conflicts: Array<{ + library: string; + detectedAddress: string; + inputAddress: string; + }> + ) { + super(`The following detected library addresses are different from the ones provided: +${conflicts + .map( + ({ library, inputAddress, detectedAddress }) => + ` * ${library} +given address: ${inputAddress} +detected address: ${detectedAddress}` + ) + .join("\n")} + +You can either fix these addresses in your libraries dictionary or simply remove them to let the plugin autodetect them.`); + } +} + +export class UnexpectedNumberOfFilesError extends HardhatVerifyError { + constructor() { + super( + "The plugin found an unexpected number of files for this contract. Please report this issue to the Hardhat team." + ); + } +} + +export class ABIArgumentLengthError extends HardhatVerifyError { + constructor( + sourceName: string, + contractName: string, + error: ABIArgumentLengthErrorType + ) { + const { types: requiredArgs, values: providedArgs } = error.count; + super( + `The constructor for ${sourceName}:${contractName} has ${requiredArgs} parameters +but ${providedArgs} arguments were provided instead.`, + error + ); + } +} + +export class ABIArgumentTypeError extends HardhatVerifyError { + constructor(error: ABIArgumentTypeErrorType) { + const { value: argValue, argument: argName, reason } = error; + super( + `Value ${argValue} cannot be encoded for the parameter ${argName}. +Encoder error reason: ${reason}`, + error + ); + } +} + +export class ABIArgumentOverflowError extends HardhatVerifyError { + constructor(error: ABIArgumentOverflowErrorType) { + const { value: argValue, fault: reason, operation } = error; + super( + `Value ${argValue} is not a safe integer and cannot be encoded. +Use a string instead of a plain number. +Encoder error reason: ${reason} fault in ${operation}`, + error + ); + } +} + +export class VerificationAPIUnexpectedMessageError extends HardhatVerifyError { + constructor(message: string) { + super(`The API responded with an unexpected message. +Please report this issue to the Hardhat team. +Contract verification may have succeeded and should be checked manually. +Message: ${message}`); + } +} + +export class UnexpectedError extends HardhatVerifyError { + constructor(e: unknown, functionName: string) { + const defaultErrorDetails = `Unexpected error in ${functionName}`; + const errorDetails = + e instanceof Error + ? e.message ?? defaultErrorDetails + : defaultErrorDetails; + super(`An unexpected error occurred during the verification process. +Please report this issue to the Hardhat team. +Error Details: ${errorDetails}`); + } +} + +export class ContractVerificationFailedError extends HardhatVerifyError { + constructor(message: string, undetectableLibraries: string[]) { + super(`The contract verification failed. +Reason: ${message} +${ + undetectableLibraries.length > 0 + ? ` +This contract makes use of libraries whose addresses are undetectable by the plugin. +Keep in mind that this verification failure may be due to passing in the wrong +address for one of these libraries: +${undetectableLibraries.map((x) => ` * ${x}`).join("\n")}` + : "" +}`); + } +} diff --git a/packages/hardhat-verify/src/internal/etherscan.ts b/packages/hardhat-verify/src/internal/etherscan.ts new file mode 100644 index 00000000000..25830ecdcc8 --- /dev/null +++ b/packages/hardhat-verify/src/internal/etherscan.ts @@ -0,0 +1,320 @@ +import type { EthereumProvider } from "hardhat/types"; +import type { ChainConfig, ApiKey } from "../types"; +import type { + EtherscanGetSourceCodeResponse, + EtherscanVerifyResponse, +} from "./etherscan.types"; + +import { HARDHAT_NETWORK_NAME } from "hardhat/plugins"; + +import { + ContractStatusPollingInvalidStatusCodeError, + ContractVerificationMissingBytecodeError, + ContractVerificationInvalidStatusCodeError, + HardhatVerifyError, + MissingApiKeyError, + ContractStatusPollingResponseNotOkError, + ChainConfigNotFoundError, + HardhatNetworkNotSupportedError, + UnexpectedError, +} from "./errors"; +import { isSuccessStatusCode, sendGetRequest, sendPostRequest } from "./undici"; +import { ValidationResponse, sleep } from "./utilities"; +import { builtinChains } from "./chain-config"; + +// Used for polling the result of the contract verification. +const VERIFICATION_STATUS_POLLING_TIME = 3000; + +/** + * Etherscan verification provider for verifying smart contracts. + * It should work with other verification providers as long as the interface + * is compatible with Etherscan's. + */ +export class Etherscan { + /** + * Create a new instance of the Etherscan verification provider. + * @param apiKey - The Etherscan API key. + * @param apiUrl - The Etherscan API URL, e.g. https://api.etherscan.io/api. + * @param browserUrl - The Etherscan browser URL, e.g. https://etherscan.io. + */ + constructor( + public apiKey: string, + public apiUrl: string, + public browserUrl: string + ) {} + + public static async getCurrentChainConfig( + networkName: string, + ethereumProvider: EthereumProvider, + customChains: ChainConfig[] + ): Promise { + const currentChainId = parseInt( + await ethereumProvider.send("eth_chainId"), + 16 + ); + + const currentChainConfig = [ + // custom chains has higher precedence than builtin chains + ...[...customChains].reverse(), // the last entry has higher precedence + ...builtinChains, + ].find(({ chainId }) => chainId === currentChainId); + + if (currentChainConfig === undefined) { + if (networkName === HARDHAT_NETWORK_NAME) { + throw new HardhatNetworkNotSupportedError(); + } + + throw new ChainConfigNotFoundError(currentChainId); + } + + return currentChainConfig; + } + + public static fromChainConfig( + apiKey: ApiKey | undefined, + chainConfig: ChainConfig + ) { + const resolvedApiKey = resolveApiKey(apiKey, chainConfig.network); + const apiUrl = chainConfig.urls.apiURL; + const browserUrl = chainConfig.urls.browserURL.trim().replace(/\/$/, ""); + + return new Etherscan(resolvedApiKey, apiUrl, browserUrl); + } + + /** + * Check if a smart contract is verified on Etherscan. + * @link https://docs.etherscan.io/api-endpoints/contracts#get-contract-source-code-for-verified-contract-source-codes + * @param address - The address of the smart contract. + * @returns True if the contract is verified, false otherwise. + */ + public async isVerified(address: string) { + const parameters = new URLSearchParams({ + apikey: this.apiKey, + module: "contract", + action: "getsourcecode", + address, + }); + + const url = new URL(this.apiUrl); + url.search = parameters.toString(); + + try { + const response = await sendGetRequest(url); + const json = + (await response.body.json()) as EtherscanGetSourceCodeResponse; + + if (!isSuccessStatusCode(response.statusCode)) { + throw new ContractVerificationInvalidStatusCodeError( + url.toString(), + response.statusCode, + JSON.stringify(json) + ); + } + + if (json.message !== "OK") { + return false; + } + + const sourceCode = json.result[0]?.SourceCode; + return ( + sourceCode !== undefined && sourceCode !== null && sourceCode !== "" + ); + } catch (e) { + if (e instanceof ContractVerificationInvalidStatusCodeError) { + throw e; + } + throw new UnexpectedError(e, "Etherscan.isVerified"); + } + } + + /** + * Verify a smart contract on Etherscan. + * @link https://docs.etherscan.io/api-endpoints/contracts#verify-source-code + * @param contractAddress - The address of the smart contract to verify. + * @param sourceCode - The source code of the smart contract. + * @param contractName - The name of the smart contract, e.g. "contracts/Sample.sol:MyContract" + * @param compilerVersion - The version of the Solidity compiler used, e.g. `v0.8.19+commit.7dd6d404` + * @param constructorArguments - The encoded constructor arguments of the smart contract. + * @returns A promise that resolves to an `EtherscanResponse` object. + * @throws {ContractVerificationRequestError} if there is an error on the request. + * @throws {ContractVerificationInvalidStatusCodeError} if the API returns an invalid status code. + * @throws {ContractVerificationMissingBytecodeError} if the bytecode is not found on the block explorer. + * @throws {HardhatVerifyError} if the response status is not OK. + */ + public async verify( + contractAddress: string, + sourceCode: string, + contractName: string, + compilerVersion: string, + constructorArguments: string + ): Promise { + const parameters = new URLSearchParams({ + apikey: this.apiKey, + module: "contract", + action: "verifysourcecode", + contractaddress: contractAddress, + sourceCode, + codeformat: "solidity-standard-json-input", + contractname: contractName, + compilerversion: compilerVersion, + constructorArguements: constructorArguments, + }); + + const url = new URL(this.apiUrl); + try { + const response = await sendPostRequest(url, parameters.toString(), { + "Content-Type": "application/x-www-form-urlencoded", + }); + const json = (await response.body.json()) as EtherscanVerifyResponse; + + if (!isSuccessStatusCode(response.statusCode)) { + throw new ContractVerificationInvalidStatusCodeError( + url.toString(), + response.statusCode, + JSON.stringify(json) + ); + } + + const etherscanResponse = new EtherscanResponse(json); + + if (etherscanResponse.isBytecodeMissingInNetworkError()) { + throw new ContractVerificationMissingBytecodeError( + this.apiUrl, + contractAddress + ); + } + + if (!etherscanResponse.isOk()) { + throw new HardhatVerifyError(etherscanResponse.message); + } + + return etherscanResponse; + } catch (e) { + if ( + e instanceof ContractVerificationInvalidStatusCodeError || + e instanceof ContractVerificationMissingBytecodeError + ) { + throw e; + } + throw new UnexpectedError(e, "Etherscan.verify"); + } + } + + /** + * Get the verification status of a smart contract from Etherscan. + * This method performs polling of the verification status if it's pending. + * @link https://docs.etherscan.io/api-endpoints/contracts#check-source-code-verification-submission-status + * @param guid - The verification GUID to check. + * @returns A promise that resolves to an `EtherscanResponse` object. + * @throws {ContractStatusPollingError} if there is an error on the request. + * @throws {ContractStatusPollingInvalidStatusCodeError} if the API returns an invalid status code. + * @throws {ContractStatusPollingResponseNotOkError} if the response status is not OK. + */ + public async getVerificationStatus(guid: string): Promise { + const parameters = new URLSearchParams({ + apikey: this.apiKey, + module: "contract", + action: "checkverifystatus", + guid, + }); + const url = new URL(this.apiUrl); + url.search = parameters.toString(); + + try { + const response = await sendGetRequest(url); + const json = (await response.body.json()) as EtherscanVerifyResponse; + + if (!isSuccessStatusCode(response.statusCode)) { + throw new ContractStatusPollingInvalidStatusCodeError( + response.statusCode, + JSON.stringify(json) + ); + } + + const etherscanResponse = new EtherscanResponse(json); + + if (etherscanResponse.isPending()) { + await sleep(VERIFICATION_STATUS_POLLING_TIME); + + return await this.getVerificationStatus(guid); + } + + if (etherscanResponse.isFailure()) { + return etherscanResponse; + } + + if (!etherscanResponse.isOk()) { + throw new ContractStatusPollingResponseNotOkError( + etherscanResponse.message + ); + } + + return etherscanResponse; + } catch (e) { + if ( + e instanceof ContractStatusPollingInvalidStatusCodeError || + e instanceof ContractStatusPollingResponseNotOkError + ) { + throw e; + } + throw new UnexpectedError(e, "Etherscan.getVerificationStatus"); + } + } + + /** + * Get the Etherscan URL for viewing a contract's details. + * @param address - The address of the smart contract. + * @returns The URL to view the contract on Etherscan's website. + */ + public getContractUrl(address: string) { + return `${this.browserUrl}/address/${address}#code`; + } +} + +class EtherscanResponse implements ValidationResponse { + public readonly status: number; + public readonly message: string; + + constructor(response: EtherscanVerifyResponse) { + this.status = parseInt(response.status, 10); + this.message = response.result; + } + + public isPending() { + return this.message === "Pending in queue"; + } + + public isFailure() { + return this.message === "Fail - Unable to verify"; + } + + public isSuccess() { + return this.message === "Pass - Verified"; + } + + public isBytecodeMissingInNetworkError() { + return this.message.startsWith("Unable to locate ContractCode at"); + } + + public isOk() { + return this.status === 1; + } +} + +function resolveApiKey(apiKey: ApiKey | undefined, network: string) { + if (apiKey === undefined || apiKey === "") { + throw new MissingApiKeyError(network); + } + + if (typeof apiKey === "string") { + return apiKey; + } + + const key = apiKey[network]; + + if (key === undefined || key === "") { + throw new MissingApiKeyError(network); + } + + return key; +} diff --git a/packages/hardhat-verify/src/internal/etherscan.types.ts b/packages/hardhat-verify/src/internal/etherscan.types.ts new file mode 100644 index 00000000000..b9268f02bb0 --- /dev/null +++ b/packages/hardhat-verify/src/internal/etherscan.types.ts @@ -0,0 +1,47 @@ +interface EtherscanGetSourceCodeNotOkResponse { + status: "0"; + message: "NOTOK"; + result: string; +} + +interface EtherscanGetSourceCodeOkResponse { + status: "1"; + message: "OK"; + result: EtherscanContract[]; +} + +interface EtherscanContract { + SourceCode: string; + ABI: string; + ContractName: string; + CompilerVersion: string; + OptimizationUsed: string; + Runs: string; + ConstructorArguments: string; + EVMVersion: string; + Library: string; + LicenseType: string; + Proxy: string; + Implementation: string; + SwarmSource: string; +} + +export type EtherscanGetSourceCodeResponse = + | EtherscanGetSourceCodeNotOkResponse + | EtherscanGetSourceCodeOkResponse; + +interface EtherscanVerifyNotOkResponse { + status: "0"; + message: "NOTOK"; + result: string; +} + +interface EtherscanVerifyOkResponse { + status: "1"; + message: "OK"; + result: string; +} + +export type EtherscanVerifyResponse = + | EtherscanVerifyNotOkResponse + | EtherscanVerifyOkResponse; diff --git a/packages/hardhat-verify/src/solc/artifacts.ts b/packages/hardhat-verify/src/internal/solc/artifacts.ts similarity index 99% rename from packages/hardhat-verify/src/solc/artifacts.ts rename to packages/hardhat-verify/src/internal/solc/artifacts.ts index be3cdac7e57..5e6df0225d8 100644 --- a/packages/hardhat-verify/src/solc/artifacts.ts +++ b/packages/hardhat-verify/src/internal/solc/artifacts.ts @@ -1,5 +1,4 @@ -import { parseFullyQualifiedName } from "hardhat/utils/contract-names"; -import { +import type { Artifacts, BuildInfo, CompilerInput, @@ -7,6 +6,8 @@ import { CompilerOutputContract, Network, } from "hardhat/types"; + +import { parseFullyQualifiedName } from "hardhat/utils/contract-names"; import { DeployedBytecodeMismatchError, DeployedBytecodeMultipleMatchesError, @@ -367,7 +368,7 @@ function mergeLibraries( ) { const detectedAddress = detectedLibraries[sourceName][libraryName]; // Our detection logic encodes bytes into lowercase hex. - if (libraryAddress.toLowerCase() !== detectedAddress) { + if (libraryAddress.toLowerCase() !== detectedAddress.toLowerCase()) { conflicts.push({ library: `${sourceName}:${libraryName}`, detectedAddress, diff --git a/packages/hardhat-verify/src/internal/solc/bytecode.ts b/packages/hardhat-verify/src/internal/solc/bytecode.ts new file mode 100644 index 00000000000..6e68faaf357 --- /dev/null +++ b/packages/hardhat-verify/src/internal/solc/bytecode.ts @@ -0,0 +1,214 @@ +import type { CompilerOutputBytecode, EthereumProvider } from "hardhat/types"; + +import { DeployedBytecodeNotFoundError } from "../errors"; +import { + getMetadataSectionLength, + inferCompilerVersion, + METADATA_LENGTH, + MISSING_METADATA_VERSION_RANGE, + SOLC_NOT_FOUND_IN_METADATA_VERSION_RANGE, +} from "./metadata"; +import { + ByteOffset, + getCallProtectionOffsets, + getImmutableOffsets, + getLibraryOffsets, +} from "./artifacts"; + +// If the compiler output bytecode is OVM bytecode, we need to make a fix to account for a bug in some versions of +// the OVM compiler. The artifact’s deployedBytecode is incorrect, but because its bytecode (initcode) is correct, when we +// actually deploy contracts, the code that ends up getting stored on chain is also correct. During verification, +// Etherscan will compile the source code, pull out the artifact’s deployedBytecode, and then perform the +// below find and replace, then check that resulting output against the code retrieved on chain from eth_getCode. +// We define the strings for that find and replace here, and use them later so we can know if the bytecode matches +// before it gets to Etherscan. +// Source: https://github.com/ethereum-optimism/optimism/blob/8d67991aba584c1703692ea46273ea8a1ef45f56/packages/contracts/src/contract-dumps.ts#L195-L204 +const OVM_FIND_OPCODES = + "336000905af158601d01573d60011458600c01573d6000803e3d621234565260ea61109c52"; +const OVM_REPLACE_OPCODES = + "336000905af158600e01573d6000803e3d6000fd5b3d6001141558600a015760016000f35b"; + +export class Bytecode { + private _bytecode: string; + private _version: string; + private _executableSection: ByteOffset; + private _isOvm: boolean; + + constructor(bytecode: string) { + this._bytecode = bytecode; + + const bytecodeBuffer = Buffer.from(bytecode, "hex"); + this._version = inferCompilerVersion(bytecodeBuffer); + this._executableSection = { + start: 0, + length: bytecode.length - getMetadataSectionLength(bytecodeBuffer) * 2, + }; + + // Check if this is OVM bytecode by looking for the concatenation of the two opcodes defined here: + // https://github.com/ethereum-optimism/optimism/blob/33cb9025f5e463525d6abe67c8457f81a87c5a24/packages/contracts/contracts/optimistic-ethereum/OVM/execution/OVM_SafetyChecker.sol#L143 + // - This check would only fail if the EVM solidity compiler didn't use any of the following opcodes: https://github.com/ethereum-optimism/optimism/blob/c42fc0df2790a5319027393cb8fa34e4f7bb520f/packages/contracts/contracts/optimistic-ethereum/iOVM/execution/iOVM_ExecutionManager.sol#L94-L175 + // This is the list of opcodes that calls the OVM execution manager. But the current solidity + // compiler seems to add REVERT in all cases, meaning it currently won't happen and this check + // will always be correct. + // - It is possible, though very unlikely, that this string appears in the bytecode of an EVM + // contract. As a result result, this _isOvm flag should only be used after trying to infer + // the solc version + // - We need this check because OVM bytecode has no metadata, so when verifying + // OVM bytecode the check in `inferSolcVersion` will always return `MISSING_METADATA_VERSION_RANGE`. + this._isOvm = bytecode.includes(OVM_REPLACE_OPCODES); + } + + public static async getDeployedContractBytecode( + address: string, + provider: EthereumProvider, + network: string + ): Promise { + const response: string = await provider.send("eth_getCode", [ + address, + "latest", + ]); + const deployedBytecode = response.replace(/^0x/, ""); + + if (deployedBytecode === "") { + throw new DeployedBytecodeNotFoundError(address, network); + } + + return new Bytecode(deployedBytecode); + } + + public stringify() { + return this._bytecode; + } + + public getVersion() { + return this._version; + } + + public isOvm() { + return this._isOvm; + } + + public hasVersionRange(): boolean { + return ( + this._version === MISSING_METADATA_VERSION_RANGE || + this._version === SOLC_NOT_FOUND_IN_METADATA_VERSION_RANGE + ); + } + + public async getMatchingVersions(versions: string[]): Promise { + const semver = await import("semver"); + + const matchingCompilerVersions = versions.filter((version) => + semver.satisfies(version, this._version) + ); + + return matchingCompilerVersions; + } + + /** + * Compare the bytecode against a compiler's output bytecode, ignoring metadata. + */ + public compare( + compilerOutputDeployedBytecode: CompilerOutputBytecode + ): boolean { + // Ignore metadata since Etherscan performs a partial match. + // See: https://ethereum.org/es/developers/docs/smart-contracts/verifying/#etherscan + const executableSection = this._getExecutableSection(); + let referenceExecutableSection = inferExecutableSection( + compilerOutputDeployedBytecode.object + ); + + // If this is OVM bytecode, do the required find and replace (see above comments for more info) + if (this._isOvm) { + referenceExecutableSection = referenceExecutableSection + .split(OVM_FIND_OPCODES) + .join(OVM_REPLACE_OPCODES); + } + + if ( + executableSection.length !== referenceExecutableSection.length && + // OVM bytecode has no metadata so we ignore this comparison if operating on OVM bytecode + !this._isOvm + ) { + return false; + } + + const normalizedBytecode = nullifyBytecodeOffsets( + executableSection, + compilerOutputDeployedBytecode + ); + + // Library hash placeholders are embedded into the bytes where the library addresses are linked. + // We need to zero them out to compare them. + const normalizedReferenceBytecode = nullifyBytecodeOffsets( + referenceExecutableSection, + compilerOutputDeployedBytecode + ); + + if (normalizedBytecode === normalizedReferenceBytecode) { + return true; + } + + return false; + } + + private _getExecutableSection(): string { + const { start, length } = this._executableSection; + return this._bytecode.slice(start, length); + } +} + +function nullifyBytecodeOffsets( + bytecode: string, + { + object: referenceBytecode, + linkReferences, + immutableReferences, + }: CompilerOutputBytecode +): string { + const offsets = [ + ...getLibraryOffsets(linkReferences), + ...getImmutableOffsets(immutableReferences), + ...getCallProtectionOffsets(bytecode, referenceBytecode), + ]; + + for (const { start, length } of offsets) { + bytecode = [ + bytecode.slice(0, start * 2), + "0".repeat(length * 2), + bytecode.slice((start + length) * 2), + ].join(""); + } + + return bytecode; +} + +/** + * This function returns the executable section without actually + * decoding the whole bytecode string. + * + * This is useful because the runtime object emitted by the compiler + * may contain nonhexadecimal characters due to link placeholders. + */ +function inferExecutableSection(bytecode: string): string { + if (bytecode.startsWith("0x")) { + bytecode = bytecode.slice(2); + } + + // `Buffer.from` will return a buffer that contains bytes up until the last decodable byte. + // To work around this we'll just slice the relevant part of the bytecode. + const metadataLengthSlice = Buffer.from( + bytecode.slice(-METADATA_LENGTH * 2), + "hex" + ); + + // If, for whatever reason, the bytecode is so small that we can't even read two bytes off it, + // return the size of the entire bytecode. + if (metadataLengthSlice.length !== METADATA_LENGTH) { + return bytecode; + } + + const metadataSectionLength = getMetadataSectionLength(metadataLengthSlice); + + return bytecode.slice(0, bytecode.length - metadataSectionLength * 2); +} diff --git a/packages/hardhat-verify/src/solc/metadata.ts b/packages/hardhat-verify/src/internal/solc/metadata.ts similarity index 98% rename from packages/hardhat-verify/src/solc/metadata.ts rename to packages/hardhat-verify/src/internal/solc/metadata.ts index 9bacd332348..445bd096dae 100644 --- a/packages/hardhat-verify/src/solc/metadata.ts +++ b/packages/hardhat-verify/src/internal/solc/metadata.ts @@ -7,7 +7,7 @@ export const METADATA_LENGTH = 2; export const SOLC_NOT_FOUND_IN_METADATA_VERSION_RANGE = "0.4.7 - 0.5.8"; export const MISSING_METADATA_VERSION_RANGE = "<0.4.7"; -const log = debug("hardhat:hardhat-etherscan:metadata"); +const log = debug("hardhat:hardhat-verify:metadata"); /** * Try to infer the Solidity compiler version from the bytecode metadata. diff --git a/packages/hardhat-verify/src/internal/sourcify.ts b/packages/hardhat-verify/src/internal/sourcify.ts new file mode 100644 index 00000000000..1e9e75dc2f5 --- /dev/null +++ b/packages/hardhat-verify/src/internal/sourcify.ts @@ -0,0 +1,175 @@ +import type { + SourcifyIsVerifiedResponse, + SourcifyVerifyResponse, +} from "./sourcify.types"; + +import { + ContractVerificationInvalidStatusCodeError, + UnexpectedError, +} from "./errors"; +import { isSuccessStatusCode, sendGetRequest, sendPostRequest } from "./undici"; +import { ContractStatus } from "./sourcify.types"; +import { ValidationResponse } from "./utilities"; + +export class Sourcify { + constructor( + public chainId: number, + public apiUrl: string, + public browserUrl: string + ) {} + + // https://sourcify.dev/server/api-docs/#/Repository/get_check_all_by_addresses + public async isVerified(address: string) { + const parameters = new URLSearchParams({ + addresses: address, + chainIds: `${this.chainId}`, + }); + + const url = new URL(`${this.apiUrl}/check-all-by-addresses`); + url.search = parameters.toString(); + + try { + const response = await sendGetRequest(url); + const json = (await response.body.json()) as SourcifyIsVerifiedResponse[]; + + if (!isSuccessStatusCode(response.statusCode)) { + throw new ContractVerificationInvalidStatusCodeError( + url.toString(), + response.statusCode, + JSON.stringify(json) + ); + } + + if (!Array.isArray(json)) { + throw new Error(`Unexpected response body: ${JSON.stringify(json)}`); + } + + const contract = json.find( + (match) => match.address.toLowerCase() === address.toLowerCase() + ); + if (contract === undefined) { + return false; + } + + if ( + "status" in contract && + contract.status === ContractStatus.NOT_FOUND + ) { + return false; + } + + if ("chainIds" in contract && contract.chainIds.length === 1) { + const { status } = contract.chainIds[0]; + if ( + status === ContractStatus.PERFECT || + status === ContractStatus.PARTIAL + ) { + return status; + } + } + + throw new Error(`Unexpected response body: ${JSON.stringify(json)}`); + } catch (e) { + if (e instanceof ContractVerificationInvalidStatusCodeError) { + throw e; + } + throw new UnexpectedError(e, "Sourcify.isVerified"); + } + } + + // https://sourcify.dev/server/api-docs/#/Stateless%20Verification/post_verify + public async verify( + address: string, + files: Record, + chosenContract?: number + ): Promise { + const parameters: any = { + address, + files, + chain: `${this.chainId}`, + }; + + if (chosenContract !== undefined) { + parameters.chosenContract = `${chosenContract}`; + } + + const url = new URL(this.apiUrl); + try { + const response = await sendPostRequest(url, JSON.stringify(parameters), { + "Content-Type": "application/json", + }); + const json = (await response.body.json()) as SourcifyVerifyResponse; + + if (!isSuccessStatusCode(response.statusCode)) { + throw new ContractVerificationInvalidStatusCodeError( + url.toString(), + response.statusCode, + JSON.stringify(json) + ); + } + + const sourcifyResponse = new SourcifyResponse(json); + + if (!sourcifyResponse.isOk()) { + throw new Error(`Verify response is not ok: ${JSON.stringify(json)}`); + } + + return sourcifyResponse; + } catch (e) { + if (e instanceof ContractVerificationInvalidStatusCodeError) { + throw e; + } + throw new UnexpectedError(e, "Sourcify.verify"); + } + } + + public getContractUrl( + address: string, + contractStatus: ContractStatus.PERFECT | ContractStatus.PARTIAL + ) { + const matchType = + contractStatus === ContractStatus.PERFECT + ? "full_match" + : "partial_match"; + return `${this.browserUrl}/contracts/${matchType}/${this.chainId}/${address}/`; + } +} + +class SourcifyResponse implements ValidationResponse { + public readonly error: string | undefined; + public readonly status: + | ContractStatus.PERFECT + | ContractStatus.PARTIAL + | undefined; + + constructor(response: SourcifyVerifyResponse) { + if ("error" in response) { + this.error = response.error; + } else if (response.result[0].status === ContractStatus.PERFECT) { + this.status = ContractStatus.PERFECT; + } else if (response.result[0].status === ContractStatus.PARTIAL) { + this.status = ContractStatus.PARTIAL; + } + } + + public isPending() { + return false; + } + + public isFailure() { + return this.error !== undefined; + } + + public isSuccess() { + return this.error === undefined; + } + + public isOk(): this is { + status: ContractStatus.PERFECT | ContractStatus.PARTIAL; + } { + return ( + this.status === ContractStatus.PERFECT || + this.status === ContractStatus.PARTIAL + ); + } +} diff --git a/packages/hardhat-verify/src/internal/sourcify.types.ts b/packages/hardhat-verify/src/internal/sourcify.types.ts new file mode 100644 index 00000000000..acf09387b32 --- /dev/null +++ b/packages/hardhat-verify/src/internal/sourcify.types.ts @@ -0,0 +1,40 @@ +export enum ContractStatus { + PERFECT = "perfect", + PARTIAL = "partial", + NOT_FOUND = "false", +} + +interface SourcifyIsVerifiedNotOkResponse { + address: string; + status: ContractStatus.NOT_FOUND; +} + +interface SourcifyIsVerifiedOkResponse { + address: string; + chainIds: Array<{ + chainId: string; + status: ContractStatus.PERFECT | ContractStatus.PARTIAL; + }>; +} + +export type SourcifyIsVerifiedResponse = + | SourcifyIsVerifiedNotOkResponse + | SourcifyIsVerifiedOkResponse; + +interface SourcifyVerifyNotOkResponse { + error: string; +} + +interface SourcifyVerifyOkResponse { + result: Array<{ + address: string; + chainId: string; + status: string; + message?: string; + libraryMap?: Record; + }>; +} + +export type SourcifyVerifyResponse = + | SourcifyVerifyNotOkResponse + | SourcifyVerifyOkResponse; diff --git a/packages/hardhat-verify/src/internal/task-names.ts b/packages/hardhat-verify/src/internal/task-names.ts new file mode 100644 index 00000000000..5557ffc1df7 --- /dev/null +++ b/packages/hardhat-verify/src/internal/task-names.ts @@ -0,0 +1,26 @@ +export const TASK_VERIFY = "verify"; +export const TASK_VERIFY_GET_VERIFICATION_SUBTASKS = + "verify:get-verification-subtasks"; +export const TASK_VERIFY_VERIFY = "verify:verify"; +export const TASK_VERIFY_PRINT_SUPPORTED_NETWORKS = + "verify:print-supported-networks"; +export const TASK_VERIFY_GET_CONTRACT_INFORMATION = + "verify:get-contract-information"; + +// Etherscan +export const TASK_VERIFY_ETHERSCAN = "verify:etherscan"; +export const TASK_VERIFY_ETHERSCAN_RESOLVE_ARGUMENTS = + "verify:etherscan-resolve-arguments"; +export const TASK_VERIFY_ETHERSCAN_GET_MINIMAL_INPUT = + "verify:etherscan-get-minimal-input"; +export const TASK_VERIFY_ETHERSCAN_ATTEMPT_VERIFICATION = + "verify:etherscan-attempt-verification"; + +// Sourcify +export const TASK_VERIFY_SOURCIFY = "verify:sourcify"; +export const TASK_VERIFY_SOURCIFY_RESOLVE_ARGUMENTS = + "verify:sourcify-resolve-arguments"; +export const TASK_VERIFY_SOURCIFY_ATTEMPT_VERIFICATION = + "verify:sourcify-attempt-verification"; +export const TASK_VERIFY_SOURCIFY_DISABLED_WARNING = + "verify:sourcify-disabled-warning"; diff --git a/packages/hardhat-verify/src/internal/tasks/blockscout.ts b/packages/hardhat-verify/src/internal/tasks/blockscout.ts new file mode 100644 index 00000000000..57296594df0 --- /dev/null +++ b/packages/hardhat-verify/src/internal/tasks/blockscout.ts @@ -0,0 +1,224 @@ +import type { CompilerInput } from "hardhat/types"; +import type { VerificationResponse, VerifyTaskArgs } from "../.."; +import type { + LibraryToAddress, + ExtendedContractInformation, +} from "../solc/artifacts"; + +import { subtask, types } from "hardhat/config"; +import { isFullyQualifiedName } from "hardhat/utils/contract-names"; + +import { + CompilerVersionsMismatchError, + ContractVerificationFailedError, + InvalidAddressError, + InvalidContractNameError, + MissingAddressError, +} from "../errors"; +import { Blockscout } from "../blockscout"; +import { Bytecode } from "../solc/bytecode"; +import { + TASK_VERIFY_BLOCKSCOUT, + TASK_VERIFY_BLOCKSCOUT_ATTEMPT_VERIFICATION, + TASK_VERIFY_BLOCKSCOUT_RESOLVE_ARGUMENTS, + TASK_VERIFY_ETHERSCAN_ATTEMPT_VERIFICATION, + TASK_VERIFY_ETHERSCAN_GET_MINIMAL_INPUT, + TASK_VERIFY_GET_CONTRACT_INFORMATION, +} from "../task-names"; +import { getCompilerVersions, resolveLibraries } from "../utilities"; + +// parsed verification args +interface VerificationArgs { + address: string; + libraries: LibraryToAddress; + contractFQN?: string; + force: boolean; +} + +interface AttemptVerificationArgs { + address: string; + compilerInput: CompilerInput; + contractInformation: ExtendedContractInformation; + verificationInterface: Blockscout; +} + +/** + * Main Blockscout verification subtask. + * + * Verifies a contract in Blockscout by coordinating various subtasks related + * to contract verification. + */ +subtask(TASK_VERIFY_BLOCKSCOUT) + .addParam("address") + .addOptionalParam("libraries", undefined, undefined, types.any) + .addOptionalParam("contract") + .addFlag("force") + .setAction( + async ( + taskArgs: VerifyTaskArgs, + { config: config, network: network, run } + ) => { + const { address, libraries, contractFQN, force }: VerificationArgs = + await run(TASK_VERIFY_BLOCKSCOUT_RESOLVE_ARGUMENTS, taskArgs); + + const chainConfig = await Blockscout.getCurrentChainConfig( + network.name, + network.provider, + config.blockscout.customChains + ); + + const blockscout = Blockscout.fromChainConfig(chainConfig); + + const isVerified = await blockscout.isVerified(address); + if (!force && isVerified) { + const contractURL = blockscout.getContractUrl(address); + console.log(`The contract ${address} has already been verified on the block explorer. If you're trying to verify a partially verified contract, please use the --force flag. +${contractURL} +`); + return; + } + + const configCompilerVersions = await getCompilerVersions(config.solidity); + + const deployedBytecode = await Bytecode.getDeployedContractBytecode( + address, + network.provider, + network.name + ); + + const matchingCompilerVersions = + await deployedBytecode.getMatchingVersions(configCompilerVersions); + // don't error if the bytecode appears to be OVM bytecode, because we can't infer a specific OVM solc version from the bytecode + if (matchingCompilerVersions.length === 0 && !deployedBytecode.isOvm()) { + throw new CompilerVersionsMismatchError( + configCompilerVersions, + deployedBytecode.getVersion(), + network.name + ); + } + + const contractInformation: ExtendedContractInformation = await run( + TASK_VERIFY_GET_CONTRACT_INFORMATION, + { + contractFQN, + deployedBytecode, + matchingCompilerVersions, + libraries, + } + ); + + const minimalInput: CompilerInput = await run( + TASK_VERIFY_ETHERSCAN_GET_MINIMAL_INPUT, + { + sourceName: contractInformation.sourceName, + } + ); + + // First, try to verify the contract using the minimal input + const { success: minimalInputVerificationSuccess }: VerificationResponse = + await run(TASK_VERIFY_BLOCKSCOUT_ATTEMPT_VERIFICATION, { + address, + compilerInput: minimalInput, + contractInformation, + verificationInterface: blockscout, + }); + + if (minimalInputVerificationSuccess) { + return; + } + + console.log(`We tried verifying your contract ${contractInformation.contractName} without including any unrelated one, but it failed. +Trying again with the full solc input used to compile and deploy it. +This means that unrelated contracts may be displayed on Blockscout... +`); + + // If verifying with the minimal input failed, try again with the full compiler input + const { + success: fullCompilerInputVerificationSuccess, + message: verificationMessage, + }: VerificationResponse = await run( + TASK_VERIFY_BLOCKSCOUT_ATTEMPT_VERIFICATION, + { + address, + compilerInput: contractInformation.compilerInput, + contractInformation, + verificationInterface: blockscout, + } + ); + + if (fullCompilerInputVerificationSuccess) { + return; + } + + throw new ContractVerificationFailedError( + verificationMessage, + contractInformation.undetectableLibraries + ); + } + ); + +subtask(TASK_VERIFY_BLOCKSCOUT_RESOLVE_ARGUMENTS) + .addOptionalParam("address") + .addOptionalParam("libraries", undefined, undefined, types.any) + .addOptionalParam("contract") + .addFlag("force") + .setAction( + async ({ + address, + contract, + libraries: librariesModule, + force, + }: VerifyTaskArgs): Promise => { + if (address === undefined) { + throw new MissingAddressError(); + } + + const { isAddress } = await import("@ethersproject/address"); + if (!isAddress(address)) { + throw new InvalidAddressError(address); + } + + if (contract !== undefined && !isFullyQualifiedName(contract)) { + throw new InvalidContractNameError(contract); + } + + let libraries; + if (typeof librariesModule === "object") { + libraries = librariesModule; + } else { + libraries = await resolveLibraries(librariesModule); + } + + return { + address, + libraries, + contractFQN: contract, + force, + }; + } + ); + +subtask(TASK_VERIFY_BLOCKSCOUT_ATTEMPT_VERIFICATION) + .addParam("address") + .addParam("compilerInput", undefined, undefined, types.any) + .addParam("contractInformation", undefined, undefined, types.any) + .addParam("verificationInterface", undefined, undefined, types.any) + .setAction( + async ( + { + address, + compilerInput, + contractInformation, + verificationInterface, + }: AttemptVerificationArgs, + { run } + ): Promise => { + return run(TASK_VERIFY_ETHERSCAN_ATTEMPT_VERIFICATION, { + address, + compilerInput, + contractInformation, + verificationInterface, + encodedConstructorArguments: "", + }); + } + ); diff --git a/packages/hardhat-verify/src/internal/tasks/etherscan.ts b/packages/hardhat-verify/src/internal/tasks/etherscan.ts new file mode 100644 index 00000000000..133a8aad6bb --- /dev/null +++ b/packages/hardhat-verify/src/internal/tasks/etherscan.ts @@ -0,0 +1,333 @@ +import type LodashCloneDeepT from "lodash.clonedeep"; +import type { + CompilerInput, + DependencyGraph, + CompilationJob, +} from "hardhat/types"; +import type { VerificationResponse, VerifyTaskArgs } from "../.."; +import type { + LibraryToAddress, + ExtendedContractInformation, +} from "../solc/artifacts"; + +import { subtask, types } from "hardhat/config"; +import { + TASK_COMPILE_SOLIDITY_GET_DEPENDENCY_GRAPH, + TASK_COMPILE_SOLIDITY_GET_COMPILATION_JOB_FOR_FILE, + TASK_COMPILE_SOLIDITY_GET_COMPILER_INPUT, +} from "hardhat/builtin-tasks/task-names"; +import { isFullyQualifiedName } from "hardhat/utils/contract-names"; + +import { + CompilerVersionsMismatchError, + ContractVerificationFailedError, + MissingAddressError, + InvalidAddressError, + InvalidContractNameError, + UnexpectedNumberOfFilesError, + VerificationAPIUnexpectedMessageError, +} from "../errors"; +import { Etherscan } from "../etherscan"; +import { Bytecode } from "../solc/bytecode"; +import { + TASK_VERIFY_ETHERSCAN, + TASK_VERIFY_ETHERSCAN_RESOLVE_ARGUMENTS, + TASK_VERIFY_ETHERSCAN_GET_MINIMAL_INPUT, + TASK_VERIFY_ETHERSCAN_ATTEMPT_VERIFICATION, + TASK_VERIFY_GET_CONTRACT_INFORMATION, +} from "../task-names"; +import { + getCompilerVersions, + encodeArguments, + resolveConstructorArguments, + resolveLibraries, + sleep, +} from "../utilities"; + +// parsed verification args +interface VerificationArgs { + address: string; + constructorArgs: string[]; + libraries: LibraryToAddress; + contractFQN?: string; +} + +interface GetMinimalInputArgs { + sourceName: string; +} + +interface AttemptVerificationArgs { + address: string; + compilerInput: CompilerInput; + contractInformation: ExtendedContractInformation; + verificationInterface: Etherscan; + encodedConstructorArguments: string; +} + +/** + * Main Etherscan verification subtask. + * + * Verifies a contract in Etherscan by coordinating various subtasks related + * to contract verification. + */ +subtask(TASK_VERIFY_ETHERSCAN) + .addParam("address") + .addOptionalParam("constructorArgsParams", undefined, undefined, types.any) + .addOptionalParam("constructorArgs") + .addOptionalParam("libraries", undefined, undefined, types.any) + .addOptionalParam("contract") + .setAction(async (taskArgs: VerifyTaskArgs, { config, network, run }) => { + const { + address, + constructorArgs, + libraries, + contractFQN, + }: VerificationArgs = await run( + TASK_VERIFY_ETHERSCAN_RESOLVE_ARGUMENTS, + taskArgs + ); + + const chainConfig = await Etherscan.getCurrentChainConfig( + network.name, + network.provider, + config.etherscan.customChains + ); + + const etherscan = Etherscan.fromChainConfig( + config.etherscan.apiKey, + chainConfig + ); + + const isVerified = await etherscan.isVerified(address); + if (isVerified) { + const contractURL = etherscan.getContractUrl(address); + console.log(`The contract ${address} has already been verified on Etherscan. +${contractURL}`); + return; + } + + const configCompilerVersions = await getCompilerVersions(config.solidity); + + const deployedBytecode = await Bytecode.getDeployedContractBytecode( + address, + network.provider, + network.name + ); + + const matchingCompilerVersions = await deployedBytecode.getMatchingVersions( + configCompilerVersions + ); + // don't error if the bytecode appears to be OVM bytecode, because we can't infer a specific OVM solc version from the bytecode + if (matchingCompilerVersions.length === 0 && !deployedBytecode.isOvm()) { + throw new CompilerVersionsMismatchError( + configCompilerVersions, + deployedBytecode.getVersion(), + network.name + ); + } + + const contractInformation: ExtendedContractInformation = await run( + TASK_VERIFY_GET_CONTRACT_INFORMATION, + { + contractFQN, + deployedBytecode, + matchingCompilerVersions, + libraries, + } + ); + + const minimalInput: CompilerInput = await run( + TASK_VERIFY_ETHERSCAN_GET_MINIMAL_INPUT, + { + sourceName: contractInformation.sourceName, + } + ); + + const encodedConstructorArguments = await encodeArguments( + contractInformation.contractOutput.abi, + contractInformation.sourceName, + contractInformation.contractName, + constructorArgs + ); + + // First, try to verify the contract using the minimal input + const { success: minimalInputVerificationSuccess }: VerificationResponse = + await run(TASK_VERIFY_ETHERSCAN_ATTEMPT_VERIFICATION, { + address, + compilerInput: minimalInput, + contractInformation, + verificationInterface: etherscan, + encodedConstructorArguments, + }); + + if (minimalInputVerificationSuccess) { + return; + } + + console.log(`We tried verifying your contract ${contractInformation.contractName} without including any unrelated one, but it failed. +Trying again with the full solc input used to compile and deploy it. +This means that unrelated contracts may be displayed on Etherscan... +`); + + // If verifying with the minimal input failed, try again with the full compiler input + const { + success: fullCompilerInputVerificationSuccess, + message: verificationMessage, + }: VerificationResponse = await run( + TASK_VERIFY_ETHERSCAN_ATTEMPT_VERIFICATION, + { + address, + compilerInput: contractInformation.compilerInput, + contractInformation, + verificationInterface: etherscan, + encodedConstructorArguments, + } + ); + + if (fullCompilerInputVerificationSuccess) { + return; + } + + throw new ContractVerificationFailedError( + verificationMessage, + contractInformation.undetectableLibraries + ); + }); + +subtask(TASK_VERIFY_ETHERSCAN_RESOLVE_ARGUMENTS) + .addOptionalParam("address") + .addOptionalParam("constructorArgsParams", undefined, [], types.any) + .addOptionalParam("constructorArgs", undefined, undefined, types.inputFile) + .addOptionalParam("libraries", undefined, undefined, types.any) + .addOptionalParam("contract") + .setAction( + async ({ + address, + constructorArgsParams, + constructorArgs: constructorArgsModule, + contract, + libraries: librariesModule, + }: VerifyTaskArgs): Promise => { + if (address === undefined) { + throw new MissingAddressError(); + } + + const { isAddress } = await import("@ethersproject/address"); + if (!isAddress(address)) { + throw new InvalidAddressError(address); + } + + if (contract !== undefined && !isFullyQualifiedName(contract)) { + throw new InvalidContractNameError(contract); + } + + const constructorArgs = await resolveConstructorArguments( + constructorArgsParams, + constructorArgsModule + ); + + let libraries; + if (typeof librariesModule === "object") { + libraries = librariesModule; + } else { + libraries = await resolveLibraries(librariesModule); + } + + return { + address, + constructorArgs, + libraries, + contractFQN: contract, + }; + } + ); + +subtask(TASK_VERIFY_ETHERSCAN_GET_MINIMAL_INPUT) + .addParam("sourceName") + .setAction(async ({ sourceName }: GetMinimalInputArgs, { run }) => { + const cloneDeep = require("lodash.clonedeep") as typeof LodashCloneDeepT; + const dependencyGraph: DependencyGraph = await run( + TASK_COMPILE_SOLIDITY_GET_DEPENDENCY_GRAPH, + { sourceNames: [sourceName] } + ); + + const resolvedFiles = dependencyGraph + .getResolvedFiles() + .filter((resolvedFile) => resolvedFile.sourceName === sourceName); + + if (resolvedFiles.length !== 1) { + throw new UnexpectedNumberOfFilesError(); + } + + const compilationJob: CompilationJob = await run( + TASK_COMPILE_SOLIDITY_GET_COMPILATION_JOB_FOR_FILE, + { + dependencyGraph, + file: resolvedFiles[0], + } + ); + + const minimalInput: CompilerInput = await run( + TASK_COMPILE_SOLIDITY_GET_COMPILER_INPUT, + { + compilationJob, + } + ); + + return cloneDeep(minimalInput); + }); + +subtask(TASK_VERIFY_ETHERSCAN_ATTEMPT_VERIFICATION) + .addParam("address") + .addParam("compilerInput", undefined, undefined, types.any) + .addParam("contractInformation", undefined, undefined, types.any) + .addParam("verificationInterface", undefined, undefined, types.any) + .addParam("encodedConstructorArguments") + .setAction( + async ({ + address, + compilerInput, + contractInformation, + verificationInterface, + encodedConstructorArguments, + }: AttemptVerificationArgs): Promise => { + // Ensure the linking information is present in the compiler input; + compilerInput.settings.libraries = contractInformation.libraries; + + const { message: guid } = await verificationInterface.verify( + address, + JSON.stringify(compilerInput), + `${contractInformation.sourceName}:${contractInformation.contractName}`, + `v${contractInformation.solcLongVersion}`, + encodedConstructorArguments + ); + + console.log(`Successfully submitted source code for contract +${contractInformation.sourceName}:${contractInformation.contractName} at ${address} +for verification on the block explorer. Waiting for verification result... +`); + + // Compilation is bound to take some time so there's no sense in requesting status immediately. + await sleep(700); + const verificationStatus = + await verificationInterface.getVerificationStatus(guid); + + if (!(verificationStatus.isFailure() || verificationStatus.isSuccess())) { + // Reaching this point shouldn't be possible unless the API is behaving in a new way. + throw new VerificationAPIUnexpectedMessageError( + verificationStatus.message + ); + } + + if (verificationStatus.isSuccess()) { + const contractURL = verificationInterface.getContractUrl(address); + console.log(`Successfully verified contract ${contractInformation.contractName} on the block explorer. +${contractURL}\n`); + } + + return { + success: verificationStatus.isSuccess(), + message: verificationStatus.message, + }; + } + ); diff --git a/packages/hardhat-verify/src/internal/tasks/sourcify.ts b/packages/hardhat-verify/src/internal/tasks/sourcify.ts new file mode 100644 index 00000000000..4eb22ed7144 --- /dev/null +++ b/packages/hardhat-verify/src/internal/tasks/sourcify.ts @@ -0,0 +1,237 @@ +import type { VerificationResponse, VerifyTaskArgs } from "../.."; +import type { + ExtendedContractInformation, + LibraryToAddress, +} from "../solc/artifacts"; + +import chalk from "chalk"; +import { subtask, types } from "hardhat/config"; +import { isFullyQualifiedName } from "hardhat/utils/contract-names"; +import { HARDHAT_NETWORK_NAME } from "hardhat/plugins"; + +import { Sourcify } from "../sourcify"; +import { + CompilerVersionsMismatchError, + ContractVerificationFailedError, + HardhatNetworkNotSupportedError, + HardhatVerifyError, + InvalidAddressError, + InvalidContractNameError, + MissingAddressError, +} from "../errors"; +import { + TASK_VERIFY_SOURCIFY, + TASK_VERIFY_SOURCIFY_RESOLVE_ARGUMENTS, + TASK_VERIFY_GET_CONTRACT_INFORMATION, + TASK_VERIFY_SOURCIFY_ATTEMPT_VERIFICATION, + TASK_VERIFY_SOURCIFY_DISABLED_WARNING, +} from "../task-names"; +import { getCompilerVersions, resolveLibraries } from "../utilities"; +import { Bytecode } from "../solc/bytecode"; + +// parsed verification args +interface VerificationArgs { + address: string; + libraries: LibraryToAddress; + contractFQN?: string; +} + +interface AttemptVerificationArgs { + address: string; + verificationInterface: Sourcify; + contractInformation: ExtendedContractInformation; +} + +/** + * Main Sourcify verification subtask. + * + * Verifies a contract in Sourcify by coordinating various subtasks related + * to contract verification. + */ +subtask(TASK_VERIFY_SOURCIFY) + .addParam("address") + .addOptionalParam("contract") + .addOptionalParam("libraries", undefined, undefined, types.any) + .setAction(async (taskArgs: VerifyTaskArgs, { config, network, run }) => { + const { address, libraries, contractFQN }: VerificationArgs = await run( + TASK_VERIFY_SOURCIFY_RESOLVE_ARGUMENTS, + taskArgs + ); + + if (network.name === HARDHAT_NETWORK_NAME) { + throw new HardhatNetworkNotSupportedError(); + } + + const currentChainId = parseInt( + await network.provider.send("eth_chainId"), + 16 + ); + + const { apiUrl, browserUrl } = config.sourcify; + + if (apiUrl === undefined) { + throw new HardhatVerifyError("Sourcify `apiUrl` is not defined"); + } + + if (browserUrl === undefined) { + throw new HardhatVerifyError("Sourcify `browserUrl` is not defined"); + } + + const sourcify = new Sourcify(currentChainId, apiUrl, browserUrl); + + const status = await sourcify.isVerified(address); + if (status !== false) { + const contractURL = sourcify.getContractUrl(address, status); + console.log(`The contract ${address} has already been verified on Sourcify. +${contractURL}`); + return; + } + + const configCompilerVersions = await getCompilerVersions(config.solidity); + + const deployedBytecode = await Bytecode.getDeployedContractBytecode( + address, + network.provider, + network.name + ); + + const matchingCompilerVersions = await deployedBytecode.getMatchingVersions( + configCompilerVersions + ); + // don't error if the bytecode appears to be OVM bytecode, because we can't infer a specific OVM solc version from the bytecode + if (matchingCompilerVersions.length === 0 && !deployedBytecode.isOvm()) { + throw new CompilerVersionsMismatchError( + configCompilerVersions, + deployedBytecode.getVersion(), + network.name + ); + } + + const contractInformation: ExtendedContractInformation = await run( + TASK_VERIFY_GET_CONTRACT_INFORMATION, + { + contractFQN, + deployedBytecode, + matchingCompilerVersions, + libraries, + } + ); + + const { + success: verificationSuccess, + message: verificationMessage, + }: VerificationResponse = await run( + TASK_VERIFY_SOURCIFY_ATTEMPT_VERIFICATION, + { + address, + verificationInterface: sourcify, + contractInformation, + } + ); + + if (verificationSuccess) { + return; + } + + throw new ContractVerificationFailedError( + verificationMessage, + contractInformation.undetectableLibraries + ); + }); + +subtask(TASK_VERIFY_SOURCIFY_RESOLVE_ARGUMENTS) + .addOptionalParam("address") + .addOptionalParam("contract") + .addOptionalParam("libraries", undefined, undefined, types.any) + .setAction( + async ({ + address, + contract, + libraries: librariesModule, + }: VerifyTaskArgs): Promise => { + if (address === undefined) { + throw new MissingAddressError(); + } + + const { isAddress } = await import("@ethersproject/address"); + if (!isAddress(address)) { + throw new InvalidAddressError(address); + } + + if (contract !== undefined && !isFullyQualifiedName(contract)) { + throw new InvalidContractNameError(contract); + } + + let libraries; + if (typeof librariesModule === "object") { + libraries = librariesModule; + } else { + libraries = await resolveLibraries(librariesModule); + } + + return { + address, + libraries, + contractFQN: contract, + }; + } + ); + +subtask(TASK_VERIFY_SOURCIFY_ATTEMPT_VERIFICATION) + .addParam("address") + .addParam("contractInformation", undefined, undefined, types.any) + .addParam("verificationInterface", undefined, undefined, types.any) + .setAction( + async ({ + address, + verificationInterface, + contractInformation, + }: AttemptVerificationArgs): Promise => { + const { sourceName, contractName, contractOutput, compilerInput } = + contractInformation; + + const librarySourcesToContent = Object.keys( + contractInformation.libraries + ).reduce((acc: Record, libSourceName) => { + const libContent = compilerInput.sources[libSourceName].content; + acc[libSourceName] = libContent; + return acc; + }, {}); + + const response = await verificationInterface.verify(address, { + "metadata.json": (contractOutput as any).metadata, + [sourceName]: compilerInput.sources[sourceName].content, + ...librarySourcesToContent, + }); + + if (response.isOk()) { + const contractURL = verificationInterface.getContractUrl( + address, + response.status + ); + console.log(`Successfully verified contract ${contractName} on Sourcify. +${contractURL}`); + } + + return { + success: response.isSuccess(), + message: "Contract successfuly verified on Sourcify", + }; + } + ); + +subtask(TASK_VERIFY_SOURCIFY_DISABLED_WARNING, async () => { + console.info( + chalk.cyan( + `[INFO] Sourcify Verification Skipped: Sourcify verification is currently disabled. To enable it, add the following entry to your Hardhat configuration: + +sourcify: { + enabled: true +} + +Or set 'enabled' to false to hide this message. + +For more information, visit https://hardhat.org/hardhat-runner/plugins/nomicfoundation-hardhat-verify#verifying-on-sourcify` + ) + ); +}); diff --git a/packages/hardhat-verify/src/internal/type-extensions.ts b/packages/hardhat-verify/src/internal/type-extensions.ts new file mode 100644 index 00000000000..df43cdd28da --- /dev/null +++ b/packages/hardhat-verify/src/internal/type-extensions.ts @@ -0,0 +1,15 @@ +import type { EtherscanConfig, SourcifyConfig } from "../types"; + +import "hardhat/types/config"; + +declare module "hardhat/types/config" { + interface HardhatUserConfig { + etherscan?: Partial; + sourcify?: Partial; + } + + interface HardhatConfig { + etherscan: EtherscanConfig; + sourcify: SourcifyConfig; + } +} diff --git a/packages/hardhat-verify/src/undici.ts b/packages/hardhat-verify/src/internal/undici.ts similarity index 81% rename from packages/hardhat-verify/src/undici.ts rename to packages/hardhat-verify/src/internal/undici.ts index e5657d59274..a25acc89660 100644 --- a/packages/hardhat-verify/src/undici.ts +++ b/packages/hardhat-verify/src/internal/undici.ts @@ -14,7 +14,8 @@ export async function sendGetRequest( export async function sendPostRequest( url: URL, - body: string + body: string, + headers: Record = {} ): Promise { const { request } = await import("undici"); const dispatcher = getDispatcher(); @@ -22,7 +23,7 @@ export async function sendPostRequest( return request(url, { dispatcher, method: "POST", - headers: { "Content-Type": "application/x-www-form-urlencoded" }, + headers, body, }); } @@ -36,3 +37,7 @@ function getDispatcher(): Undici.Dispatcher { return getGlobalDispatcher(); } + +export function isSuccessStatusCode(statusCode: number): boolean { + return statusCode >= 200 && statusCode <= 299; +} diff --git a/packages/hardhat-verify/src/utilities.ts b/packages/hardhat-verify/src/internal/utilities.ts similarity index 75% rename from packages/hardhat-verify/src/utilities.ts rename to packages/hardhat-verify/src/internal/utilities.ts index 36cbd8f1c11..24ee02edf4a 100644 --- a/packages/hardhat-verify/src/utilities.ts +++ b/packages/hardhat-verify/src/internal/utilities.ts @@ -1,8 +1,9 @@ import type { JsonFragment } from "@ethersproject/abi"; +import type { SolidityConfig } from "hardhat/types"; +import type { ChainConfig } from "../types"; import chalk from "chalk"; import path from "path"; -import { SolidityConfig } from "hardhat/types"; import { builtinChains } from "./chain-config"; import { ABIArgumentLengthError, @@ -10,12 +11,12 @@ import { ABIArgumentTypeError, EtherscanVersionNotSupportedError, ExclusiveConstructorArgumentsError, + HardhatVerifyError, ImportingModuleError, InvalidConstructorArgumentsModuleError, InvalidLibrariesModuleError, } from "./errors"; -import { ChainConfig } from "./types"; import { LibraryToAddress } from "./solc/artifacts"; import { isABIArgumentLengthError, @@ -28,7 +29,7 @@ export async function sleep(ms: number): Promise { } /** - * Prints a table of networks supported by hardhat-etherscan, including both + * Prints a table of networks supported by hardhat-verify, including both * built-in and custom networks. */ export async function printSupportedNetworks( @@ -64,7 +65,7 @@ export async function printSupportedNetworks( // print message console.log( ` -Networks supported by hardhat-etherscan: +Networks supported by hardhat-verify: ${supportedNetworksTable} @@ -77,6 +78,45 @@ To learn how to add custom networks, follow these instructions: https://hardhat. ); } +/** + * Prints verification errors to the console. + * @param errors - An object containing verification errors, where the keys + * are the names of verification subtasks and the values are HardhatVerifyError + * objects describing the specific errors. + * @remarks This function formats and logs the verification errors to the + * console with a red color using chalk. Each error is displayed along with the + * name of the verification provider it belongs to. + * @example + * const errors: Record = { + * verify:etherscan: { message: 'Error message for Etherscan' }, + * verify:sourcify: { message: 'Error message for Sourcify' }, + * // Add more errors here... + * }; + * printVerificationErrors(errors); + * // Output: + * // hardhat-verify found one or more errors during the verification process: + * // + * // Etherscan: + * // Error message for Etherscan + * // + * // Sourcify: + * // Error message for Sourcify + * // + * // ... (more errors if present) + */ +export function printVerificationErrors( + errors: Record +) { + let errorMessage = + "hardhat-verify found one or more errors during the verification process:\n\n"; + + for (const [subtaskLabel, error] of Object.entries(errors)) { + errorMessage += `${subtaskLabel}:\n${error.message}\n\n`; + } + + console.error(chalk.red(errorMessage)); +} + /** * Returns the list of constructor arguments from the constructorArgsModule * or the constructorArgsParams if the first is not defined. @@ -208,3 +248,10 @@ export async function encodeArguments( return encodedConstructorArguments; } + +export interface ValidationResponse { + isPending(): void; + isFailure(): void; + isSuccess(): void; + isOk(): void; +} diff --git a/packages/hardhat-verify/src/solc/bytecode.ts b/packages/hardhat-verify/src/solc/bytecode.ts deleted file mode 100644 index bbdefdca657..00000000000 --- a/packages/hardhat-verify/src/solc/bytecode.ts +++ /dev/null @@ -1,213 +0,0 @@ -import { CompilerOutputBytecode, EthereumProvider } from "hardhat/types"; -import { DeployedBytecodeNotFoundError } from "../errors"; -import { - getMetadataSectionLength, - inferCompilerVersion, - METADATA_LENGTH, - MISSING_METADATA_VERSION_RANGE, - SOLC_NOT_FOUND_IN_METADATA_VERSION_RANGE, -} from "./metadata"; -import { - ByteOffset, - getCallProtectionOffsets, - getImmutableOffsets, - getLibraryOffsets, -} from "./artifacts"; - -// If the compiler output bytecode is OVM bytecode, we need to make a fix to account for a bug in some versions of -// the OVM compiler. The artifact’s deployedBytecode is incorrect, but because its bytecode (initcode) is correct, when we -// actually deploy contracts, the code that ends up getting stored on chain is also correct. During verification, -// Etherscan will compile the source code, pull out the artifact’s deployedBytecode, and then perform the -// below find and replace, then check that resulting output against the code retrieved on chain from eth_getCode. -// We define the strings for that find and replace here, and use them later so we can know if the bytecode matches -// before it gets to Etherscan. -// Source: https://github.com/ethereum-optimism/optimism/blob/8d67991aba584c1703692ea46273ea8a1ef45f56/packages/contracts/src/contract-dumps.ts#L195-L204 -const OVM_FIND_OPCODES = - "336000905af158601d01573d60011458600c01573d6000803e3d621234565260ea61109c52"; -const OVM_REPLACE_OPCODES = - "336000905af158600e01573d6000803e3d6000fd5b3d6001141558600a015760016000f35b"; - -export class Bytecode { - private _bytecode: string; - private _version: string; - private _executableSection: ByteOffset; - private _isOvm: boolean; - - constructor(bytecode: string) { - this._bytecode = bytecode; - - const bytecodeBuffer = Buffer.from(bytecode, "hex"); - this._version = inferCompilerVersion(bytecodeBuffer); - this._executableSection = { - start: 0, - length: bytecode.length - getMetadataSectionLength(bytecodeBuffer) * 2, - }; - - // Check if this is OVM bytecode by looking for the concatenation of the two opcodes defined here: - // https://github.com/ethereum-optimism/optimism/blob/33cb9025f5e463525d6abe67c8457f81a87c5a24/packages/contracts/contracts/optimistic-ethereum/OVM/execution/OVM_SafetyChecker.sol#L143 - // - This check would only fail if the EVM solidity compiler didn't use any of the following opcodes: https://github.com/ethereum-optimism/optimism/blob/c42fc0df2790a5319027393cb8fa34e4f7bb520f/packages/contracts/contracts/optimistic-ethereum/iOVM/execution/iOVM_ExecutionManager.sol#L94-L175 - // This is the list of opcodes that calls the OVM execution manager. But the current solidity - // compiler seems to add REVERT in all cases, meaning it currently won't happen and this check - // will always be correct. - // - It is possible, though very unlikely, that this string appears in the bytecode of an EVM - // contract. As a result result, this _isOvm flag should only be used after trying to infer - // the solc version - // - We need this check because OVM bytecode has no metadata, so when verifying - // OVM bytecode the check in `inferSolcVersion` will always return `MISSING_METADATA_VERSION_RANGE`. - this._isOvm = bytecode.includes(OVM_REPLACE_OPCODES); - } - - public static async getDeployedContractBytecode( - address: string, - provider: EthereumProvider, - network: string - ): Promise { - const response: string = await provider.send("eth_getCode", [ - address, - "latest", - ]); - const deployedBytecode = response.replace(/^0x/, ""); - - if (deployedBytecode === "") { - throw new DeployedBytecodeNotFoundError(address, network); - } - - return new Bytecode(deployedBytecode); - } - - public stringify() { - return this._bytecode; - } - - public getVersion() { - return this._version; - } - - public isOvm() { - return this._isOvm; - } - - public hasVersionRange(): boolean { - return ( - this._version === MISSING_METADATA_VERSION_RANGE || - this._version === SOLC_NOT_FOUND_IN_METADATA_VERSION_RANGE - ); - } - - public async getMatchingVersions(versions: string[]): Promise { - const semver = await import("semver"); - - const matchingCompilerVersions = versions.filter((version) => - semver.satisfies(version, this._version) - ); - - return matchingCompilerVersions; - } - - /** - * Compare the bytecode agaisnt a compiler's output bytecode, ignoring metadata. - */ - public compare( - compilerOutputDeployedBytecode: CompilerOutputBytecode - ): boolean { - // Ignore metadata since Etherscan performs a partial match. - // See: https://ethereum.org/es/developers/docs/smart-contracts/verifying/#etherscan - const executableSection = this._getExecutableSection(); - let referenceExecutableSection = inferExecutableSection( - compilerOutputDeployedBytecode.object - ); - - // If this is OVM bytecode, do the required find and replace (see above comments for more info) - if (this._isOvm) { - referenceExecutableSection = referenceExecutableSection - .split(OVM_FIND_OPCODES) - .join(OVM_REPLACE_OPCODES); - } - - if ( - executableSection.length !== referenceExecutableSection.length && - // OVM bytecode has no metadata so we ignore this comparison if operating on OVM bytecode - !this._isOvm - ) { - return false; - } - - const normalizedBytecode = nullifyBytecodeOffsets( - executableSection, - compilerOutputDeployedBytecode - ); - - // Library hash placeholders are embedded into the bytes where the library addresses are linked. - // We need to zero them out to compare them. - const normalizedReferenceBytecode = nullifyBytecodeOffsets( - referenceExecutableSection, - compilerOutputDeployedBytecode - ); - - if (normalizedBytecode === normalizedReferenceBytecode) { - return true; - } - - return false; - } - - private _getExecutableSection(): string { - const { start, length } = this._executableSection; - return this._bytecode.slice(start, length); - } -} - -function nullifyBytecodeOffsets( - bytecode: string, - { - object: referenceBytecode, - linkReferences, - immutableReferences, - }: CompilerOutputBytecode -): string { - const offsets = [ - ...getLibraryOffsets(linkReferences), - ...getImmutableOffsets(immutableReferences), - ...getCallProtectionOffsets(bytecode, referenceBytecode), - ]; - - for (const { start, length } of offsets) { - bytecode = [ - bytecode.slice(0, start * 2), - "0".repeat(length * 2), - bytecode.slice((start + length) * 2), - ].join(""); - } - - return bytecode; -} - -/** - * This function returns the executable section without actually - * decoding the whole bytecode string. - * - * This is useful because the runtime object emitted by the compiler - * may contain nonhexadecimal characters due to link placeholders. - */ -function inferExecutableSection(bytecode: string): string { - if (bytecode.startsWith("0x")) { - bytecode = bytecode.slice(2); - } - - // `Buffer.from` will return a buffer that contains bytes up until the last decodable byte. - // To work around this we'll just slice the relevant part of the bytecode. - const metadataLengthSlice = Buffer.from( - bytecode.slice(-METADATA_LENGTH * 2), - "hex" - ); - - // If, for whatever reason, the bytecode is so small that we can't even read two bytes off it, - // return the size of the entire bytecode. - if (metadataLengthSlice.length !== METADATA_LENGTH) { - return bytecode; - } - - const metadataSectionLength = getMetadataSectionLength(metadataLengthSlice); - - return bytecode.slice(0, bytecode.length - metadataSectionLength * 2); -} diff --git a/packages/hardhat-verify/src/sourcify.ts b/packages/hardhat-verify/src/sourcify.ts new file mode 100644 index 00000000000..7e146ea86f6 --- /dev/null +++ b/packages/hardhat-verify/src/sourcify.ts @@ -0,0 +1 @@ +export { Sourcify } from "./internal/sourcify"; diff --git a/packages/hardhat-verify/src/task-names.ts b/packages/hardhat-verify/src/task-names.ts deleted file mode 100644 index 11ed1809656..00000000000 --- a/packages/hardhat-verify/src/task-names.ts +++ /dev/null @@ -1,12 +0,0 @@ -export const TASK_VERIFY = "verify"; -export const TASK_VERIFY_GET_VERIFICATION_SUBTASKS = - "verify:get-verification-subtasks"; -export const TASK_VERIFY_RESOLVE_ARGUMENTS = "verify:resolve-arguments"; -export const TASK_VERIFY_VERIFY = "verify:verify"; -export const TASK_VERIFY_ETHERSCAN = "verify:etherscan"; -export const TASK_VERIFY_ETHERSCAN_GET_CONTRACT_INFORMATION = - "verify:etherscan-get-contract-information"; -export const TASK_VERIFY_ETHERSCAN_GET_MINIMAL_INPUT = - "verify:etherscan-get-minimal-input"; -export const TASK_VERIFY_ETHERSCAN_ATTEMPT_VERIFICATION = - "verify:etherscan-attempt-verification"; diff --git a/packages/hardhat-verify/src/tsconfig.json b/packages/hardhat-verify/src/tsconfig.json new file mode 100644 index 00000000000..550a953bb3e --- /dev/null +++ b/packages/hardhat-verify/src/tsconfig.json @@ -0,0 +1,18 @@ +{ + "extends": "../../../config/typescript/tsconfig.json", + "compilerOptions": { + "outDir": "../", + "rootDirs": ["."], + "composite": true + }, + "include": ["./**/*.ts"], + "exclude": [], + "references": [ + { + "path": "../../hardhat-core/src" + }, + { + "path": "../../hardhat-ethers/src" + } + ] +} diff --git a/packages/hardhat-verify/src/type-extensions.ts b/packages/hardhat-verify/src/type-extensions.ts deleted file mode 100644 index 8435d1a7e20..00000000000 --- a/packages/hardhat-verify/src/type-extensions.ts +++ /dev/null @@ -1,13 +0,0 @@ -import "hardhat/types/config"; - -import { EtherscanConfig } from "./types"; - -declare module "hardhat/types/config" { - interface HardhatUserConfig { - etherscan?: Partial; - } - - interface HardhatConfig { - etherscan: EtherscanConfig; - } -} diff --git a/packages/hardhat-verify/src/types.ts b/packages/hardhat-verify/src/types.ts index 566084b86e6..ffa395e8765 100644 --- a/packages/hardhat-verify/src/types.ts +++ b/packages/hardhat-verify/src/types.ts @@ -10,6 +10,13 @@ export interface ChainConfig { export interface EtherscanConfig { apiKey: ApiKey; customChains: ChainConfig[]; + enabled: boolean; +} + +export interface SourcifyConfig { + enabled: boolean; + apiUrl?: string; + browserUrl?: string; } export type ApiKey = string | Record; diff --git a/packages/hardhat-verify/test/.eslintrc.js b/packages/hardhat-verify/test/.eslintrc.js index 12ee5882f11..757fe8a3ca9 100644 --- a/packages/hardhat-verify/test/.eslintrc.js +++ b/packages/hardhat-verify/test/.eslintrc.js @@ -1,5 +1,9 @@ module.exports = { extends: [`${__dirname}/../.eslintrc.js`], + parserOptions: { + project: `${__dirname}/../tsconfig.json`, + sourceType: "module", + }, rules: { "import/no-extraneous-dependencies": [ "error", diff --git a/packages/hardhat-verify/test/fixture-projects/hardhat-project/hardhat.config.js b/packages/hardhat-verify/test/fixture-projects/hardhat-project/hardhat.config.js index 1904ad4739a..cc01486a97a 100644 --- a/packages/hardhat-verify/test/fixture-projects/hardhat-project/hardhat.config.js +++ b/packages/hardhat-verify/test/fixture-projects/hardhat-project/hardhat.config.js @@ -1,4 +1,4 @@ -require("@nomiclabs/hardhat-ethers"); +require("@nomicfoundation/hardhat-ethers"); require("../../../src/index"); @@ -28,4 +28,13 @@ module.exports = { }, ], }, + sourcify: { + enabled: false, + customChains: [ + { + network: "hardhat", + chainId: 31337, + }, + ], + }, }; diff --git a/packages/hardhat-verify/test/helpers.ts b/packages/hardhat-verify/test/helpers.ts index 34b0a46032b..24802875be5 100644 --- a/packages/hardhat-verify/test/helpers.ts +++ b/packages/hardhat-verify/test/helpers.ts @@ -1,15 +1,18 @@ +import type {} from "@nomicfoundation/hardhat-ethers"; +import type { FactoryOptions, HardhatRuntimeEnvironment } from "hardhat/types"; + import path from "path"; +import debug from "debug"; import { resetHardhatContext } from "hardhat/plugins-testing"; -import type {} from "@nomiclabs/hardhat-ethers"; -import { FactoryOptions, HardhatRuntimeEnvironment } from "hardhat/types"; - declare module "mocha" { interface Context { hre: HardhatRuntimeEnvironment; } } +const log = debug("hardhat:hardhat-verify:tests"); + export const useEnvironment = (fixtureProjectName: string): void => { before("Loading hardhat environment", function () { process.chdir(path.join(__dirname, "fixture-projects", fixtureProjectName)); @@ -34,9 +37,10 @@ export const deployContract = async ( ): Promise => { const factory = await ethers.getContractFactory(contractName, options); const contract = await factory.deploy(...constructorArguments); - await contract.deployTransaction.wait(confirmations); - console.log(`Deployed ${contractName} at ${contract.address}`); - return contract.address; + await contract.deploymentTransaction()?.wait(confirmations); + const contractAddress = await contract.getAddress(); + log(`Deployed ${contractName} at ${contractAddress}`); + return contractAddress; }; export const getRandomAddress = (hre: HardhatRuntimeEnvironment): string => diff --git a/packages/hardhat-verify/test/integration/index.ts b/packages/hardhat-verify/test/integration/index.ts index 1ff457aa67b..e259df75b4e 100644 --- a/packages/hardhat-verify/test/integration/index.ts +++ b/packages/hardhat-verify/test/integration/index.ts @@ -1,10 +1,15 @@ import fs from "fs"; import path from "path"; -import sinon from "sinon"; +import sinon, { SinonStub } from "sinon"; import { assert, expect } from "chai"; import { TASK_CLEAN, TASK_COMPILE } from "hardhat/builtin-tasks/task-names"; import { SolcConfig } from "hardhat/types/config"; -import { TASK_VERIFY, TASK_VERIFY_VERIFY } from "../../src/task-names"; +import { + TASK_VERIFY, + TASK_VERIFY_ETHERSCAN, + TASK_VERIFY_VERIFY, + TASK_VERIFY_SOURCIFY, +} from "../../src/internal/task-names"; import { deployContract, getRandomAddress, useEnvironment } from "../helpers"; import { interceptGetStatus, @@ -12,23 +17,37 @@ import { interceptVerify, mockEnvironment, } from "./mocks/etherscan"; +import { + interceptSourcifyIsVerified, + interceptSourcifyVerify, + mockEnvironmentSourcify, +} from "./mocks/sourcify"; -import "../../src/type-extensions"; +import "../../src/internal/type-extensions"; describe("verify task integration tests", () => { useEnvironment("hardhat-project"); mockEnvironment(); + // suppress sourcify info message + let consoleInfoStub: SinonStub; + before(() => { + consoleInfoStub = sinon.stub(console, "info"); + }); + + // suppress warnings + after(() => { + consoleInfoStub.restore(); + }); + it("should return after printing the supported networks", async function () { const logStub = sinon.stub(console, "log"); const taskResponse = await this.hre.run(TASK_VERIFY, { - address: getRandomAddress(this.hre), - constructorArgsParams: [], listNetworks: true, }); expect(logStub).to.be.calledOnceWith( - sinon.match(/Networks supported by hardhat-etherscan/) + sinon.match(/Networks supported by hardhat-verify/) ); logStub.restore(); assert.isUndefined(taskResponse); @@ -40,17 +59,18 @@ describe("verify task integration tests", () => { // cleanup the etherscan config since we have hardhat defined as custom chain const originalConfig = this.hre.config.etherscan; this.hre.config.etherscan = { + enabled: true, apiKey: "", customChains: [], }; await expect( - this.hre.run(TASK_VERIFY, { + this.hre.run(TASK_VERIFY_ETHERSCAN, { address, constructorArgsParams: [], }) ).to.be.rejectedWith( - "The selected network is hardhat. Please select a network supported by Etherscan." + /The selected network is "hardhat", which is not supported for contract verification./ ); this.hre.config.etherscan = originalConfig; @@ -65,13 +85,13 @@ describe("verify task integration tests", () => { const logStub = sinon.stub(console, "log"); const address = getRandomAddress(this.hre); - const taskResponse = await this.hre.run(TASK_VERIFY, { + const taskResponse = await this.hre.run(TASK_VERIFY_ETHERSCAN, { address, constructorArgsParams: [], }); expect(logStub).to.be.calledOnceWith( - `The contract ${address} has already been verified. + `The contract ${address} has already been verified on Etherscan. https://hardhat.etherscan.io/address/${address}#code` ); logStub.restore(); @@ -134,7 +154,7 @@ https://hardhat.etherscan.io/address/${address}#code` const address = getRandomAddress(this.hre); await expect( - this.hre.run(TASK_VERIFY, { + this.hre.run(TASK_VERIFY_ETHERSCAN, { address, constructorArgsParams: [], }) @@ -153,7 +173,7 @@ https://hardhat.etherscan.io/address/${address}#code` ]; await expect( - this.hre.run(TASK_VERIFY, { + this.hre.run(TASK_VERIFY_ETHERSCAN, { address: simpleContractAddress, constructorArgsParams: [], }) @@ -168,15 +188,14 @@ https://hardhat.etherscan.io/address/${address}#code` }); describe("with deleted artifacts", () => { - it("should not compile the project when the noCompile is provided", async function () { + it("should throw if the artifacts are missing", async function () { await this.hre.run(TASK_CLEAN); // task will fail since we deleted all the artifacts await expect( - this.hre.run(TASK_VERIFY, { + this.hre.run(TASK_VERIFY_ETHERSCAN, { address: simpleContractAddress, constructorArgsParams: [], - noCompile: true, }) ).to.be.rejectedWith( /The address provided as argument contains a contract, but its bytecode doesn't match any of your local contracts./ @@ -192,7 +211,7 @@ https://hardhat.etherscan.io/address/${address}#code` it("should throw if the deployed bytecode matches more than one contract", async function () { await expect( - this.hre.run(TASK_VERIFY, { + this.hre.run(TASK_VERIFY_ETHERSCAN, { address: duplicatedContractAddress, constructorArgsParams: [], }) @@ -205,7 +224,7 @@ https://hardhat.etherscan.io/address/${address}#code` const contractFQN = "contracts/SimpleContract.sol:NotFound"; await expect( - this.hre.run(TASK_VERIFY, { + this.hre.run(TASK_VERIFY_ETHERSCAN, { address: simpleContractAddress, constructorArgsParams: [], contract: contractFQN, @@ -219,7 +238,7 @@ https://hardhat.etherscan.io/address/${address}#code` it("should throw if there is an invalid address in the libraries parameter", async function () { await expect( - this.hre.run(TASK_VERIFY, { + this.hre.run(TASK_VERIFY_ETHERSCAN, { address: simpleContractAddress, constructorArgsParams: [], libraries: "invalid-libraries.js", @@ -231,7 +250,7 @@ https://hardhat.etherscan.io/address/${address}#code` it("should throw if the specified library is not used by the contract", async function () { await expect( - this.hre.run(TASK_VERIFY, { + this.hre.run(TASK_VERIFY_ETHERSCAN, { address: bothLibsContractAddress, constructorArgsParams: [], libraries: "not-used-libraries.js", @@ -243,7 +262,7 @@ https://hardhat.etherscan.io/address/${address}#code` it("should throw if the specified library is listed more than once in the libraries parameter", async function () { await expect( - this.hre.run(TASK_VERIFY, { + this.hre.run(TASK_VERIFY_ETHERSCAN, { address: onlyNormalLibContractAddress, constructorArgsParams: [], libraries: "duplicated-libraries.js", @@ -255,7 +274,7 @@ https://hardhat.etherscan.io/address/${address}#code` it("should throw if deployed library address does not match the address defined in the libraries parameter", async function () { await expect( - this.hre.run(TASK_VERIFY, { + this.hre.run(TASK_VERIFY_ETHERSCAN, { address: onlyNormalLibContractAddress, constructorArgsParams: [], libraries: "mismatched-address-libraries.js", @@ -269,7 +288,7 @@ https://hardhat.etherscan.io/address/${address}#code` it("should throw if there are undetectable libraries not specified by the libraries parameter", async function () { await expect( - this.hre.run(TASK_VERIFY, { + this.hre.run(TASK_VERIFY_ETHERSCAN, { address: bothLibsContractAddress, constructorArgsParams: [], libraries: "missing-undetectable-libraries.js", @@ -284,12 +303,12 @@ This can occur if the library is only called in the contract constructor. The mi it("should throw if the verification request fails", async function () { // do not intercept the verifysourcecode request so it throws an error await expect( - this.hre.run(TASK_VERIFY, { + this.hre.run(TASK_VERIFY_ETHERSCAN, { address: simpleContractAddress, constructorArgsParams: [], }) ).to.be.rejectedWith( - /Failed to send contract verification request.\nEndpoint URL: https:\/\/api-hardhat.etherscan.io\/api\nReason: getaddrinfo ENOTFOUND api-hardhat.etherscan.io/ + /An unexpected error occurred during the verification process\.\nPlease report this issue to the Hardhat team\.\nError Details: getaddrinfo ENOTFOUND api-hardhat\.etherscan\.io/ ); }); @@ -297,13 +316,13 @@ This can occur if the library is only called in the contract constructor. The mi interceptVerify({ error: "error verifying contract" }, 500); await expect( - this.hre.run(TASK_VERIFY, { + this.hre.run(TASK_VERIFY_ETHERSCAN, { address: simpleContractAddress, constructorArgsParams: [], }) - ).to.be.rejectedWith(`Failed to send contract verification request. -Endpoint URL: https://api-hardhat.etherscan.io/api -The HTTP server response is not ok. Status code: 500 Response text: {"error":"error verifying contract"}`); + ).to.be.rejectedWith( + /Failed to send contract verification request\.\nEndpoint URL: https:\/\/api-hardhat\.etherscan\.io\/api\n/s + ); }); it("should throw if the etherscan api can't find the bytecode at the contract address", async function () { @@ -313,7 +332,7 @@ The HTTP server response is not ok. Status code: 500 Response text: {"error":"er }); await expect( - this.hre.run(TASK_VERIFY, { + this.hre.run(TASK_VERIFY_ETHERSCAN, { address: simpleContractAddress, constructorArgsParams: [], }) @@ -331,7 +350,7 @@ The HTTP server response is not ok. Status code: 500 Response text: {"error":"er }); await expect( - this.hre.run(TASK_VERIFY, { + this.hre.run(TASK_VERIFY_ETHERSCAN, { address: simpleContractAddress, constructorArgsParams: [], }) @@ -347,11 +366,13 @@ The HTTP server response is not ok. Status code: 500 Response text: {"error":"er const logStub = sinon.stub(console, "log"); await expect( - this.hre.run(TASK_VERIFY, { + this.hre.run(TASK_VERIFY_ETHERSCAN, { address: simpleContractAddress, constructorArgsParams: [], }) - ).to.be.rejectedWith(/Failure during etherscan status polling./); + ).to.be.rejectedWith( + /An unexpected error occurred during the verification process\.\nPlease report this issue to the Hardhat team\.\nError Details: getaddrinfo ENOTFOUND api-hardhat\.etherscan\.io/ + ); expect(logStub).to.be .calledOnceWith(`Successfully submitted source code for contract @@ -370,7 +391,7 @@ for verification on the block explorer. Waiting for verification result... const logStub = sinon.stub(console, "log"); await expect( - this.hre.run(TASK_VERIFY, { + this.hre.run(TASK_VERIFY_ETHERSCAN, { address: simpleContractAddress, constructorArgsParams: [], }) @@ -398,7 +419,7 @@ for verification on the block explorer. Waiting for verification result... const logStub = sinon.stub(console, "log"); await expect( - this.hre.run(TASK_VERIFY, { + this.hre.run(TASK_VERIFY_ETHERSCAN, { address: simpleContractAddress, constructorArgsParams: [], }) @@ -426,7 +447,7 @@ for verification on the block explorer. Waiting for verification result... const logStub = sinon.stub(console, "log"); await expect( - this.hre.run(TASK_VERIFY, { + this.hre.run(TASK_VERIFY_ETHERSCAN, { address: simpleContractAddress, constructorArgsParams: [], }) @@ -465,8 +486,8 @@ contracts/SimpleContract.sol:SimpleContract at ${simpleContractAddress} for verification on the block explorer. Waiting for verification result... `); expect(logStub.getCall(1)).to.be - .calledWith(`Successfully verified contract SimpleContract on Etherscan. -https://hardhat.etherscan.io/address/${simpleContractAddress}#code`); + .calledWith(`Successfully verified contract SimpleContract on the block explorer. +https://hardhat.etherscan.io/address/${simpleContractAddress}#code\n`); logStub.restore(); assert.isUndefined(taskResponse); }); @@ -515,8 +536,8 @@ contracts/SimpleContract.sol:SimpleContract at ${simpleContractAddress} for verification on the block explorer. Waiting for verification result... `); expect(logStub.getCall(3)).to.be - .calledWith(`Successfully verified contract SimpleContract on Etherscan. -https://hardhat.etherscan.io/address/${simpleContractAddress}#code`); + .calledWith(`Successfully verified contract SimpleContract on the block explorer. +https://hardhat.etherscan.io/address/${simpleContractAddress}#code\n`); logStub.restore(); assert.equal(verifyCallCount, 2); assert.equal(getStatusCallCount, 2); @@ -543,7 +564,7 @@ https://hardhat.etherscan.io/address/${simpleContractAddress}#code`); const logStub = sinon.stub(console, "log"); await expect( - this.hre.run(TASK_VERIFY, { + this.hre.run(TASK_VERIFY_ETHERSCAN, { address: bothLibsContractAddress, constructorArgsParams: ["50"], libraries: "libraries.js", @@ -589,7 +610,6 @@ for verification on the block explorer. Waiting for verification result... NormalLib: normalLibAddress, ConstructorLib: constructorLibAddress, }, - // noCompile: true, }); assert.equal(logStub.callCount, 2); @@ -599,8 +619,59 @@ contracts/WithLibs.sol:BothLibs at ${bothLibsContractAddress} for verification on the block explorer. Waiting for verification result... `); expect(logStub.getCall(1)).to.be - .calledWith(`Successfully verified contract BothLibs on Etherscan. -https://hardhat.etherscan.io/address/${bothLibsContractAddress}#code`); + .calledWith(`Successfully verified contract BothLibs on the block explorer. +https://hardhat.etherscan.io/address/${bothLibsContractAddress}#code\n`); + logStub.restore(); + assert.isUndefined(taskResponse); + }); + + after(async function () { + await this.hre.run(TASK_CLEAN); + }); + }); +}); + +describe("verify task Sourcify's integration tests", () => { + useEnvironment("hardhat-project"); + mockEnvironmentSourcify(); + + describe("with a non-verified contract", () => { + let simpleContractAddress: string; + + before(async function () { + await this.hre.run(TASK_COMPILE, { force: true, quiet: true }); + simpleContractAddress = await deployContract( + "SimpleContract", + [], + this.hre + ); + }); + + it("should verify a contract on Sourcify", async function () { + interceptSourcifyIsVerified([ + { address: simpleContractAddress, status: "false" }, + ]); + interceptSourcifyVerify({ + result: [ + { + address: simpleContractAddress, + status: "perfect", + }, + ], + }); + const logStub = sinon.stub(console, "log"); + // set network name to localhost to avoid the "hardhat is not supported" error + this.hre.network.name = "localhost"; + + const taskResponse = await this.hre.run(TASK_VERIFY_SOURCIFY, { + address: simpleContractAddress, + contract: "contracts/SimpleContract.sol:SimpleContract", + }); + + assert.equal(logStub.callCount, 1); + (expect(logStub.getCall(0)).to.be as any) + .calledWith(`Successfully verified contract SimpleContract on Sourcify. +https://repo.sourcify.dev/contracts/full_match/31337/${simpleContractAddress}/`); logStub.restore(); assert.isUndefined(taskResponse); }); diff --git a/packages/hardhat-verify/test/integration/mocks/sourcify.ts b/packages/hardhat-verify/test/integration/mocks/sourcify.ts new file mode 100644 index 00000000000..e38308b9387 --- /dev/null +++ b/packages/hardhat-verify/test/integration/mocks/sourcify.ts @@ -0,0 +1,47 @@ +import { + Dispatcher, + getGlobalDispatcher, + MockAgent, + setGlobalDispatcher, +} from "undici"; + +const mockAgent = new MockAgent({ + keepAliveTimeout: 10, + keepAliveMaxTimeout: 10, +}); + +const client = mockAgent.get("https://sourcify.dev"); + +export const mockEnvironmentSourcify = () => { + let globalDispatcher: Dispatcher; + // enable network connections for everything but etherscan API + mockAgent.enableNetConnect(/^(?!https:\/\/sourcify\.dev)/); + + before(() => { + globalDispatcher = getGlobalDispatcher(); + setGlobalDispatcher(mockAgent); + }); + + after(() => { + setGlobalDispatcher(globalDispatcher); + }); +}; + +export const interceptSourcifyIsVerified = (response: any) => + client + .intercept({ + method: "GET", + path: /\/server\/check-all-by-addresses\?addresses=0x[a-fA-F0-9]{40}&chainIds=[0-9]+/, + }) + .reply(200, response); + +export const interceptSourcifyVerify = ( + response: any, + statusCode: number = 200 +) => + client + .intercept({ + path: "/server", + method: "POST", + }) + .reply(statusCode, response); diff --git a/packages/hardhat-verify/test/unit/chain-config.ts b/packages/hardhat-verify/test/unit/chain-config.ts index 0cebea66d59..075476891fb 100644 --- a/packages/hardhat-verify/test/unit/chain-config.ts +++ b/packages/hardhat-verify/test/unit/chain-config.ts @@ -1,128 +1,7 @@ -import type { Network } from "hardhat/types"; -import type { ChainConfig } from "../../src/types"; -import { assert, expect } from "chai"; -import { builtinChains, getCurrentChainConfig } from "../../src/chain-config"; +import { assert } from "chai"; +import { builtinChains } from "../../src/internal/chain-config"; describe("Chain Config", () => { - describe("getCurrentChainConfig", () => { - const customChains: ChainConfig[] = [ - { - network: "customChain1", - chainId: 5000, - urls: { - apiURL: "", - browserURL: "", - }, - }, - { - network: "customChain2", - chainId: 5000, - urls: { - apiURL: "", - browserURL: "", - }, - }, - { - network: "customChain3", - chainId: 4999, - urls: { - apiURL: "", - browserURL: "", - }, - }, - ]; - - it("should return the last matching custom chain defined by the user", async function () { - const network = { - name: "customChain2", - provider: { - async send() { - return (5000).toString(16); - }, - }, - } as unknown as Network; - const chainConfig = await getCurrentChainConfig(network, customChains); - - assert.equal(chainConfig.network, "customChain2"); - assert.equal(chainConfig.chainId, 5000); - }); - - it("should return a built-in chain if no custom chain matches", async function () { - const network = { - name: "goerli", - provider: { - async send() { - return (5).toString(16); - }, - }, - } as unknown as Network; - const chainConfig = await getCurrentChainConfig(network, customChains); - - assert.equal(chainConfig.network, "goerli"); - assert.equal(chainConfig.chainId, 5); - }); - - it("should throw if the selected network is hardhat and it's not a added to custom chains", async () => { - const network = { - name: "hardhat", - provider: { - async send() { - return (31337).toString(16); - }, - }, - } as unknown as Network; - - await expect( - getCurrentChainConfig(network, customChains) - ).to.be.rejectedWith( - "The selected network is hardhat. Please select a network supported by Etherscan." - ); - }); - - it("should return hardhat if the selected network is hardhat and it was added as a custom chain", async () => { - const network = { - name: "hardhat", - provider: { - async send() { - return (31337).toString(16); - }, - }, - } as unknown as Network; - - const chainConfig = await getCurrentChainConfig(network, [ - ...customChains, - { - network: "hardhat", - chainId: 31337, - urls: { - apiURL: "", - browserURL: "", - }, - }, - ]); - - assert.equal(chainConfig.network, "hardhat"); - assert.equal(chainConfig.chainId, 31337); - }); - - it("should throw if there are no matches at all", async () => { - const network = { - name: "someNetwork", - provider: { - async send() { - return (21343214123).toString(16); - }, - }, - } as unknown as Network; - - await expect( - getCurrentChainConfig(network, customChains) - ).to.be.rejectedWith( - /Trying to verify a contract in a network with chain id 21343214123, but the plugin doesn't recognize it as a supported chain./ - ); - }); - }); - describe("builtinChains", () => { it("should have no duplicate chain ids", () => { // check that xdai/gnosis is the only duplicate diff --git a/packages/hardhat-verify/test/unit/config.ts b/packages/hardhat-verify/test/unit/config.ts index 210c2a976d8..030d2c4f7c1 100644 --- a/packages/hardhat-verify/test/unit/config.ts +++ b/packages/hardhat-verify/test/unit/config.ts @@ -1,14 +1,37 @@ +import type { HardhatConfig, HardhatUserConfig } from "hardhat/types"; +import type { EtherscanConfig, SourcifyConfig } from "../../src/types"; + import sinon from "sinon"; import { assert, expect } from "chai"; -import { HardhatConfig, HardhatUserConfig } from "hardhat/types"; -import { etherscanConfigExtender } from "../../src/config"; -import { EtherscanConfig } from "../../src/types"; -describe("Chain Config", () => { - it("should extend the hardhat config with the user config", async () => { - const hardhatConfig = {} as HardhatConfig; - const userConfig: HardhatUserConfig = { - etherscan: { +import { + etherscanConfigExtender, + sourcifyConfigExtender, +} from "../../src/internal/config"; + +describe("Extend config", () => { + describe("Etherscan config extender", () => { + it("should extend the hardhat config with the user config", async () => { + const hardhatConfig = {} as HardhatConfig; + const userConfig: HardhatUserConfig = { + etherscan: { + apiKey: { + goerli: "", + }, + customChains: [ + { + network: "goerli", + chainId: 5, + urls: { + apiURL: "https://api-goerli.etherscan.io/api", + browserURL: "https://goerli.etherscan.io", + }, + }, + ], + }, + }; + const expected: EtherscanConfig = { + enabled: true, apiKey: { goerli: "", }, @@ -22,58 +45,69 @@ describe("Chain Config", () => { }, }, ], - }, - }; - const expected: EtherscanConfig = { - apiKey: { - goerli: "", - }, - customChains: [ - { - network: "goerli", - chainId: 5, - urls: { - apiURL: "https://api-goerli.etherscan.io/api", - browserURL: "https://goerli.etherscan.io", - }, - }, - ], - }; - etherscanConfigExtender(hardhatConfig, userConfig); + }; + etherscanConfigExtender(hardhatConfig, userConfig); - assert.deepEqual(hardhatConfig.etherscan, expected); - }); + assert.deepEqual(hardhatConfig.etherscan, expected); + }); - it("should override the hardhat config with the user config", async () => { - const hardhatConfig = {} as HardhatConfig; - hardhatConfig.etherscan = { - apiKey: { - goerli: "", - }, - customChains: [ - { - network: "goerli", - chainId: 5, - urls: { - apiURL: "https://api-goerli.etherscan.io/api", - browserURL: "https://goerli.etherscan.io", + it("should override the hardhat config with the user config", async () => { + const hardhatConfig = {} as HardhatConfig; + hardhatConfig.etherscan = { + enabled: true, + apiKey: { + goerli: "", + }, + customChains: [ + { + network: "goerli", + chainId: 5, + urls: { + apiURL: "https://api-goerli.etherscan.io/api", + browserURL: "https://goerli.etherscan.io", + }, + }, + ], + }; + const userConfig: HardhatUserConfig = { + etherscan: { + apiKey: { + mainnet: "", + sepolia: "", }, + customChains: [ + { + network: "mainnet", + chainId: 1, + urls: { + apiURL: "https://api.etherscan.io/api", + browserURL: "https://etherscan.io", + }, + }, + { + network: "sepolia", + chainId: 11155111, + urls: { + apiURL: "https://api-sepolia.etherscan.io/api", + browserURL: "https://sepolia.etherscan.io", + }, + }, + ], }, - ], - }; - const userConfig: HardhatUserConfig = { - etherscan: { + }; + const expected: EtherscanConfig = { + enabled: true, apiKey: { - ropsten: "", + mainnet: "", sepolia: "", }, customChains: [ { - network: "ropsten", - chainId: 3, + network: "mainnet", + chainId: 1, urls: { - apiURL: "https://api-ropsten.etherscan.io/api", - browserURL: "https://ropsten.etherscan.io", + apiURL: "https://api.etherscan.io/api", + browserURL: "https://etherscan.io", }, }, { @@ -85,69 +119,61 @@ describe("Chain Config", () => { }, }, ], - }, - }; - const expected: EtherscanConfig = { - apiKey: { - ropsten: "", - sepolia: "", - }, - customChains: [ - { - network: "ropsten", - chainId: 3, - urls: { - apiURL: "https://api-ropsten.etherscan.io/api", - browserURL: "https://ropsten.etherscan.io", - }, - }, - { - network: "sepolia", - chainId: 11155111, - urls: { - apiURL: "https://api-sepolia.etherscan.io/api", - browserURL: "https://sepolia.etherscan.io", - }, - }, - ], - }; - etherscanConfigExtender(hardhatConfig, userConfig); + }; + etherscanConfigExtender(hardhatConfig, userConfig); - assert.deepEqual(hardhatConfig.etherscan, expected); - }); + assert.deepEqual(hardhatConfig.etherscan, expected); + }); - it("should set default values when user config is not provided", async () => { - const hardhatConfig = {} as HardhatConfig; - const userConfig: HardhatUserConfig = {}; - const expected: EtherscanConfig = { - apiKey: "", - customChains: [], - }; - etherscanConfigExtender(hardhatConfig, userConfig); + it("should set default values when user config is not provided", async () => { + const hardhatConfig = {} as HardhatConfig; + const userConfig: HardhatUserConfig = {}; + const expected: EtherscanConfig = { + enabled: true, + apiKey: "", + customChains: [], + }; + etherscanConfigExtender(hardhatConfig, userConfig); - assert.deepEqual(hardhatConfig.etherscan, expected); - }); + assert.deepEqual(hardhatConfig.etherscan, expected); + }); - it("should display a warning message if there is an etherscan entry in the networks object", async () => { - const warnStub = sinon.stub(console, "warn"); - const hardhatConfig = { - networks: { - etherscan: { - apiKey: { - goerli: "", + it("should display a warning message if there is an etherscan entry in the networks object", async () => { + const warnStub = sinon.stub(console, "warn"); + const hardhatConfig = { + networks: { + etherscan: { + apiKey: { + goerli: "", + }, }, }, - }, - }; - const userConfig: HardhatUserConfig = {}; + }; + const userConfig: HardhatUserConfig = {}; + + // @ts-expect-error + etherscanConfigExtender(hardhatConfig, userConfig); + expect(warnStub).to.be.calledOnceWith( + sinon.match( + /WARNING: you have an 'etherscan' entry in your networks configuration./ + ) + ); + warnStub.restore(); + }); + }); + + describe("Sourcify config extender", () => { + it("should set default values when user config is not provided", async () => { + const hardhatConfig = {} as HardhatConfig; + const userConfig: HardhatUserConfig = {}; + const expected: SourcifyConfig = { + enabled: false, + apiUrl: "https://sourcify.dev/server", + browserUrl: "https://repo.sourcify.dev", + }; + sourcifyConfigExtender(hardhatConfig, userConfig); - // @ts-expect-error - etherscanConfigExtender(hardhatConfig, userConfig); - expect(warnStub).to.be.calledOnceWith( - sinon.match( - /WARNING: you have an 'etherscan' entry in your networks configuration./ - ) - ); - warnStub.restore(); + assert.deepEqual(hardhatConfig.sourcify, expected); + }); }); }); diff --git a/packages/hardhat-verify/test/unit/etherscan.ts b/packages/hardhat-verify/test/unit/etherscan.ts index 0bcdd816c40..d1198e54c8f 100644 --- a/packages/hardhat-verify/test/unit/etherscan.ts +++ b/packages/hardhat-verify/test/unit/etherscan.ts @@ -1,5 +1,8 @@ +import type { EthereumProvider } from "hardhat/types"; +import type { ChainConfig } from "../../src/types"; + import { assert, expect } from "chai"; -import { Etherscan } from "../../src/etherscan"; +import { Etherscan } from "../../src/internal/etherscan"; describe("Etherscan", () => { const chainConfig = { @@ -13,34 +16,166 @@ describe("Etherscan", () => { describe("constructor", () => { it("should throw if the apiKey is undefined or empty", () => { - expect(() => new Etherscan(undefined, chainConfig)).to.throw( + expect(() => Etherscan.fromChainConfig(undefined, chainConfig)).to.throw( /You are trying to verify a contract in 'goerli', but no API token was found for this network./ ); - expect(() => new Etherscan("", chainConfig)).to.throw( + expect(() => Etherscan.fromChainConfig("", chainConfig)).to.throw( /You are trying to verify a contract in 'goerli', but no API token was found for this network./ ); }); it("should throw if the apiKey is an object but apiKey[network] is undefined or empty", () => { - expect(() => new Etherscan({}, chainConfig)).to.throw( + expect(() => Etherscan.fromChainConfig({}, chainConfig)).to.throw( /You are trying to verify a contract in 'goerli', but no API token was found for this network./ ); - expect(() => new Etherscan({ goerli: "" }, chainConfig)).to.throw( + expect(() => + Etherscan.fromChainConfig({ goerli: "" }, chainConfig) + ).to.throw( /You are trying to verify a contract in 'goerli', but no API token was found for this network./ ); }); }); + describe("getCurrentChainConfig", () => { + const customChains: ChainConfig[] = [ + { + network: "customChain1", + chainId: 5000, + urls: { + apiURL: "", + browserURL: "", + }, + }, + { + network: "customChain2", + chainId: 5000, + urls: { + apiURL: "", + browserURL: "", + }, + }, + { + network: "customChain3", + chainId: 4999, + urls: { + apiURL: "", + browserURL: "", + }, + }, + ]; + + it("should return the last matching custom chain defined by the user", async function () { + const networkName = "customChain2"; + const ethereumProvider = { + async send() { + return (5000).toString(16); + }, + } as unknown as EthereumProvider; + + const currentChainConfig = await Etherscan.getCurrentChainConfig( + networkName, + ethereumProvider, + customChains + ); + + assert.equal(currentChainConfig.network, networkName); + assert.equal(currentChainConfig.chainId, 5000); + }); + + it("should return a built-in chain if no custom chain matches", async function () { + const networkName = "goerli"; + const ethereumProvider = { + async send() { + return (5).toString(16); + }, + } as unknown as EthereumProvider; + const currentChainConfig = await Etherscan.getCurrentChainConfig( + networkName, + ethereumProvider, + customChains + ); + + assert.equal(currentChainConfig.network, networkName); + assert.equal(currentChainConfig.chainId, 5); + }); + + it("should throw if the selected network is hardhat and it's not a added to custom chains", async () => { + const networkName = "hardhat"; + const ethereumProvider = { + async send() { + return (31337).toString(16); + }, + } as unknown as EthereumProvider; + + await expect( + Etherscan.getCurrentChainConfig( + networkName, + ethereumProvider, + customChains + ) + ).to.be.rejectedWith( + /The selected network is "hardhat", which is not supported for contract verification./ + ); + }); + + it("should return hardhat if the selected network is hardhat and it was added as a custom chain", async () => { + const networkName = "hardhat"; + const ethereumProvider = { + async send() { + return (31337).toString(16); + }, + } as unknown as EthereumProvider; + + const currentChainConfig = await Etherscan.getCurrentChainConfig( + networkName, + ethereumProvider, + [ + ...customChains, + { + network: "hardhat", + chainId: 31337, + urls: { + apiURL: "", + browserURL: "", + }, + }, + ] + ); + + assert.equal(currentChainConfig.network, networkName); + assert.equal(currentChainConfig.chainId, 31337); + }); + + it("should throw if there are no matches at all", async () => { + const networkName = "someNetwork"; + const ethereumProvider = { + async send() { + return (21343214123).toString(16); + }, + } as unknown as EthereumProvider; + + await expect( + Etherscan.getCurrentChainConfig( + networkName, + ethereumProvider, + customChains + ) + ).to.be.rejectedWith( + /Trying to verify a contract in a network with chain id 21343214123, but the plugin doesn't recognize it as a supported chain./ + ); + }); + }); + describe("getContractUrl", () => { it("should return the contract url", () => { const expectedContractAddress = "https://goerli.etherscan.io/address/someAddress#code"; - let etherscan = new Etherscan("someApiKey", chainConfig); + let etherscan = Etherscan.fromChainConfig("someApiKey", chainConfig); let contractUrl = etherscan.getContractUrl("someAddress"); assert.equal(contractUrl, expectedContractAddress); - etherscan = new Etherscan("someApiKey", { + etherscan = Etherscan.fromChainConfig("someApiKey", { network: "goerli", chainId: 5, urls: { diff --git a/packages/hardhat-verify/test/unit/index.ts b/packages/hardhat-verify/test/unit/index.ts index 46ec2fe913c..3febcfa71f0 100644 --- a/packages/hardhat-verify/test/unit/index.ts +++ b/packages/hardhat-verify/test/unit/index.ts @@ -1,17 +1,24 @@ +import type { VerificationSubtask } from "../.."; import { assert, expect } from "chai"; +import sinon, { SinonStub } from "sinon"; + import { - TASK_VERIFY_RESOLVE_ARGUMENTS, + TASK_VERIFY_ETHERSCAN, + TASK_VERIFY_GET_VERIFICATION_SUBTASKS, + TASK_VERIFY_ETHERSCAN_RESOLVE_ARGUMENTS, + TASK_VERIFY_SOURCIFY, + TASK_VERIFY_SOURCIFY_DISABLED_WARNING, TASK_VERIFY_VERIFY, -} from "../../src/task-names"; +} from "../../src/internal/task-names"; import { getRandomAddress, useEnvironment } from "../helpers"; describe("verify task", () => { useEnvironment("hardhat-project"); - describe("verify:resolve-arguments", () => { + describe(TASK_VERIFY_ETHERSCAN_RESOLVE_ARGUMENTS, () => { it("should throw if address is not provided", async function () { await expect( - this.hre.run(TASK_VERIFY_RESOLVE_ARGUMENTS, { + this.hre.run(TASK_VERIFY_ETHERSCAN_RESOLVE_ARGUMENTS, { constructorArgsParams: [], constructorArgs: "constructor-args.js", libraries: "libraries.js", @@ -21,7 +28,7 @@ describe("verify task", () => { it("should throw if address is invalid", async function () { await expect( - this.hre.run(TASK_VERIFY_RESOLVE_ARGUMENTS, { + this.hre.run(TASK_VERIFY_ETHERSCAN_RESOLVE_ARGUMENTS, { address: "invalidAddress", constructorArgsParams: [], constructorArgs: "constructor-args.js", @@ -32,7 +39,7 @@ describe("verify task", () => { it("should throw if contract is not a fully qualified name", async function () { await expect( - this.hre.run(TASK_VERIFY_RESOLVE_ARGUMENTS, { + this.hre.run(TASK_VERIFY_ETHERSCAN_RESOLVE_ARGUMENTS, { address: getRandomAddress(this.hre), constructorArgsParams: [], constructorArgs: "constructor-args.js", @@ -42,7 +49,7 @@ describe("verify task", () => { ).to.be.rejectedWith(/A valid fully qualified name was expected./); }); - it("should return the proccesed arguments", async function () { + it("should return the processed arguments", async function () { const address = getRandomAddress(this.hre); const expectedArgs = { address, @@ -60,54 +67,23 @@ describe("verify task", () => { ConstructorLib: "0xCf7Ed3AccA5a467e9e704C703E8D87F634fB0Fc9", }, contractFQN: "contracts/TestContract.sol:TestContract", - listNetworks: true, - noCompile: true, }; - const proccesedArgs = await this.hre.run(TASK_VERIFY_RESOLVE_ARGUMENTS, { - address, - constructorArgsParams: [], - constructorArgs: "constructor-args.js", - libraries: "libraries.js", - contract: "contracts/TestContract.sol:TestContract", - listNetworks: true, - noCompile: true, - }); - - assert.deepEqual(proccesedArgs, expectedArgs); - }); - }); - - describe("verify:verify", () => { - it("should throw if address is not provided", async function () { - await expect( - this.hre.run(TASK_VERIFY_VERIFY, { - constructorArguments: [], - libraries: {}, - }) - ).to.be.rejectedWith(/You didn’t provide any address./); - }); - - it("should throw if address is invalid", async function () { - await expect( - this.hre.run(TASK_VERIFY_VERIFY, { - address: "invalidAddress", - constructorArguments: [], - libraries: {}, - }) - ).to.be.rejectedWith(/invalidAddress is an invalid address./); - }); + const processedArgs = await this.hre.run( + TASK_VERIFY_ETHERSCAN_RESOLVE_ARGUMENTS, + { + address, + constructorArgsParams: [], + constructorArgs: "constructor-args.js", + libraries: "libraries.js", + contract: "contracts/TestContract.sol:TestContract", + } + ); - it("should throw if contract is not a fully qualified name", async function () { - await expect( - this.hre.run(TASK_VERIFY_VERIFY, { - address: getRandomAddress(this.hre), - constructorArguments: [], - libraries: {}, - contract: "not-a-fully-qualified-name", - }) - ).to.be.rejectedWith(/A valid fully qualified name was expected./); + assert.deepEqual(processedArgs, expectedArgs); }); + }); + describe(TASK_VERIFY_VERIFY, () => { it("should throw if constructorArguments is not an array", async function () { await expect( this.hre.run(TASK_VERIFY_VERIFY, { @@ -130,4 +106,129 @@ describe("verify task", () => { ).to.be.rejectedWith(/The libraries parameter should be a dictionary./); }); }); + + describe(TASK_VERIFY_GET_VERIFICATION_SUBTASKS, () => { + // suppress warnings + let warnStub: SinonStub; + beforeEach(() => { + warnStub = sinon.stub(console, "warn"); + }); + afterEach(() => { + warnStub.restore(); + }); + + it("should return the etherscan subtask by default", async function () { + const verificationSubtasks: VerificationSubtask[] = await this.hre.run( + TASK_VERIFY_GET_VERIFICATION_SUBTASKS + ); + + assert.isTrue( + verificationSubtasks.some( + ({ subtaskName }) => subtaskName === TASK_VERIFY_ETHERSCAN + ) + ); + }); + + it("should return the etherscan subtask if it is enabled", async function () { + const originalConfig = this.hre.config.etherscan; + this.hre.config.etherscan = { + enabled: true, + apiKey: "", + customChains: [], + }; + + const verificationSubtasks: VerificationSubtask[] = await this.hre.run( + TASK_VERIFY_GET_VERIFICATION_SUBTASKS + ); + + this.hre.config.etherscan = originalConfig; + + assert.isTrue( + verificationSubtasks.some( + ({ subtaskName }) => subtaskName === TASK_VERIFY_ETHERSCAN + ) + ); + }); + + it("should ignore the etherscan subtask if it is disabled", async function () { + const originalConfig = this.hre.config.etherscan; + this.hre.config.etherscan = { + enabled: false, + apiKey: "", + customChains: [], + }; + + const verificationSubtasks: VerificationSubtask[] = await this.hre.run( + TASK_VERIFY_GET_VERIFICATION_SUBTASKS + ); + + this.hre.config.etherscan = originalConfig; + + assert.isFalse( + verificationSubtasks.some( + ({ subtaskName }) => subtaskName === TASK_VERIFY_ETHERSCAN + ) + ); + }); + + it("should ignore the sourcify subtask by default", async function () { + const verificationSubtasks: VerificationSubtask[] = await this.hre.run( + TASK_VERIFY_GET_VERIFICATION_SUBTASKS + ); + + assert.isFalse( + verificationSubtasks.some( + ({ subtaskName }) => subtaskName === TASK_VERIFY_SOURCIFY + ) + ); + }); + + it("should return the sourcify subtask if it is enabled", async function () { + const originalConfig = this.hre.config.sourcify; + this.hre.config.sourcify = { + enabled: true, + }; + + const verificationSubtasks: VerificationSubtask[] = await this.hre.run( + TASK_VERIFY_GET_VERIFICATION_SUBTASKS + ); + + this.hre.config.sourcify = originalConfig; + + assert.isTrue( + verificationSubtasks.some( + ({ subtaskName }) => subtaskName === TASK_VERIFY_SOURCIFY + ) + ); + assert.isFalse( + verificationSubtasks.some( + ({ subtaskName }) => + subtaskName === TASK_VERIFY_SOURCIFY_DISABLED_WARNING + ) + ); + }); + + it("should provide a warning message if both etherscan and sourcify are disabled", async function () { + const originalEtherscanConfig = this.hre.config.etherscan; + this.hre.config.etherscan = { + enabled: false, + apiKey: "", + customChains: [], + }; + const originalSourcifyConfig = this.hre.config.etherscan; + this.hre.config.sourcify = { + enabled: false, + }; + + await this.hre.run(TASK_VERIFY_GET_VERIFICATION_SUBTASKS); + + this.hre.config.etherscan = originalEtherscanConfig; + this.hre.config.sourcify = originalSourcifyConfig; + + assert.isTrue(warnStub.calledOnce); + expect(warnStub).to.be.calledWith( + sinon.match(/\[WARNING\] No verification services are enabled./) + ); + }); + }); }); diff --git a/packages/hardhat-verify/test/unit/solc/artifacts.ts b/packages/hardhat-verify/test/unit/solc/artifacts.ts index ebef87e0f31..ac9fa2a007b 100644 --- a/packages/hardhat-verify/test/unit/solc/artifacts.ts +++ b/packages/hardhat-verify/test/unit/solc/artifacts.ts @@ -1,11 +1,13 @@ +import type { CompilerOutputBytecode } from "hardhat/types"; + import { assert } from "chai"; -import { CompilerOutputBytecode } from "hardhat/types"; + import { ByteOffset, getCallProtectionOffsets, getImmutableOffsets, getLibraryOffsets, -} from "../../../src/solc/artifacts"; +} from "../../../src/internal/solc/artifacts"; describe("artifacts", () => { describe("getLibraryOffsets", () => { diff --git a/packages/hardhat-verify/test/unit/solc/metadata.ts b/packages/hardhat-verify/test/unit/solc/metadata.ts index b7adeea6035..ed4a0e6b22e 100644 --- a/packages/hardhat-verify/test/unit/solc/metadata.ts +++ b/packages/hardhat-verify/test/unit/solc/metadata.ts @@ -2,7 +2,7 @@ import { assert } from "chai"; import { getMetadataSectionLength, inferCompilerVersion, -} from "../../../src/solc/metadata"; +} from "../../../src/internal/solc/metadata"; describe("Metadata Decoder", () => { describe("inferCompilerVersion", () => { diff --git a/packages/hardhat-verify/test/unit/sourcify.ts b/packages/hardhat-verify/test/unit/sourcify.ts new file mode 100644 index 00000000000..87d288e41fc --- /dev/null +++ b/packages/hardhat-verify/test/unit/sourcify.ts @@ -0,0 +1,25 @@ +import { assert } from "chai"; +import { Sourcify } from "../../src/sourcify"; +import { ContractStatus } from "../../src/internal/sourcify.types"; + +describe("Sourcify", () => { + const chainId = 100; + + describe("getContractUrl", () => { + it("should return the contract url", () => { + const expectedContractAddress = + "https://repo.sourcify.dev/contracts/full_match/100/0xC4c622862a8F548997699bE24EA4bc504e5cA865/"; + const sourcify = new Sourcify( + chainId, + "https://sourcify.dev/server", + "https://repo.sourcify.dev" + ); + const contractUrl = sourcify.getContractUrl( + "0xC4c622862a8F548997699bE24EA4bc504e5cA865", + ContractStatus.PERFECT + ); + + assert.equal(contractUrl, expectedContractAddress); + }); + }); +}); diff --git a/packages/hardhat-verify/test/unit/utilities.ts b/packages/hardhat-verify/test/unit/utilities.ts index 88ac13067f3..55a0e2cfad7 100644 --- a/packages/hardhat-verify/test/unit/utilities.ts +++ b/packages/hardhat-verify/test/unit/utilities.ts @@ -1,15 +1,85 @@ +import type { JsonFragment } from "@ethersproject/abi"; +import type { SolidityConfig } from "hardhat/types"; +import type { ChainConfig } from "../../src/types"; + import path from "path"; import { assert, expect } from "chai"; -import { SolidityConfig } from "hardhat/types"; -import { JsonFragment } from "@ethersproject/abi"; +import sinon from "sinon"; +import chalk from "chalk"; + import { encodeArguments, getCompilerVersions, + printSupportedNetworks, + printVerificationErrors, resolveConstructorArguments, resolveLibraries, -} from "../../src/utilities"; +} from "../../src/internal/utilities"; +import { HardhatVerifyError } from "../../src/internal/errors"; +import { builtinChains } from "../../src/internal/chain-config"; describe("Utilities", () => { + describe("printSupportedNetworks", () => { + it("should print supported and custom networks", async () => { + const customChains: ChainConfig[] = [ + { + network: "MyNetwork", + chainId: 1337, + urls: { + apiURL: "https://api.mynetwork.io/api", + browserURL: "https://mynetwork.io", + }, + }, + ]; + + const logStub = sinon.stub(console, "log"); + + await printSupportedNetworks(customChains); + + sinon.restore(); + + assert.isTrue(logStub.calledOnce); + const actualTableOutput = logStub.getCall(0).args[0]; + const allChains = [...builtinChains, ...customChains]; + allChains.forEach(({ network, chainId }) => { + const regex = new RegExp(`║\\s*${network}\\s*│\\s*${chainId}\\s*║`); + assert.isTrue(regex.test(actualTableOutput)); + }); + }); + }); + + describe("printVerificationErrors", () => { + it("should print verification errors", () => { + const errors: Record = { + Etherscan: new HardhatVerifyError("Etherscan error message"), + Sourcify: new HardhatVerifyError("Sourcify error message"), + }; + + const errorStub = sinon.stub(console, "error"); + + printVerificationErrors(errors); + + sinon.restore(); + + assert.isTrue(errorStub.calledOnce); + const errorMessage = errorStub.getCall(0).args[0]; + assert.equal( + errorMessage, + chalk.red( + `hardhat-verify found one or more errors during the verification process: + +Etherscan: +Etherscan error message + +Sourcify: +Sourcify error message + +` + ) + ); + }); + }); + describe("resolveConstructorArguments", () => { it("should return the constructorArgsParams if constructorArgsModule is not defined", async () => { const constructorArgsParams = ["1", "arg2", "false"]; diff --git a/packages/hardhat-verify/tsconfig.json b/packages/hardhat-verify/tsconfig.json index 1bf285e948b..65ecfc33b99 100644 --- a/packages/hardhat-verify/tsconfig.json +++ b/packages/hardhat-verify/tsconfig.json @@ -1,16 +1,15 @@ { "extends": "../../config/typescript/tsconfig.json", "compilerOptions": { - "outDir": "./dist", + "outDir": "./build-test", + "rootDirs": ["./test"], "composite": true }, - "exclude": ["./dist", "./node_modules", "./test/**/hardhat.config.ts"], + "include": ["./test/**/*.ts"], + "exclude": ["./node_modules", "./test/**/hardhat.config.ts"], "references": [ { - "path": "../hardhat-core/src" - }, - { - "path": "../hardhat-ethers/src" + "path": "./src" } ] } diff --git a/packages/hardhat-viem/.eslintignore b/packages/hardhat-viem/.eslintignore new file mode 100644 index 00000000000..54bbdb1232e --- /dev/null +++ b/packages/hardhat-viem/.eslintignore @@ -0,0 +1,8 @@ +.eslintrc.js + +*.d.ts +index.js + +/build-test +/internal +/test/fixture-projects diff --git a/packages/hardhat-viem/.eslintrc.js b/packages/hardhat-viem/.eslintrc.js new file mode 100644 index 00000000000..13139c79c6e --- /dev/null +++ b/packages/hardhat-viem/.eslintrc.js @@ -0,0 +1,24 @@ +const { + slowImportsCommonIgnoredModules, +} = require("../../config/eslint/constants"); + +module.exports = { + extends: [`${__dirname}/../../config/eslint/eslintrc.js`], + parserOptions: { + project: `${__dirname}/src/tsconfig.json`, + sourceType: "module", + }, + overrides: [ + { + files: ["src/index.ts"], + rules: { + "@nomicfoundation/slow-imports/no-top-level-external-import": [ + "error", + { + ignoreModules: [...slowImportsCommonIgnoredModules], + }, + ], + }, + }, + ], +}; diff --git a/packages/hardhat-viem/.gitignore b/packages/hardhat-viem/.gitignore new file mode 100644 index 00000000000..8e1785ba1e7 --- /dev/null +++ b/packages/hardhat-viem/.gitignore @@ -0,0 +1,98 @@ +# Node modules +/node_modules + +# Compilation output +/build-test/ +/dist + +# Code coverage artifacts +/coverage +/.nyc_output + +/*.js +!/.eslintrc.js +/*.js.map +/*.d.ts +/*.d.ts.map +/builtin-tasks +/common +/internal +/types +/utils + +# Below is Github's node gitignore template, +# ignoring the node_modules part, as it'd ignore every node_modules, and we have some for testing + +# Logs +logs +*.log + +# Diagnostic reports (https://nodejs.org/api/report.html) +report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +#node_modules/ +jspm_packages/ + +# TypeScript v1 declaration files +typings/ + +# Optional eslint cache +.eslintcache + +# Optional REPL history +.node_repl_history + +# Output of 'pnpm pack' +*.tgz + +# parcel-bundler cache (https://parceljs.org/) +.cache + +# next.js build output +.next + +# nuxt.js build output +.nuxt + +# vuepress build output +.vuepress/dist + +# Serverless directories +.serverless/ + +# FuseBox cache +.fusebox/ + +# DynamoDB Local files +.dynamodb/ + +test/fixture-projects/*/artifacts +test/fixture-projects/*/cache diff --git a/packages/hardhat-viem/.mocharc.json b/packages/hardhat-viem/.mocharc.json new file mode 100644 index 00000000000..cc5f5768f7e --- /dev/null +++ b/packages/hardhat-viem/.mocharc.json @@ -0,0 +1,6 @@ +{ + "require": "ts-node/register/files", + "file": "./test/setup.ts", + "ignore": ["test/fixture-projects/**/*", "test/update-snapshots.ts"], + "timeout": 10000 +} diff --git a/packages/hardhat-viem/.prettierignore b/packages/hardhat-viem/.prettierignore new file mode 100644 index 00000000000..4c9a81a3da3 --- /dev/null +++ b/packages/hardhat-viem/.prettierignore @@ -0,0 +1,12 @@ +/node_modules +/internal +/*.d.ts +/*.d.ts.map +/*.js +/*.js.map +/build-test +/test/fixture-projects/**/artifacts +/test/fixture-projects/**/cache +/test/fixture-projects/**/snapshots +CHANGELOG.md +.nyc_output diff --git a/packages/hardhat-viem/CHANGELOG.md b/packages/hardhat-viem/CHANGELOG.md new file mode 100644 index 00000000000..504852f8f66 --- /dev/null +++ b/packages/hardhat-viem/CHANGELOG.md @@ -0,0 +1,13 @@ +# @nomicfoundation/hardhat-viem + +## 1.0.2 + +### Patch Changes + +- b521c2a05: Add configurable public client to getContractAt, deployContract and sendDeploymentTransaction + +## 1.0.1 + +### Patch Changes + +- 4943519d0: Fixed an issue with development networks using custom chain ids diff --git a/packages/hardhat-viem/LICENSE b/packages/hardhat-viem/LICENSE new file mode 100644 index 00000000000..3b7e8c7eabb --- /dev/null +++ b/packages/hardhat-viem/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2023 Nomic Foundation + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/packages/hardhat-viem/README.md b/packages/hardhat-viem/README.md new file mode 100644 index 00000000000..f2bfc30d51f --- /dev/null +++ b/packages/hardhat-viem/README.md @@ -0,0 +1,237 @@ +[![npm](https://img.shields.io/npm/v/@nomicfoundation/hardhat-viem.svg)](https://www.npmjs.com/package/@nomicfoundation/hardhat-viem) [![hardhat](https://hardhat.org/buidler-plugin-badge.svg?1)](https://hardhat.org) + +# hardhat-viem + +[Hardhat](https://hardhat.org) plugin for integration with [Viem](https://github.com/wagmi-dev/viem), a lightweight, composable, and type-safe Ethereum library. + +## What + +This plugin integrates the Viem Ethereum library into your Hardhat development environment. Viem is an alternative to [ethers.js](https://docs.ethers.io/) that offers developers a different way to interact with the Ethereum blockchain. + +By installing and configuring `hardhat-viem`, you gain access to the capabilities of the Viem library directly within your Hardhat projects. This integration enables you to perform various Ethereum-related tasks using Viem's features and functionalities. + +Note: This plugin relies on the Viem library, so familiarity with [Viem's documentation](https://viem.sh/docs/getting-started.html) can enhance your experience when working with `hardhat-viem`. + +## Installation + +```bash +npm install --save-dev @nomicfoundation/hardhat-viem viem +``` + +And add the following statement to your `hardhat.config.js`: + +```js +require("@nomicfoundation/hardhat-viem"); +``` + +Or, if you are using TypeScript, add this to your `hardhat.config.ts`: + +```js +import "@nomicfoundation/hardhat-viem"; +``` + +**Note:** you might want to pin Viem-related dependencies because Viem does not strictly follow semantic versioning for type changes. You can read more [here](https://hardhat.org/hardhat-runner/docs/advanced/using-viem#managing-types-and-version-stability). + +## Required plugins + +No plugins dependencies. + +## Tasks + +This plugin creates no additional tasks. + +## Environment extensions + +This plugins adds a `viem` object to the Hardhat Runtime Environment which provides a minimal set of capabilities for interacting with the blockchain. + +### Clients + +Viem supports three types of clients: + +#### Public client + +A Public Client is an interface to "public" JSON-RPC API methods such as retrieving block numbers, transactions, reading from smart contracts, etc through [Public Actions](https://viem.sh/docs/actions/public/introduction.html). + +```typescript +import hre from "hardhat"; + +const publicClient = await hre.viem.getPublicClient(); + +const blockNumber = await publicClient.getBlockNumber(); + +const balance = await publicClient.getBalance({ + address: "0xA0Cf798816D4b9b9866b5330EEa46a18382f251e", +}); +``` + +#### Wallet client + +A Wallet Client is an interface to interact with Ethereum Accounts and provides the ability to retrieve accounts, execute transactions, sign messages, etc. through [Wallet Actions](https://viem.sh/docs/actions/wallet/introduction.html). + +```typescript +import hre from "hardhat"; + +const [fromWalletClient, toWalletClient] = await hre.viem.getWalletClients(); + +const hash = await fromWalletClient.sendTransaction({ + to: toWalletClient.account.address, + value: parseEther("0.0001"), +}); +``` + +```typescript +import hre from "hardhat"; + +const walletClient = await hre.viem.getWalletClient( + "0xA0Cf798816D4b9b9866b5330EEa46a18382f251e" +); + +const signature = await walletClient.signMessage({ + account, + message: "hello world", +}); +``` + +#### Test client + +A Test Client is an interface to "test" JSON-RPC API methods such as mining blocks, impersonating accounts, setting fees, etc. through [Test Actions](https://viem.sh/docs/actions/test/introduction.html). + +```typescript +import hre from "hardhat"; + +const testClient = await hre.viem.getTestClient(); + +await testClient.mine({ + blocks: 1000000, +}); +``` + +#### Client options + +You can pass options to the `getPublicClient`, `getWalletClient`, and `getTestClient` methods to customize the client's behavior. + +```typescript +import hre from "hardhat"; + +const publicClient = await hre.viem.getPublicClient({ + pollingInterval: 1000, + cacheTime: 2000, +}); +``` + +For a complete list of options, see: + +- [Public client parameters](https://viem.sh/docs/clients/public.html#parameters) +- [Wallet client parameters](https://viem.sh/docs/clients/wallet.html#parameters) +- [Test client parameters](https://viem.sh/docs/clients/test.html#parameters) + +### Contracts + +The `viem` object provides convenient methods for deploying and interacting with smart contracts on the blockchain. + +#### Deploying a Contract + +To deploy a contract to the blockchain, use the `deployContract` method: + +```typescript +import hre from "hardhat"; + +const contract = await hre.viem.deployContract("contractName", [ + "arg1", + 50, + "arg3", +]); +``` + +By default, the first wallet client retrieved by `hre.viem.getWalletClients()` is used to deploy the contract. You can also specify a different wallet client by passing a third parameter, along with other properties, such as `gas` and `value`: + +```typescript +import hre from "hardhat"; + +const [_, secondWalletClient] = await hre.viem.getWalletClients(); + +const contractA = await hre.viem.deployContract( + "contractName", + ["arg1", 50, "arg3"], + { + walletClient: secondWalletClient, + gas: 1000000, + value: parseEther("0.0001"), + confirmations: 5, // 1 by default + } +); +``` + +#### Retrieving an Existing Contract + +If the contract is already deployed, you can retrieve an instance of it using the `getContractAt` method: + +```typescript +import hre from "hardhat"; + +const contract = await hre.viem.getContractAt( + "contractName", + "0x1234567890123456789012345678901234567890" +); +``` + +By default, the first wallet client retrieved by `hre.viem.getWalletClients()` will be used for interacting with the contract. If you want to specify a different wallet client, you can do so by passing it as a third parameter, just like when deploying a contract: + +```typescript +import hre from "hardhat"; + +const [_, secondWalletClient] = await hre.viem.getWalletClients(); + +const contract = await hre.viem.getContractAt( + "contractName", + "0x1234567890123456789012345678901234567890", + { walletClient: secondWalletClient } +); +``` + +#### Interacting with Contracts + +Once you have an instance of a contract, you can interact with it by calling its methods: + +```typescript +let response = await contract.read.method1(); +await contract.write.method2([10, "arg2"]); +``` + +##### Send deployment transaction + +By default, the `deployContract` method sends a deployment transaction to the blockchain and waits for the transaction to be mined. If you want to send the transaction without waiting for it to be mined, you can do so by using `sendDeploymentTransaction`: + +```typescript +import hre from "hardhat"; + +const { contract: contractName, deploymentTransaction } = + await hre.viem.sendDeploymentTransaction( + "contractName", + ["arg1", 50, "arg3"], + { + walletClient: secondWalletClient, + gas: 1000000, + value: parseEther("0.0001"), + } + ); +``` + +Then, if you want to wait for the transaction to be mined, you can do: + +```typescript +import hre from "hardhat"; + +const publicClient = await hre.viem.getPublicClient(); +const { contractAddress } = await publicClient.waitForTransactionReceipt({ + hash: deploymentTransaction.hash, +}); +``` + +## Usage + +There are no additional steps you need to take for this plugin to work. + +Install it and access Viem through the Hardhat Runtime Environment anywhere you need it (tasks, scripts, tests, etc). + +Read the documentation on the [Hardhat Runtime Environment](https://hardhat.org/hardhat-runner/docs/advanced/hardhat-runtime-environment) to learn how to access the HRE in different ways to use Viem from anywhere the HRE is accessible. diff --git a/packages/hardhat-viem/package.json b/packages/hardhat-viem/package.json new file mode 100644 index 00000000000..63267bcd017 --- /dev/null +++ b/packages/hardhat-viem/package.json @@ -0,0 +1,80 @@ +{ + "name": "@nomicfoundation/hardhat-viem", + "version": "1.0.2", + "description": "Hardhat plugin for viem", + "homepage": "https://github.com/nomicfoundation/hardhat/tree/main/packages/hardhat-viem", + "repository": "github:nomicfoundation/hardhat", + "author": "Nomic Foundation", + "license": "MIT", + "main": "index.js", + "types": "index.d.ts", + "keywords": [ + "ethereum", + "smart-contracts", + "hardhat", + "hardhat-plugin", + "viem" + ], + "scripts": { + "lint": "pnpm prettier --check && pnpm eslint", + "lint:fix": "pnpm prettier --write && pnpm eslint --fix", + "eslint": "eslint 'src/**/*.ts' 'test/**/*.ts'", + "prettier": "prettier \"**/*.{js,md,json}\"", + "pretest": "cd ../.. && pnpm build", + "test": "mocha --recursive \"test/**/*.ts\" -c --exit", + "snapshots:update": "ts-node test/update-snapshots.ts", + "coverage": "nyc pnpm test -- --reporter min", + "build": "tsc --build .", + "prepublishOnly": "pnpm build", + "clean": "rimraf internal *.{d.ts,js}{,.map} build-test tsconfig.tsbuildinfo" + }, + "files": [ + "src/", + "internal/", + "*.d.ts", + "*.d.ts.map", + "*.js", + "*.js.map", + "LICENSE", + "README.md" + ], + "devDependencies": { + "@nomicfoundation/eslint-plugin-hardhat-internal-rules": "workspace:^", + "@nomicfoundation/eslint-plugin-slow-imports": "workspace:^", + "@types/chai": "^4.2.0", + "@types/chai-as-promised": "^7.1.3", + "@types/lodash": "^4.14.123", + "@types/lodash.memoize": "^4.1.7", + "@types/mocha": ">=9.1.0", + "@types/node": "^16.0.0", + "@types/sinon": "^9.0.8", + "@typescript-eslint/eslint-plugin": "5.61.0", + "@typescript-eslint/parser": "5.61.0", + "chai": "^4.2.0", + "chai-as-promised": "^7.1.1", + "eslint": "^8.44.0", + "eslint-config-prettier": "8.3.0", + "eslint-plugin-import": "2.27.5", + "eslint-plugin-no-only-tests": "3.0.0", + "eslint-plugin-prettier": "3.4.0", + "hardhat": "workspace:^2.17.0", + "jest-diff": "^29.7.0", + "mocha": "^10.0.0", + "nyc": "^15.1.0", + "prettier": "2.4.1", + "rimraf": "^3.0.2", + "sinon": "^9.0.0", + "ts-node": "^10.8.0", + "typescript": "~5.0.0", + "viem": "^1.15.1" + }, + "peerDependencies": { + "hardhat": "^2.17.0", + "typescript": "~5.0.0", + "viem": "^1.15.1" + }, + "dependencies": { + "abitype": "^0.9.8", + "lodash.memoize": "^4.1.2" + } +} diff --git a/packages/hardhat-viem/src/index.ts b/packages/hardhat-viem/src/index.ts new file mode 100644 index 00000000000..d7b1f9f45f5 --- /dev/null +++ b/packages/hardhat-viem/src/index.ts @@ -0,0 +1,42 @@ +import { extendEnvironment } from "hardhat/config"; + +import { + getPublicClient, + getWalletClients, + getWalletClient, + getTestClient, +} from "./internal/clients"; +import { + deployContract, + sendDeploymentTransaction, + getContractAt, +} from "./internal/contracts"; +import "./internal/type-extensions"; +import "./internal/tasks"; + +extendEnvironment((hre) => { + const { provider } = hre.network; + + hre.viem = { + getPublicClient: (publicClientConfig) => + getPublicClient(provider, publicClientConfig), + + getWalletClients: (walletClientConfig) => + getWalletClients(provider, walletClientConfig), + + getWalletClient: (address, walletClientConfig) => + getWalletClient(provider, address, walletClientConfig), + + getTestClient: (testClientConfig) => + getTestClient(provider, testClientConfig), + + deployContract: (contractName, constructorArgs, config) => + deployContract(hre, contractName, constructorArgs, config), + + sendDeploymentTransaction: (contractName, constructorArgs, config) => + sendDeploymentTransaction(hre, contractName, constructorArgs, config), + + getContractAt: (contractName, address, config) => + getContractAt(hre, contractName, address, config), + }; +}); diff --git a/packages/hardhat-viem/src/internal/accounts.ts b/packages/hardhat-viem/src/internal/accounts.ts new file mode 100644 index 00000000000..479cd4942e2 --- /dev/null +++ b/packages/hardhat-viem/src/internal/accounts.ts @@ -0,0 +1,9 @@ +import type { EthereumProvider } from "hardhat/types"; +import type { Address } from "viem"; + +import memoize from "lodash.memoize"; + +export const getAccounts = memoize( + async (provider: EthereumProvider): Promise => + provider.send("eth_accounts") +); diff --git a/packages/hardhat-viem/src/internal/bytecode.ts b/packages/hardhat-viem/src/internal/bytecode.ts new file mode 100644 index 00000000000..553aacf256f --- /dev/null +++ b/packages/hardhat-viem/src/internal/bytecode.ts @@ -0,0 +1,138 @@ +import type * as viemT from "viem"; +import type { Artifact } from "hardhat/types/artifacts"; + +import { + AmbigousLibraryNameError, + MissingLibraryAddressError, + OverlappingLibraryNamesError, + UnnecessaryLibraryLinkError, +} from "./errors"; + +export interface Libraries
    { + [libraryName: string]: Address; +} + +export interface Link { + sourceName: string; + libraryName: string; + address: string; +} + +export async function linkBytecode( + artifact: Artifact, + libraries: Link[] +): Promise { + const { isHex } = await import("viem"); + let bytecode = artifact.bytecode; + + // TODO: measure performance impact + for (const { sourceName, libraryName, address } of libraries) { + const linkReferences = artifact.linkReferences[sourceName][libraryName]; + for (const { start, length } of linkReferences) { + bytecode = + bytecode.substring(0, 2 + start * 2) + + address.substring(2) + + bytecode.substring(2 + (start + length) * 2); + } + } + + return isHex(bytecode) ? bytecode : `0x${bytecode}`; +} + +async function throwOnAmbigousLibraryNameOrUnnecessaryLink( + contractName: string, + libraries: Libraries, + neededLibraries: Link[] +) { + for (const linkedLibraryName of Object.keys(libraries)) { + const matchingLibraries = neededLibraries.filter( + ({ sourceName, libraryName }) => + libraryName === linkedLibraryName || + `${sourceName}:${libraryName}` === linkedLibraryName + ); + + if (matchingLibraries.length > 1) { + throw new AmbigousLibraryNameError( + contractName, + linkedLibraryName, + matchingLibraries.map( + ({ sourceName, libraryName }) => `${sourceName}:${libraryName}` + ) + ); + } else if (matchingLibraries.length === 0) { + throw new UnnecessaryLibraryLinkError(contractName, linkedLibraryName); + } + } +} + +async function throwOnMissingLibrariesAddress( + contractName: string, + libraries: Libraries, + neededLibraries: Link[] +) { + const missingLibraries = []; + for (const { sourceName, libraryName } of neededLibraries) { + const address = + libraries[`${sourceName}:${libraryName}`] ?? libraries[libraryName]; + + if (address === undefined) { + missingLibraries.push({ sourceName, libraryName }); + } + } + + if (missingLibraries.length > 0) { + throw new MissingLibraryAddressError(contractName, missingLibraries); + } +} + +async function throwOnOverlappingLibraryNames( + contractName: string, + libraries: Libraries, + neededLibraries: Link[] +) { + for (const { sourceName, libraryName } of neededLibraries) { + if ( + libraries[`${sourceName}:${libraryName}`] !== undefined && + libraries[libraryName] !== undefined + ) { + throw new OverlappingLibraryNamesError(sourceName, libraryName); + } + } +} + +export async function resolveBytecodeWithLinkedLibraries( + artifact: Artifact, + libraries: Libraries +): Promise { + const { linkReferences } = artifact; + + const neededLibraries: Link[] = []; + for (const [sourceName, sourceLibraries] of Object.entries(linkReferences)) { + for (const libraryName of Object.keys(sourceLibraries)) { + neededLibraries.push({ + sourceName, + libraryName, + address: + libraries[`${sourceName}:${libraryName}`] ?? libraries[libraryName], + }); + } + } + + await throwOnAmbigousLibraryNameOrUnnecessaryLink( + artifact.contractName, + libraries, + neededLibraries + ); + await throwOnOverlappingLibraryNames( + artifact.contractName, + libraries, + neededLibraries + ); + await throwOnMissingLibrariesAddress( + artifact.contractName, + libraries, + neededLibraries + ); + + return linkBytecode(artifact, neededLibraries); +} diff --git a/packages/hardhat-viem/src/internal/chains.ts b/packages/hardhat-viem/src/internal/chains.ts new file mode 100644 index 00000000000..013f62b9ae6 --- /dev/null +++ b/packages/hardhat-viem/src/internal/chains.ts @@ -0,0 +1,97 @@ +import type { EthereumProvider } from "hardhat/types"; +import type { Chain } from "viem"; +import type { TestClientMode } from "../types"; + +import memoize from "lodash.memoize"; + +import { + UnknownDevelopmentNetworkError, + NetworkNotFoundError, + MultipleMatchingNetworksError, +} from "./errors"; + +export async function getChain(provider: EthereumProvider): Promise { + const chains: Record = require("viem/chains"); + const chainId = await getChainId(provider); + + if (isDevelopmentNetwork(chainId)) { + if (await isHardhatNetwork(provider)) { + return chains.hardhat; + } else if (await isFoundryNetwork(provider)) { + return chains.foundry; + } else { + throw new UnknownDevelopmentNetworkError(); + } + } + + const matchingChains = Object.values(chains).filter( + ({ id }) => id === chainId + ); + + if (matchingChains.length === 0) { + if (await isHardhatNetwork(provider)) { + return { + ...chains.hardhat, + id: chainId, + }; + } else if (await isFoundryNetwork(provider)) { + return { + ...chains.foundry, + id: chainId, + }; + } else { + throw new NetworkNotFoundError(chainId); + } + } + + if (matchingChains.length > 1) { + throw new MultipleMatchingNetworksError(chainId); + } + + return matchingChains[0]; +} + +export function isDevelopmentNetwork(chainId: number) { + return chainId === 31337; +} + +export async function getMode( + provider: EthereumProvider +): Promise { + if (await isHardhatNetwork(provider)) { + return "hardhat"; + } else if (await isFoundryNetwork(provider)) { + return "anvil"; + } else { + throw new UnknownDevelopmentNetworkError(); + } +} + +const getChainId = memoize(async (provider: EthereumProvider) => + Number(await provider.send("eth_chainId")) +); + +const isHardhatNetwork = memoize(async (provider: EthereumProvider) => + detectNetworkByMethodName(provider, NetworkMethod.HARDHAT_METADATA) +); + +const isFoundryNetwork = memoize(async (provider: EthereumProvider) => + detectNetworkByMethodName(provider, NetworkMethod.ANVIL_NODE_INFO) +); + +enum NetworkMethod { + HARDHAT_METADATA = "hardhat_metadata", + ANVIL_NODE_INFO = "anvil_nodeInfo", +} + +async function detectNetworkByMethodName( + provider: EthereumProvider, + methodName: string +) { + try { + await provider.send(methodName); + return true; + } catch { + return false; + } +} diff --git a/packages/hardhat-viem/src/internal/clients.ts b/packages/hardhat-viem/src/internal/clients.ts new file mode 100644 index 00000000000..4f0ca0db348 --- /dev/null +++ b/packages/hardhat-viem/src/internal/clients.ts @@ -0,0 +1,156 @@ +import type { EthereumProvider } from "hardhat/types"; +import type { + Address, + Chain, + PublicClientConfig, + WalletClientConfig, + TestClientConfig, +} from "viem"; +import type { + PublicClient, + TestClient, + TestClientMode, + WalletClient, +} from "../types"; + +/** + * Get a PublicClient instance. This is a read-only client that can be used to + * query the blockchain. + * + * @param provider The Ethereum provider used to connect to the blockchain. + * @param publicClientConfig Optional configuration for the PublicClient instance. See the viem documentation for more information. + * @returns A PublicClient instance. + */ +export async function getPublicClient( + provider: EthereumProvider, + publicClientConfig?: Partial +): Promise { + const { getChain } = await import("./chains"); + const chain = publicClientConfig?.chain ?? (await getChain(provider)); + return innerGetPublicClient(provider, chain, publicClientConfig); +} + +export async function innerGetPublicClient( + provider: EthereumProvider, + chain: Chain, + publicClientConfig?: Partial +): Promise { + const viem = await import("viem"); + const { isDevelopmentNetwork } = await import("./chains"); + const defaultParameters = isDevelopmentNetwork(chain.id) + ? { pollingInterval: 50, cacheTime: 0 } + : {}; + const parameters = { ...defaultParameters, ...publicClientConfig }; + + const publicClient = viem.createPublicClient({ + chain, + transport: viem.custom(provider), + ...parameters, + }); + + return publicClient; +} + +/** + * Get a list of WalletClient instances. These are read-write clients that can + * be used to send transactions to the blockchain. Each client is associated + * with a an account obtained from the provider using `eth_accounts`. + * + * @param provider The Ethereum provider used to connect to the blockchain. + * @param walletClientConfig Optional configuration for the WalletClient instances. See the viem documentation for more information. + * @returns A list of WalletClient instances. + */ +export async function getWalletClients( + provider: EthereumProvider, + walletClientConfig?: Partial +): Promise { + const { getAccounts } = await import("./accounts"); + const { getChain } = await import("./chains"); + const chain = walletClientConfig?.chain ?? (await getChain(provider)); + const accounts = await getAccounts(provider); + return innerGetWalletClients(provider, chain, accounts, walletClientConfig); +} + +export async function innerGetWalletClients( + provider: EthereumProvider, + chain: Chain, + accounts: Address[], + walletClientConfig?: Partial +): Promise { + const viem = await import("viem"); + const { isDevelopmentNetwork } = await import("./chains"); + const defaultParameters = isDevelopmentNetwork(chain.id) + ? { pollingInterval: 50, cacheTime: 0 } + : {}; + const parameters = { ...defaultParameters, ...walletClientConfig }; + + const walletClients = accounts.map((account) => + viem.createWalletClient({ + chain, + account, + transport: viem.custom(provider), + ...parameters, + }) + ); + + return walletClients; +} + +/** + * Get a WalletClient instance for a specific address. This is a read-write + * client that can be used to send transactions to the blockchain. + * + * @param provider The Ethereum provider used to connect to the blockchain. + * @param address The public address of the account to use. + * @param walletClientConfig Optional configuration for the WalletClient instance. See the viem documentation for more information. + * @returns A WalletClient instance. + */ +export async function getWalletClient( + provider: EthereumProvider, + address: Address, + walletClientConfig?: Partial +): Promise { + const { getChain } = await import("./chains"); + const chain = walletClientConfig?.chain ?? (await getChain(provider)); + return ( + await innerGetWalletClients(provider, chain, [address], walletClientConfig) + )[0]; +} + +/** + * Get a TestClient instance. This is a read-write client that can be used to + * perform actions only available on test nodes such as hardhat or anvil. + * + * @param provider The Ethereum provider used to connect to the blockchain. + * @param testClientConfig Optional configuration for the TestClient instance. See the viem documentation for more information. + * @returns A TestClient instance. + */ +export async function getTestClient( + provider: EthereumProvider, + testClientConfig?: Partial +): Promise { + const { getChain, getMode } = await import("./chains"); + const chain = testClientConfig?.chain ?? (await getChain(provider)); + const mode = await getMode(provider); + return innerGetTestClient(provider, chain, mode, testClientConfig); +} + +export async function innerGetTestClient( + provider: EthereumProvider, + chain: Chain, + mode: TestClientMode, + testClientConfig?: Partial +): Promise { + const viem = await import("viem"); + const defaultParameters = { pollingInterval: 50, cacheTime: 0 }; + const parameters = { ...defaultParameters, ...testClientConfig }; + + const testClient = viem.createTestClient({ + mode, + chain, + transport: viem.custom(provider), + ...parameters, + }); + + return testClient; +} diff --git a/packages/hardhat-viem/src/internal/contracts.ts b/packages/hardhat-viem/src/internal/contracts.ts new file mode 100644 index 00000000000..a5c8b1359f6 --- /dev/null +++ b/packages/hardhat-viem/src/internal/contracts.ts @@ -0,0 +1,247 @@ +import type { + EthereumProvider, + HardhatRuntimeEnvironment, +} from "hardhat/types"; +import type { Abi, Address, Hex } from "viem"; +import type { + DeployContractConfig, + GetContractAtConfig, + GetContractReturnType, + GetTransactionReturnType, + PublicClient, + SendDeploymentTransactionConfig, + WalletClient, +} from "../types"; + +import { getPublicClient, getWalletClients } from "./clients"; +import { + DefaultWalletClientNotFoundError, + DeployContractError, + HardhatViemError, + InvalidConfirmationsError, +} from "./errors"; + +export async function deployContract( + { artifacts, network }: HardhatRuntimeEnvironment, + contractName: string, + constructorArgs: any[] = [], + config: DeployContractConfig = {} +): Promise { + const { + walletClient: configWalletClient, + publicClient: configPublicClient, + confirmations, + ...deployContractParameters + } = config; + const [publicClient, walletClient, contractArtifact] = await Promise.all([ + configPublicClient ?? getPublicClient(network.provider), + configWalletClient ?? + getDefaultWalletClient(network.provider, network.name), + artifacts.readArtifact(contractName), + ]); + + return innerDeployContract( + publicClient, + walletClient, + contractArtifact.abi, + contractArtifact.bytecode as Hex, + constructorArgs, + deployContractParameters, + confirmations + ); +} + +export async function innerDeployContract( + publicClient: PublicClient, + walletClient: WalletClient, + contractAbi: Abi, + contractBytecode: Hex, + constructorArgs: any[], + deployContractParameters: DeployContractConfig = {}, + confirmations: number = 1 +): Promise { + let deploymentTxHash: Hex; + // If gasPrice is defined, then maxFeePerGas and maxPriorityFeePerGas + // must be undefined because it's a legaxy tx. + if (deployContractParameters.gasPrice !== undefined) { + deploymentTxHash = await walletClient.deployContract({ + abi: contractAbi, + bytecode: contractBytecode, + args: constructorArgs, + ...deployContractParameters, + maxFeePerGas: undefined, + maxPriorityFeePerGas: undefined, + }); + } else { + deploymentTxHash = await walletClient.deployContract({ + abi: contractAbi, + bytecode: contractBytecode, + args: constructorArgs, + ...deployContractParameters, + gasPrice: undefined, + }); + } + + if (confirmations < 0) { + throw new HardhatViemError("Confirmations must be greater than 0."); + } + if (confirmations === 0) { + throw new InvalidConfirmationsError(); + } + + const { contractAddress } = await publicClient.waitForTransactionReceipt({ + hash: deploymentTxHash, + confirmations, + }); + + if (contractAddress === null) { + const transaction = await publicClient.getTransaction({ + hash: deploymentTxHash, + }); + throw new DeployContractError(deploymentTxHash, transaction.blockNumber); + } + + const contract = await innerGetContractAt( + publicClient, + walletClient, + contractAbi, + contractAddress + ); + + return contract; +} + +export async function sendDeploymentTransaction( + { artifacts, network }: HardhatRuntimeEnvironment, + contractName: string, + constructorArgs: any[] = [], + config: SendDeploymentTransactionConfig = {} +): Promise<{ + contract: GetContractReturnType; + deploymentTransaction: GetTransactionReturnType; +}> { + const { + walletClient: configWalletClient, + publicClient: configPublicClient, + ...deployContractParameters + } = config; + const [publicClient, walletClient, contractArtifact] = await Promise.all([ + configPublicClient ?? getPublicClient(network.provider), + configWalletClient ?? + getDefaultWalletClient(network.provider, network.name), + artifacts.readArtifact(contractName), + ]); + + return innerSendDeploymentTransaction( + publicClient, + walletClient, + contractArtifact.abi, + contractArtifact.bytecode as Hex, + constructorArgs, + deployContractParameters + ); +} + +async function innerSendDeploymentTransaction( + publicClient: PublicClient, + walletClient: WalletClient, + contractAbi: Abi, + contractBytecode: Hex, + constructorArgs: any[], + deployContractParameters: SendDeploymentTransactionConfig = {} +): Promise<{ + contract: GetContractReturnType; + deploymentTransaction: GetTransactionReturnType; +}> { + let deploymentTxHash: Hex; + // If gasPrice is defined, then maxFeePerGas and maxPriorityFeePerGas + // must be undefined because it's a legaxy tx. + if (deployContractParameters.gasPrice !== undefined) { + deploymentTxHash = await walletClient.deployContract({ + abi: contractAbi, + bytecode: contractBytecode, + args: constructorArgs, + ...deployContractParameters, + maxFeePerGas: undefined, + maxPriorityFeePerGas: undefined, + }); + } else { + deploymentTxHash = await walletClient.deployContract({ + abi: contractAbi, + bytecode: contractBytecode, + args: constructorArgs, + ...deployContractParameters, + gasPrice: undefined, + }); + } + + const deploymentTx = await publicClient.getTransaction({ + hash: deploymentTxHash, + }); + + const { getContractAddress } = await import("viem"); + const contractAddress = getContractAddress({ + from: walletClient.account.address, + nonce: BigInt(deploymentTx.nonce), + }); + + const contract = await innerGetContractAt( + publicClient, + walletClient, + contractAbi, + contractAddress + ); + + return { contract, deploymentTransaction: deploymentTx }; +} + +export async function getContractAt( + { artifacts, network }: HardhatRuntimeEnvironment, + contractName: string, + address: Address, + config: GetContractAtConfig = {} +): Promise { + const [publicClient, walletClient, contractArtifact] = await Promise.all([ + config.publicClient ?? getPublicClient(network.provider), + config.walletClient ?? + getDefaultWalletClient(network.provider, network.name), + artifacts.readArtifact(contractName), + ]); + + return innerGetContractAt( + publicClient, + walletClient, + contractArtifact.abi, + address + ); +} + +async function innerGetContractAt( + publicClient: PublicClient, + walletClient: WalletClient, + contractAbi: Abi, + address: Address +): Promise { + const viem = await import("viem"); + const contract = viem.getContract({ + address, + publicClient, + walletClient, + abi: contractAbi, + }); + + return contract; +} + +async function getDefaultWalletClient( + provider: EthereumProvider, + networkName: string +): Promise { + const [defaultWalletClient] = await getWalletClients(provider); + + if (defaultWalletClient === undefined) { + throw new DefaultWalletClientNotFoundError(networkName); + } + + return defaultWalletClient; +} diff --git a/packages/hardhat-viem/src/internal/errors.ts b/packages/hardhat-viem/src/internal/errors.ts new file mode 100644 index 00000000000..324c6a8b53d --- /dev/null +++ b/packages/hardhat-viem/src/internal/errors.ts @@ -0,0 +1,76 @@ +import { NomicLabsHardhatPluginError } from "hardhat/plugins"; + +export class HardhatViemError extends NomicLabsHardhatPluginError { + constructor(message: string, parent?: Error) { + super("@nomicfoundation/hardhat-viem", message, parent); + } +} + +export class UnknownDevelopmentNetworkError extends HardhatViemError { + constructor() { + super(`The chain id corresponds to a development network but we couldn't detect which one. +Please report this issue if you're using Hardhat or Foundry.`); + } +} + +export class NetworkNotFoundError extends HardhatViemError { + constructor(chainId: number) { + super( + `No network with chain id ${chainId} found. You can override the chain by passing it as a parameter to the client getter: + +import { someChain } from "viem/chains"; +const client = await hre.viem.getPublicClient({ + chain: someChain, + ... +}); + +You can find a list of supported networks here: https://viem.sh/docs/clients/chains.html` + ); + } +} + +export class MultipleMatchingNetworksError extends HardhatViemError { + constructor(chainId: number) { + super( + `Multiple networks with chain id ${chainId} found. You can override the chain by passing it as a parameter to the client getter: + +import { someChain } from "viem/chains"; +const client = await hre.viem.getPublicClient({ + chain: someChain, + ... +}); + +You can find a list of supported networks here: https://viem.sh/docs/clients/chains.html` + ); + } +} + +export class DefaultWalletClientNotFoundError extends HardhatViemError { + constructor(networkName: string) { + super( + `Default wallet client not found. This can happen if no accounts were configured for this network (network: '${networkName}'). + +Alternatively, you can set a custom wallet client by passing it as a parameter in the deployContract function: + +const walletClient = await hre.viem.getWalletClient(address); +const contractA = await hre.viem.deployContract("A", [], { walletClient }); +const contractB = await hre.viem.getContractAt("B", address, { walletClient });` + ); + } +} + +export class InvalidConfirmationsError extends HardhatViemError { + constructor() { + super( + "deployContract does not support 0 confirmations. Use sendDeploymentTransaction if you want to handle the deployment transaction yourself." + ); + } +} + +export class DeployContractError extends HardhatViemError { + constructor(txHash: string, blockNumber: bigint) { + super( + `The deployment transaction '${txHash}' was mined in block '${blockNumber}' but its receipt doesn't contain a contract address` + ); + } +} diff --git a/packages/hardhat-viem/src/internal/tasks.ts b/packages/hardhat-viem/src/internal/tasks.ts new file mode 100644 index 00000000000..7e053a051b5 --- /dev/null +++ b/packages/hardhat-viem/src/internal/tasks.ts @@ -0,0 +1,319 @@ +import type { Artifact, Artifacts } from "hardhat/types"; +import type { ArtifactsEmittedPerFile } from "hardhat/types/builtin-tasks"; + +import { join, dirname, relative } from "path"; +import { mkdir, writeFile, rm } from "fs/promises"; + +import { subtask } from "hardhat/config"; +import { + TASK_COMPILE_SOLIDITY_EMIT_ARTIFACTS, + TASK_COMPILE_SOLIDITY, + TASK_COMPILE_REMOVE_OBSOLETE_ARTIFACTS, +} from "hardhat/builtin-tasks/task-names"; +import { + getFullyQualifiedName, + parseFullyQualifiedName, +} from "hardhat/utils/contract-names"; +import { getAllFilesMatching } from "hardhat/internal/util/fs-utils"; +import { replaceBackslashes } from "hardhat/utils/source-names"; + +interface EmittedArtifacts { + artifactsEmittedPerFile: ArtifactsEmittedPerFile; +} + +/** + * Override task that generates an `artifacts.d.ts` file with `never` + * types for duplicate contract names. This file is used in conjunction with + * the `artifacts.d.ts` file inside each contract directory to type + * `hre.artifacts`. + */ +subtask(TASK_COMPILE_SOLIDITY).setAction( + async (_, { config, artifacts }, runSuper) => { + const superRes = await runSuper(); + + const duplicateContractNames = await findDuplicateContractNames(artifacts); + + const duplicateArtifactsDTs = generateDuplicateArtifactsDefinition( + duplicateContractNames + ); + + try { + await writeFile( + join(config.paths.artifacts, "artifacts.d.ts"), + duplicateArtifactsDTs + ); + } catch (error) { + console.error("Error writing artifacts definition:", error); + } + + return superRes; + } +); + +/** + * Override task to emit TypeScript and definition files for each contract. + * Generates a `.d.ts` file per contract, and a `artifacts.d.ts` per solidity + * file, which is used in conjunction to the root `artifacts.d.ts` + * to type `hre.artifacts`. + */ +subtask(TASK_COMPILE_SOLIDITY_EMIT_ARTIFACTS).setAction( + async (_, { artifacts, config }, runSuper): Promise => { + const { artifactsEmittedPerFile }: EmittedArtifacts = await runSuper(); + const duplicateContractNames = await findDuplicateContractNames(artifacts); + + await Promise.all( + artifactsEmittedPerFile.map(async ({ file, artifactsEmitted }) => { + const srcDir = join(config.paths.artifacts, file.sourceName); + await mkdir(srcDir, { + recursive: true, + }); + + const contractTypeData = await Promise.all( + artifactsEmitted.map(async (contractName) => { + const fqn = getFullyQualifiedName(file.sourceName, contractName); + const artifact = await artifacts.readArtifact(fqn); + const isDuplicate = duplicateContractNames.has(contractName); + const declaration = generateContractDeclaration( + artifact, + isDuplicate + ); + + const typeName = `${contractName}$Type`; + + return { contractName, fqn, typeName, declaration }; + }) + ); + + const fp: Array> = []; + for (const { contractName, declaration } of contractTypeData) { + fp.push(writeFile(join(srcDir, `${contractName}.d.ts`), declaration)); + } + + const dTs = generateArtifactsDefinition(contractTypeData); + fp.push(writeFile(join(srcDir, "artifacts.d.ts"), dTs)); + + try { + await Promise.all(fp); + } catch (error) { + console.error("Error writing artifacts definition:", error); + } + }) + ); + + return { artifactsEmittedPerFile }; + } +); + +/** + * Override task for cleaning up outdated artifacts. + * Deletes directories with stale `artifacts.d.ts` files that no longer have + * a matching `.sol` file. + */ +subtask(TASK_COMPILE_REMOVE_OBSOLETE_ARTIFACTS).setAction( + async (_, { config, artifacts }, runSuper) => { + const superRes = await runSuper(); + + const fqns = await artifacts.getAllFullyQualifiedNames(); + const existingSourceNames = new Set( + fqns.map((fqn) => parseFullyQualifiedName(fqn).sourceName) + ); + const allArtifactsDTs = await getAllFilesMatching( + config.paths.artifacts, + (f) => f.endsWith("artifacts.d.ts") + ); + + for (const artifactDTs of allArtifactsDTs) { + const dir = dirname(artifactDTs); + const sourceName = replaceBackslashes( + relative(config.paths.artifacts, dir) + ); + // If sourceName is empty, it means that the artifacts.d.ts file is in the + // root of the artifacts directory, and we shouldn't delete it. + if (sourceName === "") { + continue; + } + + if (!existingSourceNames.has(sourceName)) { + await rm(dir, { force: true, recursive: true }); + } + } + + return superRes; + } +); + +const AUTOGENERATED_FILE_PREFACE = `// This file was autogenerated by hardhat-viem, do not edit it. +// prettier-ignore +// tslint:disable +// eslint-disable`; + +/** + * Generates TypeScript code that extends the `ArtifactsMap` with `never` types + * for duplicate contract names. + */ +function generateDuplicateArtifactsDefinition( + duplicateContractNames: Set +) { + return `${AUTOGENERATED_FILE_PREFACE} + +import "hardhat/types/artifacts"; + +declare module "hardhat/types/artifacts" { + interface ArtifactsMap { + ${Array.from(duplicateContractNames) + .map((name) => `${name}: never;`) + .join("\n ")} + } +} +`; +} + +/** + * Generates TypeScript code to declare a contract and its associated + * TypeScript types. + */ +function generateContractDeclaration(artifact: Artifact, isDuplicate: boolean) { + const { contractName, sourceName } = artifact; + const fqn = getFullyQualifiedName(sourceName, contractName); + const validNames = isDuplicate ? [fqn] : [contractName, fqn]; + const json = JSON.stringify(artifact, undefined, 2); + const contractTypeName = `${contractName}$Type`; + + const constructorAbi = artifact.abi.find( + ({ type }) => type === "constructor" + ); + + const inputs: Array<{ + internalType: string; + name: string; + type: string; + }> = constructorAbi !== undefined ? constructorAbi.inputs : []; + + const constructorArgs = + inputs.length > 0 + ? `constructorArgs: [${inputs + .map(({ name, type }) => getArgType(name, type)) + .join(", ")}]` + : `constructorArgs?: []`; + + return `${AUTOGENERATED_FILE_PREFACE} + +import type { Address } from "viem"; +${ + inputs.length > 0 + ? `import type { AbiParameterToPrimitiveType, GetContractReturnType } from "@nomicfoundation/hardhat-viem/types";` + : `import type { GetContractReturnType } from "@nomicfoundation/hardhat-viem/types";` +} +import "@nomicfoundation/hardhat-viem/types"; + +export interface ${contractTypeName} ${json} + +declare module "@nomicfoundation/hardhat-viem/types" { + ${validNames + .map( + (name) => `export function deployContract( + contractName: "${name}", + ${constructorArgs}, + config?: DeployContractConfig + ): Promise>;` + ) + .join("\n ")} + + ${validNames + .map( + (name) => `export function sendDeploymentTransaction( + contractName: "${name}", + ${constructorArgs}, + config?: SendDeploymentTransactionConfig + ): Promise<{ + contract: GetContractReturnType<${contractTypeName}["abi"]>; + deploymentTransaction: GetTransactionReturnType; + }>;` + ) + .join("\n ")} + + ${validNames + .map( + (name) => `export function getContractAt( + contractName: "${name}", + address: Address, + config?: GetContractAtConfig + ): Promise>;` + ) + .join("\n ")} +} +`; +} + +/** + * Generates TypeScript code to extend the `ArtifactsMap` interface with + * contract types. + */ +function generateArtifactsDefinition( + contractTypeData: Array<{ + contractName: string; + fqn: string; + typeName: string; + declaration: string; + }> +) { + return `${AUTOGENERATED_FILE_PREFACE} + +import "hardhat/types/artifacts"; + +${contractTypeData + .map((ctd) => `import { ${ctd.typeName} } from "./${ctd.contractName}";`) + .join("\n")} + +declare module "hardhat/types/artifacts" { + interface ArtifactsMap { + ${contractTypeData + .map((ctd) => `["${ctd.contractName}"]: ${ctd.typeName};`) + .join("\n ")} + ${contractTypeData + .map((ctd) => `["${ctd.fqn}"]: ${ctd.typeName};`) + .join("\n ")} + } +} +`; +} + +/** + * Returns the type of a function argument in one of the following formats: + * - If the 'name' is provided: + * "name: AbiParameterToPrimitiveType<{ name: string; type: string; }>" + * + * - If the 'name' is empty: + * "AbiParameterToPrimitiveType<{ name: string; type: string; }>" + */ +function getArgType(name: string | undefined, type: string) { + const argType = `AbiParameterToPrimitiveType<${JSON.stringify({ + name, + type, + })}>`; + + return name !== "" && name !== undefined ? `${name}: ${argType}` : argType; +} + +/** + * Returns a set of duplicate contract names. + */ +async function findDuplicateContractNames(artifacts: Artifacts) { + const fqns = await artifacts.getAllFullyQualifiedNames(); + const contractNames = fqns.map( + (fqn) => parseFullyQualifiedName(fqn).contractName + ); + + const duplicates = new Set(); + const existing = new Set(); + + for (const name of contractNames) { + if (existing.has(name)) { + duplicates.add(name); + } + + existing.add(name); + } + + return duplicates; +} diff --git a/packages/hardhat-viem/src/internal/type-extensions.ts b/packages/hardhat-viem/src/internal/type-extensions.ts new file mode 100644 index 00000000000..8310439a2e3 --- /dev/null +++ b/packages/hardhat-viem/src/internal/type-extensions.ts @@ -0,0 +1,54 @@ +import type { + Address, + PublicClientConfig, + WalletClientConfig, + TestClientConfig, +} from "viem"; +import type { + PublicClient, + TestClient, + WalletClient, + deployContract, + sendDeploymentTransaction, + getContractAt, +} from "../types"; +import "hardhat/types/runtime"; +import "hardhat/types/artifacts"; + +declare module "hardhat/types/runtime" { + interface HardhatRuntimeEnvironment { + viem: { + getPublicClient( + publicClientConfig?: Partial + ): Promise; + getWalletClients( + walletClientConfig?: Partial + ): Promise; + getWalletClient( + address: Address, + walletClientConfig?: Partial + ): Promise; + getTestClient( + testClientConfig?: Partial + ): Promise; + deployContract: typeof deployContract; + sendDeploymentTransaction: typeof sendDeploymentTransaction; + getContractAt: typeof getContractAt; + }; + } +} + +declare module "hardhat/types/artifacts" { + // eslint-disable-next-line @typescript-eslint/no-empty-interface + interface ArtifactsMap {} + + interface Artifacts { + readArtifact( + contractNameOrFullyQualifiedName: ArgT + ): Promise; + + readArtifactSync( + contractNameOrFullyQualifiedName: ArgT + ): ArtifactsMap[ArgT]; + } +} diff --git a/packages/hardhat-viem/src/tsconfig.json b/packages/hardhat-viem/src/tsconfig.json new file mode 100644 index 00000000000..aa452dcdf79 --- /dev/null +++ b/packages/hardhat-viem/src/tsconfig.json @@ -0,0 +1,15 @@ +{ + "extends": "../../../config/typescript/tsconfig.json", + "compilerOptions": { + "outDir": "../", + "rootDirs": ["."], + "composite": true + }, + "include": ["./**/*.ts"], + "exclude": [], + "references": [ + { + "path": "../../hardhat-core/src" + } + ] +} diff --git a/packages/hardhat-viem/src/types.ts b/packages/hardhat-viem/src/types.ts new file mode 100644 index 00000000000..39071d2e6c0 --- /dev/null +++ b/packages/hardhat-viem/src/types.ts @@ -0,0 +1,79 @@ +import type * as viemT from "viem"; +import type { ArtifactsMap } from "hardhat/types/artifacts"; + +export type PublicClient = viemT.PublicClient; +export type WalletClient = viemT.WalletClient< + viemT.Transport, + viemT.Chain, + viemT.Account +>; +export type TestClient = viemT.TestClient< + TestClientMode, + viemT.Transport, + viemT.Chain +>; + +export type TestClientMode = Parameters< + typeof viemT.createTestClient +>[0]["mode"]; + +export interface SendTransactionConfig { + walletClient?: WalletClient; + publicClient?: PublicClient; + gas?: bigint; + gasPrice?: bigint; + maxFeePerGas?: bigint; + maxPriorityFeePerGas?: bigint; + value?: bigint; +} + +export interface DeployContractConfig extends SendTransactionConfig { + confirmations?: number; +} + +export type SendDeploymentTransactionConfig = SendTransactionConfig; + +export interface GetContractAtConfig { + walletClient?: WalletClient; + publicClient?: PublicClient; +} + +export type GetContractReturnType< + TAbi extends viemT.Abi | readonly unknown[] = viemT.Abi +> = viemT.GetContractReturnType< + TAbi, + PublicClient, + WalletClient, + viemT.Address +>; + +export type GetTransactionReturnType = viemT.GetTransactionReturnType< + viemT.Chain, + "latest" +>; + +export type ContractName = + StringT extends keyof ArtifactsMap ? never : StringT; + +export declare function deployContract( + contractName: ContractName, + constructorArgs?: any[], + config?: DeployContractConfig +): Promise; + +export declare function sendDeploymentTransaction( + contractName: ContractName, + constructorArgs?: any[], + config?: SendDeploymentTransactionConfig +): Promise<{ + contract: GetContractReturnType; + deploymentTransaction: GetTransactionReturnType; +}>; + +export declare function getContractAt( + contractName: ContractName, + address: viemT.Address, + config?: GetContractAtConfig +): Promise; + +export type { AbiParameterToPrimitiveType } from "abitype"; diff --git a/packages/hardhat-viem/test/.eslintrc.js b/packages/hardhat-viem/test/.eslintrc.js new file mode 100644 index 00000000000..757fe8a3ca9 --- /dev/null +++ b/packages/hardhat-viem/test/.eslintrc.js @@ -0,0 +1,15 @@ +module.exports = { + extends: [`${__dirname}/../.eslintrc.js`], + parserOptions: { + project: `${__dirname}/../tsconfig.json`, + sourceType: "module", + }, + rules: { + "import/no-extraneous-dependencies": [ + "error", + { + devDependencies: true, + }, + ], + }, +}; diff --git a/packages/hardhat-viem/test/chains.ts b/packages/hardhat-viem/test/chains.ts new file mode 100644 index 00000000000..bee7e82679c --- /dev/null +++ b/packages/hardhat-viem/test/chains.ts @@ -0,0 +1,165 @@ +import type { EthereumProvider } from "hardhat/types"; + +import { expect, assert } from "chai"; +import sinon from "sinon"; +import * as chains from "viem/chains"; + +import { + getChain, + getMode, + isDevelopmentNetwork, +} from "../src/internal/chains"; +import { EthereumMockedProvider } from "./mocks/provider"; + +describe("chains", () => { + describe("getChain", () => { + afterEach(sinon.restore); + + it("should return the chain corresponding to the chain id", async () => { + const provider: EthereumProvider = new EthereumMockedProvider(); + const sendStub = sinon.stub(provider, "send"); + sendStub.withArgs("eth_chainId").returns(Promise.resolve("0x1")); // mainnet chain id + sendStub.withArgs("hardhat_metadata").throws(); + sendStub.withArgs("anvil_nodeInfo").throws(); + + const chain = await getChain(provider); + + expect(chain).to.deep.equal(chains.mainnet); + assert.equal(sendStub.callCount, 1); + }); + + it("should return the hardhat chain if the chain id is 31337 and the network is hardhat", async () => { + const provider: EthereumProvider = new EthereumMockedProvider(); + const sendStub = sinon.stub(provider, "send"); + sendStub.withArgs("eth_chainId").returns(Promise.resolve("0x7a69")); // 31337 in hex + sendStub.withArgs("hardhat_metadata").returns(Promise.resolve({})); + sendStub.withArgs("anvil_nodeInfo").throws(); + + const chain = await getChain(provider); + + expect(chain).to.deep.equal(chains.hardhat); + }); + + it("should return the foundry chain if the chain id is 31337 and the network is foundry", async () => { + const provider: EthereumProvider = new EthereumMockedProvider(); + const sendStub = sinon.stub(provider, "send"); + sendStub.withArgs("eth_chainId").returns(Promise.resolve("0x7a69")); // 31337 in hex + sendStub.withArgs("hardhat_metadata").throws(); + sendStub.withArgs("anvil_nodeInfo").returns(Promise.resolve({})); + + const chain = await getChain(provider); + + expect(chain).to.deep.equal(chains.foundry); + }); + + it("should throw if the chain id is 31337 and the network is neither hardhat nor foundry", async () => { + const provider: EthereumProvider = new EthereumMockedProvider(); + const sendStub = sinon.stub(provider, "send"); + sendStub.withArgs("eth_chainId").returns(Promise.resolve("0x7a69")); // 31337 in hex + sendStub.withArgs("hardhat_metadata").throws(); + sendStub.withArgs("anvil_nodeInfo").throws(); + + await expect(getChain(provider)).to.be.rejectedWith( + `The chain id corresponds to a development network but we couldn't detect which one. +Please report this issue if you're using Hardhat or Foundry.` + ); + }); + + it("should throw if the chain id is not 31337 and there is no chain with that id", async () => { + const provider: EthereumProvider = new EthereumMockedProvider(); + const sendStub = sinon.stub(provider, "send"); + sendStub.withArgs("eth_chainId").returns(Promise.resolve("0x0")); // fake chain id 0 + sendStub.withArgs("hardhat_metadata").throws(); + sendStub.withArgs("anvil_nodeInfo").throws(); + + await expect(getChain(provider)).to.be.rejectedWith( + /No network with chain id 0 found/ + ); + }); + + it("should throw if the chain id is not 31337 and there are multiple chains with that id", async () => { + const provider: EthereumProvider = new EthereumMockedProvider(); + const sendStub = sinon.stub(provider, "send"); + // chain id 999 corresponds to Wanchain Testnet but also Zora Goerli Testnet + sendStub.withArgs("eth_chainId").returns(Promise.resolve("0x3e7")); + sendStub.withArgs("hardhat_metadata").throws(); + sendStub.withArgs("anvil_nodeInfo").throws(); + + await expect(getChain(provider)).to.be.rejectedWith( + /Multiple networks with chain id 999 found./ + ); + }); + }); + + describe("isDevelopmentNetwork", () => { + it("should return true if the chain id is 31337", () => { + assert.ok(isDevelopmentNetwork(31337)); + }); + + it("should return false if the chain id is not 31337", () => { + assert.notOk(isDevelopmentNetwork(1)); + }); + }); + + describe("getMode", () => { + it("should return hardhat if the network is hardhat", async () => { + const provider: EthereumProvider = new EthereumMockedProvider(); + const sendStub = sinon.stub(provider, "send"); + sendStub.withArgs("hardhat_metadata").returns(Promise.resolve({})); + sendStub.withArgs("anvil_nodeInfo").throws(); + + const mode = await getMode(provider); + + expect(mode).to.equal("hardhat"); + }); + + it("should return anvil if the network is foundry", async () => { + const provider: EthereumProvider = new EthereumMockedProvider(); + const sendStub = sinon.stub(provider, "send"); + sendStub.withArgs("hardhat_metadata").throws(); + sendStub.withArgs("anvil_nodeInfo").returns(Promise.resolve({})); + + const mode = await getMode(provider); + + expect(mode).to.equal("anvil"); + }); + + it("should throw if the network is neither hardhat nor foundry", async () => { + const provider: EthereumProvider = new EthereumMockedProvider(); + const sendStub = sinon.stub(provider, "send"); + sendStub.withArgs("hardhat_metadata").throws(); + sendStub.withArgs("anvil_nodeInfo").throws(); + + await expect(getMode(provider)).to.be.rejectedWith( + `The chain id corresponds to a development network but we couldn't detect which one. +Please report this issue if you're using Hardhat or Foundry.` + ); + }); + + it("should return a hardhat chain with the custom chainId", async function () { + const provider: EthereumProvider = new EthereumMockedProvider(); + const sendStub = sinon.stub(provider, "send"); + sendStub.withArgs("eth_chainId").returns(Promise.resolve("0x3039")); // 12345 in hex + sendStub.withArgs("hardhat_metadata").returns(Promise.resolve({})); + sendStub.withArgs("anvil_nodeInfo").throws(); + + const chain = await getChain(provider); + + expect(chain.id).to.equal(12345); + expect(chain.name).to.equal("Hardhat"); + }); + + it("should return a foundry chain with the custom chainId", async function () { + const provider: EthereumProvider = new EthereumMockedProvider(); + const sendStub = sinon.stub(provider, "send"); + sendStub.withArgs("eth_chainId").returns(Promise.resolve("0x3039")); // 12345 in hex + sendStub.withArgs("anvil_nodeInfo").returns(Promise.resolve({})); + sendStub.withArgs("hardhat_metadata").throws(); + + const chain = await getChain(provider); + + expect(chain.id).to.equal(12345); + expect(chain.name).to.equal("Foundry"); + }); + }); +}); diff --git a/packages/hardhat-viem/test/clients.ts b/packages/hardhat-viem/test/clients.ts new file mode 100644 index 00000000000..399f8d0b827 --- /dev/null +++ b/packages/hardhat-viem/test/clients.ts @@ -0,0 +1,174 @@ +import type { EthereumProvider } from "hardhat/types"; + +import { assert } from "chai"; +import * as chains from "viem/chains"; + +import { + innerGetPublicClient, + innerGetWalletClients, + innerGetTestClient, +} from "../src/internal/clients"; +import { EthereumMockedProvider } from "./mocks/provider"; + +describe("clients", () => { + describe("innerGetPublicClient", () => { + it("should return a public client", async () => { + const provider: EthereumProvider = new EthereumMockedProvider(); + + const client = await innerGetPublicClient(provider, chains.mainnet); + + assert.isDefined(client); + assert.equal(client.type, "publicClient"); + assert.equal(client.chain.id, chains.mainnet.id); + }); + + it("should return a public client with custom parameters", async () => { + const provider: EthereumProvider = new EthereumMockedProvider(); + + const client = await innerGetPublicClient(provider, chains.mainnet, { + pollingInterval: 1000, + cacheTime: 2000, + }); + + assert.equal(client.pollingInterval, 1000); + assert.equal(client.cacheTime, 2000); + }); + + it("should return a public client with default parameters for development networks", async () => { + const provider: EthereumProvider = new EthereumMockedProvider(); + + const client = await innerGetPublicClient(provider, chains.hardhat); + + assert.equal(client.pollingInterval, 50); + assert.equal(client.cacheTime, 0); + }); + }); + + describe("innerGetWalletClients", () => { + it("should return a list of wallet clients", async () => { + const provider: EthereumProvider = new EthereumMockedProvider(); + + const clients = await innerGetWalletClients(provider, chains.mainnet, [ + "0x1", + "0x2", + ]); + + assert.isArray(clients); + assert.isNotEmpty(clients); + clients.forEach((client) => { + assert.equal(client.type, "walletClient"); + assert.equal(client.chain.id, chains.mainnet.id); + }); + assert.equal(clients[0].account.address, "0x1"); + assert.equal(clients[1].account.address, "0x2"); + }); + + it("should return a list of wallet clients with custom parameters", async () => { + const provider: EthereumProvider = new EthereumMockedProvider(); + + const clients = await innerGetWalletClients( + provider, + chains.mainnet, + ["0x1", "0x2"], + { + pollingInterval: 1000, + cacheTime: 2000, + } + ); + + assert.isArray(clients); + assert.isNotEmpty(clients); + clients.forEach((client) => { + assert.equal(client.pollingInterval, 1000); + assert.equal(client.cacheTime, 2000); + }); + }); + + it("should return a list of wallet clients with default parameters for development networks", async () => { + const provider: EthereumProvider = new EthereumMockedProvider(); + + const clients = await innerGetWalletClients(provider, chains.hardhat, [ + "0x1", + "0x2", + ]); + + assert.isArray(clients); + assert.isNotEmpty(clients); + clients.forEach((client) => { + assert.equal(client.pollingInterval, 50); + assert.equal(client.cacheTime, 0); + }); + }); + + it("should return an empty array if there are no accounts owned by the user", async () => { + const provider: EthereumProvider = new EthereumMockedProvider(); + + const clients = await innerGetWalletClients(provider, chains.mainnet, []); + + assert.isArray(clients); + assert.isEmpty(clients); + }); + }); + + describe("innerGetTestClient", () => { + it("should return a test client with hardhat mode", async () => { + const provider: EthereumProvider = new EthereumMockedProvider(); + + const client = await innerGetTestClient( + provider, + chains.hardhat, + "hardhat" + ); + + assert.isDefined(client); + assert.equal(client.type, "testClient"); + assert.equal(client.chain.id, chains.hardhat.id); + assert.equal(client.mode, "hardhat"); + }); + + it("should return a test client with anvil mode", async () => { + const provider: EthereumProvider = new EthereumMockedProvider(); + + const client = await innerGetTestClient( + provider, + chains.foundry, + "anvil" + ); + + assert.isDefined(client); + assert.equal(client.type, "testClient"); + assert.equal(client.chain.id, chains.foundry.id); + assert.equal(client.mode, "anvil"); + }); + + it("should return a test client with custom parameters", async () => { + const provider: EthereumProvider = new EthereumMockedProvider(); + + const client = await innerGetTestClient( + provider, + chains.hardhat, + "hardhat", + { + pollingInterval: 1000, + cacheTime: 2000, + } + ); + + assert.equal(client.pollingInterval, 1000); + assert.equal(client.cacheTime, 2000); + }); + + it("should return a test client with default parameters for development networks", async () => { + const provider: EthereumProvider = new EthereumMockedProvider(); + + const client = await innerGetTestClient( + provider, + chains.hardhat, + "hardhat" + ); + + assert.equal(client.pollingInterval, 50); + assert.equal(client.cacheTime, 0); + }); + }); +}); diff --git a/packages/hardhat-viem/test/fixture-projects/hardhat-project/contracts/ConstructorLib.sol b/packages/hardhat-viem/test/fixture-projects/hardhat-project/contracts/ConstructorLib.sol new file mode 100644 index 00000000000..0c7e22222f6 --- /dev/null +++ b/packages/hardhat-viem/test/fixture-projects/hardhat-project/contracts/ConstructorLib.sol @@ -0,0 +1,8 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity 0.8.19; + +library ConstructorLib { + function libDo(uint256 n) pure external returns (uint256) { + return n * n; + } +} diff --git a/packages/hardhat-viem/test/fixture-projects/hardhat-project/contracts/WithConstructorArgs.sol b/packages/hardhat-viem/test/fixture-projects/hardhat-project/contracts/WithConstructorArgs.sol new file mode 100644 index 00000000000..3352d4fad5a --- /dev/null +++ b/packages/hardhat-viem/test/fixture-projects/hardhat-project/contracts/WithConstructorArgs.sol @@ -0,0 +1,24 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity 0.8.19; + +contract WithConstructorArgs { + uint256 public data; + address public owner; + + constructor(uint256 _data) { + data = _data; + owner = msg.sender; + } + + function setData(uint256 _newValue) external { + data = _newValue; + } + + function getData() external view returns (uint256) { + return data; + } + + function getOwner() external view returns (address) { + return owner; + } +} diff --git a/packages/hardhat-viem/test/fixture-projects/hardhat-project/contracts/WithLibs.sol b/packages/hardhat-viem/test/fixture-projects/hardhat-project/contracts/WithLibs.sol new file mode 100644 index 00000000000..7c6c052a3d9 --- /dev/null +++ b/packages/hardhat-viem/test/fixture-projects/hardhat-project/contracts/WithLibs.sol @@ -0,0 +1,72 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity 0.8.19; + +import { ConstructorLib as ExternalConstructorLib } from './ConstructorLib.sol'; + +library NormalLib { + function libDo(uint256 n) pure external returns (uint256) { + return n * 2; + } +} + +library ConstructorLib { + function libDo(uint256 n) pure external returns (uint256) { + return n * 4; + } +} + +contract OnlyNormalLib { + + string message = "placeholder1"; + + constructor() {} + + function getNumber(uint256 aNumber) pure public returns (uint256) { + return NormalLib.libDo(aNumber); + } +} + +contract OnlyConstructorLib { + + uint256 public someNumber; + string message = "placeholder2"; + + constructor(uint256 aNumber) { + someNumber = ConstructorLib.libDo(aNumber); + } + + function getNumber() view public returns (uint256) { + return someNumber; + } +} + +contract BothLibs { + + uint256 public someNumber; + string message = "placeholder3"; + + constructor(uint256 aNumber) { + someNumber = ConstructorLib.libDo(aNumber); + } + + function getNumber(uint256 aNumber) pure public returns (uint256) { + return NormalLib.libDo(aNumber); + } + + function getNumber() view public returns (uint256) { + return someNumber; + } +} + +contract BothConstructorLibs { + uint256 public someNumber; + string message = "placeholder4"; + + constructor(uint256 aNumber) { + someNumber = ExternalConstructorLib.libDo(ConstructorLib.libDo(aNumber)); + } + + function getNumber() view public returns (uint256) { + return someNumber; + } +} diff --git a/packages/hardhat-viem/test/fixture-projects/hardhat-project/contracts/WithoutConstructorArgs.sol b/packages/hardhat-viem/test/fixture-projects/hardhat-project/contracts/WithoutConstructorArgs.sol new file mode 100644 index 00000000000..80d165a0396 --- /dev/null +++ b/packages/hardhat-viem/test/fixture-projects/hardhat-project/contracts/WithoutConstructorArgs.sol @@ -0,0 +1,23 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity 0.8.19; + +contract WithoutConstructorArgs { + uint256 public data; + address public owner; + + constructor() payable { + owner = msg.sender; + } + + function setData(uint256 _newValue) external { + data = _newValue; + } + + function getData() external view returns (uint256) { + return data; + } + + function getOwner() external view returns (address) { + return owner; + } +} diff --git a/packages/hardhat-viem/test/fixture-projects/hardhat-project/hardhat.config.js b/packages/hardhat-viem/test/fixture-projects/hardhat-project/hardhat.config.js new file mode 100644 index 00000000000..a59d1ed4d8a --- /dev/null +++ b/packages/hardhat-viem/test/fixture-projects/hardhat-project/hardhat.config.js @@ -0,0 +1,5 @@ +require("../../../src/index"); + +module.exports = { + solidity: "0.8.19", +}; diff --git a/packages/hardhat-viem/test/fixture-projects/type-generation/contracts/A.sol b/packages/hardhat-viem/test/fixture-projects/type-generation/contracts/A.sol new file mode 100644 index 00000000000..ad028f8b3a7 --- /dev/null +++ b/packages/hardhat-viem/test/fixture-projects/type-generation/contracts/A.sol @@ -0,0 +1,26 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity 0.8.19; + +contract A { + address owner; + string name; + + constructor(address _owner, uint256, string memory _name) { + owner = _owner; + name = _name; + } + + function getA() public pure returns (uint256) { + return 1; + } + + function getOwner() public view returns (address) { + return owner; + } +} + +contract B { + function getB() public pure returns (uint256) { + return 2; + } +} diff --git a/packages/hardhat-viem/test/fixture-projects/type-generation/contracts/C.sol b/packages/hardhat-viem/test/fixture-projects/type-generation/contracts/C.sol new file mode 100644 index 00000000000..9bac18334d6 --- /dev/null +++ b/packages/hardhat-viem/test/fixture-projects/type-generation/contracts/C.sol @@ -0,0 +1,22 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity 0.8.19; + +contract C { + function getC() public pure returns (uint256) { + return 3; + } +} + +contract B { + uint256 b; + string s; + + constructor(uint256 _b, string memory _s) { + b = _b; + s = _s; + } + + function getB() public view returns (uint256) { + return b; + } +} diff --git a/packages/hardhat-viem/test/fixture-projects/type-generation/hardhat.config.js b/packages/hardhat-viem/test/fixture-projects/type-generation/hardhat.config.js new file mode 100644 index 00000000000..a59d1ed4d8a --- /dev/null +++ b/packages/hardhat-viem/test/fixture-projects/type-generation/hardhat.config.js @@ -0,0 +1,5 @@ +require("../../../src/index"); + +module.exports = { + solidity: "0.8.19", +}; diff --git a/packages/hardhat-viem/test/fixture-projects/type-generation/snapshots/artifacts.d.ts b/packages/hardhat-viem/test/fixture-projects/type-generation/snapshots/artifacts.d.ts new file mode 100644 index 00000000000..eeda0881244 --- /dev/null +++ b/packages/hardhat-viem/test/fixture-projects/type-generation/snapshots/artifacts.d.ts @@ -0,0 +1,12 @@ +// This file was autogenerated by hardhat-viem, do not edit it. +// prettier-ignore +// tslint:disable +// eslint-disable + +import "hardhat/types/artifacts"; + +declare module "hardhat/types/artifacts" { + interface ArtifactsMap { + B: never; + } +} diff --git a/packages/hardhat-viem/test/fixture-projects/type-generation/snapshots/contracts/A.sol/A.d.ts b/packages/hardhat-viem/test/fixture-projects/type-generation/snapshots/contracts/A.sol/A.d.ts new file mode 100644 index 00000000000..912e6385cd0 --- /dev/null +++ b/packages/hardhat-viem/test/fixture-projects/type-generation/snapshots/contracts/A.sol/A.d.ts @@ -0,0 +1,108 @@ +// This file was autogenerated by hardhat-viem, do not edit it. +// prettier-ignore +// tslint:disable +// eslint-disable + +import type { Address } from "viem"; +import type { AbiParameterToPrimitiveType, GetContractReturnType } from "@nomicfoundation/hardhat-viem/types"; +import "@nomicfoundation/hardhat-viem/types"; + +export interface A$Type { + "_format": "hh-sol-artifact-1", + "contractName": "A", + "sourceName": "contracts/A.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "string", + "name": "_name", + "type": "string" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [], + "name": "getA", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [], + "name": "getOwner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "bytecode": "0x608060405234801561001057600080fd5b5060405161076938038061076983398181016040528101906100329190610293565b826000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600190816100819190610519565b505050506105eb565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006100c98261009e565b9050919050565b6100d9816100be565b81146100e457600080fd5b50565b6000815190506100f6816100d0565b92915050565b6000819050919050565b61010f816100fc565b811461011a57600080fd5b50565b60008151905061012c81610106565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6101858261013c565b810181811067ffffffffffffffff821117156101a4576101a361014d565b5b80604052505050565b60006101b761008a565b90506101c3828261017c565b919050565b600067ffffffffffffffff8211156101e3576101e261014d565b5b6101ec8261013c565b9050602081019050919050565b60005b838110156102175780820151818401526020810190506101fc565b60008484015250505050565b6000610236610231846101c8565b6101ad565b90508281526020810184848401111561025257610251610137565b5b61025d8482856101f9565b509392505050565b600082601f83011261027a57610279610132565b5b815161028a848260208601610223565b91505092915050565b6000806000606084860312156102ac576102ab610094565b5b60006102ba868287016100e7565b93505060206102cb8682870161011d565b925050604084015167ffffffffffffffff8111156102ec576102eb610099565b5b6102f886828701610265565b9150509250925092565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061035457607f821691505b6020821081036103675761036661030d565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026103cf7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82610392565b6103d98683610392565b95508019841693508086168417925050509392505050565b6000819050919050565b600061041661041161040c846100fc565b6103f1565b6100fc565b9050919050565b6000819050919050565b610430836103fb565b61044461043c8261041d565b84845461039f565b825550505050565b600090565b61045961044c565b610464818484610427565b505050565b5b818110156104885761047d600082610451565b60018101905061046a565b5050565b601f8211156104cd5761049e8161036d565b6104a784610382565b810160208510156104b6578190505b6104ca6104c285610382565b830182610469565b50505b505050565b600082821c905092915050565b60006104f0600019846008026104d2565b1980831691505092915050565b600061050983836104df565b9150826002028217905092915050565b61052282610302565b67ffffffffffffffff81111561053b5761053a61014d565b5b610545825461033c565b61055082828561048c565b600060209050601f8311600181146105835760008415610571578287015190505b61057b85826104fd565b8655506105e3565b601f1984166105918661036d565b60005b828110156105b957848901518255600182019150602085019450602081019050610594565b868310156105d657848901516105d2601f8916826104df565b8355505b6001600288020188555050505b505050505050565b61016f806105fa6000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c8063893d20e81461003b578063d46300fd14610059575b600080fd5b610043610077565b60405161005091906100ea565b60405180910390f35b6100616100a0565b60405161006e919061011e565b60405180910390f35b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60006001905090565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006100d4826100a9565b9050919050565b6100e4816100c9565b82525050565b60006020820190506100ff60008301846100db565b92915050565b6000819050919050565b61011881610105565b82525050565b6000602082019050610133600083018461010f565b9291505056fea264697066735822122096d0f807114d408e2aa4f29fa4fa9774523526abe709bbf7de02dbe02a245ae264736f6c63430008130033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100365760003560e01c8063893d20e81461003b578063d46300fd14610059575b600080fd5b610043610077565b60405161005091906100ea565b60405180910390f35b6100616100a0565b60405161006e919061011e565b60405180910390f35b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60006001905090565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006100d4826100a9565b9050919050565b6100e4816100c9565b82525050565b60006020820190506100ff60008301846100db565b92915050565b6000819050919050565b61011881610105565b82525050565b6000602082019050610133600083018461010f565b9291505056fea264697066735822122096d0f807114d408e2aa4f29fa4fa9774523526abe709bbf7de02dbe02a245ae264736f6c63430008130033", + "linkReferences": {}, + "deployedLinkReferences": {} +} + +declare module "@nomicfoundation/hardhat-viem/types" { + export function deployContract( + contractName: "A", + constructorArgs: [_owner: AbiParameterToPrimitiveType<{"name":"_owner","type":"address"}>, AbiParameterToPrimitiveType<{"name":"","type":"uint256"}>, _name: AbiParameterToPrimitiveType<{"name":"_name","type":"string"}>], + config?: DeployContractConfig + ): Promise>; + export function deployContract( + contractName: "contracts/A.sol:A", + constructorArgs: [_owner: AbiParameterToPrimitiveType<{"name":"_owner","type":"address"}>, AbiParameterToPrimitiveType<{"name":"","type":"uint256"}>, _name: AbiParameterToPrimitiveType<{"name":"_name","type":"string"}>], + config?: DeployContractConfig + ): Promise>; + + export function sendDeploymentTransaction( + contractName: "A", + constructorArgs: [_owner: AbiParameterToPrimitiveType<{"name":"_owner","type":"address"}>, AbiParameterToPrimitiveType<{"name":"","type":"uint256"}>, _name: AbiParameterToPrimitiveType<{"name":"_name","type":"string"}>], + config?: SendDeploymentTransactionConfig + ): Promise<{ + contract: GetContractReturnType; + deploymentTransaction: GetTransactionReturnType; + }>; + export function sendDeploymentTransaction( + contractName: "contracts/A.sol:A", + constructorArgs: [_owner: AbiParameterToPrimitiveType<{"name":"_owner","type":"address"}>, AbiParameterToPrimitiveType<{"name":"","type":"uint256"}>, _name: AbiParameterToPrimitiveType<{"name":"_name","type":"string"}>], + config?: SendDeploymentTransactionConfig + ): Promise<{ + contract: GetContractReturnType; + deploymentTransaction: GetTransactionReturnType; + }>; + + export function getContractAt( + contractName: "A", + address: Address, + config?: GetContractAtConfig + ): Promise>; + export function getContractAt( + contractName: "contracts/A.sol:A", + address: Address, + config?: GetContractAtConfig + ): Promise>; +} diff --git a/packages/hardhat-viem/test/fixture-projects/type-generation/snapshots/contracts/A.sol/B.d.ts b/packages/hardhat-viem/test/fixture-projects/type-generation/snapshots/contracts/A.sol/B.d.ts new file mode 100644 index 00000000000..917fea72bd2 --- /dev/null +++ b/packages/hardhat-viem/test/fixture-projects/type-generation/snapshots/contracts/A.sol/B.d.ts @@ -0,0 +1,56 @@ +// This file was autogenerated by hardhat-viem, do not edit it. +// prettier-ignore +// tslint:disable +// eslint-disable + +import type { Address } from "viem"; +import type { GetContractReturnType } from "@nomicfoundation/hardhat-viem/types"; +import "@nomicfoundation/hardhat-viem/types"; + +export interface B$Type { + "_format": "hh-sol-artifact-1", + "contractName": "B", + "sourceName": "contracts/A.sol", + "abi": [ + { + "inputs": [], + "name": "getB", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "pure", + "type": "function" + } + ], + "bytecode": "0x608060405234801561001057600080fd5b5060b68061001f6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063a1c5191514602d575b600080fd5b60336047565b604051603e91906067565b60405180910390f35b60006002905090565b6000819050919050565b6061816050565b82525050565b6000602082019050607a6000830184605a565b9291505056fea2646970667358221220fe48236ca287d1fb02c67c759d4bbebdc9702638fef90f605955fa2db9c0049864736f6c63430008130033", + "deployedBytecode": "0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063a1c5191514602d575b600080fd5b60336047565b604051603e91906067565b60405180910390f35b60006002905090565b6000819050919050565b6061816050565b82525050565b6000602082019050607a6000830184605a565b9291505056fea2646970667358221220fe48236ca287d1fb02c67c759d4bbebdc9702638fef90f605955fa2db9c0049864736f6c63430008130033", + "linkReferences": {}, + "deployedLinkReferences": {} +} + +declare module "@nomicfoundation/hardhat-viem/types" { + export function deployContract( + contractName: "contracts/A.sol:B", + constructorArgs?: [], + config?: DeployContractConfig + ): Promise>; + + export function sendDeploymentTransaction( + contractName: "contracts/A.sol:B", + constructorArgs?: [], + config?: SendDeploymentTransactionConfig + ): Promise<{ + contract: GetContractReturnType; + deploymentTransaction: GetTransactionReturnType; + }>; + + export function getContractAt( + contractName: "contracts/A.sol:B", + address: Address, + config?: GetContractAtConfig + ): Promise>; +} diff --git a/packages/hardhat-viem/test/fixture-projects/type-generation/snapshots/contracts/A.sol/artifacts.d.ts b/packages/hardhat-viem/test/fixture-projects/type-generation/snapshots/contracts/A.sol/artifacts.d.ts new file mode 100644 index 00000000000..18aea5c6b73 --- /dev/null +++ b/packages/hardhat-viem/test/fixture-projects/type-generation/snapshots/contracts/A.sol/artifacts.d.ts @@ -0,0 +1,18 @@ +// This file was autogenerated by hardhat-viem, do not edit it. +// prettier-ignore +// tslint:disable +// eslint-disable + +import "hardhat/types/artifacts"; + +import { A$Type } from "./A"; +import { B$Type } from "./B"; + +declare module "hardhat/types/artifacts" { + interface ArtifactsMap { + ["A"]: A$Type; + ["B"]: B$Type; + ["contracts/A.sol:A"]: A$Type; + ["contracts/A.sol:B"]: B$Type; + } +} diff --git a/packages/hardhat-viem/test/fixture-projects/type-generation/snapshots/contracts/C.sol/B.d.ts b/packages/hardhat-viem/test/fixture-projects/type-generation/snapshots/contracts/C.sol/B.d.ts new file mode 100644 index 00000000000..2f0deb8393f --- /dev/null +++ b/packages/hardhat-viem/test/fixture-projects/type-generation/snapshots/contracts/C.sol/B.d.ts @@ -0,0 +1,72 @@ +// This file was autogenerated by hardhat-viem, do not edit it. +// prettier-ignore +// tslint:disable +// eslint-disable + +import type { Address } from "viem"; +import type { AbiParameterToPrimitiveType, GetContractReturnType } from "@nomicfoundation/hardhat-viem/types"; +import "@nomicfoundation/hardhat-viem/types"; + +export interface B$Type { + "_format": "hh-sol-artifact-1", + "contractName": "B", + "sourceName": "contracts/C.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "uint256", + "name": "_b", + "type": "uint256" + }, + { + "internalType": "string", + "name": "_s", + "type": "string" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [], + "name": "getB", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "bytecode": "0x608060405234801561001057600080fd5b50604051610604380380610604833981810160405281019061003291906101fb565b816000819055508060019081610048919061046e565b505050610540565b6000604051905090565b600080fd5b600080fd5b6000819050919050565b61007781610064565b811461008257600080fd5b50565b6000815190506100948161006e565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6100ed826100a4565b810181811067ffffffffffffffff8211171561010c5761010b6100b5565b5b80604052505050565b600061011f610050565b905061012b82826100e4565b919050565b600067ffffffffffffffff82111561014b5761014a6100b5565b5b610154826100a4565b9050602081019050919050565b60005b8381101561017f578082015181840152602081019050610164565b60008484015250505050565b600061019e61019984610130565b610115565b9050828152602081018484840111156101ba576101b961009f565b5b6101c5848285610161565b509392505050565b600082601f8301126101e2576101e161009a565b5b81516101f284826020860161018b565b91505092915050565b600080604083850312156102125761021161005a565b5b600061022085828601610085565b925050602083015167ffffffffffffffff8111156102415761024061005f565b5b61024d858286016101cd565b9150509250929050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806102a957607f821691505b6020821081036102bc576102bb610262565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026103247fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826102e7565b61032e86836102e7565b95508019841693508086168417925050509392505050565b6000819050919050565b600061036b61036661036184610064565b610346565b610064565b9050919050565b6000819050919050565b61038583610350565b61039961039182610372565b8484546102f4565b825550505050565b600090565b6103ae6103a1565b6103b981848461037c565b505050565b5b818110156103dd576103d26000826103a6565b6001810190506103bf565b5050565b601f821115610422576103f3816102c2565b6103fc846102d7565b8101602085101561040b578190505b61041f610417856102d7565b8301826103be565b50505b505050565b600082821c905092915050565b600061044560001984600802610427565b1980831691505092915050565b600061045e8383610434565b9150826002028217905092915050565b61047782610257565b67ffffffffffffffff8111156104905761048f6100b5565b5b61049a8254610291565b6104a58282856103e1565b600060209050601f8311600181146104d857600084156104c6578287015190505b6104d08582610452565b865550610538565b601f1984166104e6866102c2565b60005b8281101561050e578489015182556001820191506020850194506020810190506104e9565b8683101561052b5784890151610527601f891682610434565b8355505b6001600288020188555050505b505050505050565b60b68061054e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063a1c5191514602d575b600080fd5b60336047565b604051603e91906067565b60405180910390f35b60008054905090565b6000819050919050565b6061816050565b82525050565b6000602082019050607a6000830184605a565b9291505056fea2646970667358221220d9268b96329d3a8617cfa3925eac59afcfbe7935e6fa7baab75e296746f136f264736f6c63430008130033", + "deployedBytecode": "0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063a1c5191514602d575b600080fd5b60336047565b604051603e91906067565b60405180910390f35b60008054905090565b6000819050919050565b6061816050565b82525050565b6000602082019050607a6000830184605a565b9291505056fea2646970667358221220d9268b96329d3a8617cfa3925eac59afcfbe7935e6fa7baab75e296746f136f264736f6c63430008130033", + "linkReferences": {}, + "deployedLinkReferences": {} +} + +declare module "@nomicfoundation/hardhat-viem/types" { + export function deployContract( + contractName: "contracts/C.sol:B", + constructorArgs: [_b: AbiParameterToPrimitiveType<{"name":"_b","type":"uint256"}>, _s: AbiParameterToPrimitiveType<{"name":"_s","type":"string"}>], + config?: DeployContractConfig + ): Promise>; + + export function sendDeploymentTransaction( + contractName: "contracts/C.sol:B", + constructorArgs: [_b: AbiParameterToPrimitiveType<{"name":"_b","type":"uint256"}>, _s: AbiParameterToPrimitiveType<{"name":"_s","type":"string"}>], + config?: SendDeploymentTransactionConfig + ): Promise<{ + contract: GetContractReturnType; + deploymentTransaction: GetTransactionReturnType; + }>; + + export function getContractAt( + contractName: "contracts/C.sol:B", + address: Address, + config?: GetContractAtConfig + ): Promise>; +} diff --git a/packages/hardhat-viem/test/fixture-projects/type-generation/snapshots/contracts/C.sol/C.d.ts b/packages/hardhat-viem/test/fixture-projects/type-generation/snapshots/contracts/C.sol/C.d.ts new file mode 100644 index 00000000000..cc7edacffa2 --- /dev/null +++ b/packages/hardhat-viem/test/fixture-projects/type-generation/snapshots/contracts/C.sol/C.d.ts @@ -0,0 +1,74 @@ +// This file was autogenerated by hardhat-viem, do not edit it. +// prettier-ignore +// tslint:disable +// eslint-disable + +import type { Address } from "viem"; +import type { GetContractReturnType } from "@nomicfoundation/hardhat-viem/types"; +import "@nomicfoundation/hardhat-viem/types"; + +export interface C$Type { + "_format": "hh-sol-artifact-1", + "contractName": "C", + "sourceName": "contracts/C.sol", + "abi": [ + { + "inputs": [], + "name": "getC", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "pure", + "type": "function" + } + ], + "bytecode": "0x608060405234801561001057600080fd5b5060b68061001f6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063a2375d1e14602d575b600080fd5b60336047565b604051603e91906067565b60405180910390f35b60006003905090565b6000819050919050565b6061816050565b82525050565b6000602082019050607a6000830184605a565b9291505056fea264697066735822122047c1ea5199833309c2261ac9cf25569e6acf133d1cf8dc638f656e33f555635d64736f6c63430008130033", + "deployedBytecode": "0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063a2375d1e14602d575b600080fd5b60336047565b604051603e91906067565b60405180910390f35b60006003905090565b6000819050919050565b6061816050565b82525050565b6000602082019050607a6000830184605a565b9291505056fea264697066735822122047c1ea5199833309c2261ac9cf25569e6acf133d1cf8dc638f656e33f555635d64736f6c63430008130033", + "linkReferences": {}, + "deployedLinkReferences": {} +} + +declare module "@nomicfoundation/hardhat-viem/types" { + export function deployContract( + contractName: "C", + constructorArgs?: [], + config?: DeployContractConfig + ): Promise>; + export function deployContract( + contractName: "contracts/C.sol:C", + constructorArgs?: [], + config?: DeployContractConfig + ): Promise>; + + export function sendDeploymentTransaction( + contractName: "C", + constructorArgs?: [], + config?: SendDeploymentTransactionConfig + ): Promise<{ + contract: GetContractReturnType; + deploymentTransaction: GetTransactionReturnType; + }>; + export function sendDeploymentTransaction( + contractName: "contracts/C.sol:C", + constructorArgs?: [], + config?: SendDeploymentTransactionConfig + ): Promise<{ + contract: GetContractReturnType; + deploymentTransaction: GetTransactionReturnType; + }>; + + export function getContractAt( + contractName: "C", + address: Address, + config?: GetContractAtConfig + ): Promise>; + export function getContractAt( + contractName: "contracts/C.sol:C", + address: Address, + config?: GetContractAtConfig + ): Promise>; +} diff --git a/packages/hardhat-viem/test/fixture-projects/type-generation/snapshots/contracts/C.sol/artifacts.d.ts b/packages/hardhat-viem/test/fixture-projects/type-generation/snapshots/contracts/C.sol/artifacts.d.ts new file mode 100644 index 00000000000..4994bfede7a --- /dev/null +++ b/packages/hardhat-viem/test/fixture-projects/type-generation/snapshots/contracts/C.sol/artifacts.d.ts @@ -0,0 +1,18 @@ +// This file was autogenerated by hardhat-viem, do not edit it. +// prettier-ignore +// tslint:disable +// eslint-disable + +import "hardhat/types/artifacts"; + +import { B$Type } from "./B"; +import { C$Type } from "./C"; + +declare module "hardhat/types/artifacts" { + interface ArtifactsMap { + ["B"]: B$Type; + ["C"]: C$Type; + ["contracts/C.sol:B"]: B$Type; + ["contracts/C.sol:C"]: C$Type; + } +} diff --git a/packages/hardhat-viem/test/helpers.ts b/packages/hardhat-viem/test/helpers.ts new file mode 100644 index 00000000000..d2a72c8391a --- /dev/null +++ b/packages/hardhat-viem/test/helpers.ts @@ -0,0 +1,63 @@ +import type { HardhatRuntimeEnvironment } from "hardhat/types"; + +import path from "path"; +import fs from "fs/promises"; +import { assert } from "chai"; +import { diffLinesUnified } from "jest-diff"; +import { resetHardhatContext } from "hardhat/plugins-testing"; + +// Import this plugin type extensions for the HardhatRuntimeEnvironment +import "../src/internal/type-extensions"; + +declare module "mocha" { + interface Context { + hre: HardhatRuntimeEnvironment; + } +} + +export const useEnvironment = (fixtureProjectName: string): void => { + before("Loading hardhat environment", function () { + process.chdir(path.join(__dirname, "fixture-projects", fixtureProjectName)); + process.env.HARDHAT_NETWORK = "hardhat"; + + this.hre = require("hardhat"); + }); + + after("Resetting hardhat context", async function () { + process.chdir(path.resolve(`${__dirname}/..`)); + resetHardhatContext(); + delete process.env.HARDHAT_NETWORK; + }); +}; + +export const assertSnapshotMatch = async ( + snapshotPath: string, + generatedFilePath: string +) => { + const expectedSnapshotContent = await fs.readFile(snapshotPath, "utf-8"); + const generatedFileContent = await fs.readFile(generatedFilePath, "utf-8"); + + if (expectedSnapshotContent !== generatedFileContent) { + assert.fail(` +Generated file differs from the expected snapshot: + +${generatedFilePath} should match ${snapshotPath} + +To update the snapshot, run: +pnpm snapshots:update + +${diffLinesUnified( + expectedSnapshotContent.split("\n"), + generatedFileContent.split("\n"), + { + contextLines: 3, + expand: false, + includeChangeCounts: true, + } +)}`); + } +}; + +export function sleep(ms: number) { + return new Promise((resolve) => setTimeout(resolve, ms)); +} diff --git a/packages/hardhat-viem/test/integration.ts b/packages/hardhat-viem/test/integration.ts new file mode 100644 index 00000000000..f8ff1454c5b --- /dev/null +++ b/packages/hardhat-viem/test/integration.ts @@ -0,0 +1,426 @@ +import type { Hex, TransactionReceipt } from "viem"; +import type { EthereumProvider } from "hardhat/types"; + +import path from "path"; +import { assert, expect } from "chai"; +import sinon from "sinon"; +import { getAddress, parseEther } from "viem"; + +import { TASK_CLEAN, TASK_COMPILE } from "hardhat/builtin-tasks/task-names"; +import { deployContract, innerDeployContract } from "../src/internal/contracts"; +import { EthereumMockedProvider } from "./mocks/provider"; +import { assertSnapshotMatch, sleep, useEnvironment } from "./helpers"; + +describe("Integration tests", function () { + afterEach(function () { + sinon.restore(); + }); + + describe("Hardhat Runtime Environment extension", function () { + useEnvironment("hardhat-project"); + + it("should add the viem object and it's properties", function () { + expect(this.hre.viem) + .to.be.an("object") + .that.has.all.keys([ + "getPublicClient", + "getWalletClients", + "getWalletClient", + "getTestClient", + "deployContract", + "sendDeploymentTransaction", + "getContractAt", + ]); + }); + }); + + describe("Viem plugin", function () { + useEnvironment("hardhat-project"); + + before(async function () { + await this.hre.run(TASK_COMPILE, { quiet: true }); + }); + + after(async function () { + await this.hre.run(TASK_CLEAN); + }); + + beforeEach(async function () { + await this.hre.network.provider.send("hardhat_reset"); + }); + + describe("Clients", function () { + it("should be able to query the blockchain using the public client", async function () { + const client = await this.hre.viem.getPublicClient(); + const blockNumber = await client.getBlockNumber(); + + assert.equal(blockNumber, 0n); + }); + + it("should be able to query the blockchain using the wallet client", async function () { + const publicClient = await this.hre.viem.getPublicClient(); + const [fromWalletClient, toWalletClient] = + await this.hre.viem.getWalletClients(); + const fromAddress = fromWalletClient.account.address; + const toAddress = toWalletClient.account.address; + + const fromBalanceBefore: bigint = await publicClient.getBalance({ + address: fromAddress, + }); + const toBalanceBefore: bigint = await publicClient.getBalance({ + address: toAddress, + }); + + const etherAmount = parseEther("0.0001"); + const hash = await fromWalletClient.sendTransaction({ + to: toAddress, + value: etherAmount, + }); + const receipt = await publicClient.waitForTransactionReceipt({ hash }); + const transactionFee = receipt.gasUsed * receipt.effectiveGasPrice; + + const fromBalanceAfter: bigint = await publicClient.getBalance({ + address: fromAddress, + }); + const toBalanceAfter: bigint = await publicClient.getBalance({ + address: toAddress, + }); + + assert.isDefined(receipt); + assert.equal(receipt.status, "success"); + assert.equal( + fromBalanceAfter, + fromBalanceBefore - etherAmount - transactionFee + ); + assert.equal(toBalanceAfter, toBalanceBefore + etherAmount); + }); + + it("should be able to query the blockchain using the test client", async function () { + const publicClient = await this.hre.viem.getPublicClient(); + const testClient = await this.hre.viem.getTestClient(); + + await testClient.mine({ + blocks: 1000000, + }); + const blockNumber = await publicClient.getBlockNumber(); + assert.equal(blockNumber, 1000000n); + }); + }); + + describe("deployContract", function () { + it("should be able to deploy a contract without constructor args", async function () { + const contract = await this.hre.viem.deployContract( + "WithoutConstructorArgs" + ); + + await contract.write.setData([50n]); + const data = await contract.read.getData(); + assert.equal(data, 50n); + }); + + it("should be able to deploy a contract with constructor args", async function () { + const [defaultWalletClient] = await this.hre.viem.getWalletClients(); + const contract = await this.hre.viem.deployContract( + "WithConstructorArgs", + [50n] + ); + + let data = await contract.read.getData(); + assert.equal(data, 50n); + + const owner = await contract.read.getOwner(); + assert.equal(owner, getAddress(defaultWalletClient.account.address)); + + await contract.write.setData([100n]); + data = await contract.read.getData(); + assert.equal(data, 100n); + }); + + it("should be able to deploy a contract with a different wallet client", async function () { + const [_, secondWalletClient] = await this.hre.viem.getWalletClients(); + const contract = await this.hre.viem.deployContract( + "WithoutConstructorArgs", + [], + { walletClient: secondWalletClient } + ); + + const owner = await contract.read.getOwner(); + assert.equal(owner, getAddress(secondWalletClient.account.address)); + }); + + it("should be able to deploy a contract with initial ETH", async function () { + const publicClient = await this.hre.viem.getPublicClient(); + const [defaultWalletClient] = await this.hre.viem.getWalletClients(); + const ownerBalanceBefore = await publicClient.getBalance({ + address: defaultWalletClient.account.address, + }); + const etherAmount = parseEther("0.0001"); + const contract = await this.hre.viem.deployContract( + "WithoutConstructorArgs", + [], + { value: etherAmount } + ); + const ownerBalanceAfter = await publicClient.getBalance({ + address: defaultWalletClient.account.address, + }); + const contractBalance = await publicClient.getBalance({ + address: contract.address, + }); + const block = await publicClient.getBlock({ + includeTransactions: true, + }); + const receipt = await publicClient.getTransactionReceipt({ + hash: block.transactions[0].hash, + }); + const transactionFee = receipt.gasUsed * receipt.effectiveGasPrice; + + assert.equal(contractBalance, etherAmount); + assert.equal( + ownerBalanceAfter, + ownerBalanceBefore - etherAmount - transactionFee + ); + }); + + it("should throw an error if the contract address can't be retrieved", async function () { + const publicClient = await this.hre.viem.getPublicClient(); + sinon.stub(publicClient, "waitForTransactionReceipt").returns( + Promise.resolve({ + contractAddress: null, + }) as unknown as Promise + ); + const [walletClient] = await this.hre.viem.getWalletClients(); + const contractArtifact = await this.hre.artifacts.readArtifact( + "WithoutConstructorArgs" + ); + + await expect( + innerDeployContract( + publicClient, + walletClient, + contractArtifact.abi, + contractArtifact.bytecode as Hex, + [] + ) + ).to.be.rejectedWith( + /The deployment transaction '0x[a-fA-F0-9]{64}' was mined in block '\d+' but its receipt doesn't contain a contract address/ + ); + }); + + it("should throw an error if no accounts are configured for the network", async function () { + const provider: EthereumProvider = new EthereumMockedProvider(); + const sendStub = sinon.stub(provider, "send"); + sendStub.withArgs("eth_accounts").returns(Promise.resolve([])); + const hre = { + ...this.hre, + network: { + ...this.hre.network, + provider, + }, + }; + + await expect( + deployContract(hre, "WithoutConstructorArgs") + ).to.be.rejectedWith( + /Default wallet client not found. This can happen if no accounts were configured for this network/ + ); + }); + + it("should wait for confirmations", async function () { + const publicClient = await this.hre.viem.getPublicClient(); + const testClient = await this.hre.viem.getTestClient(); + const sleepingTime = 2 * publicClient.pollingInterval; + await testClient.setAutomine(false); + + let contractPromiseResolved = false; + const contractPromise = this.hre.viem + .deployContract("WithoutConstructorArgs", [], { + confirmations: 5, + }) + .then(() => { + contractPromiseResolved = true; + }); + await sleep(sleepingTime); + assert.isFalse(contractPromiseResolved); + + await testClient.mine({ + blocks: 3, + }); + await sleep(sleepingTime); + assert.isFalse(contractPromiseResolved); + + await testClient.mine({ + blocks: 1, + }); + await sleep(sleepingTime); + assert.isFalse(contractPromiseResolved); + + await testClient.mine({ + blocks: 1, + }); + await contractPromise; + assert.isTrue(contractPromiseResolved); + }); + + it("should throw if the confirmations parameter is less than 0", async function () { + await expect( + this.hre.viem.deployContract("WithoutConstructorArgs", [], { + confirmations: -1, + }) + ).to.be.rejectedWith("Confirmations must be greater than 0."); + }); + + it("should throw if the confirmations parameter is 0", async function () { + await expect( + this.hre.viem.deployContract("WithoutConstructorArgs", [], { + confirmations: 0, + }) + ).to.be.rejectedWith( + "deployContract does not support 0 confirmations. Use sendDeploymentTransaction if you want to handle the deployment transaction yourself." + ); + }); + }); + + describe("sendDeploymentTransaction", function () { + it("should return the contract and the deployment transaction", async function () { + const publicClient = await this.hre.viem.getPublicClient(); + const { contract, deploymentTransaction } = + await this.hre.viem.sendDeploymentTransaction( + "WithoutConstructorArgs" + ); + assert.exists(contract); + assert.exists(deploymentTransaction); + + const { contractAddress } = + await publicClient.waitForTransactionReceipt({ + hash: deploymentTransaction.hash, + }); + assert.equal(contract.address, getAddress(contractAddress!)); + + await contract.write.setData([50n]); + const data = await contract.read.getData(); + assert.equal(data, 50n); + }); + }); + }); + + describe("Contract type generation", function () { + useEnvironment("type-generation"); + + before(async function () { + await this.hre.run(TASK_COMPILE, { quiet: true }); + }); + + after(async function () { + await this.hre.run(TASK_CLEAN); + }); + + it("should generate artifacts.d.ts", async function () { + const snapshotPath = path.join("snapshots", "artifacts.d.ts"); + const generatedFilePath = path.join("artifacts", "artifacts.d.ts"); + + await assertSnapshotMatch(snapshotPath, generatedFilePath); + }); + + it("should generate contracts/A.sol/A.d.ts", async function () { + const snapshotPath = path.join( + "snapshots", + "contracts", + "A.sol", + "A.d.ts" + ); + const generatedFilePath = path.join( + "artifacts", + "contracts", + "A.sol", + "A.d.ts" + ); + + await assertSnapshotMatch(snapshotPath, generatedFilePath); + }); + + it("should generate contracts/A.sol/B.d.ts", async function () { + const snapshotPath = path.join( + "snapshots", + "contracts", + "A.sol", + "B.d.ts" + ); + const generatedFilePath = path.join( + "artifacts", + "contracts", + "A.sol", + "B.d.ts" + ); + + await assertSnapshotMatch(snapshotPath, generatedFilePath); + }); + + it("should generate contracts/A.sol/artifacts.d.ts", async function () { + const snapshotPath = path.join( + "snapshots", + "contracts", + "A.sol", + "artifacts.d.ts" + ); + const generatedFilePath = path.join( + "artifacts", + "contracts", + "A.sol", + "artifacts.d.ts" + ); + + await assertSnapshotMatch(snapshotPath, generatedFilePath); + }); + + it("should generate contracts/C.sol/B.d.ts", async function () { + const snapshotPath = path.join( + "snapshots", + "contracts", + "C.sol", + "B.d.ts" + ); + const generatedFilePath = path.join( + "artifacts", + "contracts", + "C.sol", + "B.d.ts" + ); + + await assertSnapshotMatch(snapshotPath, generatedFilePath); + }); + + it("should generate contracts/C.sol/C.d.ts", async function () { + const snapshotPath = path.join( + "snapshots", + "contracts", + "C.sol", + "C.d.ts" + ); + const generatedFilePath = path.join( + "artifacts", + "contracts", + "C.sol", + "C.d.ts" + ); + + await assertSnapshotMatch(snapshotPath, generatedFilePath); + }); + + it("should generate contracts/C.sol/artifacts.d.ts", async function () { + const snapshotPath = path.join( + "snapshots", + "contracts", + "C.sol", + "artifacts.d.ts" + ); + const generatedFilePath = path.join( + "artifacts", + "contracts", + "C.sol", + "artifacts.d.ts" + ); + + await assertSnapshotMatch(snapshotPath, generatedFilePath); + }); + }); +}); diff --git a/packages/hardhat-viem/test/mocks/provider.ts b/packages/hardhat-viem/test/mocks/provider.ts new file mode 100644 index 00000000000..44fe69ab2f0 --- /dev/null +++ b/packages/hardhat-viem/test/mocks/provider.ts @@ -0,0 +1,24 @@ +import type { + EthereumProvider, + RequestArguments, + JsonRpcRequest, + JsonRpcResponse, +} from "hardhat/types"; + +import EventEmitter from "events"; + +export class EthereumMockedProvider + extends EventEmitter + implements EthereumProvider +{ + public async request(_args: RequestArguments): Promise {} + + public async send(_method: string, _params: any[] = []) {} + + public sendAsync( + _payload: JsonRpcRequest, + callback: (error: any, response: JsonRpcResponse) => void + ) { + callback(null, {} as JsonRpcRequest); // this is here just to finish the "async" operation + } +} diff --git a/packages/hardhat-viem/test/setup.ts b/packages/hardhat-viem/test/setup.ts new file mode 100644 index 00000000000..1c993d01e08 --- /dev/null +++ b/packages/hardhat-viem/test/setup.ts @@ -0,0 +1,6 @@ +import chai from "chai"; +import chaiAsPromised from "chai-as-promised"; + +chai.use(chaiAsPromised); + +chai.config.truncateThreshold = 0; diff --git a/packages/hardhat-viem/test/update-snapshots.ts b/packages/hardhat-viem/test/update-snapshots.ts new file mode 100644 index 00000000000..03540b8a575 --- /dev/null +++ b/packages/hardhat-viem/test/update-snapshots.ts @@ -0,0 +1,53 @@ +import path from "path"; +import fs from "fs"; + +import { TASK_COMPILE, TASK_CLEAN } from "hardhat/builtin-tasks/task-names"; +import { resetHardhatContext } from "hardhat/plugins-testing"; + +const snapshotPartialPaths = [ + "artifacts.d.ts", + path.join("contracts", "A.sol", "A.d.ts"), + path.join("contracts", "A.sol", "B.d.ts"), + path.join("contracts", "A.sol", "artifacts.d.ts"), + path.join("contracts", "C.sol", "B.d.ts"), + path.join("contracts", "C.sol", "C.d.ts"), + path.join("contracts", "C.sol", "artifacts.d.ts"), +]; + +const originalCwd = process.cwd(); + +async function updateSnapshots() { + process.chdir(path.join(__dirname, "fixture-projects", "type-generation")); + process.env.HARDHAT_NETWORK = "hardhat"; + + const hre = require("hardhat"); + await hre.run(TASK_COMPILE, { quiet: true }); + + snapshotPartialPaths.forEach((partialPath) => { + const snapshotPath = path.join(process.cwd(), "snapshots", partialPath); + const generatedFilePath = path.join( + process.cwd(), + "artifacts", + partialPath + ); + + fs.copyFileSync(generatedFilePath, snapshotPath); + }); + + await hre.run(TASK_CLEAN); + + process.chdir(path.resolve(`${__dirname}/..`)); + resetHardhatContext(); + delete process.env.HARDHAT_NETWORK; + + console.log("Snapshots updated!"); +} + +updateSnapshots() + .catch((error) => { + console.error(error); + process.exitCode = 1; + }) + .finally(() => { + process.chdir(originalCwd); + }); diff --git a/packages/hardhat-viem/tsconfig.json b/packages/hardhat-viem/tsconfig.json new file mode 100644 index 00000000000..65ecfc33b99 --- /dev/null +++ b/packages/hardhat-viem/tsconfig.json @@ -0,0 +1,15 @@ +{ + "extends": "../../config/typescript/tsconfig.json", + "compilerOptions": { + "outDir": "./build-test", + "rootDirs": ["./test"], + "composite": true + }, + "include": ["./test/**/*.ts"], + "exclude": ["./node_modules", "./test/**/hardhat.config.ts"], + "references": [ + { + "path": "./src" + } + ] +} diff --git a/packages/hardhat-vyper/.eslintrc.js b/packages/hardhat-vyper/.eslintrc.js index 889740f226d..c6de07705a1 100644 --- a/packages/hardhat-vyper/.eslintrc.js +++ b/packages/hardhat-vyper/.eslintrc.js @@ -1,7 +1,24 @@ +const { + slowImportsCommonIgnoredModules, +} = require("../../config/eslint/constants"); + module.exports = { extends: [`${__dirname}/../../config/eslint/eslintrc.js`], parserOptions: { project: `${__dirname}/tsconfig.json`, sourceType: "module", }, + overrides: [ + { + files: ["src/index.ts"], + rules: { + "@nomicfoundation/slow-imports/no-top-level-external-import": [ + "error", + { + ignoreModules: [...slowImportsCommonIgnoredModules], + }, + ], + }, + }, + ], }; diff --git a/packages/hardhat-vyper/.gitignore b/packages/hardhat-vyper/.gitignore index c00d7e72963..4aca21f18d7 100644 --- a/packages/hardhat-vyper/.gitignore +++ b/packages/hardhat-vyper/.gitignore @@ -15,10 +15,6 @@ # Logs logs *.log -npm-debug.log* -yarn-debug.log* -yarn-error.log* -lerna-debug.log* # Diagnostic reports (https://nodejs.org/api/report.html) report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json @@ -57,21 +53,15 @@ jspm_packages/ # TypeScript v1 declaration files typings/ -# Optional npm cache directory -.npm - # Optional eslint cache .eslintcache # Optional REPL history .node_repl_history -# Output of 'npm pack' +# Output of 'pnpm pack' *.tgz -# Yarn Integrity file -.yarn-integrity - # parcel-bundler cache (https://parceljs.org/) .cache diff --git a/packages/hardhat-vyper/.mocharc.json b/packages/hardhat-vyper/.mocharc.json index d2b0c6d38fe..b21e04d8b48 100644 --- a/packages/hardhat-vyper/.mocharc.json +++ b/packages/hardhat-vyper/.mocharc.json @@ -1,5 +1,5 @@ { "require": "ts-node/register/files", "ignore": ["test/fixture-projects/**/*"], - "timeout": 25000 + "timeout": 40000 } diff --git a/packages/hardhat-vyper/CHANGELOG.md b/packages/hardhat-vyper/CHANGELOG.md index 3381fa1be69..bc021f1a70f 100644 --- a/packages/hardhat-vyper/CHANGELOG.md +++ b/packages/hardhat-vyper/CHANGELOG.md @@ -1,5 +1,17 @@ # @nomiclabs/hardhat-vyper +## 3.0.5 + +### Patch Changes + +- 2f73386b1: Fixed a problem with the Vyper compilers downloader + +## 3.0.4 + +### Patch Changes + +- 03745576c: Added a check to validate that the Brownie code does not contain the directive `#@ if mode == "test":` because we do not support this feature. + ## 3.0.3 ### Patch Changes diff --git a/packages/hardhat-vyper/LICENSE b/packages/hardhat-vyper/LICENSE index 3b8858c5558..3b7e8c7eabb 100644 --- a/packages/hardhat-vyper/LICENSE +++ b/packages/hardhat-vyper/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2019 Nomic Labs LLC +Copyright (c) 2023 Nomic Foundation Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/packages/hardhat-vyper/README.md b/packages/hardhat-vyper/README.md index 66c74d32596..dd421b6742b 100644 --- a/packages/hardhat-vyper/README.md +++ b/packages/hardhat-vyper/README.md @@ -58,12 +58,23 @@ module.exports = { }; ``` -You can also configure multiple versions of the Vyper compiler: +You can also configure multiple versions of the Vyper compiler, as well as the compiler settings evmVersion and optimize. See the [Vyper docs](https://docs.vyperlang.org/en/v0.3.10/compiling-a-contract.html) for more info. ```js module.exports = { vyper: { - compilers: [{ version: "0.2.1" }, { version: "0.3.0" }], + compilers: [ + { + version: "0.2.1", + }, + { + version: "0.3.10", + settings: { + evmVersion: "paris", + optimize: "gas", + }, + }, + ], }, }; ``` @@ -72,6 +83,22 @@ module.exports = { There are no additional steps you need to take for this plugin to work. +## Test directives + +Brownie allows you to use the test directive `#@ if mode == "test":` to specify when a portion of code should be included only for testing purposes. + +Example: + +```py +#@ if mode == "test": +@external +def _mint_for_testing(_to: address, _token_id: uint256): + self._mint(_to, _token_id) +#@ endif +``` + +We do NOT support this feature. An error will be thrown every time that, when compiling a contract, the directive `#@ if mode == "test":` is found. + ### Additional notes The oldest vyper version supported by this plugin is 0.2.0. Versions older than this will not work and will throw an error. diff --git a/packages/hardhat-vyper/package.json b/packages/hardhat-vyper/package.json index 64b3656a336..fde0f3c0223 100644 --- a/packages/hardhat-vyper/package.json +++ b/packages/hardhat-vyper/package.json @@ -1,6 +1,6 @@ { "name": "@nomiclabs/hardhat-vyper", - "version": "3.0.3", + "version": "3.0.5", "description": "Hardhat plugin to develop smart contracts in Vyper", "repository": "github:nomiclabs/hardhat", "homepage": "https://github.com/nomiclabs/hardhat/tree/main/packages/hardhat-vyper", @@ -16,13 +16,14 @@ "vyper" ], "scripts": { - "lint": "yarn prettier --check && yarn eslint", - "lint:fix": "yarn prettier --write && yarn eslint --fix", + "lint": "pnpm prettier --check && pnpm eslint", + "lint:fix": "pnpm prettier --write && pnpm eslint --fix", "eslint": "eslint 'src/**/*.ts' 'test/**/*.ts'", "prettier": "prettier \"**/*.{js,md,json}\"", + "pretest": "cd ../.. && pnpm build", "test": "mocha --recursive \"test/**/*.ts\"", "build": "tsc --build .", - "prepublishOnly": "yarn build", + "prepublishOnly": "pnpm build", "clean": "rimraf dist" }, "files": [ @@ -39,25 +40,31 @@ "semver": "^6.3.0" }, "devDependencies": { + "@nomicfoundation/eslint-plugin-hardhat-internal-rules": "workspace:^", + "@nomicfoundation/eslint-plugin-slow-imports": "workspace:^", "@types/chai": "^4.2.0", + "@types/chai-as-promised": "^7.1.3", + "@types/debug": "^4.1.4", "@types/fs-extra": "^5.1.0", "@types/lodash": "^4.14.123", "@types/mocha": ">=9.1.0", - "@types/node": "^14.0.0", - "@typescript-eslint/eslint-plugin": "5.53.0", - "@typescript-eslint/parser": "5.53.0", + "@types/node": "^16.0.0", + "@types/semver": "^6.0.2", + "@typescript-eslint/eslint-plugin": "5.61.0", + "@typescript-eslint/parser": "5.61.0", "chai": "^4.2.0", - "eslint": "^7.29.0", + "chai-as-promised": "^7.1.1", + "eslint": "^8.44.0", "eslint-config-prettier": "8.3.0", - "eslint-plugin-import": "2.24.1", + "eslint-plugin-import": "2.27.5", "eslint-plugin-no-only-tests": "3.0.0", "eslint-plugin-prettier": "3.4.0", - "hardhat": "^2.8.3", + "hardhat": "workspace:^2.8.3", "mocha": "^10.0.0", "prettier": "2.4.1", "rimraf": "^3.0.2", "ts-node": "^10.8.0", - "typescript": "~4.7.4" + "typescript": "~5.0.0" }, "peerDependencies": { "hardhat": "^2.8.3" diff --git a/packages/hardhat-vyper/src/compiler.ts b/packages/hardhat-vyper/src/compiler.ts index bf5f5b211f4..7d529a65279 100644 --- a/packages/hardhat-vyper/src/compiler.ts +++ b/packages/hardhat-vyper/src/compiler.ts @@ -1,4 +1,7 @@ import { exec } from "child_process"; +import semver from "semver"; +import { VyperSettings } from "./types"; +import { VyperPluginError } from "./util"; export class Compiler { constructor(private _pathToVyper: string) {} @@ -6,11 +9,21 @@ export class Compiler { /** * * @param inputPaths array of paths to contracts to be compiled + * @param compilerVersion the version of the Vyper compiler + * @param settings the Vyper settings to use during compilation */ - public async compile(inputPaths: string[]) { + public async compile( + inputPaths: string[], + compilerVersion: string = "", + settings: VyperSettings = {} + ) { const output: string = await new Promise((resolve, reject) => { + const settingsCmd = getSettingsCmd(compilerVersion, settings); + const process = exec( - `${this._pathToVyper} -f combined_json ${inputPaths.join(" ")}`, + `${this._pathToVyper} ${settingsCmd} -f combined_json ${inputPaths.join( + " " + )}`, { maxBuffer: 1024 * 1024 * 500, }, @@ -28,3 +41,72 @@ export class Compiler { return JSON.parse(output); } } + +function getSettingsCmd( + compilerVersion: string, + settings: VyperSettings +): string { + let settingsStr = + settings.evmVersion !== undefined + ? `--evm-version ${settings.evmVersion} ` + : ""; + + settingsStr += getOptimize(compilerVersion, settings.optimize); + + return settingsStr; +} + +function getOptimize( + compilerVersion: string, + optimize: string | boolean | undefined +): string { + if (optimize === undefined) { + return ""; + } + + if (compilerVersion === "") { + throw new VyperPluginError( + "The 'compilerVersion' parameter must be set when the setting 'optimize' is set." + ); + } + + if (typeof optimize === "boolean") { + if (optimize) { + if ( + semver.gte(compilerVersion, "0.3.10") || + semver.lte(compilerVersion, "0.3.0") + ) { + throw new VyperPluginError( + `The 'optimize' setting with value 'true' is not supported for versions of the Vyper compiler older than or equal to 0.3.0 or newer than or equal to 0.3.10. You are currently using version ${compilerVersion}.` + ); + } + + // The optimizer is enabled by default + return ""; + } else { + if (semver.lte(compilerVersion, "0.3.0")) { + throw new VyperPluginError( + `The 'optimize' setting with value 'false' is not supported for versions of the Vyper compiler older than or equal to 0.3.0. You are currently using version ${compilerVersion}.` + ); + } + + return semver.lt(compilerVersion, "0.3.10") + ? "--no-optimize" + : "--optimize none"; + } + } + + if (typeof optimize === "string") { + if (semver.gte(compilerVersion, "0.3.10")) { + return `--optimize ${optimize}`; + } + + throw new VyperPluginError( + `The 'optimize' setting, when specified as a string value, is available only starting from the Vyper compiler version 0.3.10. You are currently using version ${compilerVersion}.` + ); + } + + throw new VyperPluginError( + `The 'optimize' setting has an invalid type value: ${typeof optimize}. Type should be either string or boolean.` + ); +} diff --git a/packages/hardhat-vyper/src/constants.ts b/packages/hardhat-vyper/src/constants.ts index a6093d25c85..f7b9dfffccc 100644 --- a/packages/hardhat-vyper/src/constants.ts +++ b/packages/hardhat-vyper/src/constants.ts @@ -3,3 +3,4 @@ export const ARTIFACT_FORMAT_VERSION = "hh-vyper-artifact-1"; export const DEBUG_NAMESPACE = "hardhat:plugin:vyper"; export const CACHE_FORMAT_VERSION = "hh-vy-cache-1"; export const VYPER_FILES_CACHE_FILENAME = "vyper-files-cache.json"; +export const OUTPUT_BREAKABLE_VYPER_VERSION = "0.4.0"; diff --git a/packages/hardhat-vyper/src/downloader.ts b/packages/hardhat-vyper/src/downloader.ts index 84dc489cf05..b645d028703 100644 --- a/packages/hardhat-vyper/src/downloader.ts +++ b/packages/hardhat-vyper/src/downloader.ts @@ -127,8 +127,10 @@ export class CompilerDownloader { } private _findVersionRelease(version: string): CompilerRelease | undefined { - return this.compilersList.find((release) => - semver.eq(release.tag_name, version) + return this.compilersList.find( + (release) => + semver.valid(release.tag_name) !== null && + semver.eq(release.tag_name, version) ); } diff --git a/packages/hardhat-vyper/src/index.ts b/packages/hardhat-vyper/src/index.ts index 25365027e78..4692a5675e5 100644 --- a/packages/hardhat-vyper/src/index.ts +++ b/packages/hardhat-vyper/src/index.ts @@ -1,13 +1,13 @@ import type { Artifacts as ArtifactsImpl } from "hardhat/internal/artifacts"; import type { Artifacts } from "hardhat/types/artifacts"; +import type { VyperFilesCache as VyperFilesCacheT } from "./cache"; import type { VyperOutput, VyperBuild } from "./types"; +import type { ResolvedFile } from "./resolver"; import * as os from "os"; import fsExtra from "fs-extra"; import semver from "semver"; -import { getCompilersDir } from "hardhat/internal/util/global-dir"; -import { localPathToSourceName } from "hardhat/utils/source-names"; import { getFullyQualifiedName } from "hardhat/utils/contract-names"; import { TASK_COMPILE_GET_COMPILATION_TASKS } from "hardhat/builtin-tasks/task-names"; import { extendConfig, subtask, types } from "hardhat/config"; @@ -24,11 +24,8 @@ import { TASK_COMPILE_VYPER_LOG_COMPILATION_RESULT, } from "./task-names"; import { DEFAULT_VYPER_VERSION } from "./constants"; -import { VyperFilesCache, getVyperFilesCachePath } from "./cache"; import { Compiler } from "./compiler"; import { CompilerDownloader } from "./downloader"; -import { Parser } from "./parser"; -import { ResolvedFile, Resolver } from "./resolver"; import { assertPluginInvariant, getArtifactFromVyperOutput, @@ -72,6 +69,9 @@ subtask(TASK_COMPILE_VYPER_GET_SOURCE_NAMES) { sourcePaths }: { sourcePaths: string[] }, { config } ): Promise => { + const { localPathToSourceName } = await import( + "hardhat/utils/source-names" + ); const sourceNames = await Promise.all( sourcePaths.map((p) => localPathToSourceName(config.paths.root, p)) ); @@ -100,6 +100,9 @@ subtask(TASK_COMPILE_VYPER_GET_BUILD) { quiet, vyperVersion }: { quiet: boolean; vyperVersion: string }, { run } ): Promise => { + const { getCompilersDir } = await import( + "hardhat/internal/util/global-dir" + ); const compilersCache = await getCompilersDir(); const downloader = new CompilerDownloader(compilersCache); @@ -204,6 +207,12 @@ subtask(TASK_COMPILE_VYPER) .addParam("quiet", undefined, undefined, types.boolean) .setAction( async ({ quiet }: { quiet: boolean }, { artifacts, config, run }) => { + const { VyperFilesCache, getVyperFilesCachePath } = await import( + "./cache" + ); + const { Parser } = await import("./parser"); + const { Resolver } = await import("./resolver"); + const sourcePaths: string[] = await run( TASK_COMPILE_VYPER_GET_SOURCE_PATHS ); @@ -348,10 +357,10 @@ ${list}` * disk, we remove it from the cache to force it to be recompiled. */ async function invalidateCacheMissingArtifacts( - vyperFilesCache: VyperFilesCache, + vyperFilesCache: VyperFilesCacheT, artifacts: Artifacts, resolvedFiles: ResolvedFile[] -): Promise { +): Promise { for (const file of resolvedFiles) { const cacheEntry = vyperFilesCache.getEntry(file.absolutePath); diff --git a/packages/hardhat-vyper/src/parser.ts b/packages/hardhat-vyper/src/parser.ts index 31eaf93f647..f3af0bfb452 100644 --- a/packages/hardhat-vyper/src/parser.ts +++ b/packages/hardhat-vyper/src/parser.ts @@ -1,4 +1,5 @@ import { VyperFilesCache } from "./cache"; +import { VyperPluginError } from "./util"; interface ParsedData { versionPragma: string; @@ -16,6 +17,8 @@ export class Parser { absolutePath: string, contentHash: string ): ParsedData { + this._validateTestModeNotUsed(fileContent, absolutePath); + const cacheResult = this._getFromCache(absolutePath, contentHash); if (cacheResult !== null) { @@ -31,6 +34,16 @@ export class Parser { return result; } + private _validateTestModeNotUsed(fileContent: string, absolutePath: string) { + if (fileContent.includes('#@ if mode == "test":')) { + throw new VyperPluginError( + `We found a test directive in the file at path ${absolutePath}.` + + ` Test directives are a Brownie feature not supported by Hardhat.` + + ` Learn more at https://hardhat.org/hardhat-runner/plugins/nomiclabs-hardhat-vyper#test-directives` + ); + } + } + private _getFromCache( absolutePath: string, contentHash: string diff --git a/packages/hardhat-vyper/src/types.ts b/packages/hardhat-vyper/src/types.ts index 8a17cd4c16b..5eaad0b65db 100644 --- a/packages/hardhat-vyper/src/types.ts +++ b/packages/hardhat-vyper/src/types.ts @@ -1,7 +1,13 @@ export type VyperUserConfig = string | VyperConfig | MultiVyperConfig; +export interface VyperSettings { + evmVersion?: string; + optimize?: string | boolean; +} + export interface VyperConfig { version: string; + settings?: VyperSettings; } export interface MultiVyperConfig { diff --git a/packages/hardhat-vyper/test/fixture-projects/.gitignore b/packages/hardhat-vyper/test/fixture-projects/.gitignore index 1a65e437ab3..64036ac854a 100644 --- a/packages/hardhat-vyper/test/fixture-projects/.gitignore +++ b/packages/hardhat-vyper/test/fixture-projects/.gitignore @@ -1,2 +1,2 @@ -/*/cache -/*/artifacts +/**/cache +/**/artifacts diff --git a/packages/hardhat-vyper/test/fixture-projects/compilation-single-file-test-directive/contracts/A.vy b/packages/hardhat-vyper/test/fixture-projects/compilation-single-file-test-directive/contracts/A.vy new file mode 100644 index 00000000000..267ea385087 --- /dev/null +++ b/packages/hardhat-vyper/test/fixture-projects/compilation-single-file-test-directive/contracts/A.vy @@ -0,0 +1,7 @@ +# @version 0.3.0 + +#@ if mode == "test": +@external +def test() -> int128: + return 42 +#@ endif \ No newline at end of file diff --git a/packages/hardhat-vyper/test/fixture-projects/unmatched-compiler-version/hardhat.config.js b/packages/hardhat-vyper/test/fixture-projects/compilation-single-file-test-directive/hardhat.config.js similarity index 100% rename from packages/hardhat-vyper/test/fixture-projects/unmatched-compiler-version/hardhat.config.js rename to packages/hardhat-vyper/test/fixture-projects/compilation-single-file-test-directive/hardhat.config.js diff --git a/packages/hardhat-vyper/test/fixture-projects/compilation-with-settings-option-variants/optimize-invalid-type/contracts/A.vy b/packages/hardhat-vyper/test/fixture-projects/compilation-with-settings-option-variants/optimize-invalid-type/contracts/A.vy new file mode 100644 index 00000000000..748ebc927af --- /dev/null +++ b/packages/hardhat-vyper/test/fixture-projects/compilation-with-settings-option-variants/optimize-invalid-type/contracts/A.vy @@ -0,0 +1,5 @@ +# @version 0.3.9 + +@external +def test() -> int128: + return 42 diff --git a/packages/hardhat-vyper/test/fixture-projects/compilation-with-settings-option-variants/optimize-invalid-type/hardhat.config.js b/packages/hardhat-vyper/test/fixture-projects/compilation-with-settings-option-variants/optimize-invalid-type/hardhat.config.js new file mode 100644 index 00000000000..e031582d901 --- /dev/null +++ b/packages/hardhat-vyper/test/fixture-projects/compilation-with-settings-option-variants/optimize-invalid-type/hardhat.config.js @@ -0,0 +1,15 @@ +require("../../../../src/index"); + +module.exports = { + vyper: { + compilers: [ + { + version: "0.3.9", + settings: { + evmVersion: "paris", + optimize: 12, + }, + }, + ], + }, +}; diff --git a/packages/hardhat-vyper/test/fixture-projects/compilation-with-settings-option-variants/optimize-set-to-false-always-available-new-versions/contracts/A.vy b/packages/hardhat-vyper/test/fixture-projects/compilation-with-settings-option-variants/optimize-set-to-false-always-available-new-versions/contracts/A.vy new file mode 100644 index 00000000000..2f6a0a54db9 --- /dev/null +++ b/packages/hardhat-vyper/test/fixture-projects/compilation-with-settings-option-variants/optimize-set-to-false-always-available-new-versions/contracts/A.vy @@ -0,0 +1,5 @@ +# @version 0.3.10 + +@external +def test() -> int128: + return 42 diff --git a/packages/hardhat-vyper/test/fixture-projects/compilation-with-settings-option-variants/optimize-set-to-false-always-available-new-versions/hardhat.config.js b/packages/hardhat-vyper/test/fixture-projects/compilation-with-settings-option-variants/optimize-set-to-false-always-available-new-versions/hardhat.config.js new file mode 100644 index 00000000000..e59e652644a --- /dev/null +++ b/packages/hardhat-vyper/test/fixture-projects/compilation-with-settings-option-variants/optimize-set-to-false-always-available-new-versions/hardhat.config.js @@ -0,0 +1,15 @@ +require("../../../../src/index"); + +module.exports = { + vyper: { + compilers: [ + { + version: "0.3.10", + settings: { + evmVersion: "paris", + optimize: false, + }, + }, + ], + }, +}; diff --git a/packages/hardhat-vyper/test/fixture-projects/generates-gas-field/contracts/A.vy b/packages/hardhat-vyper/test/fixture-projects/generates-gas-field/contracts/A.vy deleted file mode 100644 index 8ba6a64901d..00000000000 --- a/packages/hardhat-vyper/test/fixture-projects/generates-gas-field/contracts/A.vy +++ /dev/null @@ -1,5 +0,0 @@ -# @version 0.2.12 - -@external -def test() -> int128: - return 42 diff --git a/packages/hardhat-vyper/test/fixture-projects/generates-gas-field/hardhat.config.js b/packages/hardhat-vyper/test/fixture-projects/generates-gas-field/hardhat.config.js deleted file mode 100644 index 88d47d3cf8f..00000000000 --- a/packages/hardhat-vyper/test/fixture-projects/generates-gas-field/hardhat.config.js +++ /dev/null @@ -1,5 +0,0 @@ -require("../../../src/index"); - -module.exports = { - vyper: "0.2.12", -}; diff --git a/packages/hardhat-vyper/test/fixture-projects/mixed-language/contracts/test.vy b/packages/hardhat-vyper/test/fixture-projects/mixed-language/contracts/test.vy deleted file mode 100644 index 14de3134ac1..00000000000 --- a/packages/hardhat-vyper/test/fixture-projects/mixed-language/contracts/test.vy +++ /dev/null @@ -1,5 +0,0 @@ -# @version 0.3.0 - -@external -def test() -> int128: - return 42 diff --git a/packages/hardhat-vyper/test/fixture-projects/mixed-language/hardhat.config.js b/packages/hardhat-vyper/test/fixture-projects/mixed-language/hardhat.config.js deleted file mode 100644 index bf3739ff008..00000000000 --- a/packages/hardhat-vyper/test/fixture-projects/mixed-language/hardhat.config.js +++ /dev/null @@ -1,8 +0,0 @@ -require("../../../src/index"); - -module.exports = { - vyper: { - version: "0.3.0", - }, - solidity: "0.5.15", -}; diff --git a/packages/hardhat-vyper/test/fixture-projects/old-vyper-versions/contracts/Foo.vy b/packages/hardhat-vyper/test/fixture-projects/old-vyper-versions/contracts/Foo.vy deleted file mode 100644 index 152b41143a6..00000000000 --- a/packages/hardhat-vyper/test/fixture-projects/old-vyper-versions/contracts/Foo.vy +++ /dev/null @@ -1,5 +0,0 @@ -# @version ^0.1.0-beta.14 - -@external -def test() -> int128: - return 42 diff --git a/packages/hardhat-vyper/test/fixture-projects/old-vyper-versions/old-vyper-version-multiple-compilers.js b/packages/hardhat-vyper/test/fixture-projects/old-vyper-versions/old-vyper-version-multiple-compilers.js deleted file mode 100644 index 15691ce4451..00000000000 --- a/packages/hardhat-vyper/test/fixture-projects/old-vyper-versions/old-vyper-version-multiple-compilers.js +++ /dev/null @@ -1,14 +0,0 @@ -require("../../../src/index"); - -module.exports = { - vyper: { - compilers: [ - { - version: "0.3.0", - }, - { - version: "0.1.0-beta.15", - }, - ], - }, -}; diff --git a/packages/hardhat-vyper/test/fixture-projects/old-vyper-versions/old-vyper-version.js b/packages/hardhat-vyper/test/fixture-projects/old-vyper-versions/old-vyper-version.js deleted file mode 100644 index a90b7bfcc08..00000000000 --- a/packages/hardhat-vyper/test/fixture-projects/old-vyper-versions/old-vyper-version.js +++ /dev/null @@ -1,5 +0,0 @@ -require("../../../src/index"); - -module.exports = { - vyper: "0.1.0-beta.15", -}; diff --git a/packages/hardhat-vyper/test/fixture-projects/unmatched-compiler-version/contracts/A.vy b/packages/hardhat-vyper/test/fixture-projects/unmatched-compiler-version/contracts/A.vy deleted file mode 100644 index 2ec3f24d5ef..00000000000 --- a/packages/hardhat-vyper/test/fixture-projects/unmatched-compiler-version/contracts/A.vy +++ /dev/null @@ -1,5 +0,0 @@ -# @version ^0.2.0 - -@external -def test() -> int128: - return 42 diff --git a/packages/hardhat-vyper/test/helpers.ts b/packages/hardhat-vyper/test/helpers.ts deleted file mode 100644 index 3d4827937c9..00000000000 --- a/packages/hardhat-vyper/test/helpers.ts +++ /dev/null @@ -1,105 +0,0 @@ -import { assert, AssertionError } from "chai"; -import * as fsExtra from "fs-extra"; -import path from "path"; - -import { resetHardhatContext } from "hardhat/plugins-testing"; -import { HardhatRuntimeEnvironment } from "hardhat/types"; - -import { VyperPluginError } from "../src/util"; - -declare module "mocha" { - interface Context { - env: HardhatRuntimeEnvironment; - } -} - -export function assertFileExists(pathToFile: string) { - assert.isTrue( - fsExtra.existsSync(pathToFile), - `Expected ${pathToFile} to exist` - ); -} - -export function useFixtureProject(projectName: string) { - let projectPath: string; - let prevWorkingDir: string; - - before(() => { - projectPath = getFixtureProjectPath(projectName); - }); - - before(() => { - prevWorkingDir = process.cwd(); - process.chdir(projectPath); - }); - - after(() => { - process.chdir(prevWorkingDir); - }); -} - -function getFixtureProjectPath(projectName: string): string { - const projectPath = path.join(__dirname, "fixture-projects", projectName); - - if (!fsExtra.pathExistsSync(projectPath)) { - throw new Error(`Fixture project ${projectName} doesn't exist`); - } - - return fsExtra.realpathSync(projectPath); -} - -export function useEnvironment(configPath?: string) { - beforeEach("Loading hardhat environment", function () { - if (configPath !== undefined) { - process.env.HARDHAT_CONFIG = configPath; - } - - this.env = require("hardhat"); - }); - - afterEach("Resetting hardhat context", function () { - delete process.env.HARDHAT_CONFIG; - resetHardhatContext(); - }); -} - -export async function expectVyperErrorAsync( - f: () => Promise, - errorMessage?: string | RegExp -) { - const error = new AssertionError( - `VyperPluginError expected, but no Error was thrown` - ); - - const notExactMatch = new AssertionError( - `VyperPluginError was thrown, but should have included "${errorMessage}" but got "` - ); - - const notRegexMatch = new AssertionError( - `VyperPluginError was thrown, but should have matched reged ${errorMessage} but got "` - ); - - try { - await f(); - } catch (err: any) { - assert(VyperPluginError.isNomicLabsHardhatPluginError(err)); - - if (errorMessage !== undefined) { - if (typeof errorMessage === "string") { - if (!err.message.includes(errorMessage)) { - notExactMatch.message += `${err.message}"`; - throw notExactMatch; - } - } else { - if (errorMessage.exec(err.message) === null) { - notRegexMatch.message += `${err.message}"`; - throw notRegexMatch; - } - } - } - - return; - } - - throw error; -} diff --git a/packages/hardhat-vyper/test/tests.ts b/packages/hardhat-vyper/test/tests.ts index 06573616335..04ac58d9ea0 100644 --- a/packages/hardhat-vyper/test/tests.ts +++ b/packages/hardhat-vyper/test/tests.ts @@ -1,4 +1,5 @@ -import { assert } from "chai"; +import { assert, expect, use } from "chai"; +import chaiAsPromised from "chai-as-promised"; import * as fsExtra from "fs-extra"; import path from "path"; @@ -12,6 +13,8 @@ import { expectVyperErrorAsync, } from "./helpers"; +use(chaiAsPromised); + describe("Vyper plugin", function () { beforeEach(function () { fsExtra.removeSync("artifacts"); @@ -107,4 +110,25 @@ describe("Vyper plugin", function () { ); }); }); + + describe("project should not compile", function () { + useFixtureProject("compilation-single-file-test-directive"); + useEnvironment(); + + it("should throw an error because a test directive is present in the source file", async function () { + const filePath = path.join( + __dirname, + "fixture-projects", + "compilation-single-file-test-directive", + "contracts", + "A.vy" + ); + + await expect(this.env.run(TASK_COMPILE)).to.be.rejectedWith( + `We found a test directive in the file at path ${filePath}.` + + ` Test directives are a Brownie feature not supported by Hardhat.` + + ` Learn more at https://hardhat.org/hardhat-runner/plugins/nomiclabs-hardhat-vyper#test-directives` + ); + }); + }); }); diff --git a/packages/hardhat-vyper/tsconfig.json b/packages/hardhat-vyper/tsconfig.json deleted file mode 100644 index 230e231d69c..00000000000 --- a/packages/hardhat-vyper/tsconfig.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "extends": "../../config/typescript/tsconfig.json", - "compilerOptions": { - "outDir": "./dist" - }, - "exclude": ["./dist", "./node_modules", "./test/**/hardhat.config.ts"], - "references": [ - { - "path": "../hardhat-core/src" - } - ] -} diff --git a/packages/hardhat-waffle/README.md b/packages/hardhat-waffle/README.md deleted file mode 100644 index cdd34227e16..00000000000 --- a/packages/hardhat-waffle/README.md +++ /dev/null @@ -1,5 +0,0 @@ -# `@nomiclabs/hardhat-waffle` plugin - -This plugin integrates Hardhat with [Waffle](https://getwaffle.io/). - -To read more please visit [this site](https://github.com/NomicFoundation/hardhat-waffle). diff --git a/packages/hardhat-web3-legacy/.eslintrc.js b/packages/hardhat-web3-legacy/.eslintrc.js deleted file mode 100644 index 889740f226d..00000000000 --- a/packages/hardhat-web3-legacy/.eslintrc.js +++ /dev/null @@ -1,7 +0,0 @@ -module.exports = { - extends: [`${__dirname}/../../config/eslint/eslintrc.js`], - parserOptions: { - project: `${__dirname}/tsconfig.json`, - sourceType: "module", - }, -}; diff --git a/packages/hardhat-web3-legacy/.gitignore b/packages/hardhat-web3-legacy/.gitignore index c00d7e72963..4aca21f18d7 100644 --- a/packages/hardhat-web3-legacy/.gitignore +++ b/packages/hardhat-web3-legacy/.gitignore @@ -15,10 +15,6 @@ # Logs logs *.log -npm-debug.log* -yarn-debug.log* -yarn-error.log* -lerna-debug.log* # Diagnostic reports (https://nodejs.org/api/report.html) report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json @@ -57,21 +53,15 @@ jspm_packages/ # TypeScript v1 declaration files typings/ -# Optional npm cache directory -.npm - # Optional eslint cache .eslintcache # Optional REPL history .node_repl_history -# Output of 'npm pack' +# Output of 'pnpm pack' *.tgz -# Yarn Integrity file -.yarn-integrity - # parcel-bundler cache (https://parceljs.org/) .cache diff --git a/packages/hardhat-web3-legacy/.mocharc.json b/packages/hardhat-web3-legacy/.mocharc.json deleted file mode 100644 index 775e35460dd..00000000000 --- a/packages/hardhat-web3-legacy/.mocharc.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "require": "ts-node/register/files", - "file": "../common/run-with-ganache", - "ignore": ["test/fixture-projects/**/*"], - "timeout": 10000 -} diff --git a/packages/hardhat-web3-legacy/LICENSE b/packages/hardhat-web3-legacy/LICENSE index 3b8858c5558..3b7e8c7eabb 100644 --- a/packages/hardhat-web3-legacy/LICENSE +++ b/packages/hardhat-web3-legacy/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2019 Nomic Labs LLC +Copyright (c) 2023 Nomic Foundation Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/packages/hardhat-web3-legacy/README.md b/packages/hardhat-web3-legacy/README.md deleted file mode 100644 index 4ef730752af..00000000000 --- a/packages/hardhat-web3-legacy/README.md +++ /dev/null @@ -1,43 +0,0 @@ -[![npm](https://img.shields.io/npm/v/@nomiclabs/hardhat-web3-legacy.svg)](https://www.npmjs.com/package/@nomiclabs/hardhat-web3-legacy) [![hardhat](https://hardhat.org/buidler-plugin-badge.svg?1)](https://hardhat.org) - -# hardhat-web3-legacy - -This plugin integrates [Web3.js](https://github.com/ethereum/web3.js) `0.20x` into [Hardhat](https://hardhat.org). - -## What - -This plugin brings to Hardhat the Web3 module and an initialized instance of Web3. - -# Installation - -```bash -npm install --save-dev @nomiclabs/hardhat-web3-legacy web3@^0.20.7 -``` - -And add the following statement to your `hardhat.config.js`: - -```js -require("@nomiclabs/hardhat-web3-legacy"); -``` - -Or, if you are using TypeScript, add this to your `hardhat.config.ts`: - -```js -import "@nomiclabs/hardhat-web3-legacy"; -``` - -## Tasks - -This plugin creates no additional tasks. - -## Environment extensions - -This plugin adds the following elements to the `HardhatRuntimeEnvironment`: - -- `Web3`: The Web3.js module. -- `web3`: An instantiated Web3.js object connected to the selected network. -- `pweb3`: A promisified version of `web3`. - -## Usage - -In Web3 0.20x some features are synchronous and some are asynchronous. For example `web3.eth.accounts` and `web3.eth.blockNumber` are synchronous and not supported. You'll get a `Synchronous requests are not supported, use pweb3 instead` error when trying to access them. To use these you need to use the promisified web3 and call the getter version of the property instead: `await pweb3.eth.getAccounts()`. diff --git a/packages/hardhat-web3-legacy/package.json b/packages/hardhat-web3-legacy/package.json index 4ba78198b6c..e3511c24705 100644 --- a/packages/hardhat-web3-legacy/package.json +++ b/packages/hardhat-web3-legacy/package.json @@ -17,13 +17,14 @@ "web3.js" ], "scripts": { - "lint": "yarn prettier --check && yarn eslint", - "lint:fix": "yarn prettier --write && yarn eslint --fix", + "lint": "pnpm prettier --check && pnpm eslint", + "lint:fix": "pnpm prettier --write && pnpm eslint --fix", "eslint": "eslint 'src/**/*.ts' 'test/**/*.ts'", "prettier": "prettier \"**/*.{js,md,json}\"", + "pretest": "cd ../.. && pnpm build", "test": "mocha --recursive \"test/**/*.ts\" --exit", "build": "tsc --build .", - "prepublishOnly": "yarn build", + "prepublishOnly": "pnpm build", "clean": "rimraf dist" }, "files": [ @@ -33,23 +34,25 @@ "README.md" ], "devDependencies": { + "@nomicfoundation/eslint-plugin-hardhat-internal-rules": "workspace:^", + "@nomicfoundation/eslint-plugin-slow-imports": "workspace:^", "@types/chai": "^4.2.0", "@types/mocha": ">=9.1.0", - "@types/node": "^14.0.0", - "@typescript-eslint/eslint-plugin": "5.53.0", - "@typescript-eslint/parser": "5.53.0", + "@types/node": "^16.0.0", + "@typescript-eslint/eslint-plugin": "5.61.0", + "@typescript-eslint/parser": "5.61.0", "chai": "^4.2.0", - "eslint": "^7.29.0", + "eslint": "^8.44.0", "eslint-config-prettier": "8.3.0", - "eslint-plugin-import": "2.24.1", + "eslint-plugin-import": "2.27.5", "eslint-plugin-no-only-tests": "3.0.0", "eslint-plugin-prettier": "3.4.0", - "hardhat": "^2.0.0", + "hardhat": "workspace:^2.0.0", "mocha": "^10.0.0", "prettier": "2.4.1", "rimraf": "^3.0.2", "ts-node": "^10.8.0", - "typescript": "~4.7.4", + "typescript": "~5.0.0", "web3": "^0.20.0" }, "peerDependencies": { diff --git a/packages/hardhat-web3-legacy/src/index.ts b/packages/hardhat-web3-legacy/src/index.ts index fdb0d20f832..3eb444d7006 100644 --- a/packages/hardhat-web3-legacy/src/index.ts +++ b/packages/hardhat-web3-legacy/src/index.ts @@ -1,7 +1,8 @@ +import type { promisifyWeb3 as PromisifyWeb3T } from "./pweb3"; + import { extendEnvironment } from "hardhat/config"; import { lazyFunction, lazyObject } from "hardhat/plugins"; -import { promisifyWeb3 } from "./pweb3"; import "./type-extensions"; import { Web3HTTPProviderAdapter } from "./web3-provider-adapter"; @@ -11,5 +12,8 @@ extendEnvironment((env) => { const Web3 = require("web3"); return new Web3(new Web3HTTPProviderAdapter(env.network.provider)); }); + const { promisifyWeb3 } = require("./pweb3") as { + promisifyWeb3: typeof PromisifyWeb3T; + }; env.pweb3 = lazyObject(() => promisifyWeb3(env.web3)); }); diff --git a/packages/hardhat-web3-legacy/src/pweb3.ts b/packages/hardhat-web3-legacy/src/pweb3.ts deleted file mode 100644 index f28fbc5a9d4..00000000000 --- a/packages/hardhat-web3-legacy/src/pweb3.ts +++ /dev/null @@ -1,132 +0,0 @@ -import { wrapWithSolidityErrorsCorrection } from "hardhat/internal/hardhat-network/stack-traces/solidity-errors"; -import { NomicLabsHardhatPluginError } from "hardhat/plugins"; -import { promisify } from "util"; - -export function promisifyWeb3(web3: any) { - const WEB3_MODULES = ["eth", "db", "shh", "net", "personal", "bzz"]; - - const Web3 = require("web3"); - const pweb3 = new Web3(web3.currentProvider); - - for (const module of WEB3_MODULES) { - const originalModule = pweb3[module]; - pweb3[module] = {}; - - for (const prop in web3[module]) { - if (module === "eth" && prop === "contract") { - continue; - } - - const desc = Object.getOwnPropertyDescriptor(web3[module], prop); - - if (desc === undefined) { - Object.defineProperty(pweb3[module], prop, { - get: () => { - throw new NomicLabsHardhatPluginError( - "@nomiclabs/hardhat-web3-legacy", - `pweb3.${module}.${prop} is not supported.` - ); - }, - }); - } else if (desc.get !== undefined) { - Object.defineProperty(pweb3[module], prop, { - get: () => { - throw new NomicLabsHardhatPluginError( - "@nomiclabs/hardhat-web3-legacy", - "pweb3 doesn't support synchronous calls." - ); - }, - }); - } else if (web3[module][prop] instanceof Function) { - pweb3[module][prop] = async (...args: any[]) => { - return wrapWithSolidityErrorsCorrection(() => { - const pfied = promisify(web3[module][prop].bind(web3[module])); - return pfied(...args); - }, 3); - }; - } else { - pweb3[module][prop] = originalModule[prop]; - } - } - } - - pweb3.eth.contract = (abi: any[]) => { - const contractFactory = web3.eth.contract(abi); - - const originalNew = contractFactory.new; - - contractFactory.new = (...args: any[]) => { - if (typeof args[args.length - 1] === "function") { - throw new NomicLabsHardhatPluginError( - "@nomiclabs/hardhat-web3-legacy", - "pweb3.eth.ContractFactory.new doesn't support callbacks." - ); - } - - // Web3 calls twice to the callback. Once before finishing to initialize - // the contract. - let alreadyCalledOnce = false; - - return wrapWithSolidityErrorsCorrection(() => { - const pfied = () => - new Promise((resolve, reject) => { - originalNew.apply(contractFactory, [ - ...args, - (err: any, contract: any) => { - if (err !== undefined && err !== null) { - reject(err); - return; - } - - if (!alreadyCalledOnce) { - alreadyCalledOnce = true; - return; - } - - promisifyContract(contract, abi); - resolve(contract); - }, - ]); - }); - return pfied(); - }, 3); - }; - - contractFactory.new.getData = originalNew.getData; - - const originalAt = contractFactory.at; - - contractFactory.at = (address: string, callback: any) => { - if (callback === undefined) { - const contract = originalAt.call(contractFactory, address); - promisifyContract(contract, abi); - return contract; - } - - throw new NomicLabsHardhatPluginError( - "@nomiclabs/hardhat-web3-legacy", - "pweb3.eth.ContractFactory.at doesn't support callbacks." - ); - }; - - return contractFactory; - }; - - return pweb3; -} - -function promisifyContract(contract: any, abi: any[]) { - for (const abiElem of abi) { - if (abiElem.type === "function") { - const original = contract[abiElem.name]; - - contract[abiElem.name] = async (...args: any[]) => { - return wrapWithSolidityErrorsCorrection(() => { - const pfied = promisify(original.bind(contract)); - return pfied(...args); - }, 3); - }; - contract[abiElem.name].getData = original.getData.bind(original); - } - } -} diff --git a/packages/hardhat-web3-legacy/src/type-extensions.ts b/packages/hardhat-web3-legacy/src/type-extensions.ts deleted file mode 100644 index 51434f37802..00000000000 --- a/packages/hardhat-web3-legacy/src/type-extensions.ts +++ /dev/null @@ -1,9 +0,0 @@ -import "hardhat/types/runtime"; - -declare module "hardhat/types/runtime" { - export interface HardhatRuntimeEnvironment { - Web3: any; - web3: any; - pweb3: any; - } -} diff --git a/packages/hardhat-web3-legacy/src/web3-provider-adapter.ts b/packages/hardhat-web3-legacy/src/web3-provider-adapter.ts deleted file mode 100644 index c23b9ef1f74..00000000000 --- a/packages/hardhat-web3-legacy/src/web3-provider-adapter.ts +++ /dev/null @@ -1,119 +0,0 @@ -import { NomicLabsHardhatPluginError } from "hardhat/plugins"; -import { EthereumProvider } from "hardhat/types"; -import util from "util"; - -export interface JsonRpcRequest { - jsonrpc: string; - method: string; - params: any[]; - id: number; -} - -export interface JsonRpcResponse { - jsonrpc: string; - id: number; - result?: any; - error?: { - code: number; - message: string; - data?: any; - }; -} - -export class Web3HTTPProviderAdapter { - private readonly _provider: EthereumProvider; - - constructor(provider: EthereumProvider) { - this._provider = provider; - - // We bind everything here because some test suits break otherwise - this.sendAsync = this.sendAsync.bind(this) as any; - this.send = this.send.bind(this) as any; - this.isConnected = this.isConnected.bind(this) as any; - this._sendJsonRpcRequest = this._sendJsonRpcRequest.bind(this) as any; - } - - public send(payload?: Partial) { - if (payload !== undefined && payload.method !== undefined) { - throw new NomicLabsHardhatPluginError( - "@nomiclabs/hardhat-web3-legacy", - `Trying to call RPC method ${payload.method}, but synchronous requests are not supported, use pweb3 instead` - ); - } - - throw new NomicLabsHardhatPluginError( - "@nomiclabs/hardhat-web3-legacy", - "Synchronous requests are not supported, use pweb3 instead" - ); - } - - public sendAsync( - payload: JsonRpcRequest, - callback: (error: Error | null, response?: JsonRpcResponse) => void - ): void; - public sendAsync( - payload: JsonRpcRequest[], - callback: (error: Error | null, response?: JsonRpcResponse[]) => void - ): void; - public sendAsync( - payload: JsonRpcRequest | JsonRpcRequest[], - callback: (error: Error | null, response?: any) => void - ): void { - if (!Array.isArray(payload)) { - util.callbackify(() => this._sendJsonRpcRequest(payload))(callback); - return; - } - - util.callbackify(async () => { - const responses: JsonRpcResponse[] = []; - - for (const request of payload) { - const response = await this._sendJsonRpcRequest(request); - - responses.push(response); - - if (response.error !== undefined) { - break; - } - } - - return responses; - })(callback); - } - - public isConnected(): boolean { - return true; - } - - private async _sendJsonRpcRequest( - request: JsonRpcRequest - ): Promise { - const response: JsonRpcResponse = { - id: request.id, - jsonrpc: "2.0", - }; - - try { - const result = await this._provider.send(request.method, request.params); - response.result = result; - } catch (error: any) { - if (error.code === undefined) { - throw error; - } - - response.error = { - // This might be a mistake, but I'm leaving it as is just in case, - // because it's not obvious what we should do here. - // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions - code: error.code ? +error.code : 404, - message: error.message, - data: { - stack: error.stack, - name: error.name, - }, - }; - } - - return response; - } -} diff --git a/packages/hardhat-web3-legacy/src/web3.d.ts b/packages/hardhat-web3-legacy/src/web3.d.ts new file mode 100644 index 00000000000..993160c5a16 --- /dev/null +++ b/packages/hardhat-web3-legacy/src/web3.d.ts @@ -0,0 +1 @@ +declare module "web3"; diff --git a/packages/hardhat-web3-legacy/test/helpers.ts b/packages/hardhat-web3-legacy/test/helpers.ts deleted file mode 100644 index 394785e4001..00000000000 --- a/packages/hardhat-web3-legacy/test/helpers.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { resetHardhatContext } from "hardhat/plugins-testing"; -import { HardhatRuntimeEnvironment } from "hardhat/types"; -import path from "path"; - -declare module "mocha" { - interface Context { - env: HardhatRuntimeEnvironment; - } -} - -export function useEnvironment( - fixtureProjectName: string, - networkName = "localhost" -) { - beforeEach("Loading hardhat environment", function () { - process.chdir(path.join(__dirname, "fixture-projects", fixtureProjectName)); - process.env.HARDHAT_NETWORK = networkName; - - this.env = require("hardhat"); - }); - - afterEach("Resetting hardhat", function () { - resetHardhatContext(); - }); -} diff --git a/packages/hardhat-web3-legacy/test/pweb3.ts b/packages/hardhat-web3-legacy/test/pweb3.ts deleted file mode 100644 index 4a06bf8a0a2..00000000000 --- a/packages/hardhat-web3-legacy/test/pweb3.ts +++ /dev/null @@ -1,80 +0,0 @@ -import { assert } from "chai"; -import Web3 from "web3"; - -import { promisifyWeb3 } from "../src/pweb3"; - -const CONTRACT_BYTECODE = - "6080604052348015600f57600080fd5b50609b8061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060325760003560e01c80635a44b650146037578063e730f60b146053575b600080fd5b603d605b565b6040518082815260200191505060405180910390f35b60596064565b005b60006001905090565b56fea265627a7a7230582075918bec172b335d3087851edc0735dd08bf398d38b6680f77bd9d9765d02be464736f6c634300050a0032"; - -const ABI = [ - { - constant: true, - inputs: [], - name: "constantFunction", - outputs: [ - { - name: "", - type: "uint256", - }, - ], - payable: false, - stateMutability: "pure", - type: "function", - }, - { - constant: false, - inputs: [], - name: "nonConstantFunction", - outputs: [], - payable: false, - stateMutability: "nonpayable", - type: "function", - }, -]; - -describe("pweb3", () => { - let web3: any; - let pweb3: any; - - beforeEach("Initialize web3 and pweb3", () => { - const provider = new Web3.providers.HttpProvider("http://127.0.0.1:8545"); - web3 = new Web3(provider); - pweb3 = promisifyWeb3(web3); - }); - - it("Should throw if a synch call is made", () => { - assert.throws( - () => pweb3.eth.accounts, - "pweb3 doesn't support synchronous calls." - ); - }); - - it("Should promisify contracts", async () => { - const accounts = await pweb3.eth.getAccounts(); - const TestContract = pweb3.eth.contract(ABI); - - const test = await TestContract.new({ - data: `0x${CONTRACT_BYTECODE}`, - from: accounts[0], - gas: 456789, - }); - - await test.nonConstantFunction({ from: accounts[0] }); - - assert.equal(await test.constantFunction(), 1); - }); - - it("Should give the same result as calling web3 but promisified", (done) => { - web3.eth.getAccounts((error: Error | null, expectedAccounts?: string[]) => { - const promise = pweb3.eth.getAccounts(); - assert.instanceOf(promise, Promise); - promise - .then( - (actualAccounts: string[]) => - assert.deepEqual(actualAccounts, expectedAccounts), - (_pweb3Error: Error) => assert.instanceOf(error, Error) - ) - .then(done); - }); - }); -}); diff --git a/packages/hardhat-web3-legacy/test/web3-provider-adapter.ts b/packages/hardhat-web3-legacy/test/web3-provider-adapter.ts deleted file mode 100644 index d38aded886b..00000000000 --- a/packages/hardhat-web3-legacy/test/web3-provider-adapter.ts +++ /dev/null @@ -1,155 +0,0 @@ -/* eslint-disable @typescript-eslint/strict-boolean-expressions */ -import { assert } from "chai"; -import Web3 from "web3"; - -import { - JsonRpcRequest, - JsonRpcResponse, - Web3HTTPProviderAdapter, -} from "../src/web3-provider-adapter"; - -import { useEnvironment } from "./helpers"; - -let nextId = 1; - -function createJsonRpcRequest( - method: string, - params: any[] = [] -): JsonRpcRequest { - return { - id: nextId++, - jsonrpc: "2.0", - method, - params, - }; -} - -describe("Web3 provider adapter", function () { - let realWeb3Provider: any; - let adaptedProvider: Web3HTTPProviderAdapter; - - useEnvironment("hardhat-project"); - - beforeEach(function () { - realWeb3Provider = new Web3.providers.HttpProvider("http://127.0.0.1:8545"); - adaptedProvider = new Web3HTTPProviderAdapter(this.env.network.provider); - - assert.isDefined(this.env.web3); - }); - - it("Should throw if send is called", async function () { - assert.throws( - () => adaptedProvider.send(), - "Synchronous requests are not supported, use pweb3 instead" - ); - - assert.throws( - () => adaptedProvider.send({ method: "asd" }), - `Trying to call RPC method asd, but synchronous requests are not supported, use pweb3 instead` - ); - }); - - it("Should always return true when isConnected is called", function () { - assert.isTrue(adaptedProvider.isConnected()); - }); - - it("Should return the same as the real provider for sigle requests", function (done) { - const request = createJsonRpcRequest("eth_accounts"); - realWeb3Provider.sendAsync( - request, - (error: Error | null, response?: JsonRpcResponse) => { - adaptedProvider.sendAsync(request, (error2, response2) => { - assert.deepEqual(error2, error); - assert.deepEqual(response2, response); - done(); - }); - } - ); - }); - - it("Should return the same as the real provider for batched requests", function (done) { - const requests = [ - createJsonRpcRequest("eth_accounts"), - createJsonRpcRequest("net_version"), - createJsonRpcRequest("eth_accounts"), - ]; - - realWeb3Provider.sendAsync( - requests, - (error: Error | null, response?: JsonRpcResponse[]) => { - adaptedProvider.sendAsync(requests, (error2, response2) => { - assert.deepEqual(error2, error); - assert.deepEqual(response2, response); - done(); - }); - } - ); - }); - - it("Should return the same on error", function (done) { - // We disable this test for RskJ - // See: https://github.com/rsksmart/rskj/issues/876 - this.env.network.provider - .send("web3_clientVersion") - .then((version) => { - if (version.includes("RskJ")) { - done(); - return; - } - - const request = createJsonRpcRequest("error_please"); - - realWeb3Provider.sendAsync( - request, - (error: Error | null, response?: JsonRpcResponse) => { - adaptedProvider.sendAsync(request, (error2, response2) => { - assert.deepEqual(error2, error); - assert.equal(response2!.error!.message, response!.error!.message); - done(); - }); - } - ); - }) - .then( - () => {}, - () => {} - ); - }); - - it("Should let all requests complete, even if one of them fails", function (done) { - const requests = [ - createJsonRpcRequest("eth_accounts"), - createJsonRpcRequest("error_please"), - createJsonRpcRequest("eth_accounts"), - ]; - - realWeb3Provider.sendAsync( - requests, - (error: Error | null, response?: JsonRpcResponse[]) => { - adaptedProvider.sendAsync(requests, (error2, response2) => { - assert.deepEqual(error2, error); - assert.deepEqual(response2![0], response![0]); - - // Ganache doesn't return a value for requests after the failing one, - // so we don't either. Otherwise, this should be tested. - // assert.lengthOf(response2!, response!.length); - // assert.isUndefined(responseFromAdapted![2]);![2]); - - // We disable this test for RskJ - // See: https://github.com/rsksmart/rskj/issues/876 - this.env.network.provider - .send("web3_clientVersion") - .then((version) => { - if (version.includes("RskJ")) { - assert.equal( - response2![1].error!.message, - response![1].error!.message - ); - } - }) - .then(done, done); - }); - } - ); - }); -}); diff --git a/packages/hardhat-web3-legacy/web3-lazy-object-tests/when-accessing-web3-class.js b/packages/hardhat-web3-legacy/web3-lazy-object-tests/when-accessing-web3-class.js deleted file mode 100644 index 55a00a38258..00000000000 --- a/packages/hardhat-web3-legacy/web3-lazy-object-tests/when-accessing-web3-class.js +++ /dev/null @@ -1,6 +0,0 @@ -const { lazyFunction, lazyObject } = require("hardhat/plugins"); - -global.Web3 = lazyFunction(() => require("web3")); -global.web3 = lazyObject(() => new global.Web3()); - -console.log(Web3.providers.HttpProvider.name); diff --git a/packages/hardhat-web3-legacy/web3-lazy-object-tests/when-accessing-web3-object.js b/packages/hardhat-web3-legacy/web3-lazy-object-tests/when-accessing-web3-object.js deleted file mode 100644 index 6160b1fcedf..00000000000 --- a/packages/hardhat-web3-legacy/web3-lazy-object-tests/when-accessing-web3-object.js +++ /dev/null @@ -1,6 +0,0 @@ -const { lazyFunction, lazyObject } = require("hardhat/plugins"); - -global.Web3 = lazyFunction(() => require("web3")); -global.web3 = lazyObject(() => new global.Web3()); - -console.log(global.web3.eth.getAccounts.name); diff --git a/packages/hardhat-toolbox/.eslintrc.js b/packages/hardhat-web3-v4/.eslintrc.js similarity index 100% rename from packages/hardhat-toolbox/.eslintrc.js rename to packages/hardhat-web3-v4/.eslintrc.js diff --git a/packages/hardhat-web3-v4/.gitignore b/packages/hardhat-web3-v4/.gitignore new file mode 100644 index 00000000000..bc1256a4fea --- /dev/null +++ b/packages/hardhat-web3-v4/.gitignore @@ -0,0 +1,97 @@ +# Node modules +/node_modules + +# Compilation output +/build-test/ +/dist + +# Code coverage artifacts +/coverage +/.nyc_output + +# Below is Github's node gitignore template, +# ignoring the node_modules part, as it'd ignore every node_modules, and we have some for testing + +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +lerna-debug.log* + +# Diagnostic reports (https://nodejs.org/api/report.html) +report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +#node_modules/ +jspm_packages/ + +# TypeScript v1 declaration files +typings/ + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# parcel-bundler cache (https://parceljs.org/) +.cache + +# next.js build output +.next + +# nuxt.js build output +.nuxt + +# vuepress build output +.vuepress/dist + +# Serverless directories +.serverless/ + +# FuseBox cache +.fusebox/ + +# DynamoDB Local files +.dynamodb/ + +artifacts +cache \ No newline at end of file diff --git a/packages/hardhat-web3-v4/.mocharc.json b/packages/hardhat-web3-v4/.mocharc.json new file mode 100644 index 00000000000..901e40db33b --- /dev/null +++ b/packages/hardhat-web3-v4/.mocharc.json @@ -0,0 +1,6 @@ +{ + "require": "ts-node/register/files", + "file": "../common/run-with-hardhat.js", + "ignore": ["test/fixture-projects/**/*"], + "timeout": 10000 +} diff --git a/packages/hardhat-web3-legacy/.prettierignore b/packages/hardhat-web3-v4/.prettierignore similarity index 100% rename from packages/hardhat-web3-legacy/.prettierignore rename to packages/hardhat-web3-v4/.prettierignore diff --git a/packages/hardhat-web3-v4/LICENSE b/packages/hardhat-web3-v4/LICENSE new file mode 100644 index 00000000000..3b7e8c7eabb --- /dev/null +++ b/packages/hardhat-web3-v4/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2023 Nomic Foundation + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/packages/hardhat-web3-v4/README.md b/packages/hardhat-web3-v4/README.md new file mode 100644 index 00000000000..8000c9443a5 --- /dev/null +++ b/packages/hardhat-web3-v4/README.md @@ -0,0 +1,59 @@ +[![npm](https://img.shields.io/npm/v/@nomicfoundation/hardhat-web3-v4.svg)](https://www.npmjs.com/package/@nomicfoundation/hardhat-web3-v4) [![hardhat](https://hardhat.org/buidler-plugin-badge.svg?1)](https://hardhat.org) + +# hardhat-web3-v4 + +_This plugin is a collaboration between the Nomic Foundation and [ChainSafe](https://chainsafe.io/)_ + +Integrate [Web3.js](https://github.com/ethereum/web3.js) `4.x` into [Hardhat](https://hardhat.org). + +## What + +This plugin brings to Hardhat the Web3 module and an initialized instance of Web3. + +# Installation + +```bash +npm install --save-dev @nomicfoundation/hardhat-web3-v4 'web3@4' +``` + +And add the following statement to your `hardhat.config.js`: + +```js +require("@nomicfoundation/hardhat-web3-v4"); +``` + +Or, if you are using TypeScript, add this to your `hardhat.config.ts`: + +```js +import "@nomifoundation/hardhat-web3-v4"; +``` + +By default, contract invocations will not be typesafe. Consider installing [@chainsafe/hardhat-ts-artifact-plugin](https://www.npmjs.com/package/@chainsafe/hardhat-ts-artifact-plugin) to obtain available contract methods and events. Read more about inferring types [here](https://docs.web3js.org/guides/smart_contracts/infer_contract_types_guide/). + +## Tasks + +This plugin creates no additional tasks. + +## Environment extensions + +This plugin adds the following elements to the `HardhatRuntimeEnvironment`: + +- `Web3`: The Web3.js module. +- `web3`: An instantiated Web3.js object connected to the selected network. + +## Usage + +Install it and access Web3.js through the Hardhat Runtime Environment anywhere you need it (tasks, scripts, tests, etc). For example, in your `hardhat.config.js`: + +```js +require("@nomicfoundation/hardhat-web3-v4"); + +// task action function receives the Hardhat Runtime Environment as second argument +task("accounts", "Prints accounts", async (_, { web3 }) => { + console.log(await web3.eth.getAccounts()); +}); +``` + +And then run `npx hardhat accounts` to try it. + +Read the documentation on the [Hardhat Runtime Environment](https://hardhat.org/hardhat-runner/docs/advanced/hardhat-runtime-environment) to learn how to access the HRE in different ways to use Web3.js from anywhere the HRE is accessible. diff --git a/packages/hardhat-web3-v4/package.json b/packages/hardhat-web3-v4/package.json new file mode 100644 index 00000000000..1febcbaffeb --- /dev/null +++ b/packages/hardhat-web3-v4/package.json @@ -0,0 +1,63 @@ +{ + "name": "@nomicfoundation/hardhat-web3-v4", + "version": "1.0.0", + "author": "Nomic Foundation", + "license": "MIT", + "homepage": "https://github.com/nomicfoundation/hardhat/tree/main/packages/hardhat-web3-v4", + "repository": "github:nomicfoundation/hardhat", + "main": "dist/src/index.js", + "types": "dist/src/index.d.ts", + "description": "Hardhat plugin for using Web3 4.x", + "keywords": [ + "ethereum", + "smart-contracts", + "hardhat", + "hardhat-plugin", + "web3", + "web3.js" + ], + "scripts": { + "lint": "pnpm prettier --check && pnpm eslint", + "lint:fix": "pnpm prettier --write && pnpm eslint --fix", + "eslint": "eslint 'src/**/*.ts' 'test/**/*.ts'", + "prettier": "prettier \"**/*.{js,md,json}\"", + "test": "mocha --recursive \"test/**/*.ts\" --exit && node web3-lazy-object-tests/when-accessing-web3-class.js && node web3-lazy-object-tests/when-accessing-web3-object.js && node web3-lazy-object-tests/when-requiring-web3-module.js", + "build": "tsc --build .", + "prepublishOnly": "pnpm build", + "clean": "rimraf dist" + }, + "files": [ + "dist/src/", + "src/", + "LICENSE", + "README.md" + ], + "devDependencies": { + "@nomicfoundation/eslint-plugin-hardhat-internal-rules": "workspace:^", + "@nomicfoundation/eslint-plugin-slow-imports": "workspace:^", + "@types/chai": "^4.2.0", + "@types/chai-as-promised": "^7.1.3", + "@types/mocha": ">=9.1.0", + "@types/node": "^16.0.0", + "@typescript-eslint/eslint-plugin": "5.61.0", + "@typescript-eslint/parser": "5.61.0", + "chai": "^4.2.0", + "chai-as-promised": "^7.1.1", + "eslint": "^8.44.0", + "eslint-config-prettier": "8.3.0", + "eslint-plugin-import": "2.27.5", + "eslint-plugin-no-only-tests": "3.0.0", + "eslint-plugin-prettier": "3.4.0", + "hardhat": "workspace:^2.0.0", + "mocha": "^10.0.0", + "prettier": "2.4.1", + "rimraf": "^3.0.2", + "ts-node": "^10.8.0", + "typescript": "~5.0.0", + "web3": "^4.0.1" + }, + "peerDependencies": { + "hardhat": "^2.0.0", + "web3": "^4.0.1" + } +} diff --git a/packages/hardhat-web3-v4/src/index.ts b/packages/hardhat-web3-v4/src/index.ts new file mode 100644 index 00000000000..4b27f5bb174 --- /dev/null +++ b/packages/hardhat-web3-v4/src/index.ts @@ -0,0 +1,12 @@ +import { extendEnvironment } from "hardhat/config"; +import { lazyFunction, lazyObject } from "hardhat/plugins"; + +import "./type-extensions"; + +extendEnvironment((env) => { + env.Web3 = lazyFunction(() => require("web3").Web3); + env.web3 = lazyObject(() => { + const Web3 = require("web3").Web3; + return new Web3(env.network.provider); + }); +}); diff --git a/packages/hardhat-web3-v4/src/type-extensions.ts b/packages/hardhat-web3-v4/src/type-extensions.ts new file mode 100644 index 00000000000..4353372f1a7 --- /dev/null +++ b/packages/hardhat-web3-v4/src/type-extensions.ts @@ -0,0 +1,10 @@ +import type * as Web3 from "web3"; + +import "hardhat/types/runtime"; + +declare module "hardhat/types/runtime" { + interface HardhatRuntimeEnvironment { + Web3: typeof Web3; + web3: Web3.Web3; + } +} diff --git a/packages/hardhat-web3/test/.eslintrc.js b/packages/hardhat-web3-v4/test/.eslintrc.js similarity index 100% rename from packages/hardhat-web3/test/.eslintrc.js rename to packages/hardhat-web3-v4/test/.eslintrc.js diff --git a/packages/hardhat-web3-v4/test/fixture-projects/hardhat-project/contracts/Greeter.sol b/packages/hardhat-web3-v4/test/fixture-projects/hardhat-project/contracts/Greeter.sol new file mode 100644 index 00000000000..d7c9b9490cf --- /dev/null +++ b/packages/hardhat-web3-v4/test/fixture-projects/hardhat-project/contracts/Greeter.sol @@ -0,0 +1,22 @@ +pragma solidity ^0.5.1; + +contract Greeter { + + string greeting; + + event GreetingUpdated(string greeting); + + constructor() public { + greeting = "Hi"; + } + + function setGreeting(string memory _greeting) public { + greeting = _greeting; + emit GreetingUpdated(_greeting); + } + + function greet() public view returns (string memory) { + return greeting; + } + +} diff --git a/packages/hardhat-web3-v4/test/fixture-projects/hardhat-project/hardhat.config.js b/packages/hardhat-web3-v4/test/fixture-projects/hardhat-project/hardhat.config.js new file mode 100644 index 00000000000..d851e726c88 --- /dev/null +++ b/packages/hardhat-web3-v4/test/fixture-projects/hardhat-project/hardhat.config.js @@ -0,0 +1,5 @@ +require("../../../src/index"); + +module.exports = { + solidity: "0.5.15", +}; diff --git a/packages/hardhat-web3-v4/test/helpers.ts b/packages/hardhat-web3-v4/test/helpers.ts new file mode 100644 index 00000000000..c3781481eed --- /dev/null +++ b/packages/hardhat-web3-v4/test/helpers.ts @@ -0,0 +1,27 @@ +import { resetHardhatContext } from "hardhat/plugins-testing"; +import { HardhatRuntimeEnvironment } from "hardhat/types"; +import { TASK_COMPILE } from "hardhat/builtin-tasks/task-names"; +import path from "path"; + +declare module "mocha" { + interface Context { + env: HardhatRuntimeEnvironment; + } +} + +export function useEnvironment( + fixtureProjectName: string, + networkName = "localhost" +) { + beforeEach("Loading hardhat environment", async function () { + process.chdir(path.join(__dirname, "fixture-projects", fixtureProjectName)); + process.env.HARDHAT_NETWORK = networkName; + + this.env = require("hardhat"); + await this.env.run(TASK_COMPILE); + }); + + afterEach("Resetting hardhat", function () { + resetHardhatContext(); + }); +} diff --git a/packages/hardhat-web3-v4/test/index.ts b/packages/hardhat-web3-v4/test/index.ts new file mode 100644 index 00000000000..6488c6ddb22 --- /dev/null +++ b/packages/hardhat-web3-v4/test/index.ts @@ -0,0 +1,47 @@ +import chai from "chai"; +import chaiAsPromised from "chai-as-promised"; + +import { Contract } from "web3"; +import { useEnvironment } from "./helpers"; + +chai.use(chaiAsPromised); + +describe("Web3 plugin", function () { + describe("ganache", function () { + useEnvironment("hardhat-project", "localhost"); + + describe("contracts", function () { + it("should deploy", async function () { + const artifact = this.env.artifacts.readArtifactSync("Greeter"); + const Greeter = new Contract(artifact.abi, this.env.web3); + const response = Greeter.deploy({ + data: artifact.bytecode, + }).send({ + from: (await this.env.web3.eth.getAccounts())[0], + }); + await new Promise((resolve) => + response.on("receipt", () => resolve()) + ); + }); + }); + }); + describe("hardhat", function () { + useEnvironment("hardhat-project", "hardhat"); + + describe("contract", function () { + it("should deploy", async function () { + const artifact = this.env.artifacts.readArtifactSync("Greeter"); + const Greeter = new Contract(artifact.abi, this.env.web3); + const from = (await this.env.web3.eth.getAccounts())[0]; + const response = Greeter.deploy({ + data: artifact.bytecode, + }).send({ + from, + }); + await new Promise((resolve) => + response.on("receipt", () => resolve()) + ); + }); + }); + }); +}); diff --git a/packages/hardhat-web3/tsconfig.json b/packages/hardhat-web3-v4/tsconfig.json similarity index 100% rename from packages/hardhat-web3/tsconfig.json rename to packages/hardhat-web3-v4/tsconfig.json diff --git a/packages/hardhat-web3-v4/web3-lazy-object-tests/when-accessing-web3-class.js b/packages/hardhat-web3-v4/web3-lazy-object-tests/when-accessing-web3-class.js new file mode 100644 index 00000000000..83656c3640f --- /dev/null +++ b/packages/hardhat-web3-v4/web3-lazy-object-tests/when-accessing-web3-class.js @@ -0,0 +1,6 @@ +const { lazyFunction, lazyObject } = require("hardhat/plugins"); + +global.Web3 = lazyFunction(() => require("web3").Web3); +global.web3 = lazyObject(() => new global.Web3()); + +console.log(Web3.version); diff --git a/packages/hardhat-web3-v4/web3-lazy-object-tests/when-accessing-web3-object.js b/packages/hardhat-web3-v4/web3-lazy-object-tests/when-accessing-web3-object.js new file mode 100644 index 00000000000..82d7f4a09f5 --- /dev/null +++ b/packages/hardhat-web3-v4/web3-lazy-object-tests/when-accessing-web3-object.js @@ -0,0 +1,6 @@ +const { lazyFunction, lazyObject } = require("hardhat/plugins"); + +global.Web3 = lazyFunction(() => require("web3").Web3); +global.web3 = lazyObject(() => new global.Web3()); + +console.log(global.web3.eth.getAccounts.name); diff --git a/packages/hardhat-web3-legacy/web3-lazy-object-tests/when-requiring-web3-module.js b/packages/hardhat-web3-v4/web3-lazy-object-tests/when-requiring-web3-module.js similarity index 100% rename from packages/hardhat-web3-legacy/web3-lazy-object-tests/when-requiring-web3-module.js rename to packages/hardhat-web3-v4/web3-lazy-object-tests/when-requiring-web3-module.js diff --git a/packages/hardhat-web3/.eslintrc.js b/packages/hardhat-web3/.eslintrc.js deleted file mode 100644 index 889740f226d..00000000000 --- a/packages/hardhat-web3/.eslintrc.js +++ /dev/null @@ -1,7 +0,0 @@ -module.exports = { - extends: [`${__dirname}/../../config/eslint/eslintrc.js`], - parserOptions: { - project: `${__dirname}/tsconfig.json`, - sourceType: "module", - }, -}; diff --git a/packages/hardhat-web3/.gitignore b/packages/hardhat-web3/.gitignore index c00d7e72963..4aca21f18d7 100644 --- a/packages/hardhat-web3/.gitignore +++ b/packages/hardhat-web3/.gitignore @@ -15,10 +15,6 @@ # Logs logs *.log -npm-debug.log* -yarn-debug.log* -yarn-error.log* -lerna-debug.log* # Diagnostic reports (https://nodejs.org/api/report.html) report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json @@ -57,21 +53,15 @@ jspm_packages/ # TypeScript v1 declaration files typings/ -# Optional npm cache directory -.npm - # Optional eslint cache .eslintcache # Optional REPL history .node_repl_history -# Output of 'npm pack' +# Output of 'pnpm pack' *.tgz -# Yarn Integrity file -.yarn-integrity - # parcel-bundler cache (https://parceljs.org/) .cache diff --git a/packages/hardhat-web3/.mocharc.json b/packages/hardhat-web3/.mocharc.json deleted file mode 100644 index 775e35460dd..00000000000 --- a/packages/hardhat-web3/.mocharc.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "require": "ts-node/register/files", - "file": "../common/run-with-ganache", - "ignore": ["test/fixture-projects/**/*"], - "timeout": 10000 -} diff --git a/packages/hardhat-web3/.prettierignore b/packages/hardhat-web3/.prettierignore deleted file mode 100644 index 37cbd4e3f5a..00000000000 --- a/packages/hardhat-web3/.prettierignore +++ /dev/null @@ -1,5 +0,0 @@ -/node_modules -/dist -/test/fixture-projects/**/artifacts -/test/fixture-projects/**/cache -CHANGELOG.md diff --git a/packages/hardhat-web3/LICENSE b/packages/hardhat-web3/LICENSE index 3b8858c5558..3b7e8c7eabb 100644 --- a/packages/hardhat-web3/LICENSE +++ b/packages/hardhat-web3/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2019 Nomic Labs LLC +Copyright (c) 2023 Nomic Foundation Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/packages/hardhat-web3/README.md b/packages/hardhat-web3/README.md index 364e4950586..31125879361 100644 --- a/packages/hardhat-web3/README.md +++ b/packages/hardhat-web3/README.md @@ -11,7 +11,7 @@ This plugin brings to Hardhat the Web3 module and an initialized instance of Web # Installation ```bash -npm install --save-dev @nomiclabs/hardhat-web3 web3 +npm install --save-dev @nomiclabs/hardhat-web3 'web3@^1.0.0-beta.36' ``` And add the following statement to your `hardhat.config.js`: diff --git a/packages/hardhat-web3/package.json b/packages/hardhat-web3/package.json index 99ffc8bf248..51f3415268e 100644 --- a/packages/hardhat-web3/package.json +++ b/packages/hardhat-web3/package.json @@ -17,13 +17,14 @@ "web3.js" ], "scripts": { - "lint": "yarn prettier --check && yarn eslint", - "lint:fix": "yarn prettier --write && yarn eslint --fix", + "lint": "pnpm prettier --check && pnpm eslint", + "lint:fix": "pnpm prettier --write && pnpm eslint --fix", "eslint": "eslint 'src/**/*.ts' 'test/**/*.ts'", "prettier": "prettier \"**/*.{js,md,json}\"", + "pretest": "cd ../.. && pnpm build", "test": "mocha --recursive \"test/**/*.ts\" --exit && node web3-lazy-object-tests/when-accessing-web3-class.js && node web3-lazy-object-tests/when-accessing-web3-object.js && node web3-lazy-object-tests/when-requiring-web3-module.js", "build": "tsc --build .", - "prepublishOnly": "yarn build", + "prepublishOnly": "pnpm build", "clean": "rimraf dist" }, "files": [ @@ -33,23 +34,26 @@ "README.md" ], "devDependencies": { + "@nomicfoundation/eslint-plugin-hardhat-internal-rules": "workspace:^", + "@nomicfoundation/eslint-plugin-slow-imports": "workspace:^", "@types/chai": "^4.2.0", "@types/mocha": ">=9.1.0", - "@types/node": "^14.0.0", - "@typescript-eslint/eslint-plugin": "5.53.0", - "@typescript-eslint/parser": "5.53.0", + "@types/node": "^16.0.0", + "@typescript-eslint/eslint-plugin": "5.61.0", + "@typescript-eslint/parser": "5.61.0", "chai": "^4.2.0", - "eslint": "^7.29.0", + "eslint": "^8.44.0", "eslint-config-prettier": "8.3.0", - "eslint-plugin-import": "2.24.1", + "eslint-plugin-import": "2.27.5", "eslint-plugin-no-only-tests": "3.0.0", "eslint-plugin-prettier": "3.4.0", - "hardhat": "^2.0.0", + "hardhat": "workspace:^2.0.0", "mocha": "^10.0.0", "prettier": "2.4.1", "rimraf": "^3.0.2", + "sha3": "^2.1.4", "ts-node": "^10.8.0", - "typescript": "~4.7.4", + "typescript": "~5.0.0", "web3": "^1.0.0-beta.36" }, "peerDependencies": { diff --git a/packages/hardhat-web3/src/index.ts b/packages/hardhat-web3/src/index.ts deleted file mode 100644 index 66519fe9f87..00000000000 --- a/packages/hardhat-web3/src/index.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { extendEnvironment } from "hardhat/config"; -import { lazyFunction, lazyObject } from "hardhat/plugins"; - -import "./type-extensions"; -import { Web3HTTPProviderAdapter } from "./web3-provider-adapter"; - -extendEnvironment((env) => { - env.Web3 = lazyFunction(() => require("web3")); - env.web3 = lazyObject(() => { - const Web3 = require("web3"); - return new Web3(new Web3HTTPProviderAdapter(env.network.provider)); - }); -}); diff --git a/packages/hardhat-web3/src/type-extensions.ts b/packages/hardhat-web3/src/type-extensions.ts deleted file mode 100644 index af8c9558bb4..00000000000 --- a/packages/hardhat-web3/src/type-extensions.ts +++ /dev/null @@ -1,10 +0,0 @@ -import type Web3 from "web3"; - -import "hardhat/types/runtime"; - -declare module "hardhat/types/runtime" { - interface HardhatRuntimeEnvironment { - Web3: typeof Web3; - web3: Web3; - } -} diff --git a/packages/hardhat-web3/src/web3-provider-adapter.ts b/packages/hardhat-web3/src/web3-provider-adapter.ts deleted file mode 100644 index d76c9abbd26..00000000000 --- a/packages/hardhat-web3/src/web3-provider-adapter.ts +++ /dev/null @@ -1,102 +0,0 @@ -import { EthereumProvider } from "hardhat/types"; -import util from "util"; - -export interface JsonRpcRequest { - jsonrpc: string; - method: string; - params: any[]; - id: number; -} - -export interface JsonRpcResponse { - jsonrpc: string; - id: number; - result?: any; - error?: { - code: number; - message: string; - data?: any; - }; -} - -export class Web3HTTPProviderAdapter { - private readonly _provider: EthereumProvider; - - constructor(provider: EthereumProvider) { - this._provider = provider; - // We bind everything here because some test suits break otherwise - this.send = this.send.bind(this) as any; - this.isConnected = this.isConnected.bind(this) as any; - this._sendJsonRpcRequest = this._sendJsonRpcRequest.bind(this) as any; - } - - public send( - payload: JsonRpcRequest, - callback: (error: Error | null, response?: JsonRpcResponse) => void - ): void; - public send( - payload: JsonRpcRequest[], - callback: (error: Error | null, response?: JsonRpcResponse[]) => void - ): void; - public send( - payload: JsonRpcRequest | JsonRpcRequest[], - callback: (error: Error | null, response?: any) => void - ): void { - if (!Array.isArray(payload)) { - util.callbackify(() => this._sendJsonRpcRequest(payload))(callback); - return; - } - - util.callbackify(async () => { - const responses: JsonRpcResponse[] = []; - - for (const request of payload) { - const response = await this._sendJsonRpcRequest(request); - - responses.push(response); - - if (response.error !== undefined) { - break; - } - } - - return responses; - })(callback); - } - - public isConnected(): boolean { - return true; - } - - private async _sendJsonRpcRequest( - request: JsonRpcRequest - ): Promise { - const response: JsonRpcResponse = { - id: request.id, - jsonrpc: "2.0", - }; - - try { - const result = await this._provider.send(request.method, request.params); - response.result = result; - } catch (error: any) { - if (error.code === undefined) { - throw error; - } - - response.error = { - // This might be a mistake, but I'm leaving it as is just in case, - // because it's not obvious what we should do here. - // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions - code: error.code ? +error.code : 404, - message: error.message, - data: { - stack: error.stack, - name: error.name, - }, - }; - } - - return response; - } -} diff --git a/packages/hardhat-web3/test/helpers.ts b/packages/hardhat-web3/test/helpers.ts deleted file mode 100644 index 394785e4001..00000000000 --- a/packages/hardhat-web3/test/helpers.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { resetHardhatContext } from "hardhat/plugins-testing"; -import { HardhatRuntimeEnvironment } from "hardhat/types"; -import path from "path"; - -declare module "mocha" { - interface Context { - env: HardhatRuntimeEnvironment; - } -} - -export function useEnvironment( - fixtureProjectName: string, - networkName = "localhost" -) { - beforeEach("Loading hardhat environment", function () { - process.chdir(path.join(__dirname, "fixture-projects", fixtureProjectName)); - process.env.HARDHAT_NETWORK = networkName; - - this.env = require("hardhat"); - }); - - afterEach("Resetting hardhat", function () { - resetHardhatContext(); - }); -} diff --git a/packages/hardhat-web3/test/web3-provider-adapter.ts b/packages/hardhat-web3/test/web3-provider-adapter.ts deleted file mode 100644 index 044142d49b4..00000000000 --- a/packages/hardhat-web3/test/web3-provider-adapter.ts +++ /dev/null @@ -1,145 +0,0 @@ -/* eslint-disable @typescript-eslint/strict-boolean-expressions */ -import { assert } from "chai"; -import Web3 from "web3"; - -import { - JsonRpcRequest, - JsonRpcResponse, - Web3HTTPProviderAdapter, -} from "../src/web3-provider-adapter"; - -import { useEnvironment } from "./helpers"; - -let nextId = 1; - -function createJsonRpcRequest( - method: string, - params: any[] = [] -): JsonRpcRequest { - return { - id: nextId++, - jsonrpc: "2.0", - method, - params, - }; -} - -describe("Web3 provider adapter", function () { - let realWeb3Provider: any; - let adaptedProvider: Web3HTTPProviderAdapter; - - useEnvironment("hardhat-project"); - - beforeEach(function () { - realWeb3Provider = new Web3.providers.HttpProvider("http://127.0.0.1:8545"); - adaptedProvider = new Web3HTTPProviderAdapter(this.env.network.provider); - }); - - it("Should always return true when isConnected is called", function () { - assert.isTrue(adaptedProvider.isConnected()); - }); - - it("Should return the same as the real provider for sigle requests", function (done) { - const request = createJsonRpcRequest("eth_accounts"); - realWeb3Provider.send( - request, - (error: Error | null, response?: JsonRpcResponse) => { - adaptedProvider.send(request, (error2, response2) => { - assert.deepEqual(error2, error); - assert.deepEqual(response2, response); - done(); - }); - } - ); - }); - - it("Should return the same as the real provider for batched requests", function (done) { - const requests = [ - createJsonRpcRequest("eth_accounts"), - createJsonRpcRequest("net_version"), - createJsonRpcRequest("eth_accounts"), - ]; - - realWeb3Provider.send( - requests, - (error: Error | null, response?: JsonRpcResponse[]) => { - adaptedProvider.send(requests, (error2, response2) => { - assert.deepEqual(error2, error); - assert.deepEqual(response2, response); - done(); - }); - } - ); - }); - - it("Should return the same on error", function (done) { - // We disable this test for RskJ - // See: https://github.com/rsksmart/rskj/issues/876 - this.env.network.provider - .send("web3_clientVersion") - .then((version) => { - if (version.includes("RskJ")) { - done(); - return; - } - - const request = createJsonRpcRequest("error_please"); - - return realWeb3Provider.send( - request, - (error: Error | null, response?: JsonRpcResponse) => { - adaptedProvider.send(request, (error2, response2) => { - assert.deepEqual(error2, error); - assert.equal(response2!.error!.message, response!.error!.message); - done(); - }); - } - ); - }) - .then( - () => {}, - () => {} - ); - }); - - it("Should let all requests complete, even if one of them fails", function (done) { - const requests = [ - createJsonRpcRequest("eth_accounts"), - createJsonRpcRequest("error_please"), - createJsonRpcRequest("eth_accounts"), - ]; - - realWeb3Provider.send( - requests, - (error: Error | null, response?: JsonRpcResponse[]) => { - adaptedProvider.send(requests, (error2, response2) => { - assert.deepEqual(error2, error); - assert.deepEqual(response2![0], response![0]); - assert.equal( - response2![1].error!.message, - response![1].error!.message - ); - - // Ganache doesn't return a value for requests after the failing one, - // so we don't either. Otherwise, this should be tested. - // assert.lengthOf(response2!, response!.length); - // assert.isUndefined(responseFromAdapted![2]);![2]); - - // We disable this test for RskJ - // See: https://github.com/rsksmart/rskj/issues/876 - this.env.network.provider - .send("web3_clientVersion") - .then((version) => { - if (version.includes("RskJ")) { - assert.equal( - response2![1].error!.message, - response![1].error!.message - ); - } - }) - .then(done, done); - }); - } - ); - }); -}); diff --git a/packages/hardhat-web3/web3-lazy-object-tests/when-accessing-web3-class.js b/packages/hardhat-web3/web3-lazy-object-tests/when-accessing-web3-class.js deleted file mode 100644 index 08adc79cd1d..00000000000 --- a/packages/hardhat-web3/web3-lazy-object-tests/when-accessing-web3-class.js +++ /dev/null @@ -1,6 +0,0 @@ -const { lazyFunction, lazyObject } = require("hardhat/plugins"); - -global.Web3 = lazyFunction(() => require("web3")); -global.web3 = lazyObject(() => new global.Web3()); - -console.log(Web3.version); diff --git a/packages/hardhat-web3/web3-lazy-object-tests/when-accessing-web3-object.js b/packages/hardhat-web3/web3-lazy-object-tests/when-accessing-web3-object.js deleted file mode 100644 index 6160b1fcedf..00000000000 --- a/packages/hardhat-web3/web3-lazy-object-tests/when-accessing-web3-object.js +++ /dev/null @@ -1,6 +0,0 @@ -const { lazyFunction, lazyObject } = require("hardhat/plugins"); - -global.Web3 = lazyFunction(() => require("web3")); -global.web3 = lazyObject(() => new global.Web3()); - -console.log(global.web3.eth.getAccounts.name); diff --git a/packages/hardhat-web3/web3-lazy-object-tests/when-requiring-web3-module.js b/packages/hardhat-web3/web3-lazy-object-tests/when-requiring-web3-module.js deleted file mode 100644 index 94e7a659436..00000000000 --- a/packages/hardhat-web3/web3-lazy-object-tests/when-requiring-web3-module.js +++ /dev/null @@ -1,6 +0,0 @@ -const { lazyFunction, lazyObject } = require("hardhat/plugins"); - -global.Web3 = lazyFunction(() => require("web3")); -global.web3 = lazyObject(() => new global.Web3()); - -require("web3"); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 00000000000..cc41f0f776a --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,12025 @@ +lockfileVersion: '6.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + devDependencies: + '@changesets/cli': + specifier: ^2.16.0 + version: 2.26.2 + hardhat: + specifier: workspace:* + version: link:packages/hardhat-core + prettier: + specifier: 2.4.1 + version: 2.4.1 + shelljs: + specifier: ^0.8.5 + version: 0.8.5 + typescript: + specifier: ~5.0.0 + version: 5.0.4 + + packages/common: + devDependencies: + detect-port: + specifier: ^1.3.0 + version: 1.5.1 + ganache-cli: + specifier: ^6.12.2 + version: 6.12.2 + prettier: + specifier: 2.4.1 + version: 2.4.1 + + packages/eslint-plugin-hardhat-internal-rules: + dependencies: + '@typescript-eslint/utils': + specifier: ^5.61.0 + version: 5.61.0(eslint@8.47.0)(typescript@5.0.4) + requireindex: + specifier: ^1.2.0 + version: 1.2.0 + devDependencies: + eslint: + specifier: ^8.44.0 + version: 8.47.0 + eslint-config-prettier: + specifier: 8.3.0 + version: 8.3.0(eslint@8.47.0) + eslint-doc-generator: + specifier: ^1.0.0 + version: 1.4.3(eslint@8.47.0)(typescript@5.0.4) + eslint-plugin-eslint-plugin: + specifier: ^5.0.0 + version: 5.1.1(eslint@8.47.0) + eslint-plugin-node: + specifier: ^11.1.0 + version: 11.1.0(eslint@8.47.0) + eslint-plugin-prettier: + specifier: 3.4.0 + version: 3.4.0(eslint-config-prettier@8.3.0)(eslint@8.47.0)(prettier@2.4.1) + mocha: + specifier: ^10.0.0 + version: 10.2.0 + + packages/eslint-plugin-slow-imports: + dependencies: + eslint-module-utils: + specifier: ^2.8.0 + version: 2.8.0(@typescript-eslint/parser@5.61.0)(eslint-import-resolver-node@0.3.9)(eslint@8.47.0) + requireindex: + specifier: ^1.2.0 + version: 1.2.0 + devDependencies: + eslint: + specifier: ^8.44.0 + version: 8.47.0 + eslint-config-prettier: + specifier: 8.3.0 + version: 8.3.0(eslint@8.47.0) + eslint-doc-generator: + specifier: ^1.0.0 + version: 1.4.3(eslint@8.47.0)(typescript@5.0.4) + eslint-plugin-eslint-plugin: + specifier: ^5.0.0 + version: 5.1.1(eslint@8.47.0) + eslint-plugin-node: + specifier: ^11.1.0 + version: 11.1.0(eslint@8.47.0) + mocha: + specifier: ^10.0.0 + version: 10.2.0 + + packages/hardhat-chai-matchers: + dependencies: + '@types/chai-as-promised': + specifier: ^7.1.3 + version: 7.1.5 + chai-as-promised: + specifier: ^7.1.1 + version: 7.1.1(chai@4.3.7) + deep-eql: + specifier: ^4.0.1 + version: 4.1.3 + ordinal: + specifier: ^1.0.3 + version: 1.0.3 + devDependencies: + '@nomicfoundation/eslint-plugin-hardhat-internal-rules': + specifier: workspace:^ + version: link:../eslint-plugin-hardhat-internal-rules + '@nomicfoundation/eslint-plugin-slow-imports': + specifier: workspace:^ + version: link:../eslint-plugin-slow-imports + '@nomicfoundation/hardhat-chai-matchers': + specifier: workspace:* + version: 'link:' + '@nomicfoundation/hardhat-ethers': + specifier: workspace:^3.0.0 + version: link:../hardhat-ethers + '@types/bn.js': + specifier: ^5.1.0 + version: 5.1.1 + '@types/chai': + specifier: ^4.2.0 + version: 4.3.5 + '@types/mocha': + specifier: '>=9.1.0' + version: 10.0.1 + '@types/node': + specifier: ^16.0.0 + version: 16.18.40 + '@typescript-eslint/eslint-plugin': + specifier: 5.61.0 + version: 5.61.0(@typescript-eslint/parser@5.61.0)(eslint@8.47.0)(typescript@5.0.4) + '@typescript-eslint/parser': + specifier: 5.61.0 + version: 5.61.0(eslint@8.47.0)(typescript@5.0.4) + bignumber.js: + specifier: ^9.0.2 + version: 9.1.1 + bn.js: + specifier: ^5.1.0 + version: 5.2.1 + chai: + specifier: ^4.2.0 + version: 4.3.7 + eslint: + specifier: ^8.44.0 + version: 8.47.0 + eslint-config-prettier: + specifier: 8.3.0 + version: 8.3.0(eslint@8.47.0) + eslint-plugin-import: + specifier: 2.27.5 + version: 2.27.5(@typescript-eslint/parser@5.61.0)(eslint@8.47.0) + eslint-plugin-no-only-tests: + specifier: 3.0.0 + version: 3.0.0 + eslint-plugin-prettier: + specifier: 3.4.0 + version: 3.4.0(eslint-config-prettier@8.3.0)(eslint@8.47.0)(prettier@2.4.1) + ethers: + specifier: ^6.1.0 + version: 6.7.0 + get-port: + specifier: ^5.1.1 + version: 5.1.1 + hardhat: + specifier: workspace:^2.9.4 + version: link:../hardhat-core + mocha: + specifier: ^10.0.0 + version: 10.2.0 + prettier: + specifier: 2.4.1 + version: 2.4.1 + rimraf: + specifier: ^3.0.2 + version: 3.0.2 + ts-node: + specifier: ^10.8.0 + version: 10.9.1(@types/node@16.18.40)(typescript@5.0.4) + typescript: + specifier: ~5.0.0 + version: 5.0.4 + + packages/hardhat-core: + dependencies: + '@ethersproject/abi': + specifier: ^5.1.2 + version: 5.7.0 + '@metamask/eth-sig-util': + specifier: ^4.0.0 + version: 4.0.1 + '@nomicfoundation/ethereumjs-block': + specifier: 5.0.2 + version: 5.0.2 + '@nomicfoundation/ethereumjs-blockchain': + specifier: 7.0.2 + version: 7.0.2 + '@nomicfoundation/ethereumjs-common': + specifier: 4.0.2 + version: 4.0.2 + '@nomicfoundation/ethereumjs-evm': + specifier: 2.0.2 + version: 2.0.2 + '@nomicfoundation/ethereumjs-rlp': + specifier: 5.0.2 + version: 5.0.2 + '@nomicfoundation/ethereumjs-statemanager': + specifier: 2.0.2 + version: 2.0.2 + '@nomicfoundation/ethereumjs-trie': + specifier: 6.0.2 + version: 6.0.2 + '@nomicfoundation/ethereumjs-tx': + specifier: 5.0.2 + version: 5.0.2 + '@nomicfoundation/ethereumjs-util': + specifier: 9.0.2 + version: 9.0.2 + '@nomicfoundation/ethereumjs-vm': + specifier: 7.0.2 + version: 7.0.2 + '@nomicfoundation/solidity-analyzer': + specifier: ^0.1.0 + version: 0.1.1 + '@sentry/node': + specifier: ^5.18.1 + version: 5.30.0 + '@types/bn.js': + specifier: ^5.1.0 + version: 5.1.1 + '@types/lru-cache': + specifier: ^5.1.0 + version: 5.1.1 + adm-zip: + specifier: ^0.4.16 + version: 0.4.16 + aggregate-error: + specifier: ^3.0.0 + version: 3.1.0 + ansi-escapes: + specifier: ^4.3.0 + version: 4.3.2 + boxen: + specifier: ^5.1.2 + version: 5.1.2 + chalk: + specifier: ^2.4.2 + version: 2.4.2 + chokidar: + specifier: ^3.4.0 + version: 3.5.3 + ci-info: + specifier: ^2.0.0 + version: 2.0.0 + debug: + specifier: ^4.1.1 + version: 4.3.4(supports-color@8.1.1) + enquirer: + specifier: ^2.3.0 + version: 2.4.1 + env-paths: + specifier: ^2.2.0 + version: 2.2.1 + ethereum-cryptography: + specifier: ^1.0.3 + version: 1.2.0 + ethereumjs-abi: + specifier: ^0.6.8 + version: 0.6.8 + find-up: + specifier: ^2.1.0 + version: 2.1.0 + fp-ts: + specifier: 1.19.3 + version: 1.19.3 + fs-extra: + specifier: ^7.0.1 + version: 7.0.1 + glob: + specifier: 7.2.0 + version: 7.2.0 + immutable: + specifier: ^4.0.0-rc.12 + version: 4.3.2 + io-ts: + specifier: 1.10.4 + version: 1.10.4 + keccak: + specifier: ^3.0.2 + version: 3.0.3 + lodash: + specifier: ^4.17.11 + version: 4.17.21 + mnemonist: + specifier: ^0.38.0 + version: 0.38.5 + mocha: + specifier: ^10.0.0 + version: 10.2.0 + p-map: + specifier: ^4.0.0 + version: 4.0.0 + raw-body: + specifier: ^2.4.1 + version: 2.5.1 + resolve: + specifier: 1.17.0 + version: 1.17.0 + semver: + specifier: ^6.3.0 + version: 6.3.1 + solc: + specifier: 0.7.3 + version: 0.7.3(debug@4.3.4) + source-map-support: + specifier: ^0.5.13 + version: 0.5.21 + stacktrace-parser: + specifier: ^0.1.10 + version: 0.1.10 + tsort: + specifier: 0.0.1 + version: 0.0.1 + undici: + specifier: ^5.14.0 + version: 5.23.0 + uuid: + specifier: ^8.3.2 + version: 8.3.2 + ws: + specifier: ^7.4.6 + version: 7.4.6 + devDependencies: + '@nomicfoundation/eslint-plugin-hardhat-internal-rules': + specifier: workspace:^ + version: link:../eslint-plugin-hardhat-internal-rules + '@nomicfoundation/eslint-plugin-slow-imports': + specifier: workspace:^ + version: link:../eslint-plugin-slow-imports + '@types/async-eventemitter': + specifier: ^0.2.1 + version: 0.2.1 + '@types/chai': + specifier: ^4.2.0 + version: 4.3.5 + '@types/chai-as-promised': + specifier: ^7.1.3 + version: 7.1.5 + '@types/ci-info': + specifier: ^2.0.0 + version: 2.0.0 + '@types/debug': + specifier: ^4.1.4 + version: 4.1.8 + '@types/find-up': + specifier: ^2.1.1 + version: 2.1.1 + '@types/fs-extra': + specifier: ^5.1.0 + version: 5.1.0 + '@types/glob': + specifier: ^7.1.1 + version: 7.2.0 + '@types/keccak': + specifier: ^3.0.1 + version: 3.0.1 + '@types/lodash': + specifier: ^4.14.123 + version: 4.14.197 + '@types/mocha': + specifier: '>=9.1.0' + version: 10.0.1 + '@types/node': + specifier: ^16.0.0 + version: 16.18.40 + '@types/resolve': + specifier: ^1.17.1 + version: 1.20.2 + '@types/semver': + specifier: ^6.0.2 + version: 6.2.3 + '@types/sinon': + specifier: ^9.0.8 + version: 9.0.11 + '@types/uuid': + specifier: ^8.3.1 + version: 8.3.4 + '@types/ws': + specifier: ^7.2.1 + version: 7.4.7 + '@typescript-eslint/eslint-plugin': + specifier: 5.61.0 + version: 5.61.0(@typescript-eslint/parser@5.61.0)(eslint@8.47.0)(typescript@5.0.4) + '@typescript-eslint/parser': + specifier: 5.61.0 + version: 5.61.0(eslint@8.47.0)(typescript@5.0.4) + bignumber.js: + specifier: ^9.0.2 + version: 9.1.1 + bn.js: + specifier: ^5.1.0 + version: 5.2.1 + chai: + specifier: ^4.2.0 + version: 4.3.7 + chai-as-promised: + specifier: ^7.1.1 + version: 7.1.1(chai@4.3.7) + eslint: + specifier: ^8.44.0 + version: 8.47.0 + eslint-config-prettier: + specifier: 8.3.0 + version: 8.3.0(eslint@8.47.0) + eslint-plugin-import: + specifier: 2.27.5 + version: 2.27.5(@typescript-eslint/parser@5.61.0)(eslint@8.47.0) + eslint-plugin-no-only-tests: + specifier: 3.0.0 + version: 3.0.0 + eslint-plugin-prettier: + specifier: 3.4.0 + version: 3.4.0(eslint-config-prettier@8.3.0)(eslint@8.47.0)(prettier@2.4.1) + ethers: + specifier: ^6.1.0 + version: 6.7.0 + ethers-v5: + specifier: npm:ethers@5 + version: /ethers@5.7.2 + prettier: + specifier: 2.4.1 + version: 2.4.1 + rimraf: + specifier: ^3.0.2 + version: 3.0.2 + sinon: + specifier: ^9.0.0 + version: 9.2.4 + time-require: + specifier: ^0.1.2 + version: 0.1.2 + ts-node: + specifier: ^10.8.0 + version: 10.9.1(@types/node@16.18.40)(typescript@5.0.4) + typescript: + specifier: ~5.0.0 + version: 5.0.4 + + packages/hardhat-ethers: + dependencies: + debug: + specifier: ^4.1.1 + version: 4.3.4(supports-color@8.1.1) + lodash.isequal: + specifier: ^4.5.0 + version: 4.5.0 + devDependencies: + '@nomicfoundation/eslint-plugin-hardhat-internal-rules': + specifier: workspace:^ + version: link:../eslint-plugin-hardhat-internal-rules + '@nomicfoundation/eslint-plugin-slow-imports': + specifier: workspace:^ + version: link:../eslint-plugin-slow-imports + '@types/chai': + specifier: ^4.2.0 + version: 4.3.5 + '@types/chai-as-promised': + specifier: ^7.1.3 + version: 7.1.5 + '@types/debug': + specifier: ^4.1.4 + version: 4.1.8 + '@types/lodash.isequal': + specifier: ^4.5.6 + version: 4.5.6 + '@types/mocha': + specifier: '>=9.1.0' + version: 10.0.1 + '@types/node': + specifier: ^16.0.0 + version: 16.18.40 + '@types/sinon': + specifier: ^9.0.8 + version: 9.0.11 + '@typescript-eslint/eslint-plugin': + specifier: 5.61.0 + version: 5.61.0(@typescript-eslint/parser@5.61.0)(eslint@8.47.0)(typescript@5.0.4) + '@typescript-eslint/parser': + specifier: 5.61.0 + version: 5.61.0(eslint@8.47.0)(typescript@5.0.4) + chai: + specifier: ^4.2.0 + version: 4.3.7 + chai-as-promised: + specifier: ^7.1.1 + version: 7.1.1(chai@4.3.7) + chalk: + specifier: ^2.4.2 + version: 2.4.2 + eslint: + specifier: ^8.44.0 + version: 8.47.0 + eslint-config-prettier: + specifier: 8.3.0 + version: 8.3.0(eslint@8.47.0) + eslint-plugin-import: + specifier: 2.27.5 + version: 2.27.5(@typescript-eslint/parser@5.61.0)(eslint@8.47.0) + eslint-plugin-no-only-tests: + specifier: 3.0.0 + version: 3.0.0 + eslint-plugin-prettier: + specifier: 3.4.0 + version: 3.4.0(eslint-config-prettier@8.3.0)(eslint@8.47.0)(prettier@2.4.1) + ethers: + specifier: ^6.1.0 + version: 6.7.0 + hardhat: + specifier: workspace:^2.0.0 + version: link:../hardhat-core + mocha: + specifier: ^10.0.0 + version: 10.2.0 + prettier: + specifier: 2.4.1 + version: 2.4.1 + rimraf: + specifier: ^3.0.2 + version: 3.0.2 + sinon: + specifier: ^9.0.0 + version: 9.2.4 + ts-node: + specifier: ^10.8.0 + version: 10.9.1(@types/node@16.18.40)(typescript@5.0.4) + typescript: + specifier: ~5.0.0 + version: 5.0.4 + + packages/hardhat-foundry: + dependencies: + chalk: + specifier: ^2.4.2 + version: 2.4.2 + devDependencies: + '@nomicfoundation/eslint-plugin-hardhat-internal-rules': + specifier: workspace:^ + version: link:../eslint-plugin-hardhat-internal-rules + '@nomicfoundation/eslint-plugin-slow-imports': + specifier: workspace:^ + version: link:../eslint-plugin-slow-imports + '@types/chai': + specifier: ^4.2.0 + version: 4.3.5 + '@types/mocha': + specifier: '>=9.1.0' + version: 10.0.1 + '@types/node': + specifier: ^16.0.0 + version: 16.18.40 + '@typescript-eslint/eslint-plugin': + specifier: 5.61.0 + version: 5.61.0(@typescript-eslint/parser@5.61.0)(eslint@8.47.0)(typescript@5.0.4) + '@typescript-eslint/parser': + specifier: 5.61.0 + version: 5.61.0(eslint@8.47.0)(typescript@5.0.4) + chai: + specifier: ^4.2.0 + version: 4.3.7 + eslint: + specifier: ^8.44.0 + version: 8.47.0 + eslint-config-prettier: + specifier: 8.3.0 + version: 8.3.0(eslint@8.47.0) + eslint-plugin-import: + specifier: 2.27.5 + version: 2.27.5(@typescript-eslint/parser@5.61.0)(eslint@8.47.0) + eslint-plugin-prettier: + specifier: 3.4.0 + version: 3.4.0(eslint-config-prettier@8.3.0)(eslint@8.47.0)(prettier@2.4.1) + hardhat: + specifier: workspace:^2.17.2 + version: link:../hardhat-core + mocha: + specifier: ^10.0.0 + version: 10.2.0 + prettier: + specifier: 2.4.1 + version: 2.4.1 + rimraf: + specifier: ^3.0.2 + version: 3.0.2 + ts-node: + specifier: ^10.8.0 + version: 10.9.1(@types/node@16.18.40)(typescript@5.0.4) + typescript: + specifier: ~5.0.0 + version: 5.0.4 + + packages/hardhat-ledger: + dependencies: + '@ledgerhq/errors': + specifier: ^6.12.6 + version: 6.12.6 + '@ledgerhq/hw-app-eth': + specifier: 6.33.6 + version: 6.33.6(debug@4.3.4) + '@ledgerhq/hw-transport': + specifier: ^6.28.4 + version: 6.28.4 + '@ledgerhq/hw-transport-node-hid': + specifier: ^6.27.13 + version: 6.27.13 + '@nomicfoundation/ethereumjs-util': + specifier: 9.0.2 + version: 9.0.2 + chalk: + specifier: ^2.4.2 + version: 2.4.2 + debug: + specifier: ^4.1.1 + version: 4.3.4(supports-color@8.1.1) + env-paths: + specifier: ^2.2.0 + version: 2.2.1 + ethers: + specifier: ^6.1.0 + version: 6.7.0 + fs-extra: + specifier: ^7.0.1 + version: 7.0.1 + io-ts: + specifier: 1.10.4 + version: 1.10.4 + ora: + specifier: ^5.4.1 + version: 5.4.1 + devDependencies: + '@nomicfoundation/eslint-plugin-hardhat-internal-rules': + specifier: workspace:^ + version: link:../eslint-plugin-hardhat-internal-rules + '@nomicfoundation/eslint-plugin-slow-imports': + specifier: workspace:^ + version: link:../eslint-plugin-slow-imports + '@types/chai': + specifier: ^4.2.0 + version: 4.3.5 + '@types/fs-extra': + specifier: ^5.1.0 + version: 5.1.0 + '@types/mocha': + specifier: '>=9.1.0' + version: 10.0.1 + '@types/node': + specifier: ^16.0.0 + version: 16.18.40 + '@types/sinon': + specifier: ^9.0.8 + version: 9.0.11 + '@typescript-eslint/eslint-plugin': + specifier: 5.61.0 + version: 5.61.0(@typescript-eslint/parser@5.61.0)(eslint@8.47.0)(typescript@5.0.4) + '@typescript-eslint/parser': + specifier: 5.61.0 + version: 5.61.0(eslint@8.47.0)(typescript@5.0.4) + chai: + specifier: ^4.2.0 + version: 4.3.7 + eslint: + specifier: ^8.44.0 + version: 8.47.0 + eslint-config-prettier: + specifier: 8.3.0 + version: 8.3.0(eslint@8.47.0) + eslint-plugin-import: + specifier: 2.27.5 + version: 2.27.5(@typescript-eslint/parser@5.61.0)(eslint@8.47.0) + eslint-plugin-no-only-tests: + specifier: 3.0.0 + version: 3.0.0 + eslint-plugin-prettier: + specifier: 3.4.0 + version: 3.4.0(eslint-config-prettier@8.3.0)(eslint@8.47.0)(prettier@2.4.1) + hardhat: + specifier: workspace:^2.16.0 + version: link:../hardhat-core + mocha: + specifier: ^10.0.0 + version: 10.2.0 + nyc: + specifier: ^15.1.0 + version: 15.1.0 + prettier: + specifier: 2.4.1 + version: 2.4.1 + rimraf: + specifier: ^3.0.2 + version: 3.0.2 + sinon: + specifier: ^9.0.0 + version: 9.2.4 + ts-node: + specifier: ^10.8.0 + version: 10.9.1(@types/node@16.18.40)(typescript@5.0.4) + typescript: + specifier: ~5.0.0 + version: 5.0.4 + + packages/hardhat-network-helpers: + dependencies: + ethereumjs-util: + specifier: ^7.1.4 + version: 7.1.4 + devDependencies: + '@nomicfoundation/eslint-plugin-hardhat-internal-rules': + specifier: workspace:^ + version: link:../eslint-plugin-hardhat-internal-rules + '@nomicfoundation/eslint-plugin-slow-imports': + specifier: workspace:^ + version: link:../eslint-plugin-slow-imports + '@types/chai': + specifier: ^4.2.0 + version: 4.3.5 + '@types/chai-as-promised': + specifier: ^7.1.3 + version: 7.1.5 + '@types/mocha': + specifier: '>=9.1.0' + version: 10.0.1 + '@types/node': + specifier: ^16.0.0 + version: 16.18.40 + '@typescript-eslint/eslint-plugin': + specifier: 5.61.0 + version: 5.61.0(@typescript-eslint/parser@5.61.0)(eslint@8.47.0)(typescript@5.0.4) + '@typescript-eslint/parser': + specifier: 5.61.0 + version: 5.61.0(eslint@8.47.0)(typescript@5.0.4) + chai: + specifier: ^4.2.0 + version: 4.3.7 + chai-as-promised: + specifier: ^7.1.1 + version: 7.1.1(chai@4.3.7) + eslint: + specifier: ^8.44.0 + version: 8.47.0 + eslint-config-prettier: + specifier: 8.3.0 + version: 8.3.0(eslint@8.47.0) + eslint-plugin-import: + specifier: 2.27.5 + version: 2.27.5(@typescript-eslint/parser@5.61.0)(eslint@8.47.0) + eslint-plugin-no-only-tests: + specifier: 3.0.0 + version: 3.0.0 + eslint-plugin-prettier: + specifier: 3.4.0 + version: 3.4.0(eslint-config-prettier@8.3.0)(eslint@8.47.0)(prettier@2.4.1) + ethers-v5: + specifier: npm:ethers@5 + version: /ethers@5.7.2 + hardhat: + specifier: workspace:^2.9.5 + version: link:../hardhat-core + mocha: + specifier: ^10.0.0 + version: 10.2.0 + prettier: + specifier: 2.4.1 + version: 2.4.1 + rimraf: + specifier: ^3.0.2 + version: 3.0.2 + ts-node: + specifier: ^10.8.0 + version: 10.9.1(@types/node@16.18.40)(typescript@5.0.4) + typescript: + specifier: ~5.0.0 + version: 5.0.4 + + packages/hardhat-shorthand: + dependencies: + '@fvictorio/tabtab': + specifier: ^0.0.3 + version: 0.0.3 + debug: + specifier: ^4.1.1 + version: 4.3.4(supports-color@8.1.1) + semver: + specifier: ^6.3.0 + version: 6.3.1 + devDependencies: + '@nomicfoundation/eslint-plugin-hardhat-internal-rules': + specifier: workspace:^ + version: link:../eslint-plugin-hardhat-internal-rules + '@nomicfoundation/eslint-plugin-slow-imports': + specifier: workspace:^ + version: link:../eslint-plugin-slow-imports + '@types/chai': + specifier: ^4.2.0 + version: 4.3.5 + '@types/debug': + specifier: ^4.1.4 + version: 4.1.8 + '@types/fs-extra': + specifier: ^5.1.0 + version: 5.1.0 + '@types/mocha': + specifier: '>=9.1.0' + version: 10.0.1 + '@types/node': + specifier: ^16.0.0 + version: 16.18.40 + '@types/semver': + specifier: ^6.0.2 + version: 6.2.3 + '@typescript-eslint/eslint-plugin': + specifier: 5.61.0 + version: 5.61.0(@typescript-eslint/parser@5.61.0)(eslint@8.47.0)(typescript@5.0.4) + '@typescript-eslint/parser': + specifier: 5.61.0 + version: 5.61.0(eslint@8.47.0)(typescript@5.0.4) + chai: + specifier: ^4.2.0 + version: 4.3.7 + eslint: + specifier: ^8.44.0 + version: 8.47.0 + eslint-config-prettier: + specifier: 8.3.0 + version: 8.3.0(eslint@8.47.0) + eslint-plugin-import: + specifier: 2.27.5 + version: 2.27.5(@typescript-eslint/parser@5.61.0)(eslint@8.47.0) + eslint-plugin-no-only-tests: + specifier: 3.0.0 + version: 3.0.0 + eslint-plugin-prettier: + specifier: 3.4.0 + version: 3.4.0(eslint-config-prettier@8.3.0)(eslint@8.47.0)(prettier@2.4.1) + hardhat: + specifier: workspace:^2.0.0 + version: link:../hardhat-core + mocha: + specifier: ^10.0.0 + version: 10.2.0 + prettier: + specifier: 2.4.1 + version: 2.4.1 + rimraf: + specifier: ^3.0.2 + version: 3.0.2 + ts-node: + specifier: ^10.8.0 + version: 10.9.1(@types/node@16.18.40)(typescript@5.0.4) + typescript: + specifier: ~5.0.0 + version: 5.0.4 + + packages/hardhat-solhint: + dependencies: + solhint: + specifier: ^3.4.0 + version: 3.4.0 + devDependencies: + '@nomicfoundation/eslint-plugin-hardhat-internal-rules': + specifier: workspace:^ + version: link:../eslint-plugin-hardhat-internal-rules + '@nomicfoundation/eslint-plugin-slow-imports': + specifier: workspace:^ + version: link:../eslint-plugin-slow-imports + '@types/chai': + specifier: ^4.2.0 + version: 4.3.5 + '@types/fs-extra': + specifier: ^5.1.0 + version: 5.1.0 + '@types/mocha': + specifier: '>=9.1.0' + version: 10.0.1 + '@types/node': + specifier: ^16.0.0 + version: 16.18.40 + '@types/sinon': + specifier: ^9.0.8 + version: 9.0.11 + '@typescript-eslint/eslint-plugin': + specifier: 5.61.0 + version: 5.61.0(@typescript-eslint/parser@5.61.0)(eslint@8.47.0)(typescript@5.0.4) + '@typescript-eslint/parser': + specifier: 5.61.0 + version: 5.61.0(eslint@8.47.0)(typescript@5.0.4) + chai: + specifier: ^4.2.0 + version: 4.3.7 + eslint: + specifier: ^8.44.0 + version: 8.47.0 + eslint-config-prettier: + specifier: 8.3.0 + version: 8.3.0(eslint@8.47.0) + eslint-plugin-import: + specifier: 2.27.5 + version: 2.27.5(@typescript-eslint/parser@5.61.0)(eslint@8.47.0) + eslint-plugin-no-only-tests: + specifier: 3.0.0 + version: 3.0.0 + eslint-plugin-prettier: + specifier: 3.4.0 + version: 3.4.0(eslint-config-prettier@8.3.0)(eslint@8.47.0)(prettier@2.4.1) + fs-extra: + specifier: ^7.0.1 + version: 7.0.1 + hardhat: + specifier: workspace:^2.0.0 + version: link:../hardhat-core + mocha: + specifier: ^10.0.0 + version: 10.2.0 + prettier: + specifier: 2.4.1 + version: 2.4.1 + rimraf: + specifier: ^3.0.2 + version: 3.0.2 + sinon: + specifier: ^9.0.0 + version: 9.2.4 + ts-node: + specifier: ^10.8.0 + version: 10.9.1(@types/node@16.18.40)(typescript@5.0.4) + typescript: + specifier: ~5.0.0 + version: 5.0.4 + + packages/hardhat-solpp: + dependencies: + fs-extra: + specifier: ^7.0.1 + version: 7.0.1 + solpp: + specifier: ^0.11.5 + version: 0.11.5 + devDependencies: + '@nomicfoundation/eslint-plugin-hardhat-internal-rules': + specifier: workspace:^ + version: link:../eslint-plugin-hardhat-internal-rules + '@nomicfoundation/eslint-plugin-slow-imports': + specifier: workspace:^ + version: link:../eslint-plugin-slow-imports + '@types/chai': + specifier: ^4.2.0 + version: 4.3.5 + '@types/fs-extra': + specifier: ^5.1.0 + version: 5.1.0 + '@types/mocha': + specifier: '>=9.1.0' + version: 10.0.1 + '@types/node': + specifier: ^16.0.0 + version: 16.18.40 + '@typescript-eslint/eslint-plugin': + specifier: 5.61.0 + version: 5.61.0(@typescript-eslint/parser@5.61.0)(eslint@8.47.0)(typescript@5.0.4) + '@typescript-eslint/parser': + specifier: 5.61.0 + version: 5.61.0(eslint@8.47.0)(typescript@5.0.4) + chai: + specifier: ^4.2.0 + version: 4.3.7 + eslint: + specifier: ^8.44.0 + version: 8.47.0 + eslint-config-prettier: + specifier: 8.3.0 + version: 8.3.0(eslint@8.47.0) + eslint-plugin-import: + specifier: 2.27.5 + version: 2.27.5(@typescript-eslint/parser@5.61.0)(eslint@8.47.0) + eslint-plugin-no-only-tests: + specifier: 3.0.0 + version: 3.0.0 + eslint-plugin-prettier: + specifier: 3.4.0 + version: 3.4.0(eslint-config-prettier@8.3.0)(eslint@8.47.0)(prettier@2.4.1) + hardhat: + specifier: workspace:^2.0.0 + version: link:../hardhat-core + mocha: + specifier: ^10.0.0 + version: 10.2.0 + prettier: + specifier: 2.4.1 + version: 2.4.1 + rimraf: + specifier: ^3.0.2 + version: 3.0.2 + ts-node: + specifier: ^10.8.0 + version: 10.9.1(@types/node@16.18.40)(typescript@5.0.4) + typescript: + specifier: ~5.0.0 + version: 5.0.4 + + packages/hardhat-toolbox: + devDependencies: + '@nomicfoundation/eslint-plugin-hardhat-internal-rules': + specifier: workspace:^ + version: link:../eslint-plugin-hardhat-internal-rules + '@nomicfoundation/eslint-plugin-slow-imports': + specifier: workspace:^ + version: link:../eslint-plugin-slow-imports + '@nomicfoundation/hardhat-chai-matchers': + specifier: workspace:^2.0.0 + version: link:../hardhat-chai-matchers + '@nomicfoundation/hardhat-ethers': + specifier: workspace:^3.0.0 + version: link:../hardhat-ethers + '@nomicfoundation/hardhat-network-helpers': + specifier: workspace:^1.0.0 + version: link:../hardhat-network-helpers + '@nomicfoundation/hardhat-verify': + specifier: workspace:^2.0.0 + version: link:../hardhat-verify + '@typechain/ethers-v6': + specifier: ^0.5.0 + version: 0.5.0(ethers@6.7.0)(typechain@8.3.1)(typescript@5.0.4) + '@typechain/hardhat': + specifier: ^9.0.0 + version: 9.0.0(@typechain/ethers-v6@0.5.0)(ethers@6.7.0)(hardhat@packages+hardhat-core)(typechain@8.3.1) + '@types/chai': + specifier: ^4.2.0 + version: 4.3.5 + '@types/mocha': + specifier: '>=9.1.0' + version: 10.0.1 + '@types/node': + specifier: ^16.0.0 + version: 16.18.40 + '@typescript-eslint/eslint-plugin': + specifier: 5.61.0 + version: 5.61.0(@typescript-eslint/parser@5.61.0)(eslint@8.47.0)(typescript@5.0.4) + '@typescript-eslint/parser': + specifier: 5.61.0 + version: 5.61.0(eslint@8.47.0)(typescript@5.0.4) + chai: + specifier: ^4.2.0 + version: 4.3.7 + eslint: + specifier: ^8.44.0 + version: 8.47.0 + eslint-config-prettier: + specifier: 8.3.0 + version: 8.3.0(eslint@8.47.0) + eslint-plugin-import: + specifier: 2.27.5 + version: 2.27.5(@typescript-eslint/parser@5.61.0)(eslint@8.47.0) + eslint-plugin-no-only-tests: + specifier: 3.0.0 + version: 3.0.0 + eslint-plugin-prettier: + specifier: 3.4.0 + version: 3.4.0(eslint-config-prettier@8.3.0)(eslint@8.47.0)(prettier@2.4.1) + ethers: + specifier: ^6.4.0 + version: 6.7.0 + hardhat: + specifier: workspace:^2.11.0 + version: link:../hardhat-core + hardhat-gas-reporter: + specifier: ^1.0.8 + version: 1.0.8(hardhat@packages+hardhat-core) + mocha: + specifier: ^10.0.0 + version: 10.2.0 + prettier: + specifier: 2.4.1 + version: 2.4.1 + rimraf: + specifier: ^3.0.2 + version: 3.0.2 + solidity-coverage: + specifier: ^0.8.1 + version: 0.8.1(hardhat@packages+hardhat-core) + ts-node: + specifier: ^10.8.0 + version: 10.9.1(@types/node@16.18.40)(typescript@5.0.4) + typechain: + specifier: ^8.3.1 + version: 8.3.1(typescript@5.0.4) + typescript: + specifier: ~5.0.0 + version: 5.0.4 + + packages/hardhat-toolbox-viem: + dependencies: + chai-as-promised: + specifier: ^7.1.1 + version: 7.1.1(chai@4.3.7) + devDependencies: + '@nomicfoundation/eslint-plugin-hardhat-internal-rules': + specifier: workspace:^ + version: link:../eslint-plugin-hardhat-internal-rules + '@nomicfoundation/eslint-plugin-slow-imports': + specifier: workspace:^ + version: link:../eslint-plugin-slow-imports + '@nomicfoundation/hardhat-network-helpers': + specifier: workspace:^1.0.0 + version: link:../hardhat-network-helpers + '@nomicfoundation/hardhat-verify': + specifier: workspace:^2.0.0 + version: link:../hardhat-verify + '@nomicfoundation/hardhat-viem': + specifier: workspace:^1.0.0 + version: link:../hardhat-viem + '@types/chai': + specifier: ^4.2.0 + version: 4.3.5 + '@types/chai-as-promised': + specifier: ^7.1.6 + version: 7.1.6 + '@types/mocha': + specifier: '>=9.1.0' + version: 10.0.1 + '@types/node': + specifier: ^16.0.0 + version: 16.18.40 + '@typescript-eslint/eslint-plugin': + specifier: 5.61.0 + version: 5.61.0(@typescript-eslint/parser@5.61.0)(eslint@8.47.0)(typescript@5.0.4) + '@typescript-eslint/parser': + specifier: 5.61.0 + version: 5.61.0(eslint@8.47.0)(typescript@5.0.4) + chai: + specifier: ^4.2.0 + version: 4.3.7 + eslint: + specifier: ^8.44.0 + version: 8.47.0 + eslint-config-prettier: + specifier: 8.3.0 + version: 8.3.0(eslint@8.47.0) + eslint-plugin-import: + specifier: 2.27.5 + version: 2.27.5(@typescript-eslint/parser@5.61.0)(eslint@8.47.0) + eslint-plugin-no-only-tests: + specifier: 3.0.0 + version: 3.0.0 + eslint-plugin-prettier: + specifier: 3.4.0 + version: 3.4.0(eslint-config-prettier@8.3.0)(eslint@8.47.0)(prettier@2.4.1) + hardhat: + specifier: workspace:^2.11.0 + version: link:../hardhat-core + hardhat-gas-reporter: + specifier: ^1.0.8 + version: 1.0.8(hardhat@packages+hardhat-core) + mocha: + specifier: ^10.0.0 + version: 10.2.0 + prettier: + specifier: 2.4.1 + version: 2.4.1 + rimraf: + specifier: ^3.0.2 + version: 3.0.2 + solidity-coverage: + specifier: ^0.8.1 + version: 0.8.1(hardhat@packages+hardhat-core) + ts-node: + specifier: ^10.8.0 + version: 10.9.1(@types/node@16.18.40)(typescript@5.0.4) + typescript: + specifier: ~5.0.4 + version: 5.0.4 + viem: + specifier: ^1.15.1 + version: 1.15.1(typescript@5.0.4) + + packages/hardhat-truffle4: + dependencies: + '@types/chai': + specifier: ^4.2.0 + version: 4.3.5 + chai: + specifier: ^4.2.0 + version: 4.3.7 + ethereumjs-util: + specifier: ^7.1.4 + version: 7.1.4 + fs-extra: + specifier: ^7.0.1 + version: 7.0.1 + truffle-contract: + specifier: ^3.0.7 + version: 3.0.7 + devDependencies: + '@nomicfoundation/eslint-plugin-hardhat-internal-rules': + specifier: workspace:^ + version: link:../eslint-plugin-hardhat-internal-rules + '@nomicfoundation/eslint-plugin-slow-imports': + specifier: workspace:^ + version: link:../eslint-plugin-slow-imports + '@nomiclabs/hardhat-web3-legacy': + specifier: workspace:^2.0.0 + version: link:../hardhat-web3-legacy + '@types/fs-extra': + specifier: ^5.1.0 + version: 5.1.0 + '@types/glob': + specifier: ^7.1.1 + version: 7.2.0 + '@types/mocha': + specifier: '>=9.1.0' + version: 10.0.1 + '@types/node': + specifier: ^16.0.0 + version: 16.18.40 + '@typescript-eslint/eslint-plugin': + specifier: 5.61.0 + version: 5.61.0(@typescript-eslint/parser@5.61.0)(eslint@8.47.0)(typescript@5.0.4) + '@typescript-eslint/parser': + specifier: 5.61.0 + version: 5.61.0(eslint@8.47.0)(typescript@5.0.4) + eslint: + specifier: ^8.44.0 + version: 8.47.0 + eslint-config-prettier: + specifier: 8.3.0 + version: 8.3.0(eslint@8.47.0) + eslint-plugin-import: + specifier: 2.27.5 + version: 2.27.5(@typescript-eslint/parser@5.61.0)(eslint@8.47.0) + eslint-plugin-no-only-tests: + specifier: 3.0.0 + version: 3.0.0 + eslint-plugin-prettier: + specifier: 3.4.0 + version: 3.4.0(eslint-config-prettier@8.3.0)(eslint@8.47.0)(prettier@2.4.1) + hardhat: + specifier: workspace:^2.6.4 + version: link:../hardhat-core + mocha: + specifier: ^10.0.0 + version: 10.2.0 + prettier: + specifier: 2.4.1 + version: 2.4.1 + rimraf: + specifier: ^3.0.2 + version: 3.0.2 + ts-node: + specifier: ^10.8.0 + version: 10.9.1(@types/node@16.18.40)(typescript@5.0.4) + typescript: + specifier: ~5.0.0 + version: 5.0.4 + web3: + specifier: ^0.20.0 + version: 0.20.0 + + packages/hardhat-truffle5: + dependencies: + '@nomiclabs/truffle-contract': + specifier: ^4.2.23 + version: 4.2.23(web3-core-helpers@1.10.3)(web3-core-promievent@1.10.3)(web3-eth-abi@1.10.3)(web3-utils@1.10.3)(web3@1.10.3) + '@types/chai': + specifier: ^4.2.0 + version: 4.3.5 + chai: + specifier: ^4.2.0 + version: 4.3.7 + ethereumjs-util: + specifier: ^7.1.4 + version: 7.1.4 + fs-extra: + specifier: ^7.0.1 + version: 7.0.1 + devDependencies: + '@nomicfoundation/eslint-plugin-hardhat-internal-rules': + specifier: workspace:^ + version: link:../eslint-plugin-hardhat-internal-rules + '@nomicfoundation/eslint-plugin-slow-imports': + specifier: workspace:^ + version: link:../eslint-plugin-slow-imports + '@nomiclabs/hardhat-web3': + specifier: workspace:^2.0.0 + version: link:../hardhat-web3 + '@types/fs-extra': + specifier: ^5.1.0 + version: 5.1.0 + '@types/glob': + specifier: ^7.1.1 + version: 7.2.0 + '@types/mocha': + specifier: '>=9.1.0' + version: 10.0.1 + '@types/node': + specifier: ^16.0.0 + version: 16.18.40 + '@typescript-eslint/eslint-plugin': + specifier: 5.61.0 + version: 5.61.0(@typescript-eslint/parser@5.61.0)(eslint@8.47.0)(typescript@5.0.4) + '@typescript-eslint/parser': + specifier: 5.61.0 + version: 5.61.0(eslint@8.47.0)(typescript@5.0.4) + eslint: + specifier: ^8.44.0 + version: 8.47.0 + eslint-config-prettier: + specifier: 8.3.0 + version: 8.3.0(eslint@8.47.0) + eslint-plugin-import: + specifier: 2.27.5 + version: 2.27.5(@typescript-eslint/parser@5.61.0)(eslint@8.47.0) + eslint-plugin-no-only-tests: + specifier: 3.0.0 + version: 3.0.0 + eslint-plugin-prettier: + specifier: 3.4.0 + version: 3.4.0(eslint-config-prettier@8.3.0)(eslint@8.47.0)(prettier@2.4.1) + hardhat: + specifier: workspace:^2.6.4 + version: link:../hardhat-core + mocha: + specifier: ^10.0.0 + version: 10.2.0 + prettier: + specifier: 2.4.1 + version: 2.4.1 + rimraf: + specifier: ^3.0.2 + version: 3.0.2 + ts-node: + specifier: ^10.8.0 + version: 10.9.1(@types/node@16.18.40)(typescript@5.0.4) + typescript: + specifier: ~5.0.0 + version: 5.0.4 + web3: + specifier: ^1.0.0-beta.36 + version: 1.10.3 + + packages/hardhat-verify: + dependencies: + '@ethersproject/abi': + specifier: ^5.1.2 + version: 5.7.0 + '@ethersproject/address': + specifier: ^5.0.2 + version: 5.7.0 + cbor: + specifier: ^8.1.0 + version: 8.1.0 + chalk: + specifier: ^2.4.2 + version: 2.4.2 + debug: + specifier: ^4.1.1 + version: 4.3.4(supports-color@8.1.1) + lodash.clonedeep: + specifier: ^4.5.0 + version: 4.5.0 + semver: + specifier: ^6.3.0 + version: 6.3.1 + table: + specifier: ^6.8.0 + version: 6.8.1 + undici: + specifier: ^5.14.0 + version: 5.23.0 + devDependencies: + '@nomicfoundation/eslint-plugin-hardhat-internal-rules': + specifier: workspace:^ + version: link:../eslint-plugin-hardhat-internal-rules + '@nomicfoundation/eslint-plugin-slow-imports': + specifier: workspace:^ + version: link:../eslint-plugin-slow-imports + '@nomicfoundation/hardhat-ethers': + specifier: workspace:^3.0.0 + version: link:../hardhat-ethers + '@types/chai': + specifier: ^4.2.0 + version: 4.3.5 + '@types/chai-as-promised': + specifier: ^7.1.3 + version: 7.1.5 + '@types/debug': + specifier: ^4.1.4 + version: 4.1.8 + '@types/lodash.clonedeep': + specifier: ^4.5.7 + version: 4.5.7 + '@types/mocha': + specifier: '>=9.1.0' + version: 10.0.1 + '@types/node': + specifier: ^16.0.0 + version: 16.18.40 + '@types/semver': + specifier: ^6.0.2 + version: 6.2.3 + '@types/sinon': + specifier: ^9.0.8 + version: 9.0.11 + '@types/sinon-chai': + specifier: ^3.2.9 + version: 3.2.9 + '@typescript-eslint/eslint-plugin': + specifier: 5.61.0 + version: 5.61.0(@typescript-eslint/parser@5.61.0)(eslint@8.47.0)(typescript@5.0.4) + '@typescript-eslint/parser': + specifier: 5.61.0 + version: 5.61.0(eslint@8.47.0)(typescript@5.0.4) + chai: + specifier: ^4.2.0 + version: 4.3.7 + chai-as-promised: + specifier: ^7.1.1 + version: 7.1.1(chai@4.3.7) + eslint: + specifier: ^8.44.0 + version: 8.47.0 + eslint-config-prettier: + specifier: 8.3.0 + version: 8.3.0(eslint@8.47.0) + eslint-plugin-import: + specifier: 2.27.5 + version: 2.27.5(@typescript-eslint/parser@5.61.0)(eslint@8.47.0) + eslint-plugin-no-only-tests: + specifier: 3.0.0 + version: 3.0.0 + eslint-plugin-prettier: + specifier: 3.4.0 + version: 3.4.0(eslint-config-prettier@8.3.0)(eslint@8.47.0)(prettier@2.4.1) + ethers: + specifier: ^5.0.0 + version: 5.7.2 + hardhat: + specifier: ^2.0.4 + version: link:../hardhat-core + mocha: + specifier: ^10.0.0 + version: 10.2.0 + nyc: + specifier: ^15.1.0 + version: 15.1.0 + prettier: + specifier: 2.4.1 + version: 2.4.1 + rimraf: + specifier: ^3.0.2 + version: 3.0.2 + sinon: + specifier: ^9.0.0 + version: 9.2.4 + sinon-chai: + specifier: ^3.7.0 + version: 3.7.0(chai@4.3.7)(sinon@9.2.4) + ts-node: + specifier: ^10.8.0 + version: 10.9.1(@types/node@16.18.40)(typescript@5.0.4) + typescript: + specifier: ~5.0.0 + version: 5.0.4 + + packages/hardhat-viem: + dependencies: + abitype: + specifier: ^0.9.8 + version: 0.9.8(typescript@5.0.4) + lodash.memoize: + specifier: ^4.1.2 + version: 4.1.2 + devDependencies: + '@nomicfoundation/eslint-plugin-hardhat-internal-rules': + specifier: workspace:^ + version: link:../eslint-plugin-hardhat-internal-rules + '@nomicfoundation/eslint-plugin-slow-imports': + specifier: workspace:^ + version: link:../eslint-plugin-slow-imports + '@types/chai': + specifier: ^4.2.0 + version: 4.3.5 + '@types/chai-as-promised': + specifier: ^7.1.3 + version: 7.1.6 + '@types/lodash': + specifier: ^4.14.123 + version: 4.14.197 + '@types/lodash.memoize': + specifier: ^4.1.7 + version: 4.1.7 + '@types/mocha': + specifier: '>=9.1.0' + version: 10.0.1 + '@types/node': + specifier: ^16.0.0 + version: 16.18.40 + '@types/sinon': + specifier: ^9.0.8 + version: 9.0.11 + '@typescript-eslint/eslint-plugin': + specifier: 5.61.0 + version: 5.61.0(@typescript-eslint/parser@5.61.0)(eslint@8.47.0)(typescript@5.0.4) + '@typescript-eslint/parser': + specifier: 5.61.0 + version: 5.61.0(eslint@8.47.0)(typescript@5.0.4) + chai: + specifier: ^4.2.0 + version: 4.3.7 + chai-as-promised: + specifier: ^7.1.1 + version: 7.1.1(chai@4.3.7) + eslint: + specifier: ^8.44.0 + version: 8.47.0 + eslint-config-prettier: + specifier: 8.3.0 + version: 8.3.0(eslint@8.47.0) + eslint-plugin-import: + specifier: 2.27.5 + version: 2.27.5(@typescript-eslint/parser@5.61.0)(eslint@8.47.0) + eslint-plugin-no-only-tests: + specifier: 3.0.0 + version: 3.0.0 + eslint-plugin-prettier: + specifier: 3.4.0 + version: 3.4.0(eslint-config-prettier@8.3.0)(eslint@8.47.0)(prettier@2.4.1) + hardhat: + specifier: workspace:^2.17.0 + version: link:../hardhat-core + jest-diff: + specifier: ^29.7.0 + version: 29.7.0 + mocha: + specifier: ^10.0.0 + version: 10.2.0 + nyc: + specifier: ^15.1.0 + version: 15.1.0 + prettier: + specifier: 2.4.1 + version: 2.4.1 + rimraf: + specifier: ^3.0.2 + version: 3.0.2 + sinon: + specifier: ^9.0.0 + version: 9.2.4 + ts-node: + specifier: ^10.8.0 + version: 10.9.1(@types/node@16.18.40)(typescript@5.0.4) + typescript: + specifier: ~5.0.0 + version: 5.0.4 + viem: + specifier: ^1.15.1 + version: 1.15.1(typescript@5.0.4) + + packages/hardhat-vyper: + dependencies: + debug: + specifier: ^4.1.1 + version: 4.3.4(supports-color@8.1.1) + fs-extra: + specifier: ^7.0.1 + version: 7.0.1 + io-ts: + specifier: 1.10.4 + version: 1.10.4 + lodash: + specifier: ^4.17.11 + version: 4.17.21 + semver: + specifier: ^6.3.0 + version: 6.3.1 + devDependencies: + '@nomicfoundation/eslint-plugin-hardhat-internal-rules': + specifier: workspace:^ + version: link:../eslint-plugin-hardhat-internal-rules + '@nomicfoundation/eslint-plugin-slow-imports': + specifier: workspace:^ + version: link:../eslint-plugin-slow-imports + '@types/chai': + specifier: ^4.2.0 + version: 4.3.5 + '@types/chai-as-promised': + specifier: ^7.1.3 + version: 7.1.8 + '@types/debug': + specifier: ^4.1.4 + version: 4.1.8 + '@types/fs-extra': + specifier: ^5.1.0 + version: 5.1.0 + '@types/lodash': + specifier: ^4.14.123 + version: 4.14.197 + '@types/mocha': + specifier: '>=9.1.0' + version: 10.0.1 + '@types/node': + specifier: ^16.0.0 + version: 16.18.40 + '@types/semver': + specifier: ^6.0.2 + version: 6.2.3 + '@typescript-eslint/eslint-plugin': + specifier: 5.61.0 + version: 5.61.0(@typescript-eslint/parser@5.61.0)(eslint@8.47.0)(typescript@5.0.4) + '@typescript-eslint/parser': + specifier: 5.61.0 + version: 5.61.0(eslint@8.47.0)(typescript@5.0.4) + chai: + specifier: ^4.2.0 + version: 4.3.7 + chai-as-promised: + specifier: ^7.1.1 + version: 7.1.1(chai@4.3.7) + eslint: + specifier: ^8.44.0 + version: 8.47.0 + eslint-config-prettier: + specifier: 8.3.0 + version: 8.3.0(eslint@8.47.0) + eslint-plugin-import: + specifier: 2.27.5 + version: 2.27.5(@typescript-eslint/parser@5.61.0)(eslint@8.47.0) + eslint-plugin-no-only-tests: + specifier: 3.0.0 + version: 3.0.0 + eslint-plugin-prettier: + specifier: 3.4.0 + version: 3.4.0(eslint-config-prettier@8.3.0)(eslint@8.47.0)(prettier@2.4.1) + hardhat: + specifier: workspace:^2.8.3 + version: link:../hardhat-core + mocha: + specifier: ^10.0.0 + version: 10.2.0 + prettier: + specifier: 2.4.1 + version: 2.4.1 + rimraf: + specifier: ^3.0.2 + version: 3.0.2 + ts-node: + specifier: ^10.8.0 + version: 10.9.1(@types/node@16.18.40)(typescript@5.0.4) + typescript: + specifier: ~5.0.0 + version: 5.0.4 + + packages/hardhat-web3: + dependencies: + '@types/bignumber.js': + specifier: ^5.0.0 + version: 5.0.0 + devDependencies: + '@nomicfoundation/eslint-plugin-hardhat-internal-rules': + specifier: workspace:^ + version: link:../eslint-plugin-hardhat-internal-rules + '@nomicfoundation/eslint-plugin-slow-imports': + specifier: workspace:^ + version: link:../eslint-plugin-slow-imports + '@types/chai': + specifier: ^4.2.0 + version: 4.3.5 + '@types/mocha': + specifier: '>=9.1.0' + version: 10.0.1 + '@types/node': + specifier: ^16.0.0 + version: 16.18.40 + '@typescript-eslint/eslint-plugin': + specifier: 5.61.0 + version: 5.61.0(@typescript-eslint/parser@5.61.0)(eslint@8.47.0)(typescript@5.0.4) + '@typescript-eslint/parser': + specifier: 5.61.0 + version: 5.61.0(eslint@8.47.0)(typescript@5.0.4) + chai: + specifier: ^4.2.0 + version: 4.3.7 + eslint: + specifier: ^8.44.0 + version: 8.47.0 + eslint-config-prettier: + specifier: 8.3.0 + version: 8.3.0(eslint@8.47.0) + eslint-plugin-import: + specifier: 2.27.5 + version: 2.27.5(@typescript-eslint/parser@5.61.0)(eslint@8.47.0) + eslint-plugin-no-only-tests: + specifier: 3.0.0 + version: 3.0.0 + eslint-plugin-prettier: + specifier: 3.4.0 + version: 3.4.0(eslint-config-prettier@8.3.0)(eslint@8.47.0)(prettier@2.4.1) + hardhat: + specifier: workspace:^2.0.0 + version: link:../hardhat-core + mocha: + specifier: ^10.0.0 + version: 10.2.0 + prettier: + specifier: 2.4.1 + version: 2.4.1 + rimraf: + specifier: ^3.0.2 + version: 3.0.2 + sha3: + specifier: ^2.1.4 + version: 2.1.4 + ts-node: + specifier: ^10.8.0 + version: 10.9.1(@types/node@16.18.40)(typescript@5.0.4) + typescript: + specifier: ~5.0.0 + version: 5.0.4 + web3: + specifier: ^1.0.0-beta.36 + version: 1.10.3 + + packages/hardhat-web3-legacy: + devDependencies: + '@nomicfoundation/eslint-plugin-hardhat-internal-rules': + specifier: workspace:^ + version: link:../eslint-plugin-hardhat-internal-rules + '@nomicfoundation/eslint-plugin-slow-imports': + specifier: workspace:^ + version: link:../eslint-plugin-slow-imports + '@types/chai': + specifier: ^4.2.0 + version: 4.3.5 + '@types/mocha': + specifier: '>=9.1.0' + version: 10.0.1 + '@types/node': + specifier: ^16.0.0 + version: 16.18.40 + '@typescript-eslint/eslint-plugin': + specifier: 5.61.0 + version: 5.61.0(@typescript-eslint/parser@5.61.0)(eslint@8.47.0)(typescript@5.0.4) + '@typescript-eslint/parser': + specifier: 5.61.0 + version: 5.61.0(eslint@8.47.0)(typescript@5.0.4) + chai: + specifier: ^4.2.0 + version: 4.3.7 + eslint: + specifier: ^8.44.0 + version: 8.47.0 + eslint-config-prettier: + specifier: 8.3.0 + version: 8.3.0(eslint@8.47.0) + eslint-plugin-import: + specifier: 2.27.5 + version: 2.27.5(@typescript-eslint/parser@5.61.0)(eslint@8.47.0) + eslint-plugin-no-only-tests: + specifier: 3.0.0 + version: 3.0.0 + eslint-plugin-prettier: + specifier: 3.4.0 + version: 3.4.0(eslint-config-prettier@8.3.0)(eslint@8.47.0)(prettier@2.4.1) + hardhat: + specifier: workspace:^2.0.0 + version: link:../hardhat-core + mocha: + specifier: ^10.0.0 + version: 10.2.0 + prettier: + specifier: 2.4.1 + version: 2.4.1 + rimraf: + specifier: ^3.0.2 + version: 3.0.2 + ts-node: + specifier: ^10.8.0 + version: 10.9.1(@types/node@16.18.40)(typescript@5.0.4) + typescript: + specifier: ~5.0.0 + version: 5.0.4 + web3: + specifier: ^0.20.0 + version: 0.20.0 + + packages/hardhat-web3-v4: + devDependencies: + '@nomicfoundation/eslint-plugin-hardhat-internal-rules': + specifier: workspace:^ + version: link:../eslint-plugin-hardhat-internal-rules + '@nomicfoundation/eslint-plugin-slow-imports': + specifier: workspace:^ + version: link:../eslint-plugin-slow-imports + '@types/chai': + specifier: ^4.2.0 + version: 4.3.5 + '@types/chai-as-promised': + specifier: ^7.1.3 + version: 7.1.8 + '@types/mocha': + specifier: '>=9.1.0' + version: 10.0.1 + '@types/node': + specifier: ^16.0.0 + version: 16.18.40 + '@typescript-eslint/eslint-plugin': + specifier: 5.61.0 + version: 5.61.0(@typescript-eslint/parser@5.61.0)(eslint@8.47.0)(typescript@5.0.4) + '@typescript-eslint/parser': + specifier: 5.61.0 + version: 5.61.0(eslint@8.47.0)(typescript@5.0.4) + chai: + specifier: ^4.2.0 + version: 4.3.7 + chai-as-promised: + specifier: ^7.1.1 + version: 7.1.1(chai@4.3.7) + eslint: + specifier: ^8.44.0 + version: 8.47.0 + eslint-config-prettier: + specifier: 8.3.0 + version: 8.3.0(eslint@8.47.0) + eslint-plugin-import: + specifier: 2.27.5 + version: 2.27.5(@typescript-eslint/parser@5.61.0)(eslint@8.47.0) + eslint-plugin-no-only-tests: + specifier: 3.0.0 + version: 3.0.0 + eslint-plugin-prettier: + specifier: 3.4.0 + version: 3.4.0(eslint-config-prettier@8.3.0)(eslint@8.47.0)(prettier@2.4.1) + hardhat: + specifier: workspace:^2.0.0 + version: link:../hardhat-core + mocha: + specifier: ^10.0.0 + version: 10.2.0 + prettier: + specifier: 2.4.1 + version: 2.4.1 + rimraf: + specifier: ^3.0.2 + version: 3.0.2 + ts-node: + specifier: ^10.8.0 + version: 10.9.1(@types/node@16.18.40)(typescript@5.0.4) + typescript: + specifier: ~5.0.0 + version: 5.0.4 + web3: + specifier: ^4.0.1 + version: 4.2.2(typescript@5.0.4) + +packages: + + /@aashutoshrathi/word-wrap@1.2.6: + resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} + engines: {node: '>=0.10.0'} + + /@adraffy/ens-normalize@1.9.2: + resolution: {integrity: sha512-0h+FrQDqe2Wn+IIGFkTCd4aAwTJ+7834Ek1COohCyV26AXhwQ7WQaz+4F/nLOeVl/3BtWHOHLPsq46V8YB46Eg==} + + /@adraffy/ens-normalize@1.9.4: + resolution: {integrity: sha512-UK0bHA7hh9cR39V+4gl2/NnBBjoXIxkuWAPCaY4X7fbH4L/azIi7ilWOCjMUYfpJgraLUAqkRi2BqrjME8Rynw==} + dev: true + + /@ampproject/remapping@2.2.1: + resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/gen-mapping': 0.3.3 + '@jridgewell/trace-mapping': 0.3.20 + dev: true + + /@babel/code-frame@7.22.10: + resolution: {integrity: sha512-/KKIMG4UEL35WmI9OlvMhurwtytjvXoFcGNrOvyG9zIzA8YmPjVtIZUf7b05+TPO7G7/GEmLHDaoCgACHl9hhA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/highlight': 7.22.20 + chalk: 2.4.2 + + /@babel/code-frame@7.22.13: + resolution: {integrity: sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/highlight': 7.22.20 + chalk: 2.4.2 + dev: true + + /@babel/compat-data@7.23.2: + resolution: {integrity: sha512-0S9TQMmDHlqAZ2ITT95irXKfxN9bncq8ZCoJhun3nHL/lLUxd2NKBJYoNGWH7S0hz6fRQwWlAWn/ILM0C70KZQ==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/core@7.23.2: + resolution: {integrity: sha512-n7s51eWdaWZ3vGT2tD4T7J6eJs3QoBXydv7vkUM06Bf1cbVD2Kc2UrkzhiQwobfV7NwOnQXYL7UBJ5VPU+RGoQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@ampproject/remapping': 2.2.1 + '@babel/code-frame': 7.22.13 + '@babel/generator': 7.23.0 + '@babel/helper-compilation-targets': 7.22.15 + '@babel/helper-module-transforms': 7.23.0(@babel/core@7.23.2) + '@babel/helpers': 7.23.2 + '@babel/parser': 7.23.0 + '@babel/template': 7.22.15 + '@babel/traverse': 7.23.2 + '@babel/types': 7.23.0 + convert-source-map: 2.0.0 + debug: 4.3.4(supports-color@8.1.1) + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/generator@7.23.0: + resolution: {integrity: sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.0 + '@jridgewell/gen-mapping': 0.3.3 + '@jridgewell/trace-mapping': 0.3.20 + jsesc: 2.5.2 + dev: true + + /@babel/helper-compilation-targets@7.22.15: + resolution: {integrity: sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/compat-data': 7.23.2 + '@babel/helper-validator-option': 7.22.15 + browserslist: 4.22.1 + lru-cache: 5.1.1 + semver: 6.3.1 + dev: true + + /@babel/helper-environment-visitor@7.22.20: + resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-function-name@7.23.0: + resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.22.15 + '@babel/types': 7.23.0 + dev: true + + /@babel/helper-hoist-variables@7.22.5: + resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.0 + dev: true + + /@babel/helper-module-imports@7.22.15: + resolution: {integrity: sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.0 + dev: true + + /@babel/helper-module-transforms@7.23.0(@babel/core@7.23.2): + resolution: {integrity: sha512-WhDWw1tdrlT0gMgUJSlX0IQvoO1eN279zrAUbVB+KpV2c3Tylz8+GnKOLllCS6Z/iZQEyVYxhZVUdPTqs2YYPw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-module-imports': 7.22.15 + '@babel/helper-simple-access': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/helper-validator-identifier': 7.22.20 + dev: true + + /@babel/helper-simple-access@7.22.5: + resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.0 + dev: true + + /@babel/helper-split-export-declaration@7.22.6: + resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.0 + dev: true + + /@babel/helper-string-parser@7.22.5: + resolution: {integrity: sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-validator-identifier@7.22.20: + resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} + engines: {node: '>=6.9.0'} + + /@babel/helper-validator-option@7.22.15: + resolution: {integrity: sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helpers@7.23.2: + resolution: {integrity: sha512-lzchcp8SjTSVe/fPmLwtWVBFC7+Tbn8LGHDVfDp9JGxpAY5opSaEFgt8UQvrnECWOTdji2mOWMz1rOhkHscmGQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.22.15 + '@babel/traverse': 7.23.2 + '@babel/types': 7.23.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/highlight@7.22.20: + resolution: {integrity: sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-validator-identifier': 7.22.20 + chalk: 2.4.2 + js-tokens: 4.0.0 + + /@babel/parser@7.23.0: + resolution: {integrity: sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + '@babel/types': 7.23.0 + dev: true + + /@babel/runtime@7.22.10: + resolution: {integrity: sha512-21t/fkKLMZI4pqP2wlmsQAWnYW1PDyKyyUV4vCi+B25ydmdaYTKXPwCj0BzSUnZf4seIiYvSA3jcZ3gdsMFkLQ==} + engines: {node: '>=6.9.0'} + dependencies: + regenerator-runtime: 0.14.0 + dev: true + + /@babel/template@7.22.15: + resolution: {integrity: sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.22.13 + '@babel/parser': 7.23.0 + '@babel/types': 7.23.0 + dev: true + + /@babel/traverse@7.23.2: + resolution: {integrity: sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.22.13 + '@babel/generator': 7.23.0 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-hoist-variables': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/parser': 7.23.0 + '@babel/types': 7.23.0 + debug: 4.3.4(supports-color@8.1.1) + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/types@7.23.0: + resolution: {integrity: sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-string-parser': 7.22.5 + '@babel/helper-validator-identifier': 7.22.20 + to-fast-properties: 2.0.0 + dev: true + + /@chainsafe/as-sha256@0.3.1: + resolution: {integrity: sha512-hldFFYuf49ed7DAakWVXSJODuq3pzJEguD8tQ7h+sGkM18vja+OFoJI9krnGmgzyuZC2ETX0NOIcCTy31v2Mtg==} + dev: false + + /@chainsafe/persistent-merkle-tree@0.4.2: + resolution: {integrity: sha512-lLO3ihKPngXLTus/L7WHKaw9PnNJWizlOF1H9NNzHP6Xvh82vzg9F2bzkXhYIFshMZ2gTCEz8tq6STe7r5NDfQ==} + dependencies: + '@chainsafe/as-sha256': 0.3.1 + dev: false + + /@chainsafe/persistent-merkle-tree@0.5.0: + resolution: {integrity: sha512-l0V1b5clxA3iwQLXP40zYjyZYospQLZXzBVIhhr9kDg/1qHZfzzHw0jj4VPBijfYCArZDlPkRi1wZaV2POKeuw==} + dependencies: + '@chainsafe/as-sha256': 0.3.1 + dev: false + + /@chainsafe/ssz@0.10.2: + resolution: {integrity: sha512-/NL3Lh8K+0q7A3LsiFq09YXS9fPE+ead2rr7vM2QK8PLzrNsw3uqrif9bpRX5UxgeRjM+vYi+boCM3+GM4ovXg==} + dependencies: + '@chainsafe/as-sha256': 0.3.1 + '@chainsafe/persistent-merkle-tree': 0.5.0 + dev: false + + /@chainsafe/ssz@0.9.4: + resolution: {integrity: sha512-77Qtg2N1ayqs4Bg/wvnWfg5Bta7iy7IRh8XqXh7oNMeP2HBbBwx8m6yTpA8p0EHItWPEBkgZd5S5/LSlp3GXuQ==} + dependencies: + '@chainsafe/as-sha256': 0.3.1 + '@chainsafe/persistent-merkle-tree': 0.4.2 + case: 1.6.3 + dev: false + + /@changesets/apply-release-plan@6.1.4: + resolution: {integrity: sha512-FMpKF1fRlJyCZVYHr3CbinpZZ+6MwvOtWUuO8uo+svcATEoc1zRDcj23pAurJ2TZ/uVz1wFHH6K3NlACy0PLew==} + dependencies: + '@babel/runtime': 7.22.10 + '@changesets/config': 2.3.1 + '@changesets/get-version-range-type': 0.3.2 + '@changesets/git': 2.0.0 + '@changesets/types': 5.2.1 + '@manypkg/get-packages': 1.1.3 + detect-indent: 6.1.0 + fs-extra: 7.0.1 + lodash.startcase: 4.4.0 + outdent: 0.5.0 + prettier: 2.8.8 + resolve-from: 5.0.0 + semver: 7.5.4 + dev: true + + /@changesets/assemble-release-plan@5.2.4: + resolution: {integrity: sha512-xJkWX+1/CUaOUWTguXEbCDTyWJFECEhmdtbkjhn5GVBGxdP/JwaHBIU9sW3FR6gD07UwZ7ovpiPclQZs+j+mvg==} + dependencies: + '@babel/runtime': 7.22.10 + '@changesets/errors': 0.1.4 + '@changesets/get-dependents-graph': 1.3.6 + '@changesets/types': 5.2.1 + '@manypkg/get-packages': 1.1.3 + semver: 7.5.4 + dev: true + + /@changesets/changelog-git@0.1.14: + resolution: {integrity: sha512-+vRfnKtXVWsDDxGctOfzJsPhaCdXRYoe+KyWYoq5X/GqoISREiat0l3L8B0a453B2B4dfHGcZaGyowHbp9BSaA==} + dependencies: + '@changesets/types': 5.2.1 + dev: true + + /@changesets/cli@2.26.2: + resolution: {integrity: sha512-dnWrJTmRR8bCHikJHl9b9HW3gXACCehz4OasrXpMp7sx97ECuBGGNjJhjPhdZNCvMy9mn4BWdplI323IbqsRig==} + hasBin: true + dependencies: + '@babel/runtime': 7.22.10 + '@changesets/apply-release-plan': 6.1.4 + '@changesets/assemble-release-plan': 5.2.4 + '@changesets/changelog-git': 0.1.14 + '@changesets/config': 2.3.1 + '@changesets/errors': 0.1.4 + '@changesets/get-dependents-graph': 1.3.6 + '@changesets/get-release-plan': 3.0.17 + '@changesets/git': 2.0.0 + '@changesets/logger': 0.0.5 + '@changesets/pre': 1.0.14 + '@changesets/read': 0.5.9 + '@changesets/types': 5.2.1 + '@changesets/write': 0.2.3 + '@manypkg/get-packages': 1.1.3 + '@types/is-ci': 3.0.0 + '@types/semver': 7.5.0 + ansi-colors: 4.1.3 + chalk: 2.4.2 + enquirer: 2.4.1 + external-editor: 3.1.0 + fs-extra: 7.0.1 + human-id: 1.0.2 + is-ci: 3.0.1 + meow: 6.1.1 + outdent: 0.5.0 + p-limit: 2.3.0 + preferred-pm: 3.0.3 + resolve-from: 5.0.0 + semver: 7.5.4 + spawndamnit: 2.0.0 + term-size: 2.2.1 + tty-table: 4.2.1 + dev: true + + /@changesets/config@2.3.1: + resolution: {integrity: sha512-PQXaJl82CfIXddUOppj4zWu+987GCw2M+eQcOepxN5s+kvnsZOwjEJO3DH9eVy+OP6Pg/KFEWdsECFEYTtbg6w==} + dependencies: + '@changesets/errors': 0.1.4 + '@changesets/get-dependents-graph': 1.3.6 + '@changesets/logger': 0.0.5 + '@changesets/types': 5.2.1 + '@manypkg/get-packages': 1.1.3 + fs-extra: 7.0.1 + micromatch: 4.0.5 + dev: true + + /@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.6: + resolution: {integrity: sha512-Q/sLgBANmkvUm09GgRsAvEtY3p1/5OCzgBE5vX3vgb5CvW0j7CEljocx5oPXeQSNph6FXulJlXV3Re/v3K3P3Q==} + dependencies: + '@changesets/types': 5.2.1 + '@manypkg/get-packages': 1.1.3 + chalk: 2.4.2 + fs-extra: 7.0.1 + semver: 7.5.4 + dev: true + + /@changesets/get-release-plan@3.0.17: + resolution: {integrity: sha512-6IwKTubNEgoOZwDontYc2x2cWXfr6IKxP3IhKeK+WjyD6y3M4Gl/jdQvBw+m/5zWILSOCAaGLu2ZF6Q+WiPniw==} + dependencies: + '@babel/runtime': 7.22.10 + '@changesets/assemble-release-plan': 5.2.4 + '@changesets/config': 2.3.1 + '@changesets/pre': 1.0.14 + '@changesets/read': 0.5.9 + '@changesets/types': 5.2.1 + '@manypkg/get-packages': 1.1.3 + dev: true + + /@changesets/get-version-range-type@0.3.2: + resolution: {integrity: sha512-SVqwYs5pULYjYT4op21F2pVbcrca4qA/bAA3FmFXKMN7Y+HcO8sbZUTx3TAy2VXulP2FACd1aC7f2nTuqSPbqg==} + dev: true + + /@changesets/git@2.0.0: + resolution: {integrity: sha512-enUVEWbiqUTxqSnmesyJGWfzd51PY4H7mH9yUw0hPVpZBJ6tQZFMU3F3mT/t9OJ/GjyiM4770i+sehAn6ymx6A==} + dependencies: + '@babel/runtime': 7.22.10 + '@changesets/errors': 0.1.4 + '@changesets/types': 5.2.1 + '@manypkg/get-packages': 1.1.3 + is-subdir: 1.2.0 + micromatch: 4.0.5 + spawndamnit: 2.0.0 + dev: true + + /@changesets/logger@0.0.5: + resolution: {integrity: sha512-gJyZHomu8nASHpaANzc6bkQMO9gU/ib20lqew1rVx753FOxffnCrJlGIeQVxNWCqM+o6OOleCo/ivL8UAO5iFw==} + dependencies: + chalk: 2.4.2 + dev: true + + /@changesets/parse@0.3.16: + resolution: {integrity: sha512-127JKNd167ayAuBjUggZBkmDS5fIKsthnr9jr6bdnuUljroiERW7FBTDNnNVyJ4l69PzR57pk6mXQdtJyBCJKg==} + dependencies: + '@changesets/types': 5.2.1 + js-yaml: 3.14.1 + dev: true + + /@changesets/pre@1.0.14: + resolution: {integrity: sha512-dTsHmxQWEQekHYHbg+M1mDVYFvegDh9j/kySNuDKdylwfMEevTeDouR7IfHNyVodxZXu17sXoJuf2D0vi55FHQ==} + dependencies: + '@babel/runtime': 7.22.10 + '@changesets/errors': 0.1.4 + '@changesets/types': 5.2.1 + '@manypkg/get-packages': 1.1.3 + fs-extra: 7.0.1 + dev: true + + /@changesets/read@0.5.9: + resolution: {integrity: sha512-T8BJ6JS6j1gfO1HFq50kU3qawYxa4NTbI/ASNVVCBTsKquy2HYwM9r7ZnzkiMe8IEObAJtUVGSrePCOxAK2haQ==} + dependencies: + '@babel/runtime': 7.22.10 + '@changesets/git': 2.0.0 + '@changesets/logger': 0.0.5 + '@changesets/parse': 0.3.16 + '@changesets/types': 5.2.1 + chalk: 2.4.2 + fs-extra: 7.0.1 + p-filter: 2.1.0 + dev: true + + /@changesets/types@4.1.0: + resolution: {integrity: sha512-LDQvVDv5Kb50ny2s25Fhm3d9QSZimsoUGBsUioj6MC3qbMUCuC8GPIvk/M6IvXx3lYhAs0lwWUQLb+VIEUCECw==} + dev: true + + /@changesets/types@5.2.1: + resolution: {integrity: sha512-myLfHbVOqaq9UtUKqR/nZA/OY7xFjQMdfgfqeZIBK4d0hA6pgxArvdv8M+6NUzzBsjWLOtvApv8YHr4qM+Kpfg==} + dev: true + + /@changesets/write@0.2.3: + resolution: {integrity: sha512-Dbamr7AIMvslKnNYsLFafaVORx4H0pvCA2MHqgtNCySMe1blImEyAEOzDmcgKAkgz4+uwoLz7demIrX+JBr/Xw==} + dependencies: + '@babel/runtime': 7.22.10 + '@changesets/types': 5.2.1 + fs-extra: 7.0.1 + human-id: 1.0.2 + prettier: 2.8.8 + dev: true + + /@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 + + /@eslint-community/eslint-utils@4.4.0(eslint@8.47.0): + resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + dependencies: + eslint: 8.47.0 + eslint-visitor-keys: 3.4.3 + + /@eslint-community/regexpp@4.6.2: + resolution: {integrity: sha512-pPTNuaAG3QMH+buKyBIGJs3g/S5y0caxw0ygM3YyE6yJFySwiGGSzA+mM3KJ8QQvzeLh3blwgSonkFjgQdxzMw==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + /@eslint/eslintrc@2.1.2: + resolution: {integrity: sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + ajv: 6.12.6 + debug: 4.3.4(supports-color@8.1.1) + espree: 9.6.1 + globals: 13.21.0 + ignore: 5.2.4 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + + /@eslint/js@8.47.0: + resolution: {integrity: sha512-P6omY1zv5MItm93kLM8s2vr1HICJH8v0dvddDhysbIuZ+vcjOHg5Zbkf1mTkcmi2JA9oBG2anOkRnW8WJTS8Og==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + /@ethereumjs/common@2.6.5: + resolution: {integrity: sha512-lRyVQOeCDaIVtgfbowla32pzeDv2Obr8oR8Put5RdUBNRGr1VGPGQNGP6elWIpgK3YdpzqTOh4GyUGOureVeeA==} + dependencies: + crc-32: 1.2.2 + ethereumjs-util: 7.1.5 + + /@ethereumjs/rlp@4.0.1: + resolution: {integrity: sha512-tqsQiBQDQdmPWE1xkkBq4rlSW5QZpLOUJ5RJh2/9fug+q9tnUhuZoVLk7s0scUIKTOzEtR72DFBXI4WiZcMpvw==} + engines: {node: '>=14'} + hasBin: true + + /@ethereumjs/tx@3.5.2: + resolution: {integrity: sha512-gQDNJWKrSDGu2w7w0PzVXVBNMzb7wwdDOmOqczmhNjqFxFuIbhVJDwiGEnxFNC2/b8ifcZzY7MLcluizohRzNw==} + dependencies: + '@ethereumjs/common': 2.6.5 + ethereumjs-util: 7.1.5 + + /@ethereumjs/util@8.1.0: + resolution: {integrity: sha512-zQ0IqbdX8FZ9aw11vP+dZkKDkS+kgIvQPHnSAXzP9pLu+Rfu3D3XEeLbicvoXJTYnhZiPmsZUxgdzXwNKxRPbA==} + engines: {node: '>=14'} + dependencies: + '@ethereumjs/rlp': 4.0.1 + ethereum-cryptography: 2.1.2 + micro-ftch: 0.3.1 + + /@ethersproject/abi@5.0.7: + resolution: {integrity: sha512-Cqktk+hSIckwP/W8O47Eef60VwmoSC/L3lY0+dIBhQPCNn9E4V7rwmm2aFrNRRDJfFlGuZ1khkQUOc3oBX+niw==} + dependencies: + '@ethersproject/address': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/constants': 5.7.0 + '@ethersproject/hash': 5.7.0 + '@ethersproject/keccak256': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/strings': 5.7.0 + dev: false + + /@ethersproject/abi@5.7.0: + resolution: {integrity: sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA==} + dependencies: + '@ethersproject/address': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/constants': 5.7.0 + '@ethersproject/hash': 5.7.0 + '@ethersproject/keccak256': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/strings': 5.7.0 + + /@ethersproject/abstract-provider@5.7.0: + resolution: {integrity: sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw==} + dependencies: + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/networks': 5.7.1 + '@ethersproject/properties': 5.7.0 + '@ethersproject/transactions': 5.7.0 + '@ethersproject/web': 5.7.1 + + /@ethersproject/abstract-signer@5.7.0: + resolution: {integrity: sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ==} + dependencies: + '@ethersproject/abstract-provider': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + + /@ethersproject/address@5.7.0: + resolution: {integrity: sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==} + dependencies: + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/keccak256': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/rlp': 5.7.0 + + /@ethersproject/base64@5.7.0: + resolution: {integrity: sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ==} + dependencies: + '@ethersproject/bytes': 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: + 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: + resolution: {integrity: sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A==} + dependencies: + '@ethersproject/logger': 5.7.0 + + /@ethersproject/constants@5.7.0: + resolution: {integrity: sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA==} + dependencies: + '@ethersproject/bignumber': 5.7.0 + + /@ethersproject/contracts@5.7.0: + resolution: {integrity: sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg==} + dependencies: + '@ethersproject/abi': 5.7.0 + '@ethersproject/abstract-provider': 5.7.0 + '@ethersproject/abstract-signer': 5.7.0 + '@ethersproject/address': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/constants': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/transactions': 5.7.0 + + /@ethersproject/hash@5.7.0: + resolution: {integrity: sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g==} + dependencies: + '@ethersproject/abstract-signer': 5.7.0 + '@ethersproject/address': 5.7.0 + '@ethersproject/base64': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/keccak256': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/strings': 5.7.0 + + /@ethersproject/hdnode@5.7.0: + resolution: {integrity: sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg==} + dependencies: + '@ethersproject/abstract-signer': 5.7.0 + '@ethersproject/basex': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/pbkdf2': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/sha2': 5.7.0 + '@ethersproject/signing-key': 5.7.0 + '@ethersproject/strings': 5.7.0 + '@ethersproject/transactions': 5.7.0 + '@ethersproject/wordlists': 5.7.0 + + /@ethersproject/json-wallets@5.7.0: + resolution: {integrity: sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g==} + dependencies: + '@ethersproject/abstract-signer': 5.7.0 + '@ethersproject/address': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/hdnode': 5.7.0 + '@ethersproject/keccak256': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/pbkdf2': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/random': 5.7.0 + '@ethersproject/strings': 5.7.0 + '@ethersproject/transactions': 5.7.0 + aes-js: 3.0.0 + scrypt-js: 3.0.1 + + /@ethersproject/keccak256@5.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: + resolution: {integrity: sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig==} + + /@ethersproject/networks@5.7.1: + resolution: {integrity: sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ==} + dependencies: + '@ethersproject/logger': 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: + resolution: {integrity: sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw==} + dependencies: + '@ethersproject/logger': 5.7.0 + + /@ethersproject/providers@5.7.2: + resolution: {integrity: sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg==} + dependencies: + '@ethersproject/abstract-provider': 5.7.0 + '@ethersproject/abstract-signer': 5.7.0 + '@ethersproject/address': 5.7.0 + '@ethersproject/base64': 5.7.0 + '@ethersproject/basex': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/constants': 5.7.0 + '@ethersproject/hash': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/networks': 5.7.1 + '@ethersproject/properties': 5.7.0 + '@ethersproject/random': 5.7.0 + '@ethersproject/rlp': 5.7.0 + '@ethersproject/sha2': 5.7.0 + '@ethersproject/strings': 5.7.0 + '@ethersproject/transactions': 5.7.0 + '@ethersproject/web': 5.7.1 + bech32: 1.1.4 + ws: 7.4.6 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + /@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: + resolution: {integrity: sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w==} + dependencies: + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 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: + resolution: {integrity: sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q==} + dependencies: + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + bn.js: 5.2.1 + elliptic: 6.5.4 + hash.js: 1.1.7 + + /@ethersproject/solidity@5.7.0: + resolution: {integrity: sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA==} + dependencies: + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/keccak256': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/sha2': 5.7.0 + '@ethersproject/strings': 5.7.0 + + /@ethersproject/strings@5.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: + resolution: {integrity: sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ==} + dependencies: + '@ethersproject/address': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/constants': 5.7.0 + '@ethersproject/keccak256': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/rlp': 5.7.0 + '@ethersproject/signing-key': 5.7.0 + + /@ethersproject/units@5.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: + resolution: {integrity: sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA==} + dependencies: + '@ethersproject/abstract-provider': 5.7.0 + '@ethersproject/abstract-signer': 5.7.0 + '@ethersproject/address': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/hash': 5.7.0 + '@ethersproject/hdnode': 5.7.0 + '@ethersproject/json-wallets': 5.7.0 + '@ethersproject/keccak256': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/random': 5.7.0 + '@ethersproject/signing-key': 5.7.0 + '@ethersproject/transactions': 5.7.0 + '@ethersproject/wordlists': 5.7.0 + + /@ethersproject/web@5.7.1: + resolution: {integrity: sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w==} + dependencies: + '@ethersproject/base64': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/strings': 5.7.0 + + /@ethersproject/wordlists@5.7.0: + resolution: {integrity: sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA==} + dependencies: + '@ethersproject/bytes': 5.7.0 + '@ethersproject/hash': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/strings': 5.7.0 + + /@fvictorio/tabtab@0.0.3: + resolution: {integrity: sha512-bT/BSy8MJThrTebqTCjXRnGSgZWthHLigZ4k2AvfNtC79vPyBS1myaxw8gRU6RxIcdDD3HBtm7pOsOoyC086Zg==} + engines: {node: '>=10'} + dependencies: + debug: 4.3.4(supports-color@8.1.1) + enquirer: 2.4.1 + minimist: 1.2.8 + mkdirp: 1.0.4 + untildify: 4.0.0 + transitivePeerDependencies: + - supports-color + dev: false + + /@humanwhocodes/config-array@0.11.10: + resolution: {integrity: sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==} + engines: {node: '>=10.10.0'} + dependencies: + '@humanwhocodes/object-schema': 1.2.1 + debug: 4.3.4(supports-color@8.1.1) + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + + /@humanwhocodes/module-importer@1.0.1: + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + + /@humanwhocodes/object-schema@1.2.1: + resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} + + /@istanbuljs/load-nyc-config@1.1.0: + resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} + engines: {node: '>=8'} + dependencies: + camelcase: 5.3.1 + find-up: 4.1.0 + get-package-type: 0.1.0 + js-yaml: 3.14.1 + resolve-from: 5.0.0 + dev: true + + /@istanbuljs/schema@0.1.3: + resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} + engines: {node: '>=8'} + dev: true + + /@jest/schemas@29.6.3: + resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@sinclair/typebox': 0.27.8 + dev: true + + /@jridgewell/gen-mapping@0.3.3: + resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/set-array': 1.1.2 + '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/trace-mapping': 0.3.20 + dev: true + + /@jridgewell/resolve-uri@3.1.1: + resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} + engines: {node: '>=6.0.0'} + dev: true + + /@jridgewell/set-array@1.1.2: + resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} + engines: {node: '>=6.0.0'} + dev: true + + /@jridgewell/sourcemap-codec@1.4.15: + resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + dev: true + + /@jridgewell/trace-mapping@0.3.20: + resolution: {integrity: sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==} + dependencies: + '@jridgewell/resolve-uri': 3.1.1 + '@jridgewell/sourcemap-codec': 1.4.15 + dev: true + + /@jridgewell/trace-mapping@0.3.9: + resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} + dependencies: + '@jridgewell/resolve-uri': 3.1.1 + '@jridgewell/sourcemap-codec': 1.4.15 + dev: true + + /@ledgerhq/cryptoassets@11.0.1: + resolution: {integrity: sha512-VhSA1ydoTnNjoC5c+S/a+YURJV+UNvuLVkRrKpP87zaQ2a+odPkP3EVDrU+G1Dvt/LipA24ZgcpoxXTbO6fQ9Q==} + dependencies: + invariant: 2.2.4 + dev: false + + /@ledgerhq/cryptoassets@9.13.0: + resolution: {integrity: sha512-MzGJyc48OGU/FLYGYwEJyfOgbJzlR8XJ9Oo6XpNpNUM1/E5NDqvD72V0D+0uWIJYN3e2NtyqHXShLZDu7P95YA==} + dependencies: + invariant: 2.2.4 + dev: false + + /@ledgerhq/devices@8.0.7: + resolution: {integrity: sha512-BbPyET52lXnVs7CxJWrGYqmtGdbGzj+XnfCqLsDnA7QYr1CZREysxmie+Rr6BKpNDBRVesAovXjtaVaZOn+upw==} + dependencies: + '@ledgerhq/errors': 6.14.0 + '@ledgerhq/logs': 6.10.1 + rxjs: 6.6.7 + semver: 7.5.4 + dev: false + + /@ledgerhq/domain-service@1.1.13(debug@4.3.4): + resolution: {integrity: sha512-8XQl4glEfNyX4BkNhuwe69mzn1VIasWFoKlgXIXf6gc8Rw1Qzcn0LE+/3DBxZ3pC3IWiBnm7MmXMrIaSLjnPNQ==} + dependencies: + '@ledgerhq/cryptoassets': 11.0.1 + '@ledgerhq/errors': 6.14.0 + '@ledgerhq/logs': 6.10.1 + '@ledgerhq/types-live': 6.41.1 + axios: 1.6.0(debug@4.3.4) + eip55: 2.1.1 + react: 17.0.2 + react-dom: 17.0.2(react@17.0.2) + transitivePeerDependencies: + - debug + dev: false + + /@ledgerhq/errors@6.12.6: + resolution: {integrity: sha512-D+r2B09vaRO06wfGoss+rNgwqWSoK0bCtsaJWzlD2hv1zxTtucqVtSztbRFypIqxWTCb3ix5Nh2dWHEJVTp2Xw==} + dev: false + + /@ledgerhq/errors@6.14.0: + resolution: {integrity: sha512-ZWJw2Ti6Dq1Ott/+qYqJdDWeZm16qI3VNG5rFlb0TQ3UcAyLIQZbnnzzdcVVwVeZiEp66WIpINd/pBdqsHVyOA==} + dev: false + + /@ledgerhq/hw-app-eth@6.33.6(debug@4.3.4): + resolution: {integrity: sha512-QzYvr5FNEWWd70Vg04A2i8CY0mtPgJrrX7/KePabjXrR8NjDyJ5Ej8qSQPBTp2dkR4TGiz5Y7+HIcWpdgYzjzg==} + dependencies: + '@ethersproject/abi': 5.7.0 + '@ethersproject/rlp': 5.7.0 + '@ledgerhq/cryptoassets': 9.13.0 + '@ledgerhq/domain-service': 1.1.13(debug@4.3.4) + '@ledgerhq/errors': 6.12.6 + '@ledgerhq/hw-transport': 6.28.4 + '@ledgerhq/hw-transport-mocker': 6.27.19 + '@ledgerhq/logs': 6.10.1 + axios: 1.6.0(debug@4.3.4) + bignumber.js: 9.1.1 + crypto-js: 4.2.0 + transitivePeerDependencies: + - debug + dev: false + + /@ledgerhq/hw-transport-mocker@6.27.19: + resolution: {integrity: sha512-sD/7Ht1flaHZcwIFOi2E1LTHYLdAOe206/JwlwRU78pT0oUan8FnXR5SD8PSmhwgmQjJXto+PFBlmVe5EIt9Lw==} + dependencies: + '@ledgerhq/hw-transport': 6.28.8 + '@ledgerhq/logs': 6.10.1 + dev: false + + /@ledgerhq/hw-transport-node-hid-noevents@6.27.19: + resolution: {integrity: sha512-zOIB1fBiQH9ZYFzoEpNY4n1lE7bGPgRT+k85fKuLM7cxxm5Sy+TgrdxImvBz0IQUS8EvrtZCm+dVWkb2sH/6OA==} + dependencies: + '@ledgerhq/devices': 8.0.7 + '@ledgerhq/errors': 6.14.0 + '@ledgerhq/hw-transport': 6.28.8 + '@ledgerhq/logs': 6.10.1 + node-hid: 2.1.2 + dev: false + + /@ledgerhq/hw-transport-node-hid@6.27.13: + resolution: {integrity: sha512-j4c1UOMylX9cE9ebTh+qqMfzZDJpK8WZ7/kalxdY/MHWQcO+F2XAMvEqdZOaMjSIhI0vbgL/OoEvO2nxGFhObA==} + dependencies: + '@ledgerhq/devices': 8.0.7 + '@ledgerhq/errors': 6.12.6 + '@ledgerhq/hw-transport': 6.28.4 + '@ledgerhq/hw-transport-node-hid-noevents': 6.27.19 + '@ledgerhq/logs': 6.10.1 + lodash: 4.17.21 + node-hid: 2.1.2 + usb: 1.9.2 + dev: false + + /@ledgerhq/hw-transport@6.28.4: + resolution: {integrity: sha512-fB2H92YQjidmae2GFCmOGPwkZWk0lvTu0tlLlzfiY0wRheAG+DEgjnqhdU8wmydkPLIj0WUjRgldtnJtg/a2iQ==} + dependencies: + '@ledgerhq/devices': 8.0.7 + '@ledgerhq/errors': 6.12.6 + events: 3.3.0 + dev: false + + /@ledgerhq/hw-transport@6.28.8: + resolution: {integrity: sha512-XxQVl4htd018u/M66r0iu5nlHi+J6QfdPsORzDF6N39jaz+tMqItb7tUlXM/isggcuS5lc7GJo7NOuJ8rvHZaQ==} + dependencies: + '@ledgerhq/devices': 8.0.7 + '@ledgerhq/errors': 6.14.0 + events: 3.3.0 + dev: false + + /@ledgerhq/logs@6.10.1: + resolution: {integrity: sha512-z+ILK8Q3y+nfUl43ctCPuR4Y2bIxk/ooCQFwZxhtci1EhAtMDzMAx2W25qx8G1PPL9UUOdnUax19+F0OjXoj4w==} + dev: false + + /@ledgerhq/types-live@6.41.1: + resolution: {integrity: sha512-M9NcGlpyW7383HZ+Wcl+vVj07fKlBLQT29wrrPTW9raj2iq0fzyAaxSQPs0VKX6LghLQSmXG2EdcvQ9v5FakgA==} + dependencies: + bignumber.js: 9.1.2 + rxjs: 6.6.7 + dev: false + + /@manypkg/find-root@1.1.0: + resolution: {integrity: sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==} + dependencies: + '@babel/runtime': 7.22.10 + '@types/node': 12.20.55 + find-up: 4.1.0 + fs-extra: 8.1.0 + dev: true + + /@manypkg/get-packages@1.1.3: + resolution: {integrity: sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==} + dependencies: + '@babel/runtime': 7.22.10 + '@changesets/types': 4.1.0 + '@manypkg/find-root': 1.1.0 + fs-extra: 8.1.0 + globby: 11.1.0 + read-yaml-file: 1.1.0 + dev: true + + /@metamask/eth-sig-util@4.0.1: + resolution: {integrity: sha512-tghyZKLHZjcdlDqCA3gNZmLeR0XvOE9U1qoQO9ohyAZT6Pya+H9vkBPcsyXytmYLNgVoin7CKCmweo/R43V+tQ==} + engines: {node: '>=12.0.0'} + dependencies: + ethereumjs-abi: 0.6.8 + ethereumjs-util: 6.2.1 + ethjs-util: 0.1.6 + tweetnacl: 1.0.3 + tweetnacl-util: 0.15.1 + dev: false + + /@noble/curves@1.1.0: + resolution: {integrity: sha512-091oBExgENk/kGj3AZmtBDMpxQPDtxQABR2B9lb1JbVTs6ytdzZNwvhxQ4MWasRNEzlbEH8jCWFCwhF/Obj5AA==} + dependencies: + '@noble/hashes': 1.3.1 + + /@noble/curves@1.2.0: + resolution: {integrity: sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==} + dependencies: + '@noble/hashes': 1.3.2 + dev: true + + /@noble/hashes@1.1.2: + resolution: {integrity: sha512-KYRCASVTv6aeUi1tsF8/vpyR7zpfs3FUzy2Jqm+MU+LmUKhQ0y2FpfwqkCcxSg2ua4GALJd8k2R76WxwZGbQpA==} + + /@noble/hashes@1.2.0: + resolution: {integrity: sha512-FZfhjEDbT5GRswV3C6uvLPHMiVD6lQBmpoX5+eSiPaMTXte/IKqI5dykDxzZB/WBeK/CDuQRBWarPdi3FNY2zQ==} + + /@noble/hashes@1.3.1: + resolution: {integrity: sha512-EbqwksQwz9xDRGfDST86whPBgM65E0OH/pCgqW0GBVzO22bNE+NuIbeTb714+IfSjU3aRk47EUvXIb5bTsenKA==} + engines: {node: '>= 16'} + + /@noble/hashes@1.3.2: + resolution: {integrity: sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==} + engines: {node: '>= 16'} + + /@noble/secp256k1@1.7.1: + resolution: {integrity: sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw==} + + /@nodelib/fs.scandir@2.1.5: + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + /@nodelib/fs.stat@2.0.5: + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + /@nodelib/fs.walk@1.2.8: + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.15.0 + + /@nomicfoundation/ethereumjs-block@5.0.2: + resolution: {integrity: sha512-hSe6CuHI4SsSiWWjHDIzWhSiAVpzMUcDRpWYzN0T9l8/Rz7xNn3elwVOJ/tAyS0LqL6vitUD78Uk7lQDXZun7Q==} + engines: {node: '>=14'} + dependencies: + '@nomicfoundation/ethereumjs-common': 4.0.2 + '@nomicfoundation/ethereumjs-rlp': 5.0.2 + '@nomicfoundation/ethereumjs-trie': 6.0.2 + '@nomicfoundation/ethereumjs-tx': 5.0.2 + '@nomicfoundation/ethereumjs-util': 9.0.2 + ethereum-cryptography: 0.1.3 + ethers: 5.7.2 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + dev: false + + /@nomicfoundation/ethereumjs-blockchain@7.0.2: + resolution: {integrity: sha512-8UUsSXJs+MFfIIAKdh3cG16iNmWzWC/91P40sazNvrqhhdR/RtGDlFk2iFTGbBAZPs2+klZVzhRX8m2wvuvz3w==} + engines: {node: '>=14'} + dependencies: + '@nomicfoundation/ethereumjs-block': 5.0.2 + '@nomicfoundation/ethereumjs-common': 4.0.2 + '@nomicfoundation/ethereumjs-ethash': 3.0.2 + '@nomicfoundation/ethereumjs-rlp': 5.0.2 + '@nomicfoundation/ethereumjs-trie': 6.0.2 + '@nomicfoundation/ethereumjs-tx': 5.0.2 + '@nomicfoundation/ethereumjs-util': 9.0.2 + abstract-level: 1.0.3 + debug: 4.3.4(supports-color@8.1.1) + ethereum-cryptography: 0.1.3 + level: 8.0.0 + lru-cache: 5.1.1 + memory-level: 1.0.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: false + + /@nomicfoundation/ethereumjs-common@4.0.2: + resolution: {integrity: sha512-I2WGP3HMGsOoycSdOTSqIaES0ughQTueOsddJ36aYVpI3SN8YSusgRFLwzDJwRFVIYDKx/iJz0sQ5kBHVgdDwg==} + dependencies: + '@nomicfoundation/ethereumjs-util': 9.0.2 + crc-32: 1.2.2 + dev: false + + /@nomicfoundation/ethereumjs-ethash@3.0.2: + resolution: {integrity: sha512-8PfoOQCcIcO9Pylq0Buijuq/O73tmMVURK0OqdjhwqcGHYC2PwhbajDh7GZ55ekB0Px197ajK3PQhpKoiI/UPg==} + engines: {node: '>=14'} + dependencies: + '@nomicfoundation/ethereumjs-block': 5.0.2 + '@nomicfoundation/ethereumjs-rlp': 5.0.2 + '@nomicfoundation/ethereumjs-util': 9.0.2 + abstract-level: 1.0.3 + bigint-crypto-utils: 3.3.0 + ethereum-cryptography: 0.1.3 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + dev: false + + /@nomicfoundation/ethereumjs-evm@2.0.2: + resolution: {integrity: sha512-rBLcUaUfANJxyOx9HIdMX6uXGin6lANCulIm/pjMgRqfiCRMZie3WKYxTSd8ZE/d+qT+zTedBF4+VHTdTSePmQ==} + engines: {node: '>=14'} + dependencies: + '@ethersproject/providers': 5.7.2 + '@nomicfoundation/ethereumjs-common': 4.0.2 + '@nomicfoundation/ethereumjs-tx': 5.0.2 + '@nomicfoundation/ethereumjs-util': 9.0.2 + debug: 4.3.4(supports-color@8.1.1) + ethereum-cryptography: 0.1.3 + mcl-wasm: 0.7.9 + rustbn.js: 0.2.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: false + + /@nomicfoundation/ethereumjs-rlp@5.0.2: + resolution: {integrity: sha512-QwmemBc+MMsHJ1P1QvPl8R8p2aPvvVcKBbvHnQOKBpBztEo0omN0eaob6FeZS/e3y9NSe+mfu3nNFBHszqkjTA==} + engines: {node: '>=14'} + hasBin: true + dev: false + + /@nomicfoundation/ethereumjs-statemanager@2.0.2: + resolution: {integrity: sha512-dlKy5dIXLuDubx8Z74sipciZnJTRSV/uHG48RSijhgm1V7eXYFC567xgKtsKiVZB1ViTP9iFL4B6Je0xD6X2OA==} + dependencies: + '@nomicfoundation/ethereumjs-common': 4.0.2 + '@nomicfoundation/ethereumjs-rlp': 5.0.2 + debug: 4.3.4(supports-color@8.1.1) + ethereum-cryptography: 0.1.3 + ethers: 5.7.2 + js-sdsl: 4.4.2 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: false + + /@nomicfoundation/ethereumjs-trie@6.0.2: + resolution: {integrity: sha512-yw8vg9hBeLYk4YNg5MrSJ5H55TLOv2FSWUTROtDtTMMmDGROsAu+0tBjiNGTnKRi400M6cEzoFfa89Fc5k8NTQ==} + engines: {node: '>=14'} + dependencies: + '@nomicfoundation/ethereumjs-rlp': 5.0.2 + '@nomicfoundation/ethereumjs-util': 9.0.2 + '@types/readable-stream': 2.3.15 + ethereum-cryptography: 0.1.3 + readable-stream: 3.6.2 + dev: false + + /@nomicfoundation/ethereumjs-tx@5.0.2: + resolution: {integrity: sha512-T+l4/MmTp7VhJeNloMkM+lPU3YMUaXdcXgTGCf8+ZFvV9NYZTRLFekRwlG6/JMmVfIfbrW+dRRJ9A6H5Q/Z64g==} + engines: {node: '>=14'} + dependencies: + '@chainsafe/ssz': 0.9.4 + '@ethersproject/providers': 5.7.2 + '@nomicfoundation/ethereumjs-common': 4.0.2 + '@nomicfoundation/ethereumjs-rlp': 5.0.2 + '@nomicfoundation/ethereumjs-util': 9.0.2 + ethereum-cryptography: 0.1.3 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + dev: false + + /@nomicfoundation/ethereumjs-util@9.0.2: + resolution: {integrity: sha512-4Wu9D3LykbSBWZo8nJCnzVIYGvGCuyiYLIJa9XXNVt1q1jUzHdB+sJvx95VGCpPkCT+IbLecW6yfzy3E1bQrwQ==} + engines: {node: '>=14'} + dependencies: + '@chainsafe/ssz': 0.10.2 + '@nomicfoundation/ethereumjs-rlp': 5.0.2 + ethereum-cryptography: 0.1.3 + dev: false + + /@nomicfoundation/ethereumjs-vm@7.0.2: + resolution: {integrity: sha512-Bj3KZT64j54Tcwr7Qm/0jkeZXJMfdcAtRBedou+Hx0dPOSIgqaIr0vvLwP65TpHbak2DmAq+KJbW2KNtIoFwvA==} + engines: {node: '>=14'} + dependencies: + '@nomicfoundation/ethereumjs-block': 5.0.2 + '@nomicfoundation/ethereumjs-blockchain': 7.0.2 + '@nomicfoundation/ethereumjs-common': 4.0.2 + '@nomicfoundation/ethereumjs-evm': 2.0.2 + '@nomicfoundation/ethereumjs-rlp': 5.0.2 + '@nomicfoundation/ethereumjs-statemanager': 2.0.2 + '@nomicfoundation/ethereumjs-trie': 6.0.2 + '@nomicfoundation/ethereumjs-tx': 5.0.2 + '@nomicfoundation/ethereumjs-util': 9.0.2 + debug: 4.3.4(supports-color@8.1.1) + ethereum-cryptography: 0.1.3 + mcl-wasm: 0.7.9 + rustbn.js: 0.2.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: false + + /@nomicfoundation/solidity-analyzer-darwin-arm64@0.1.1: + resolution: {integrity: sha512-KcTodaQw8ivDZyF+D76FokN/HdpgGpfjc/gFCImdLUyqB6eSWVaZPazMbeAjmfhx3R0zm/NYVzxwAokFKgrc0w==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@nomicfoundation/solidity-analyzer-darwin-x64@0.1.1: + resolution: {integrity: sha512-XhQG4BaJE6cIbjAVtzGOGbK3sn1BO9W29uhk9J8y8fZF1DYz0Doj8QDMfpMu+A6TjPDs61lbsmeYodIDnfveSA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@nomicfoundation/solidity-analyzer-freebsd-x64@0.1.1: + resolution: {integrity: sha512-GHF1VKRdHW3G8CndkwdaeLkVBi5A9u2jwtlS7SLhBc8b5U/GcoL39Q+1CSO3hYqePNP+eV5YI7Zgm0ea6kMHoA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: false + optional: true + + /@nomicfoundation/solidity-analyzer-linux-arm64-gnu@0.1.1: + resolution: {integrity: sha512-g4Cv2fO37ZsUENQ2vwPnZc2zRenHyAxHcyBjKcjaSmmkKrFr64yvzeNO8S3GBFCo90rfochLs99wFVGT/0owpg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + libc: [glibc] + requiresBuild: true + dev: false + optional: true + + /@nomicfoundation/solidity-analyzer-linux-arm64-musl@0.1.1: + resolution: {integrity: sha512-WJ3CE5Oek25OGE3WwzK7oaopY8xMw9Lhb0mlYuJl/maZVo+WtP36XoQTb7bW/i8aAdHW5Z+BqrHMux23pvxG3w==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + libc: [musl] + requiresBuild: true + dev: false + optional: true + + /@nomicfoundation/solidity-analyzer-linux-x64-gnu@0.1.1: + resolution: {integrity: sha512-5WN7leSr5fkUBBjE4f3wKENUy9HQStu7HmWqbtknfXkkil+eNWiBV275IOlpXku7v3uLsXTOKpnnGHJYI2qsdA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + libc: [glibc] + requiresBuild: true + dev: false + optional: true + + /@nomicfoundation/solidity-analyzer-linux-x64-musl@0.1.1: + resolution: {integrity: sha512-KdYMkJOq0SYPQMmErv/63CwGwMm5XHenEna9X9aB8mQmhDBrYrlAOSsIPgFCUSL0hjxE3xHP65/EPXR/InD2+w==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + libc: [musl] + requiresBuild: true + dev: false + optional: true + + /@nomicfoundation/solidity-analyzer-win32-arm64-msvc@0.1.1: + resolution: {integrity: sha512-VFZASBfl4qiBYwW5xeY20exWhmv6ww9sWu/krWSesv3q5hA0o1JuzmPHR4LPN6SUZj5vcqci0O6JOL8BPw+APg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@nomicfoundation/solidity-analyzer-win32-ia32-msvc@0.1.1: + resolution: {integrity: sha512-JnFkYuyCSA70j6Si6cS1A9Gh1aHTEb8kOTBApp/c7NRTFGNMH8eaInKlyuuiIbvYFhlXW4LicqyYuWNNq9hkpQ==} + engines: {node: '>= 10'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@nomicfoundation/solidity-analyzer-win32-x64-msvc@0.1.1: + resolution: {integrity: sha512-HrVJr6+WjIXGnw3Q9u6KQcbZCtk0caVWhCdFADySvRyUxJ8PnzlaP+MhwNE8oyT8OZ6ejHBRrrgjSqDCFXGirw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@nomicfoundation/solidity-analyzer@0.1.1: + resolution: {integrity: sha512-1LMtXj1puAxyFusBgUIy5pZk3073cNXYnXUpuNKFghHbIit/xZgbk0AokpUADbNm3gyD6bFWl3LRFh3dhVdREg==} + engines: {node: '>= 12'} + optionalDependencies: + '@nomicfoundation/solidity-analyzer-darwin-arm64': 0.1.1 + '@nomicfoundation/solidity-analyzer-darwin-x64': 0.1.1 + '@nomicfoundation/solidity-analyzer-freebsd-x64': 0.1.1 + '@nomicfoundation/solidity-analyzer-linux-arm64-gnu': 0.1.1 + '@nomicfoundation/solidity-analyzer-linux-arm64-musl': 0.1.1 + '@nomicfoundation/solidity-analyzer-linux-x64-gnu': 0.1.1 + '@nomicfoundation/solidity-analyzer-linux-x64-musl': 0.1.1 + '@nomicfoundation/solidity-analyzer-win32-arm64-msvc': 0.1.1 + '@nomicfoundation/solidity-analyzer-win32-ia32-msvc': 0.1.1 + '@nomicfoundation/solidity-analyzer-win32-x64-msvc': 0.1.1 + dev: false + + /@nomiclabs/truffle-contract@4.2.23(web3-core-helpers@1.10.3)(web3-core-promievent@1.10.3)(web3-eth-abi@1.10.3)(web3-utils@1.10.3)(web3@1.10.3): + resolution: {integrity: sha512-Khj/Ts9r0LqEpGYhISbc+8WTOd6qJ4aFnDR+Ew+neqcjGnhwrIvuihNwPFWU6hDepW3Xod6Y+rTo90N8sLRDjw==} + peerDependencies: + web3: ^1.2.1 + web3-core-helpers: ^1.2.1 + web3-core-promievent: ^1.2.1 + web3-eth-abi: ^1.2.1 + web3-utils: ^1.2.1 + dependencies: + '@truffle/blockchain-utils': 0.0.25 + '@truffle/contract-schema': 3.4.16 + '@truffle/debug-utils': 4.2.14 + '@truffle/error': 0.0.11 + '@truffle/interface-adapter': 0.4.24 + bignumber.js: 7.2.1 + ethereum-ens: 0.8.0 + ethers: 4.0.49 + source-map-support: 0.5.21 + web3: 1.10.3 + web3-core-helpers: 1.10.3 + web3-core-promievent: 1.10.3 + web3-eth-abi: 1.10.3 + web3-utils: 1.10.3 + transitivePeerDependencies: + - bufferutil + - encoding + - supports-color + - utf-8-validate + dev: false + + /@scure/base@1.1.3: + resolution: {integrity: sha512-/+SgoRjLq7Xlf0CWuLHq2LUZeL/w65kfzAPG5NH9pcmBhs+nunQTn4gvdwgMTIXnt9b2C/1SeL2XiysZEyIC9Q==} + + /@scure/bip32@1.1.5: + resolution: {integrity: sha512-XyNh1rB0SkEqd3tXcXMi+Xe1fvg+kUIcoRIEujP1Jgv7DqW2r9lg3Ah0NkFaCs9sTkQAQA8kw7xiRXzENi9Rtw==} + dependencies: + '@noble/hashes': 1.2.0 + '@noble/secp256k1': 1.7.1 + '@scure/base': 1.1.3 + + /@scure/bip32@1.3.1: + resolution: {integrity: sha512-osvveYtyzdEVbt3OfwwXFr4P2iVBL5u1Q3q4ONBfDY/UpOuXmOlbgwc1xECEboY8wIays8Yt6onaWMUdUbfl0A==} + dependencies: + '@noble/curves': 1.1.0 + '@noble/hashes': 1.3.2 + '@scure/base': 1.1.3 + + /@scure/bip32@1.3.2: + resolution: {integrity: sha512-N1ZhksgwD3OBlwTv3R6KFEcPojl/W4ElJOeCZdi+vuI5QmTFwLq3OFf2zd2ROpKvxFdgZ6hUpb0dx9bVNEwYCA==} + dependencies: + '@noble/curves': 1.2.0 + '@noble/hashes': 1.3.2 + '@scure/base': 1.1.3 + dev: true + + /@scure/bip39@1.1.1: + resolution: {integrity: sha512-t+wDck2rVkh65Hmv280fYdVdY25J9YeEUIgn2LG1WM6gxFkGzcksoDiUkWVpVp3Oex9xGC68JU2dSbUfwZ2jPg==} + dependencies: + '@noble/hashes': 1.2.0 + '@scure/base': 1.1.3 + + /@scure/bip39@1.2.1: + resolution: {integrity: sha512-Z3/Fsz1yr904dduJD0NpiyRHhRYHdcnyh73FZWiV+/qhWi83wNJ3NWolYqCEN+ZWsUz2TWwajJggcRE9r1zUYg==} + dependencies: + '@noble/hashes': 1.3.2 + '@scure/base': 1.1.3 + + /@sentry/core@5.30.0: + resolution: {integrity: sha512-TmfrII8w1PQZSZgPpUESqjB+jC6MvZJZdLtE/0hZ+SrnKhW3x5WlYLvTXZpcWePYBku7rl2wn1RZu6uT0qCTeg==} + engines: {node: '>=6'} + dependencies: + '@sentry/hub': 5.30.0 + '@sentry/minimal': 5.30.0 + '@sentry/types': 5.30.0 + '@sentry/utils': 5.30.0 + tslib: 1.14.1 + dev: false + + /@sentry/hub@5.30.0: + resolution: {integrity: sha512-2tYrGnzb1gKz2EkMDQcfLrDTvmGcQPuWxLnJKXJvYTQDGLlEvi2tWz1VIHjunmOvJrB5aIQLhm+dcMRwFZDCqQ==} + engines: {node: '>=6'} + dependencies: + '@sentry/types': 5.30.0 + '@sentry/utils': 5.30.0 + tslib: 1.14.1 + dev: false + + /@sentry/minimal@5.30.0: + resolution: {integrity: sha512-BwWb/owZKtkDX+Sc4zCSTNcvZUq7YcH3uAVlmh/gtR9rmUvbzAA3ewLuB3myi4wWRAMEtny6+J/FN/x+2wn9Xw==} + engines: {node: '>=6'} + dependencies: + '@sentry/hub': 5.30.0 + '@sentry/types': 5.30.0 + tslib: 1.14.1 + dev: false + + /@sentry/node@5.30.0: + resolution: {integrity: sha512-Br5oyVBF0fZo6ZS9bxbJZG4ApAjRqAnqFFurMVJJdunNb80brh7a5Qva2kjhm+U6r9NJAB5OmDyPkA1Qnt+QVg==} + engines: {node: '>=6'} + dependencies: + '@sentry/core': 5.30.0 + '@sentry/hub': 5.30.0 + '@sentry/tracing': 5.30.0 + '@sentry/types': 5.30.0 + '@sentry/utils': 5.30.0 + cookie: 0.4.2 + https-proxy-agent: 5.0.1 + lru_map: 0.3.3 + tslib: 1.14.1 + transitivePeerDependencies: + - supports-color + dev: false + + /@sentry/tracing@5.30.0: + resolution: {integrity: sha512-dUFowCr0AIMwiLD7Fs314Mdzcug+gBVo/+NCMyDw8tFxJkwWAKl7Qa2OZxLQ0ZHjakcj1hNKfCQJ9rhyfOl4Aw==} + engines: {node: '>=6'} + dependencies: + '@sentry/hub': 5.30.0 + '@sentry/minimal': 5.30.0 + '@sentry/types': 5.30.0 + '@sentry/utils': 5.30.0 + tslib: 1.14.1 + dev: false + + /@sentry/types@5.30.0: + resolution: {integrity: sha512-R8xOqlSTZ+htqrfteCWU5Nk0CDN5ApUTvrlvBuiH1DyP6czDZ4ktbZB0hAgBlVcK0U+qpD3ag3Tqqpa5Q67rPw==} + engines: {node: '>=6'} + dev: false + + /@sentry/utils@5.30.0: + resolution: {integrity: sha512-zaYmoH0NWWtvnJjC9/CBseXMtKHm/tm40sz3YfJRxeQjyzRqNQPgivpd9R/oDJCYj999mzdW382p/qi2ypjLww==} + engines: {node: '>=6'} + dependencies: + '@sentry/types': 5.30.0 + tslib: 1.14.1 + dev: false + + /@sinclair/typebox@0.27.8: + resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} + dev: true + + /@sindresorhus/is@0.14.0: + resolution: {integrity: sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==} + engines: {node: '>=6'} + dev: false + + /@sindresorhus/is@4.6.0: + resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} + engines: {node: '>=10'} + + /@sinonjs/commons@1.8.6: + resolution: {integrity: sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==} + dependencies: + type-detect: 4.0.8 + dev: true + + /@sinonjs/fake-timers@6.0.1: + resolution: {integrity: sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA==} + dependencies: + '@sinonjs/commons': 1.8.6 + dev: true + + /@sinonjs/samsam@5.3.1: + resolution: {integrity: sha512-1Hc0b1TtyfBu8ixF/tpfSHTVWKwCBLY4QJbkgnE7HcwyvT2xArDxb4K7dMgqRm3szI+LJbzmW/s4xxEhv6hwDg==} + dependencies: + '@sinonjs/commons': 1.8.6 + lodash.get: 4.4.2 + type-detect: 4.0.8 + dev: true + + /@sinonjs/text-encoding@0.7.2: + resolution: {integrity: sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ==} + dev: true + + /@solidity-parser/parser@0.14.5: + resolution: {integrity: sha512-6dKnHZn7fg/iQATVEzqyUOyEidbn05q7YA2mQ9hC0MMXhhV3/JrsxmFSYZAcr7j1yUP700LLhTruvJ3MiQmjJg==} + dependencies: + antlr4ts: 0.5.0-alpha.4 + dev: true + + /@solidity-parser/parser@0.15.0: + resolution: {integrity: sha512-5UFJJTzWi1hgFk6aGCZ5rxG2DJkCJOzJ74qg7UkWSNCDSigW+CJLoYUb5bLiKrtI34Nr9rpFSUNHfkqtlL+N/w==} + dependencies: + antlr4ts: 0.5.0-alpha.4 + dev: false + + /@szmarczak/http-timer@1.1.2: + resolution: {integrity: sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==} + engines: {node: '>=6'} + dependencies: + defer-to-connect: 1.1.3 + dev: false + + /@szmarczak/http-timer@4.0.6: + resolution: {integrity: sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==} + engines: {node: '>=10'} + dependencies: + defer-to-connect: 2.0.1 + + /@szmarczak/http-timer@5.0.1: + resolution: {integrity: sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==} + engines: {node: '>=14.16'} + dependencies: + defer-to-connect: 2.0.1 + + /@truffle/blockchain-utils@0.0.25: + resolution: {integrity: sha512-XA5m0BfAWtysy5ChHyiAf1fXbJxJXphKk+eZ9Rb9Twi6fn3Jg4gnHNwYXJacYFEydqT5vr2s4Ou812JHlautpw==} + dependencies: + source-map-support: 0.5.21 + dev: false + + /@truffle/codec@0.7.1: + resolution: {integrity: sha512-mNd6KnW6J0UB1zafGBXDlTEbCMvWpmPAJmzv7aF/nAIaN/F8UePSCiQ1OTQP39Rprj6GFiCCaWVnBAwum6UGSg==} + dependencies: + big.js: 5.2.2 + bn.js: 4.12.0 + borc: 2.1.2 + debug: 4.3.4(supports-color@8.1.1) + lodash.clonedeep: 4.5.0 + lodash.escaperegexp: 4.1.2 + lodash.partition: 4.6.0 + lodash.sum: 4.0.2 + semver: 6.3.1 + source-map-support: 0.5.21 + utf8: 3.0.0 + web3-utils: 1.2.9 + transitivePeerDependencies: + - supports-color + dev: false + + /@truffle/contract-schema@3.4.16: + resolution: {integrity: sha512-g0WNYR/J327DqtJPI70ubS19K1Fth/1wxt2jFqLsPmz5cGZVjCwuhiie+LfBde4/Mc9QR8G+L3wtmT5cyoBxAg==} + engines: {node: ^16.20 || ^18.16 || >=20} + dependencies: + ajv: 6.12.6 + debug: 4.3.4(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + dev: false + + /@truffle/debug-utils@4.2.14: + resolution: {integrity: sha512-g5UTX2DPTzrjRjBJkviGI2IrQRTTSvqjmNWCNZNXP+vgQKNxL9maLZhQ6oA3BuuByVW/kusgYeXt8+W1zynC8g==} + dependencies: + '@truffle/codec': 0.7.1 + '@trufflesuite/chromafi': 2.2.2 + chalk: 2.4.2 + debug: 4.3.4(supports-color@8.1.1) + highlight.js: 9.18.5 + highlightjs-solidity: 1.2.2 + transitivePeerDependencies: + - supports-color + dev: false + + /@truffle/error@0.0.11: + resolution: {integrity: sha512-ju6TucjlJkfYMmdraYY/IBJaFb+Sa+huhYtOoyOJ+G29KcgytUVnDzKGwC7Kgk6IsxQMm62Mc1E0GZzFbGGipw==} + dev: false + + /@truffle/interface-adapter@0.4.24: + resolution: {integrity: sha512-2Zho4dJbm/XGwNleY7FdxcjXiAR3SzdGklgrAW4N/YVmltaJv6bT56ACIbPNN6AdzkTSTO65OlsB/63sfSa/VA==} + dependencies: + bn.js: 5.2.1 + ethers: 4.0.49 + web3: 1.3.6 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: false + + /@trufflesuite/chromafi@2.2.2: + resolution: {integrity: sha512-mItQwVBsb8qP/vaYHQ1kDt2vJLhjoEXJptT6y6fJGvFophMFhOI/NsTVUa0nJL1nyMeFiS6hSYuNVdpQZzB1gA==} + dependencies: + ansi-mark: 1.0.4 + ansi-regex: 3.0.1 + array-uniq: 1.0.3 + camelcase: 4.1.0 + chalk: 2.4.2 + cheerio: 1.0.0-rc.12 + detect-indent: 5.0.0 + he: 1.2.0 + highlight.js: 10.7.3 + lodash.merge: 4.6.2 + min-indent: 1.0.1 + strip-ansi: 4.0.0 + strip-indent: 2.0.0 + super-split: 1.1.0 + dev: false + + /@tsconfig/node10@1.0.9: + resolution: {integrity: sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==} + dev: true + + /@tsconfig/node12@1.0.11: + resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} + dev: true + + /@tsconfig/node14@1.0.3: + resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} + dev: true + + /@tsconfig/node16@1.0.4: + resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} + dev: true + + /@typechain/ethers-v6@0.5.0(ethers@6.7.0)(typechain@8.3.1)(typescript@5.0.4): + resolution: {integrity: sha512-wsz7AvbY5n2uVwpS2RHDYsW6wYOrhWxeTLFpxuzhO62w/ZDQEVIipArX731KA/hdqygP2zJ2RTkVXgzU1WrU1g==} + peerDependencies: + ethers: 6.x + typechain: ^8.3.1 + typescript: '>=4.7.0' + dependencies: + ethers: 6.7.0 + lodash: 4.17.21 + ts-essentials: 7.0.3(typescript@5.0.4) + typechain: 8.3.1(typescript@5.0.4) + typescript: 5.0.4 + dev: true + + /@typechain/hardhat@9.0.0(@typechain/ethers-v6@0.5.0)(ethers@6.7.0)(hardhat@packages+hardhat-core)(typechain@8.3.1): + resolution: {integrity: sha512-oCGRvcsryRHEDZ4KO2lenB7wdf8WMDS+f9KGcRFiQWcRLpWWD0ruBGRxNjzkTqyPLtgQ9MvZsXquAFPEw7gAEA==} + peerDependencies: + '@typechain/ethers-v6': ^0.5.0 + ethers: ^6.1.0 + hardhat: ^2.9.9 + typechain: ^8.3.1 + dependencies: + '@typechain/ethers-v6': 0.5.0(ethers@6.7.0)(typechain@8.3.1)(typescript@5.0.4) + ethers: 6.7.0 + fs-extra: 9.1.0 + hardhat: link:packages/hardhat-core + typechain: 8.3.1(typescript@5.0.4) + dev: true + + /@types/async-eventemitter@0.2.1: + resolution: {integrity: sha512-M2P4Ng26QbAeITiH7w1d7OxtldgfAe0wobpyJzVK/XOb0cUGKU2R4pfAhqcJBXAe2ife5ZOhSv4wk7p+ffURtg==} + dev: true + + /@types/bignumber.js@5.0.0: + resolution: {integrity: sha512-0DH7aPGCClywOFaxxjE6UwpN2kQYe9LwuDQMv+zYA97j5GkOMo8e66LYT+a8JYU7jfmUFRZLa9KycxHDsKXJCA==} + deprecated: This is a stub types definition for bignumber.js (https://github.com/MikeMcl/bignumber.js/). bignumber.js provides its own type definitions, so you don't need @types/bignumber.js installed! + dependencies: + bignumber.js: 9.1.2 + dev: false + + /@types/bn.js@4.11.6: + resolution: {integrity: sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==} + dependencies: + '@types/node': 16.18.40 + dev: false + + /@types/bn.js@5.1.1: + resolution: {integrity: sha512-qNrYbZqMx0uJAfKnKclPh+dTwK33KfLHYqtyODwd5HnXOjnkhc4qgn3BrK6RWyGZm5+sIFE7Q7Vz6QQtJB7w7g==} + dependencies: + '@types/node': 16.18.40 + + /@types/cacheable-request@6.0.3: + resolution: {integrity: sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==} + dependencies: + '@types/http-cache-semantics': 4.0.4 + '@types/keyv': 3.1.4 + '@types/node': 16.18.40 + '@types/responselike': 1.0.3 + + /@types/chai-as-promised@7.1.5: + resolution: {integrity: sha512-jStwss93SITGBwt/niYrkf2C+/1KTeZCZl1LaeezTlqppAKeoQC7jxyqYuP72sxBGKCIbw7oHgbYssIRzT5FCQ==} + dependencies: + '@types/chai': 4.3.5 + + /@types/chai-as-promised@7.1.6: + resolution: {integrity: sha512-cQLhk8fFarRVZAXUQV1xEnZgMoPxqKojBvRkqPCKPQCzEhpbbSKl1Uu75kDng7k5Ln6LQLUmNBjLlFthCgm1NA==} + dependencies: + '@types/chai': 4.3.5 + dev: true + + /@types/chai-as-promised@7.1.8: + resolution: {integrity: sha512-ThlRVIJhr69FLlh6IctTXFkmhtP3NpMZ2QGq69StYLyKZFp/HOp1VdKZj7RvfNWYYcJ1xlbLGLLWj1UvP5u/Gw==} + dependencies: + '@types/chai': 4.3.5 + dev: true + + /@types/chai@4.3.5: + resolution: {integrity: sha512-mEo1sAde+UCE6b2hxn332f1g1E8WfYRu6p5SvTKr2ZKC1f7gFJXk4h5PyGP9Dt6gCaG8y8XhwnXWC6Iy2cmBng==} + + /@types/ci-info@2.0.0: + resolution: {integrity: sha512-5R2/MHILQLDCzTuhs1j4Qqq8AaKUf7Ma4KSSkCtc12+fMs47zfa34qhto9goxpyX00tQK1zxB885VCiawZ5Qhg==} + dev: true + + /@types/concat-stream@1.6.1: + resolution: {integrity: sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA==} + dependencies: + '@types/node': 16.18.40 + dev: true + + /@types/debug@4.1.8: + resolution: {integrity: sha512-/vPO1EPOs306Cvhwv7KfVfYvOJqA/S/AXjaHQiJboCZzcNDb+TIJFN9/2C9DZ//ijSKWioNyUxD792QmDJ+HKQ==} + dependencies: + '@types/ms': 0.7.31 + dev: true + + /@types/find-up@2.1.1: + resolution: {integrity: sha512-60LC501bQRN9/3yfVaEEMd7IndaufffL56PBRAejPpUrY304Ps1jfnjNqPw5jmM5R8JHWiKBAe5IHzNcPV41AA==} + dev: true + + /@types/form-data@0.0.33: + resolution: {integrity: sha512-8BSvG1kGm83cyJITQMZSulnl6QV8jqAGreJsc5tPu1Jq0vTSOiY/k24Wx82JRpWwZSqrala6sd5rWi6aNXvqcw==} + dependencies: + '@types/node': 16.18.40 + dev: true + + /@types/fs-extra@5.1.0: + resolution: {integrity: sha512-AInn5+UBFIK9FK5xc9yP5e3TQSPNNgjHByqYcj9g5elVBnDQcQL7PlO1CIRy2gWlbwK7UPYqi7vRvFA44dCmYQ==} + dependencies: + '@types/node': 16.18.40 + dev: true + + /@types/glob@7.2.0: + resolution: {integrity: sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==} + dependencies: + '@types/minimatch': 5.1.2 + '@types/node': 16.18.40 + dev: true + + /@types/http-cache-semantics@4.0.4: + resolution: {integrity: sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==} + + /@types/is-ci@3.0.0: + resolution: {integrity: sha512-Q0Op0hdWbYd1iahB+IFNQcWXFq4O0Q5MwQP7uN0souuQ4rPg1vEYcnIOfr1gY+M+6rc8FGoRaBO1mOOvL29sEQ==} + dependencies: + ci-info: 3.8.0 + dev: true + + /@types/json-schema@7.0.12: + resolution: {integrity: sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==} + + /@types/json5@0.0.29: + resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} + dev: true + + /@types/keccak@3.0.1: + resolution: {integrity: sha512-/MxAVmtyyeOvZ6dGf3ciLwFRuV5M8DRIyYNFGHYI6UyBW4/XqyO0LZw+JFMvaeY3cHItQAkELclBU1x5ank6mg==} + dependencies: + '@types/node': 16.18.40 + dev: true + + /@types/keyv@3.1.4: + resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} + dependencies: + '@types/node': 16.18.40 + + /@types/lodash.clonedeep@4.5.7: + resolution: {integrity: sha512-ccNqkPptFIXrpVqUECi60/DFxjNKsfoQxSQsgcBJCX/fuX1wgyQieojkcWH/KpE3xzLoWN/2k+ZeGqIN3paSvw==} + dependencies: + '@types/lodash': 4.14.197 + dev: true + + /@types/lodash.isequal@4.5.6: + resolution: {integrity: sha512-Ww4UGSe3DmtvLLJm2F16hDwEQSv7U0Rr8SujLUA2wHI2D2dm8kPu6Et+/y303LfjTIwSBKXB/YTUcAKpem/XEg==} + dependencies: + '@types/lodash': 4.14.197 + dev: true + + /@types/lodash.memoize@4.1.7: + resolution: {integrity: sha512-lGN7WeO4vO6sICVpf041Q7BX/9k1Y24Zo3FY0aUezr1QlKznpjzsDk3T3wvH8ofYzoK0QupN9TWcFAFZlyPwQQ==} + dependencies: + '@types/lodash': 4.14.197 + dev: true + + /@types/lodash@4.14.197: + resolution: {integrity: sha512-BMVOiWs0uNxHVlHBgzTIqJYmj+PgCo4euloGF+5m4okL3rEYzM2EEv78mw8zWSMM57dM7kVIgJ2QDvwHSoCI5g==} + dev: true + + /@types/lru-cache@5.1.1: + resolution: {integrity: sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw==} + dev: false + + /@types/minimatch@5.1.2: + resolution: {integrity: sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==} + dev: true + + /@types/minimist@1.2.2: + resolution: {integrity: sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==} + dev: true + + /@types/mocha@10.0.1: + resolution: {integrity: sha512-/fvYntiO1GeICvqbQ3doGDIP97vWmvFt83GKguJ6prmQM2iXZfFcq6YE8KteFyRtX2/h5Hf91BYvPodJKFYv5Q==} + dev: true + + /@types/ms@0.7.31: + resolution: {integrity: sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==} + dev: true + + /@types/node@10.17.60: + resolution: {integrity: sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==} + dev: true + + /@types/node@12.20.55: + resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} + + /@types/node@16.18.40: + resolution: {integrity: sha512-+yno3ItTEwGxXiS/75Q/aHaa5srkpnJaH+kdkTVJ3DtJEwv92itpKbxU+FjPoh2m/5G9zmUQfrL4A4C13c+iGA==} + + /@types/node@18.15.13: + resolution: {integrity: sha512-N+0kuo9KgrUQ1Sn/ifDXsvg0TTleP7rIy4zOBGECxAljqvqfqpTfzx0Q1NUedOixRMBfe2Whhb056a42cWs26Q==} + + /@types/node@8.10.66: + resolution: {integrity: sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==} + dev: true + + /@types/normalize-package-data@2.4.1: + resolution: {integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==} + dev: true + + /@types/pbkdf2@3.1.0: + resolution: {integrity: sha512-Cf63Rv7jCQ0LaL8tNXmEyqTHuIJxRdlS5vMh1mj5voN4+QFhVZnlZruezqpWYDiJ8UTzhP0VmeLXCmBk66YrMQ==} + dependencies: + '@types/node': 16.18.40 + + /@types/prettier@2.7.3: + resolution: {integrity: sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==} + dev: true + + /@types/qs@6.9.10: + resolution: {integrity: sha512-3Gnx08Ns1sEoCrWssEgTSJs/rsT2vhGP+Ja9cnnk9k4ALxinORlQneLXFeFKOTJMOeZUFD1s7w+w2AphTpvzZw==} + dev: true + + /@types/readable-stream@2.3.15: + resolution: {integrity: sha512-oM5JSKQCcICF1wvGgmecmHldZ48OZamtMxcGGVICOJA8o8cahXC1zEVAif8iwoc5j8etxFaRFnf095+CDsuoFQ==} + dependencies: + '@types/node': 16.18.40 + safe-buffer: 5.1.2 + dev: false + + /@types/resolve@1.20.2: + resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==} + dev: true + + /@types/responselike@1.0.3: + resolution: {integrity: sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==} + dependencies: + '@types/node': 16.18.40 + + /@types/secp256k1@4.0.3: + resolution: {integrity: sha512-Da66lEIFeIz9ltsdMZcpQvmrmmoqrfju8pm1BH8WbYjZSwUgCwXLb9C+9XYogwBITnbsSaMdVPb2ekf7TV+03w==} + dependencies: + '@types/node': 16.18.40 + + /@types/semver@6.2.3: + resolution: {integrity: sha512-KQf+QAMWKMrtBMsB8/24w53tEsxllMj6TuA80TT/5igJalLI/zm0L3oXRbIAl4Ohfc85gyHX/jhMwsVkmhLU4A==} + dev: true + + /@types/semver@7.5.0: + resolution: {integrity: sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==} + + /@types/sinon-chai@3.2.9: + resolution: {integrity: sha512-/19t63pFYU0ikrdbXKBWj9PCdnKyTd0Qkz0X91Ta081cYsq90OxYdcWwK/dwEoDa6dtXgj2HJfmzgq+QZTHdmQ==} + dependencies: + '@types/chai': 4.3.5 + '@types/sinon': 9.0.11 + dev: true + + /@types/sinon@9.0.11: + resolution: {integrity: sha512-PwP4UY33SeeVKodNE37ZlOsR9cReypbMJOhZ7BVE0lB+Hix3efCOxiJWiE5Ia+yL9Cn2Ch72EjFTRze8RZsNtg==} + dependencies: + '@types/sinonjs__fake-timers': 8.1.2 + dev: true + + /@types/sinonjs__fake-timers@8.1.2: + resolution: {integrity: sha512-9GcLXF0/v3t80caGs5p2rRfkB+a8VBGLJZVih6CNFkx8IZ994wiKKLSRs9nuFwk1HevWs/1mnUmkApGrSGsShA==} + dev: true + + /@types/uuid@8.3.4: + resolution: {integrity: sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==} + dev: true + + /@types/ws@7.4.7: + resolution: {integrity: sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==} + dependencies: + '@types/node': 16.18.40 + dev: true + + /@types/ws@8.5.3: + resolution: {integrity: sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w==} + dependencies: + '@types/node': 16.18.40 + dev: true + + /@types/ws@8.5.9: + resolution: {integrity: sha512-jbdrY0a8lxfdTp/+r7Z4CkycbOFN8WX+IOchLJr3juT/xzbJ8URyTVSJ/hvNdadTgM1mnedb47n+Y31GsFnQlg==} + dependencies: + '@types/node': 16.18.40 + dev: true + + /@typescript-eslint/eslint-plugin@5.61.0(@typescript-eslint/parser@5.61.0)(eslint@8.47.0)(typescript@5.0.4): + resolution: {integrity: sha512-A5l/eUAug103qtkwccSCxn8ZRwT+7RXWkFECdA4Cvl1dOlDUgTpAOfSEElZn2uSUxhdDpnCdetrf0jvU4qrL+g==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + '@typescript-eslint/parser': ^5.0.0 + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@eslint-community/regexpp': 4.6.2 + '@typescript-eslint/parser': 5.61.0(eslint@8.47.0)(typescript@5.0.4) + '@typescript-eslint/scope-manager': 5.61.0 + '@typescript-eslint/type-utils': 5.61.0(eslint@8.47.0)(typescript@5.0.4) + '@typescript-eslint/utils': 5.61.0(eslint@8.47.0)(typescript@5.0.4) + debug: 4.3.4(supports-color@8.1.1) + eslint: 8.47.0 + graphemer: 1.4.0 + ignore: 5.2.4 + natural-compare-lite: 1.4.0 + semver: 7.5.4 + tsutils: 3.21.0(typescript@5.0.4) + typescript: 5.0.4 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/parser@5.61.0(eslint@8.47.0)(typescript@5.0.4): + resolution: {integrity: sha512-yGr4Sgyh8uO6fSi9hw3jAFXNBHbCtKKFMdX2IkT3ZqpKmtAq3lHS4ixB/COFuAIJpwl9/AqF7j72ZDWYKmIfvg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/scope-manager': 5.61.0 + '@typescript-eslint/types': 5.61.0 + '@typescript-eslint/typescript-estree': 5.61.0(typescript@5.0.4) + debug: 4.3.4(supports-color@8.1.1) + eslint: 8.47.0 + typescript: 5.0.4 + transitivePeerDependencies: + - supports-color + + /@typescript-eslint/scope-manager@5.61.0: + resolution: {integrity: sha512-W8VoMjoSg7f7nqAROEmTt6LoBpn81AegP7uKhhW5KzYlehs8VV0ZW0fIDVbcZRcaP3aPSW+JZFua+ysQN+m/Nw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + '@typescript-eslint/types': 5.61.0 + '@typescript-eslint/visitor-keys': 5.61.0 + + /@typescript-eslint/scope-manager@5.62.0: + resolution: {integrity: sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/visitor-keys': 5.62.0 + dev: true + + /@typescript-eslint/type-utils@5.61.0(eslint@8.47.0)(typescript@5.0.4): + resolution: {integrity: sha512-kk8u//r+oVK2Aj3ph/26XdH0pbAkC2RiSjUYhKD+PExemG4XSjpGFeyZ/QM8lBOa7O8aGOU+/yEbMJgQv/DnCg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: '*' + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/typescript-estree': 5.61.0(typescript@5.0.4) + '@typescript-eslint/utils': 5.61.0(eslint@8.47.0)(typescript@5.0.4) + debug: 4.3.4(supports-color@8.1.1) + eslint: 8.47.0 + tsutils: 3.21.0(typescript@5.0.4) + typescript: 5.0.4 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/types@5.61.0: + resolution: {integrity: sha512-ldyueo58KjngXpzloHUog/h9REmHl59G1b3a5Sng1GfBo14BkS3ZbMEb3693gnP1k//97lh7bKsp6/V/0v1veQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + /@typescript-eslint/types@5.62.0: + resolution: {integrity: sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + + /@typescript-eslint/typescript-estree@5.61.0(typescript@5.0.4): + resolution: {integrity: sha512-Fud90PxONnnLZ36oR5ClJBLTLfU4pIWBmnvGwTbEa2cXIqj70AEDEmOmpkFComjBZ/037ueKrOdHuYmSFVD7Rw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/types': 5.61.0 + '@typescript-eslint/visitor-keys': 5.61.0 + debug: 4.3.4(supports-color@8.1.1) + globby: 11.1.0 + is-glob: 4.0.3 + semver: 7.5.4 + tsutils: 3.21.0(typescript@5.0.4) + typescript: 5.0.4 + transitivePeerDependencies: + - supports-color + + /@typescript-eslint/typescript-estree@5.62.0(typescript@5.0.4): + resolution: {integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/visitor-keys': 5.62.0 + debug: 4.3.4(supports-color@8.1.1) + globby: 11.1.0 + is-glob: 4.0.3 + semver: 7.5.4 + tsutils: 3.21.0(typescript@5.0.4) + typescript: 5.0.4 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/utils@5.61.0(eslint@8.47.0)(typescript@5.0.4): + resolution: {integrity: sha512-mV6O+6VgQmVE6+xzlA91xifndPW9ElFW8vbSF0xCT/czPXVhwDewKila1jOyRwa9AE19zKnrr7Cg5S3pJVrTWQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.47.0) + '@types/json-schema': 7.0.12 + '@types/semver': 7.5.0 + '@typescript-eslint/scope-manager': 5.61.0 + '@typescript-eslint/types': 5.61.0 + '@typescript-eslint/typescript-estree': 5.61.0(typescript@5.0.4) + eslint: 8.47.0 + eslint-scope: 5.1.1 + semver: 7.5.4 + transitivePeerDependencies: + - supports-color + - typescript + + /@typescript-eslint/utils@5.62.0(eslint@8.47.0)(typescript@5.0.4): + resolution: {integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.47.0) + '@types/json-schema': 7.0.12 + '@types/semver': 7.5.0 + '@typescript-eslint/scope-manager': 5.62.0 + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.0.4) + eslint: 8.47.0 + eslint-scope: 5.1.1 + semver: 7.5.4 + transitivePeerDependencies: + - supports-color + - typescript + dev: true + + /@typescript-eslint/visitor-keys@5.61.0: + resolution: {integrity: sha512-50XQ5VdbWrX06mQXhy93WywSFZZGsv3EOjq+lqp6WC2t+j3mb6A9xYVdrRxafvK88vg9k9u+CT4l6D8PEatjKg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + '@typescript-eslint/types': 5.61.0 + eslint-visitor-keys: 3.4.3 + + /@typescript-eslint/visitor-keys@5.62.0: + resolution: {integrity: sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + '@typescript-eslint/types': 5.62.0 + eslint-visitor-keys: 3.4.3 + dev: true + + /abbrev@1.0.9: + resolution: {integrity: sha512-LEyx4aLEC3x6T0UguF6YILf+ntvmOaWsVfENmIW0E9H09vKlLDGelMjjSm0jkDHALj8A8quZ/HapKNigzwge+Q==} + dev: true + + /abitype@0.7.1(typescript@5.0.4): + resolution: {integrity: sha512-VBkRHTDZf9Myaek/dO3yMmOzB/y2s3Zo6nVU7yaw1G+TvCHAjwaJzNGN9yo4K5D8bU/VZXKP1EJpRhFr862PlQ==} + peerDependencies: + typescript: '>=4.9.4' + zod: ^3 >=3.19.1 + peerDependenciesMeta: + zod: + optional: true + dependencies: + typescript: 5.0.4 + dev: true + + /abitype@0.9.8(typescript@5.0.4): + resolution: {integrity: sha512-puLifILdm+8sjyss4S+fsUN09obiT1g2YW6CtcQF+QDzxR0euzgEB29MZujC6zMk2a6SVmtttq1fc6+YFA7WYQ==} + peerDependencies: + typescript: '>=5.0.4' + zod: ^3 >=3.19.1 + peerDependenciesMeta: + typescript: + optional: true + zod: + optional: true + dependencies: + typescript: 5.0.4 + + /abortcontroller-polyfill@1.7.5: + resolution: {integrity: sha512-JMJ5soJWP18htbbxJjG7bG6yuI6pRhgJ0scHHTfkUjf6wjP912xZWvM+A4sJK3gqd9E8fcPbDnOefbA9Th/FIQ==} + + /abstract-level@1.0.3: + resolution: {integrity: sha512-t6jv+xHy+VYwc4xqZMn2Pa9DjcdzvzZmQGRjTFc8spIbRGHgBrEKbPq+rYXc7CCo0lxgYvSgKVg9qZAhpVQSjA==} + engines: {node: '>=12'} + dependencies: + buffer: 6.0.3 + catering: 2.1.1 + is-buffer: 2.0.5 + level-supports: 4.0.1 + level-transcoder: 1.0.1 + module-error: 1.0.2 + queue-microtask: 1.2.3 + dev: false + + /accepts@1.3.8: + resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} + engines: {node: '>= 0.6'} + dependencies: + mime-types: 2.1.35 + negotiator: 0.6.3 + + /acorn-jsx@5.3.2(acorn@8.10.0): + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + acorn: 8.10.0 + + /acorn-walk@8.2.0: + resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} + engines: {node: '>=0.4.0'} + dev: true + + /acorn@8.10.0: + resolution: {integrity: sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==} + engines: {node: '>=0.4.0'} + hasBin: true + + /address@1.2.2: + resolution: {integrity: sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==} + engines: {node: '>= 10.0.0'} + dev: true + + /adm-zip@0.4.16: + resolution: {integrity: sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg==} + engines: {node: '>=0.3.0'} + dev: false + + /aes-js@3.0.0: + resolution: {integrity: sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==} + + /aes-js@4.0.0-beta.5: + resolution: {integrity: sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==} + + /agent-base@6.0.2: + resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} + engines: {node: '>= 6.0.0'} + dependencies: + debug: 4.3.4(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + dev: false + + /aggregate-error@3.1.0: + resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} + engines: {node: '>=8'} + dependencies: + clean-stack: 2.2.0 + indent-string: 4.0.0 + + /ajv@5.5.2: + resolution: {integrity: sha512-Ajr4IcMXq/2QmMkEmSvxqfLN5zGmJ92gHXAeOXq1OekoH2rfDNsgdDoL2f7QaRCy7G/E6TpxBVdRuNraMztGHw==} + dependencies: + co: 4.6.0 + fast-deep-equal: 1.1.0 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.3.1 + dev: false + + /ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + + /ajv@8.12.0: + resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} + dependencies: + fast-deep-equal: 3.1.3 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + uri-js: 4.4.1 + + /amdefine@1.0.1: + resolution: {integrity: sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg==} + engines: {node: '>=0.4.2'} + requiresBuild: true + dev: true + optional: true + + /ansi-align@3.0.1: + resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} + dependencies: + string-width: 4.2.3 + dev: false + + /ansi-colors@3.2.3: + resolution: {integrity: sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==} + engines: {node: '>=6'} + dev: true + + /ansi-colors@4.1.1: + resolution: {integrity: sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==} + engines: {node: '>=6'} + + /ansi-colors@4.1.3: + resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} + engines: {node: '>=6'} + + /ansi-escapes@4.3.2: + resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} + engines: {node: '>=8'} + dependencies: + type-fest: 0.21.3 + dev: false + + /ansi-mark@1.0.4: + resolution: {integrity: sha512-3UG9PiYp/eyLuOojJbcQfiH0s8VmHV4M/K9e24q5EBD8PDoDy0Ii4y/VYnTgF+0hWjm8WXz4ybmX6kftbeelFw==} + dependencies: + ansi-regex: 3.0.1 + array-uniq: 1.0.3 + chalk: 2.4.2 + strip-ansi: 4.0.0 + super-split: 1.1.0 + dev: false + + /ansi-regex@3.0.1: + resolution: {integrity: sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==} + engines: {node: '>=4'} + + /ansi-regex@4.1.1: + resolution: {integrity: sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==} + engines: {node: '>=6'} + dev: true + + /ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + /ansi-styles@1.0.0: + resolution: {integrity: sha512-3iF4FIKdxaVYT3JqQuY3Wat/T2t7TRbbQ94Fu50ZUCbLy4TFbTzr90NOHQodQkNqmeEGCw8WbeP78WNi6SKYUA==} + engines: {node: '>=0.8.0'} + dev: true + + /ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + dependencies: + color-convert: 1.9.3 + + /ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + dependencies: + color-convert: 2.0.1 + + /ansi-styles@5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} + dev: true + + /antlr4@4.13.1: + resolution: {integrity: sha512-kiXTspaRYvnIArgE97z5YVVf/cDVQABr3abFRR6mE7yesLMkgu4ujuyV/sgxafQ8wgve0DJQUJ38Z8tkgA2izA==} + engines: {node: '>=16'} + dev: false + + /antlr4@4.8.0: + resolution: {integrity: sha512-en/MxQ4OkPgGJQ3wD/muzj1uDnFSzdFIhc2+c6bHZokWkuBb6RRvFjpWhPxWLbgQvaEzldJZ0GSQpfSAaE3hqg==} + dev: false + + /antlr4ts@0.5.0-alpha.4: + resolution: {integrity: sha512-WPQDt1B74OfPv/IMS2ekXAKkTZIHl88uMetg6q3OTqgFxZ/dxDXI0EWLyZid/1Pe6hTftyg5N7gel5wNAGxXyQ==} + + /any-promise@1.3.0: + resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + dev: false + + /anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + + /append-transform@2.0.0: + resolution: {integrity: sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==} + engines: {node: '>=8'} + dependencies: + default-require-extensions: 3.0.1 + dev: true + + /archy@1.0.0: + resolution: {integrity: sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==} + dev: true + + /arg@4.1.3: + resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} + dev: true + + /argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + dependencies: + sprintf-js: 1.0.3 + dev: true + + /argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + /array-back@3.1.0: + resolution: {integrity: sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==} + engines: {node: '>=6'} + dev: true + + /array-back@4.0.2: + resolution: {integrity: sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==} + engines: {node: '>=8'} + dev: true + + /array-buffer-byte-length@1.0.0: + resolution: {integrity: sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==} + dependencies: + call-bind: 1.0.2 + is-array-buffer: 3.0.2 + dev: true + + /array-flatten@1.1.1: + resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} + + /array-includes@3.1.6: + resolution: {integrity: sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.22.1 + get-intrinsic: 1.2.1 + is-string: 1.0.7 + dev: true + + /array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + + /array-uniq@1.0.3: + resolution: {integrity: sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==} + engines: {node: '>=0.10.0'} + + /array.prototype.flat@1.3.1: + resolution: {integrity: sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.22.1 + es-shim-unscopables: 1.0.0 + dev: true + + /array.prototype.flatmap@1.3.1: + resolution: {integrity: sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.22.1 + es-shim-unscopables: 1.0.0 + dev: true + + /array.prototype.reduce@1.0.6: + resolution: {integrity: sha512-UW+Mz8LG/sPSU8jRDCjVr6J/ZKAGpHfwrZ6kWTG5qCxIEiXdVshqGnu5vEZA8S1y6X4aCSbQZ0/EEsfvEvBiSg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.22.1 + es-array-method-boxes-properly: 1.0.0 + is-string: 1.0.7 + dev: true + + /arraybuffer.prototype.slice@1.0.1: + resolution: {integrity: sha512-09x0ZWFEjj4WD8PDbykUwo3t9arLn8NIzmmYEJFpYekOAQjpkGSyrQhNoRTcwwcFRu+ycWF78QZ63oWTqSjBcw==} + engines: {node: '>= 0.4'} + dependencies: + array-buffer-byte-length: 1.0.0 + call-bind: 1.0.2 + define-properties: 1.2.0 + get-intrinsic: 1.2.1 + is-array-buffer: 3.0.2 + is-shared-array-buffer: 1.0.2 + dev: true + + /arrify@1.0.1: + resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} + engines: {node: '>=0.10.0'} + dev: true + + /asap@2.0.6: + resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} + dev: true + + /asn1.js@5.4.1: + resolution: {integrity: sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==} + dependencies: + bn.js: 4.12.0 + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + safer-buffer: 2.1.2 + dev: false + + /asn1@0.2.6: + resolution: {integrity: sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==} + dependencies: + safer-buffer: 2.1.2 + + /assert-plus@1.0.0: + resolution: {integrity: sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==} + engines: {node: '>=0.8'} + + /assertion-error@1.1.0: + resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} + + /ast-parents@0.0.1: + resolution: {integrity: sha512-XHusKxKz3zoYk1ic8Un640joHbFMhbqneyoZfoKnEGtf2ey9Uh/IdpcQplODdO/kENaMIWsD0nJm4+wX3UNLHA==} + dev: false + + /astral-regex@2.0.0: + resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} + engines: {node: '>=8'} + dev: false + + /async-limiter@1.0.1: + resolution: {integrity: sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==} + + /async@1.5.2: + resolution: {integrity: sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w==} + dev: true + + /asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + + /at-least-node@1.0.0: + resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} + engines: {node: '>= 4.0.0'} + dev: true + + /available-typed-arrays@1.0.5: + resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==} + engines: {node: '>= 0.4'} + + /aws-sign2@0.7.0: + resolution: {integrity: sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==} + + /aws4@1.12.0: + resolution: {integrity: sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==} + + /axios@0.21.4: + resolution: {integrity: sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==} + dependencies: + follow-redirects: 1.15.2(debug@4.3.4) + transitivePeerDependencies: + - debug + dev: false + + /axios@1.6.0(debug@4.3.4): + resolution: {integrity: sha512-EZ1DYihju9pwVB+jg67ogm+Tmqc6JmhamRN6I4Zt8DfZu5lbcQGw3ozH9lFejSJgs/ibaef3A9PMXPLeefFGJg==} + dependencies: + follow-redirects: 1.15.2(debug@4.3.4) + form-data: 4.0.0 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + + /balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + /base-x@3.0.9: + resolution: {integrity: sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==} + dependencies: + safe-buffer: 5.2.1 + + /base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + + /bcrypt-pbkdf@1.0.2: + resolution: {integrity: sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==} + dependencies: + tweetnacl: 0.14.5 + + /bech32@1.1.4: + resolution: {integrity: sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==} + + /better-path-resolve@1.0.0: + resolution: {integrity: sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==} + engines: {node: '>=4'} + dependencies: + is-windows: 1.0.2 + dev: true + + /big.js@5.2.2: + resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==} + dev: false + + /bigint-crypto-utils@3.3.0: + resolution: {integrity: sha512-jOTSb+drvEDxEq6OuUybOAv/xxoh3cuYRUIPyu8sSHQNKM303UQ2R1DAo45o1AkcIXw6fzbaFI1+xGGdaXs2lg==} + engines: {node: '>=14.0.0'} + dev: false + + /bignumber.js@7.2.1: + resolution: {integrity: sha512-S4XzBk5sMB+Rcb/LNcpzXr57VRTxgAvaAEDAl1AwRx27j00hT84O6OkteE7u8UB3NuaaygCRrEpqox4uDOrbdQ==} + dev: false + + /bignumber.js@9.1.1: + resolution: {integrity: sha512-pHm4LsMJ6lzgNGVfZHjMoO8sdoRhOzOH4MLmY65Jg70bpxCKu5iOHNJyfF6OyvYw7t8Fpf35RuzUyqnQsj8Vig==} + + /bignumber.js@9.1.2: + resolution: {integrity: sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==} + + /binary-extensions@2.2.0: + resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} + engines: {node: '>=8'} + + /bindings@1.5.0: + resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} + dependencies: + file-uri-to-path: 1.0.0 + dev: false + + /bl@4.1.0: + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + dependencies: + buffer: 5.7.1 + inherits: 2.0.4 + readable-stream: 3.6.2 + dev: false + + /blakejs@1.2.1: + resolution: {integrity: sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ==} + + /bluebird@3.7.2: + resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==} + + /bn-str-256@1.9.1: + resolution: {integrity: sha512-u3muv3WO5sYv9nUQsPnDGLg731yNt/MOlKPK5pmBVqClcl7tY97tyfKxw8ed44HVrpi+7dkgJgQpbXP47a3GoQ==} + dependencies: + decimal.js-light: 2.5.1 + lodash: 4.17.21 + dev: false + + /bn.js@4.11.6: + resolution: {integrity: sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA==} + + /bn.js@4.11.8: + resolution: {integrity: sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==} + dev: false + + /bn.js@4.12.0: + resolution: {integrity: sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==} + + /bn.js@5.2.1: + resolution: {integrity: sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==} + + /body-parser@1.20.1: + resolution: {integrity: sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + dependencies: + bytes: 3.1.2 + content-type: 1.0.5 + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + on-finished: 2.4.1 + qs: 6.11.0 + raw-body: 2.5.1 + type-is: 1.6.18 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + + /body-parser@1.20.2: + resolution: {integrity: sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + dependencies: + bytes: 3.1.2 + content-type: 1.0.5 + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + on-finished: 2.4.1 + qs: 6.11.0 + raw-body: 2.5.2 + type-is: 1.6.18 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + + /boolbase@1.0.0: + resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + dev: false + + /boolean@3.2.0: + resolution: {integrity: sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==} + dev: true + + /borc@2.1.2: + resolution: {integrity: sha512-Sy9eoUi4OiKzq7VovMn246iTo17kzuyHJKomCfpWMlI6RpfN1gk95w7d7gH264nApVLg0HZfcpz62/g4VH1Y4w==} + engines: {node: '>=4'} + dependencies: + bignumber.js: 9.1.2 + buffer: 5.7.1 + commander: 2.20.3 + ieee754: 1.2.1 + iso-url: 0.4.7 + json-text-sequence: 0.1.1 + readable-stream: 3.6.2 + dev: false + + /boxen@5.1.2: + resolution: {integrity: sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==} + engines: {node: '>=10'} + dependencies: + ansi-align: 3.0.1 + camelcase: 6.3.0 + chalk: 4.1.2 + cli-boxes: 2.2.1 + string-width: 4.2.3 + type-fest: 0.20.2 + widest-line: 3.1.0 + wrap-ansi: 7.0.0 + dev: false + + /brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + /brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + dependencies: + balanced-match: 1.0.2 + + /braces@3.0.2: + resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + engines: {node: '>=8'} + dependencies: + fill-range: 7.0.1 + + /breakword@1.0.6: + resolution: {integrity: sha512-yjxDAYyK/pBvws9H4xKYpLDpYKEH6CzrBPAuXq3x18I+c/2MkVtT3qAr7Oloi6Dss9qNhPVueAAVU1CSeNDIXw==} + dependencies: + wcwidth: 1.0.1 + dev: true + + /brorand@1.1.0: + resolution: {integrity: sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==} + + /browser-level@1.0.1: + resolution: {integrity: sha512-XECYKJ+Dbzw0lbydyQuJzwNXtOpbMSq737qxJN11sIRTErOMShvDpbzTlgju7orJKvx4epULolZAuJGLzCmWRQ==} + dependencies: + abstract-level: 1.0.3 + catering: 2.1.1 + module-error: 1.0.2 + run-parallel-limit: 1.1.0 + dev: false + + /browser-stdout@1.3.1: + resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==} + + /browserify-aes@1.2.0: + resolution: {integrity: sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==} + dependencies: + buffer-xor: 1.0.3 + cipher-base: 1.0.4 + create-hash: 1.2.0 + evp_bytestokey: 1.0.3 + inherits: 2.0.4 + safe-buffer: 5.2.1 + + /browserify-cipher@1.0.1: + resolution: {integrity: sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==} + dependencies: + browserify-aes: 1.2.0 + browserify-des: 1.0.2 + evp_bytestokey: 1.0.3 + dev: false + + /browserify-des@1.0.2: + resolution: {integrity: sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==} + dependencies: + cipher-base: 1.0.4 + des.js: 1.1.0 + inherits: 2.0.4 + safe-buffer: 5.2.1 + dev: false + + /browserify-rsa@4.1.0: + resolution: {integrity: sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==} + dependencies: + bn.js: 5.2.1 + randombytes: 2.1.0 + dev: false + + /browserify-sign@4.2.2: + resolution: {integrity: sha512-1rudGyeYY42Dk6texmv7c4VcQ0EsvVbLwZkA+AQB7SxvXxmcD93jcHie8bzecJ+ChDlmAm2Qyu0+Ccg5uhZXCg==} + engines: {node: '>= 4'} + dependencies: + bn.js: 5.2.1 + browserify-rsa: 4.1.0 + create-hash: 1.2.0 + create-hmac: 1.1.7 + elliptic: 6.5.4 + inherits: 2.0.4 + parse-asn1: 5.1.6 + readable-stream: 3.6.2 + safe-buffer: 5.2.1 + dev: false + + /browserslist@4.22.1: + resolution: {integrity: sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + dependencies: + caniuse-lite: 1.0.30001561 + electron-to-chromium: 1.4.578 + node-releases: 2.0.13 + update-browserslist-db: 1.0.13(browserslist@4.22.1) + dev: true + + /bs58@4.0.1: + resolution: {integrity: sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==} + dependencies: + base-x: 3.0.9 + + /bs58check@2.1.2: + resolution: {integrity: sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==} + dependencies: + bs58: 4.0.1 + create-hash: 1.2.0 + safe-buffer: 5.2.1 + + /buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + + /buffer-to-arraybuffer@0.0.5: + resolution: {integrity: sha512-3dthu5CYiVB1DEJp61FtApNnNndTckcqe4pFcLdvHtrpG+kcyekCJKg4MRiDcFW7A6AODnXB9U4dwQiCW5kzJQ==} + + /buffer-xor@1.0.3: + resolution: {integrity: sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==} + + /buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + + /buffer@6.0.3: + resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + + /bufferutil@4.0.8: + resolution: {integrity: sha512-4T53u4PdgsXqKaIctwF8ifXlRTTmEPJ8iEPWFdGZvcf7sbwYo6FKFEX9eNNAnzFZ7EzJAQ3CJeOtCRA4rDp7Pw==} + engines: {node: '>=6.14.2'} + requiresBuild: true + dependencies: + node-gyp-build: 4.6.0 + + /busboy@1.6.0: + resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} + engines: {node: '>=10.16.0'} + dependencies: + streamsearch: 1.1.0 + dev: false + + /bytes@3.1.2: + resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} + engines: {node: '>= 0.8'} + + /cacheable-lookup@5.0.4: + resolution: {integrity: sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==} + engines: {node: '>=10.6.0'} + + /cacheable-lookup@6.1.0: + resolution: {integrity: sha512-KJ/Dmo1lDDhmW2XDPMo+9oiy/CeqosPguPCrgcVzKyZrL6pM1gU2GmPY/xo6OQPTUaA/c0kwHuywB4E6nmT9ww==} + engines: {node: '>=10.6.0'} + + /cacheable-request@6.1.0: + resolution: {integrity: sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==} + engines: {node: '>=8'} + dependencies: + clone-response: 1.0.3 + get-stream: 5.2.0 + http-cache-semantics: 4.1.1 + keyv: 3.1.0 + lowercase-keys: 2.0.0 + normalize-url: 4.5.1 + responselike: 1.0.2 + dev: false + + /cacheable-request@7.0.4: + resolution: {integrity: sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==} + engines: {node: '>=8'} + dependencies: + clone-response: 1.0.3 + get-stream: 5.2.0 + http-cache-semantics: 4.1.1 + keyv: 4.5.4 + lowercase-keys: 2.0.0 + normalize-url: 6.1.0 + responselike: 2.0.1 + + /caching-transform@4.0.0: + resolution: {integrity: sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==} + engines: {node: '>=8'} + dependencies: + hasha: 5.2.2 + make-dir: 3.1.0 + package-hash: 4.0.0 + write-file-atomic: 3.0.3 + dev: true + + /call-bind@1.0.2: + resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} + dependencies: + function-bind: 1.1.1 + get-intrinsic: 1.2.1 + + /callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + /camelcase-keys@6.2.2: + resolution: {integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==} + engines: {node: '>=8'} + dependencies: + camelcase: 5.3.1 + map-obj: 4.3.0 + quick-lru: 4.0.1 + dev: true + + /camelcase@4.1.0: + resolution: {integrity: sha512-FxAv7HpHrXbh3aPo4o2qxHay2lkLY3x5Mw3KeE4KQE8ysVfziWeRZDwcjauvwBSGEC/nXUPzZy8zeh4HokqOnw==} + engines: {node: '>=4'} + dev: false + + /camelcase@5.3.1: + resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} + engines: {node: '>=6'} + dev: true + + /camelcase@6.3.0: + resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} + engines: {node: '>=10'} + + /caniuse-lite@1.0.30001561: + resolution: {integrity: sha512-NTt0DNoKe958Q0BE0j0c1V9jbUzhBxHIEJy7asmGrpE0yG63KTV7PLHPnK2E1O9RsQrQ081I3NLuXGS6zht3cw==} + dev: true + + /case@1.6.3: + resolution: {integrity: sha512-mzDSXIPaFwVDvZAHqZ9VlbyF4yyXRuX6IvB06WvPYkqJVO24kX1PPhv9bfpKNFZyxYFmmgo03HUiD8iklmJYRQ==} + engines: {node: '>= 0.8.0'} + dev: false + + /caseless@0.12.0: + resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==} + + /catering@2.1.1: + resolution: {integrity: sha512-K7Qy8O9p76sL3/3m7/zLKbRkyOlSZAgzEaLhyj2mXS8PsCud2Eo4hAb8aLtZqHh0QGqLcb9dlJSu6lHRVENm1w==} + engines: {node: '>=6'} + dev: false + + /cbor@8.1.0: + resolution: {integrity: sha512-DwGjNW9omn6EwP70aXsn7FQJx5kO12tX0bZkaTjzdVFM6/7nhA4t0EENocKGx6D2Bch9PE2KzCUf5SceBdeijg==} + engines: {node: '>=12.19'} + dependencies: + nofilter: 3.1.0 + dev: false + + /chai-as-promised@7.1.1(chai@4.3.7): + resolution: {integrity: sha512-azL6xMoi+uxu6z4rhWQ1jbdUhOMhis2PvscD/xjLqNMkv3BPPp2JyyuTHOrf9BOosGpNQ11v6BKv/g57RXbiaA==} + peerDependencies: + chai: '>= 2.1.2 < 5' + dependencies: + chai: 4.3.7 + check-error: 1.0.2 + + /chai@4.3.7: + resolution: {integrity: sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==} + engines: {node: '>=4'} + dependencies: + assertion-error: 1.1.0 + check-error: 1.0.2 + deep-eql: 4.1.3 + get-func-name: 2.0.0 + loupe: 2.3.6 + pathval: 1.1.1 + type-detect: 4.0.8 + + /chalk@0.4.0: + resolution: {integrity: sha512-sQfYDlfv2DGVtjdoQqxS0cEZDroyG8h6TamA6rvxwlrU5BaSLDx9xhatBYl2pxZ7gmpNaPFVwBtdGdu5rQ+tYQ==} + engines: {node: '>=0.8.0'} + dependencies: + ansi-styles: 1.0.0 + has-color: 0.1.7 + strip-ansi: 0.1.1 + dev: true + + /chalk@2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 + + /chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + /chardet@0.7.0: + resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} + dev: true + + /charenc@0.0.2: + resolution: {integrity: sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==} + dev: true + + /check-error@1.0.2: + resolution: {integrity: sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==} + + /cheerio-select@2.1.0: + resolution: {integrity: sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==} + dependencies: + boolbase: 1.0.0 + css-select: 5.1.0 + css-what: 6.1.0 + domelementtype: 2.3.0 + domhandler: 5.0.3 + domutils: 3.1.0 + dev: false + + /cheerio@1.0.0-rc.12: + resolution: {integrity: sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==} + engines: {node: '>= 6'} + dependencies: + cheerio-select: 2.1.0 + dom-serializer: 2.0.0 + domhandler: 5.0.3 + domutils: 3.1.0 + htmlparser2: 8.0.2 + parse5: 7.1.2 + parse5-htmlparser2-tree-adapter: 7.0.0 + dev: false + + /chokidar@3.3.0: + resolution: {integrity: sha512-dGmKLDdT3Gdl7fBUe8XK+gAtGmzy5Fn0XkkWQuYxGIgWVPPse2CxFA5mtrlD0TOHaHjEUqkWNyP1XdHoJES/4A==} + engines: {node: '>= 8.10.0'} + dependencies: + anymatch: 3.1.3 + braces: 3.0.2 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.2.0 + optionalDependencies: + fsevents: 2.1.3 + dev: true + + /chokidar@3.5.3: + resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} + engines: {node: '>= 8.10.0'} + dependencies: + anymatch: 3.1.3 + braces: 3.0.2 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.2 + + /chownr@1.1.4: + resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} + + /ci-info@2.0.0: + resolution: {integrity: sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==} + dev: false + + /ci-info@3.8.0: + resolution: {integrity: sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==} + engines: {node: '>=8'} + dev: true + + /cids@0.7.5: + resolution: {integrity: sha512-zT7mPeghoWAu+ppn8+BS1tQ5qGmbMfB4AregnQjA/qHY3GC1m1ptI9GkWNlgeu38r7CuRdXB47uY2XgAYt6QVA==} + engines: {node: '>=4.0.0', npm: '>=3.0.0'} + deprecated: This module has been superseded by the multiformats module + dependencies: + buffer: 5.7.1 + class-is: 1.1.0 + multibase: 0.6.1 + multicodec: 1.0.4 + multihashes: 0.4.21 + + /cipher-base@1.0.4: + resolution: {integrity: sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==} + dependencies: + inherits: 2.0.4 + safe-buffer: 5.2.1 + + /class-is@1.1.0: + resolution: {integrity: sha512-rhjH9AG1fvabIDoGRVH587413LPjTZgmDF9fOFCbFJQV4yuocX1mHxxvXI4g3cGwbVY9wAYIoKlg1N79frJKQw==} + + /classic-level@1.3.0: + resolution: {integrity: sha512-iwFAJQYtqRTRM0F6L8h4JCt00ZSGdOyqh7yVrhhjrOpFhmBjNlRUey64MCiyo6UmQHMJ+No3c81nujPv+n9yrg==} + engines: {node: '>=12'} + requiresBuild: true + dependencies: + abstract-level: 1.0.3 + catering: 2.1.1 + module-error: 1.0.2 + napi-macros: 2.2.2 + node-gyp-build: 4.6.0 + dev: false + + /clean-stack@2.2.0: + resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} + engines: {node: '>=6'} + + /cli-boxes@2.2.1: + resolution: {integrity: sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==} + engines: {node: '>=6'} + dev: false + + /cli-cursor@3.1.0: + resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} + engines: {node: '>=8'} + dependencies: + restore-cursor: 3.1.0 + dev: false + + /cli-spinners@2.9.1: + resolution: {integrity: sha512-jHgecW0pxkonBJdrKsqxgRX9AcG+u/5k0Q7WPDfi8AogLAdwxEkyYYNWwZ5GvVFoFx2uiY1eNcSK00fh+1+FyQ==} + engines: {node: '>=6'} + dev: false + + /cli-table3@0.5.1: + resolution: {integrity: sha512-7Qg2Jrep1S/+Q3EceiZtQcDPWxhAvBw+ERf1162v4sikJrvojMHFqXt8QIVha8UlH9rgU0BeWPytZ9/TzYqlUw==} + engines: {node: '>=6'} + dependencies: + object-assign: 4.1.1 + string-width: 2.1.1 + optionalDependencies: + colors: 1.4.0 + dev: true + + /cliui@5.0.0: + resolution: {integrity: sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==} + dependencies: + string-width: 3.1.0 + strip-ansi: 5.2.0 + wrap-ansi: 5.1.0 + dev: true + + /cliui@6.0.0: + resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==} + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 6.2.0 + dev: true + + /cliui@7.0.4: + resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + + /cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + dev: true + + /clone-response@1.0.3: + resolution: {integrity: sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==} + dependencies: + mimic-response: 1.0.1 + + /clone@1.0.4: + resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} + engines: {node: '>=0.8'} + + /co@4.6.0: + resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} + engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} + dev: false + + /color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + dependencies: + color-name: 1.1.3 + + /color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + dependencies: + color-name: 1.1.4 + + /color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + + /color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + /colors@1.4.0: + resolution: {integrity: sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==} + engines: {node: '>=0.1.90'} + dev: true + + /combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + dependencies: + delayed-stream: 1.0.0 + + /command-exists@1.2.9: + resolution: {integrity: sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==} + dev: false + + /command-line-args@5.2.1: + resolution: {integrity: sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg==} + engines: {node: '>=4.0.0'} + dependencies: + array-back: 3.1.0 + find-replace: 3.0.0 + lodash.camelcase: 4.3.0 + typical: 4.0.0 + dev: true + + /command-line-usage@6.1.3: + resolution: {integrity: sha512-sH5ZSPr+7UStsloltmDh7Ce5fb8XPlHyoPzTpyyMuYCtervL65+ubVZ6Q61cFtFl62UyJlc8/JwERRbAFPUqgw==} + engines: {node: '>=8.0.0'} + dependencies: + array-back: 4.0.2 + chalk: 2.4.2 + table-layout: 1.0.2 + typical: 5.2.0 + dev: true + + /commander@10.0.1: + resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} + engines: {node: '>=14'} + + /commander@2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + dev: false + + /commander@3.0.2: + resolution: {integrity: sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow==} + dev: false + + /commondir@1.0.1: + resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} + dev: true + + /concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + /concat-stream@1.6.2: + resolution: {integrity: sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==} + engines: {'0': node >= 0.8} + dependencies: + buffer-from: 1.1.2 + inherits: 2.0.4 + readable-stream: 2.3.8 + typedarray: 0.0.6 + dev: true + + /content-disposition@0.5.4: + resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} + engines: {node: '>= 0.6'} + dependencies: + safe-buffer: 5.2.1 + + /content-hash@2.5.2: + resolution: {integrity: sha512-FvIQKy0S1JaWV10sMsA7TRx8bpU+pqPkhbsfvOJAdjRXvYxEckAwQWGwtRjiaJfh+E0DvcWUGqcdjwMGFjsSdw==} + dependencies: + cids: 0.7.5 + multicodec: 0.5.7 + multihashes: 0.4.21 + + /content-type@1.0.5: + resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} + engines: {node: '>= 0.6'} + + /convert-source-map@1.9.0: + resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} + dev: true + + /convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + dev: true + + /cookie-signature@1.0.6: + resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} + + /cookie@0.4.2: + resolution: {integrity: sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==} + engines: {node: '>= 0.6'} + dev: false + + /cookie@0.5.0: + resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} + engines: {node: '>= 0.6'} + + /cookiejar@2.1.4: + resolution: {integrity: sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==} + dev: false + + /core-util-is@1.0.2: + resolution: {integrity: sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==} + + /core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + dev: true + + /cors@2.8.5: + resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} + engines: {node: '>= 0.10'} + dependencies: + object-assign: 4.1.1 + vary: 1.1.2 + + /cosmiconfig@8.2.0: + resolution: {integrity: sha512-3rTMnFJA1tCOPwRxtgF4wd7Ab2qvDbL8jX+3smjIbS4HlZBagTlpERbdN7iAbWlrfxE3M8c27kTwTawQ7st+OQ==} + engines: {node: '>=14'} + dependencies: + import-fresh: 3.3.0 + js-yaml: 4.1.0 + parse-json: 5.2.0 + path-type: 4.0.0 + + /crc-32@1.2.2: + resolution: {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==} + engines: {node: '>=0.8'} + hasBin: true + + /create-ecdh@4.0.4: + resolution: {integrity: sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==} + dependencies: + bn.js: 4.12.0 + elliptic: 6.5.4 + dev: false + + /create-hash@1.2.0: + resolution: {integrity: sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==} + dependencies: + cipher-base: 1.0.4 + inherits: 2.0.4 + md5.js: 1.3.5 + ripemd160: 2.0.2 + sha.js: 2.4.11 + + /create-hmac@1.1.7: + resolution: {integrity: sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==} + dependencies: + cipher-base: 1.0.4 + create-hash: 1.2.0 + inherits: 2.0.4 + ripemd160: 2.0.2 + safe-buffer: 5.2.1 + sha.js: 2.4.11 + + /create-require@1.1.1: + resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} + dev: true + + /cross-fetch@4.0.0: + resolution: {integrity: sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==} + dependencies: + node-fetch: 2.7.0 + transitivePeerDependencies: + - encoding + + /cross-spawn@5.1.0: + resolution: {integrity: sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==} + dependencies: + lru-cache: 4.1.5 + shebang-command: 1.2.0 + which: 1.3.1 + dev: true + + /cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + /crypt@0.0.2: + resolution: {integrity: sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==} + dev: true + + /crypto-browserify@3.12.0: + resolution: {integrity: sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==} + dependencies: + browserify-cipher: 1.0.1 + browserify-sign: 4.2.2 + create-ecdh: 4.0.4 + create-hash: 1.2.0 + create-hmac: 1.1.7 + diffie-hellman: 5.0.3 + inherits: 2.0.4 + pbkdf2: 3.1.2 + public-encrypt: 4.0.3 + randombytes: 2.1.0 + randomfill: 1.0.4 + dev: false + + /crypto-js@3.3.0: + resolution: {integrity: sha512-DIT51nX0dCfKltpRiXV+/TVZq+Qq2NgF4644+K7Ttnla7zEzqc+kjJyiB96BHNyUTBxyjzRcZYpUdZa+QAqi6Q==} + + /crypto-js@4.2.0: + resolution: {integrity: sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==} + dev: false + + /css-select@5.1.0: + resolution: {integrity: sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==} + dependencies: + boolbase: 1.0.0 + css-what: 6.1.0 + domhandler: 5.0.3 + domutils: 3.1.0 + nth-check: 2.1.1 + dev: false + + /css-what@6.1.0: + resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==} + engines: {node: '>= 6'} + dev: false + + /csv-generate@3.4.3: + resolution: {integrity: sha512-w/T+rqR0vwvHqWs/1ZyMDWtHHSJaN06klRqJXBEpDJaM/+dZkso0OKh1VcuuYvK3XM53KysVNq8Ko/epCK8wOw==} + dev: true + + /csv-parse@4.16.3: + resolution: {integrity: sha512-cO1I/zmz4w2dcKHVvpCr7JVRu8/FymG5OEpmvsZYlccYolPBLoVGKUHgNoc4ZGkFeFlWGEDmMyBM+TTqRdW/wg==} + dev: true + + /csv-stringify@5.6.5: + resolution: {integrity: sha512-PjiQ659aQ+fUTQqSrd1XEDnOr52jh30RBurfzkscaE2tPaFsDH5wOAHJiw8XAHphRknCwMUE9KRayc4K/NbO8A==} + dev: true + + /csv@5.5.3: + resolution: {integrity: sha512-QTaY0XjjhTQOdguARF0lGKm5/mEq9PD9/VhZZegHDIBq2tQwgNpHc3dneD4mGo2iJs+fTKv5Bp0fZ+BRuY3Z0g==} + engines: {node: '>= 0.1.90'} + dependencies: + csv-generate: 3.4.3 + csv-parse: 4.16.3 + csv-stringify: 5.6.5 + stream-transform: 2.1.3 + dev: true + + /d@1.0.1: + resolution: {integrity: sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==} + dependencies: + es5-ext: 0.10.62 + type: 1.2.0 + + /dashdash@1.14.1: + resolution: {integrity: sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==} + engines: {node: '>=0.10'} + dependencies: + assert-plus: 1.0.0 + + /date-time@0.1.1: + resolution: {integrity: sha512-p4psdkgdNA6x0600SKbfWiOomNb33ADBMRHf49GMhYVgJsPefZlMSLXXVWWUpbqSxB3DL5/cxKa6a8i3XPK5Xg==} + engines: {node: '>=0.10.0'} + dev: true + + /death@1.1.0: + resolution: {integrity: sha512-vsV6S4KVHvTGxbEcij7hkWRv0It+sGGWVOM67dQde/o5Xjnr+KmLjxWJii2uEObIrt1CcM9w0Yaovx+iOlIL+w==} + dev: true + + /debug@2.6.9: + resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.0.0 + + /debug@3.2.6(supports-color@6.0.0): + resolution: {integrity: sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==} + deprecated: Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797) + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.3 + supports-color: 6.0.0 + dev: true + + /debug@3.2.7: + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.3 + + /debug@4.3.4(supports-color@8.1.1): + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 + supports-color: 8.1.1 + + /decamelize-keys@1.1.1: + resolution: {integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==} + engines: {node: '>=0.10.0'} + dependencies: + decamelize: 1.2.0 + map-obj: 1.0.1 + dev: true + + /decamelize@1.2.0: + resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} + engines: {node: '>=0.10.0'} + dev: true + + /decamelize@4.0.0: + resolution: {integrity: sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==} + engines: {node: '>=10'} + + /decimal.js-light@2.5.1: + resolution: {integrity: sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==} + dev: false + + /decode-uri-component@0.2.2: + resolution: {integrity: sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==} + engines: {node: '>=0.10'} + + /decompress-response@3.3.0: + resolution: {integrity: sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==} + engines: {node: '>=4'} + dependencies: + mimic-response: 1.0.1 + + /decompress-response@6.0.0: + resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} + engines: {node: '>=10'} + dependencies: + mimic-response: 3.1.0 + + /deep-eql@4.1.3: + resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} + engines: {node: '>=6'} + dependencies: + type-detect: 4.0.8 + + /deep-extend@0.6.0: + resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} + engines: {node: '>=4.0.0'} + + /deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + + /deepmerge@4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} + dev: true + + /default-require-extensions@3.0.1: + resolution: {integrity: sha512-eXTJmRbm2TIt9MgWTsOH1wEuhew6XGZcMeGKCtLedIg/NCsg1iBePXkceTdK4Fii7pzmN9tGsZhKzZ4h7O/fxw==} + engines: {node: '>=8'} + dependencies: + strip-bom: 4.0.0 + dev: true + + /defaults@1.0.4: + resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} + dependencies: + clone: 1.0.4 + + /defer-to-connect@1.1.3: + resolution: {integrity: sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==} + dev: false + + /defer-to-connect@2.0.1: + resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==} + engines: {node: '>=10'} + + /define-properties@1.2.0: + resolution: {integrity: sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==} + engines: {node: '>= 0.4'} + dependencies: + has-property-descriptors: 1.0.0 + object-keys: 1.1.1 + dev: true + + /delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + + /delimit-stream@0.1.0: + resolution: {integrity: sha512-a02fiQ7poS5CnjiJBAsjGLPp5EwVoGHNeu9sziBd9huppRfsAFIpv5zNLv0V1gbop53ilngAf5Kf331AwcoRBQ==} + dev: false + + /depd@2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} + + /des.js@1.1.0: + resolution: {integrity: sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg==} + dependencies: + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + dev: false + + /destroy@1.2.0: + resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + + /detect-indent@5.0.0: + resolution: {integrity: sha512-rlpvsxUtM0PQvy9iZe640/IWwWYyBsTApREbA1pHOpmOUIl9MkP/U4z7vTtg4Oaojvqhxt7sdufnT0EzGaR31g==} + engines: {node: '>=4'} + dev: false + + /detect-indent@6.1.0: + resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} + engines: {node: '>=8'} + dev: true + + /detect-libc@2.0.2: + resolution: {integrity: sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==} + engines: {node: '>=8'} + dev: false + + /detect-port@1.5.1: + resolution: {integrity: sha512-aBzdj76lueB6uUst5iAs7+0H/oOjqI5D16XUWxlWMIMROhcM0rfsNVk93zTngq1dDNpoXRr++Sus7ETAExppAQ==} + hasBin: true + dependencies: + address: 1.2.2 + debug: 4.3.4(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + dev: true + + /diff-sequences@29.6.3: + resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dev: true + + /diff@3.5.0: + resolution: {integrity: sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==} + engines: {node: '>=0.3.1'} + dev: true + + /diff@4.0.2: + resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} + engines: {node: '>=0.3.1'} + dev: true + + /diff@5.0.0: + resolution: {integrity: sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==} + engines: {node: '>=0.3.1'} + + /diffie-hellman@5.0.3: + resolution: {integrity: sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==} + dependencies: + bn.js: 4.12.0 + miller-rabin: 4.0.1 + randombytes: 2.1.0 + dev: false + + /difflib@0.2.4: + resolution: {integrity: sha512-9YVwmMb0wQHQNr5J9m6BSj6fk4pfGITGQOOs+D9Fl+INODWFOfvhIU1hNv6GgR1RBoC/9NJcwu77zShxV0kT7w==} + dependencies: + heap: 0.2.7 + dev: true + + /dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + dependencies: + path-type: 4.0.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: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} + dependencies: + esutils: 2.0.3 + + /dom-serializer@2.0.0: + resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + entities: 4.5.0 + dev: false + + /dom-walk@0.1.2: + resolution: {integrity: sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==} + + /domelementtype@2.3.0: + resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} + dev: false + + /domhandler@5.0.3: + resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} + engines: {node: '>= 4'} + dependencies: + domelementtype: 2.3.0 + dev: false + + /domutils@3.1.0: + resolution: {integrity: sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==} + dependencies: + dom-serializer: 2.0.0 + domelementtype: 2.3.0 + domhandler: 5.0.3 + dev: false + + /dot-prop@7.2.0: + resolution: {integrity: sha512-Ol/IPXUARn9CSbkrdV4VJo7uCy1I3VuSiWCaFSg+8BdUOzF9n3jefIpcgAydvUZbTdEBZs2vEiTiS9m61ssiDA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + type-fest: 2.19.0 + dev: true + + /duplexer3@0.1.5: + resolution: {integrity: sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA==} + dev: false + + /ecc-jsbn@0.1.2: + resolution: {integrity: sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==} + dependencies: + jsbn: 0.1.1 + safer-buffer: 2.1.2 + + /ee-first@1.1.1: + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + + /eip55@2.1.1: + resolution: {integrity: sha512-WcagVAmNu2Ww2cDUfzuWVntYwFxbvZ5MvIyLZpMjTTkjD6sCvkGOiS86jTppzu9/gWsc8isLHAeMBWK02OnZmA==} + dependencies: + keccak: 3.0.3 + dev: false + + /electron-to-chromium@1.4.578: + resolution: {integrity: sha512-V0ZhSu1BQZKfG0yNEL6Dadzik8E1vAzfpVOapdSiT9F6yapEJ3Bk+4tZ4SMPdWiUchCgnM/ByYtBzp5ntzDMIA==} + dev: true + + /elliptic@6.5.4: + resolution: {integrity: sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==} + dependencies: + bn.js: 4.12.0 + brorand: 1.1.0 + hash.js: 1.1.7 + hmac-drbg: 1.0.1 + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + minimalistic-crypto-utils: 1.0.1 + + /emoji-regex@7.0.3: + resolution: {integrity: sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==} + dev: true + + /emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + /encodeurl@1.0.2: + resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} + engines: {node: '>= 0.8'} + + /end-of-stream@1.4.4: + resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + dependencies: + once: 1.4.0 + + /enquirer@2.4.1: + resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} + engines: {node: '>=8.6'} + dependencies: + ansi-colors: 4.1.3 + strip-ansi: 6.0.1 + + /entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + dev: false + + /env-paths@2.2.1: + resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} + engines: {node: '>=6'} + dev: false + + /error-ex@1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + dependencies: + is-arrayish: 0.2.1 + + /es-abstract@1.22.1: + resolution: {integrity: sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw==} + engines: {node: '>= 0.4'} + dependencies: + array-buffer-byte-length: 1.0.0 + arraybuffer.prototype.slice: 1.0.1 + available-typed-arrays: 1.0.5 + call-bind: 1.0.2 + es-set-tostringtag: 2.0.1 + es-to-primitive: 1.2.1 + function.prototype.name: 1.1.5 + get-intrinsic: 1.2.1 + get-symbol-description: 1.0.0 + globalthis: 1.0.3 + gopd: 1.0.1 + has: 1.0.3 + has-property-descriptors: 1.0.0 + has-proto: 1.0.1 + has-symbols: 1.0.3 + internal-slot: 1.0.5 + is-array-buffer: 3.0.2 + is-callable: 1.2.7 + is-negative-zero: 2.0.2 + is-regex: 1.1.4 + is-shared-array-buffer: 1.0.2 + is-string: 1.0.7 + is-typed-array: 1.1.12 + is-weakref: 1.0.2 + object-inspect: 1.12.3 + object-keys: 1.1.1 + object.assign: 4.1.4 + regexp.prototype.flags: 1.5.0 + safe-array-concat: 1.0.0 + safe-regex-test: 1.0.0 + string.prototype.trim: 1.2.7 + string.prototype.trimend: 1.0.6 + string.prototype.trimstart: 1.0.6 + typed-array-buffer: 1.0.0 + typed-array-byte-length: 1.0.0 + typed-array-byte-offset: 1.0.0 + typed-array-length: 1.0.4 + unbox-primitive: 1.0.2 + which-typed-array: 1.1.11 + dev: true + + /es-array-method-boxes-properly@1.0.0: + resolution: {integrity: sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==} + dev: true + + /es-set-tostringtag@2.0.1: + resolution: {integrity: sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==} + engines: {node: '>= 0.4'} + dependencies: + get-intrinsic: 1.2.1 + has: 1.0.3 + has-tostringtag: 1.0.0 + dev: true + + /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: + resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} + engines: {node: '>= 0.4'} + dependencies: + is-callable: 1.2.7 + is-date-object: 1.0.5 + is-symbol: 1.0.4 + dev: true + + /es5-ext@0.10.62: + resolution: {integrity: sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==} + engines: {node: '>=0.10'} + requiresBuild: true + dependencies: + es6-iterator: 2.0.3 + es6-symbol: 3.1.3 + next-tick: 1.1.0 + + /es6-error@4.1.1: + resolution: {integrity: sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==} + dev: true + + /es6-iterator@2.0.3: + resolution: {integrity: sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==} + dependencies: + d: 1.0.1 + es5-ext: 0.10.62 + es6-symbol: 3.1.3 + + /es6-promise@4.2.8: + resolution: {integrity: sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==} + + /es6-symbol@3.1.3: + resolution: {integrity: sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==} + dependencies: + d: 1.0.1 + ext: 1.7.0 + + /escalade@3.1.1: + resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} + engines: {node: '>=6'} + + /escape-html@1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + + /escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + + /escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + /escodegen@1.8.1: + resolution: {integrity: sha512-yhi5S+mNTOuRvyW4gWlg5W1byMaQGWWSYHXsuFZ7GBo7tpyOwi2EdzMP/QWxh9hwkD2m+wDVHJsxhRIj+v/b/A==} + engines: {node: '>=0.12.0'} + hasBin: true + dependencies: + esprima: 2.7.3 + estraverse: 1.9.3 + esutils: 2.0.3 + optionator: 0.8.3 + optionalDependencies: + source-map: 0.2.0 + dev: true + + /eslint-config-prettier@8.3.0(eslint@8.47.0): + resolution: {integrity: sha512-BgZuLUSeKzvlL/VUjx/Yb787VQ26RU3gGjA3iiFvdsp/2bMfVIWUVP7tjxtjS0e+HP409cPlPvNkQloz8C91ew==} + hasBin: true + peerDependencies: + eslint: '>=7.0.0' + dependencies: + eslint: 8.47.0 + dev: true + + /eslint-doc-generator@1.4.3(eslint@8.47.0)(typescript@5.0.4): + resolution: {integrity: sha512-cn9KXE7xuKlxKi/9VbirR3cbz7W1geRObwWzZjJAnpTeNBoqA8Rj+lD8/HHHJ7PnOdaTrRyhhoYdCtxqq3U7Bw==} + engines: {node: ^14.18.0 || ^16.0.0 || >=18.0.0} + hasBin: true + peerDependencies: + eslint: '>= 7' + dependencies: + '@typescript-eslint/utils': 5.62.0(eslint@8.47.0)(typescript@5.0.4) + ajv: 8.12.0 + boolean: 3.2.0 + commander: 10.0.1 + cosmiconfig: 8.2.0 + deepmerge: 4.3.1 + dot-prop: 7.2.0 + eslint: 8.47.0 + jest-diff: 29.7.0 + json-schema-traverse: 1.0.0 + markdown-table: 3.0.3 + no-case: 3.0.4 + type-fest: 3.13.1 + transitivePeerDependencies: + - supports-color + - typescript + dev: true + + /eslint-import-resolver-node@0.3.9: + resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} + dependencies: + debug: 3.2.7 + is-core-module: 2.13.0 + resolve: 1.22.4 + transitivePeerDependencies: + - supports-color + + /eslint-module-utils@2.8.0(@typescript-eslint/parser@5.61.0)(eslint-import-resolver-node@0.3.9)(eslint@8.47.0): + resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: '*' + eslint-import-resolver-node: '*' + eslint-import-resolver-typescript: '*' + eslint-import-resolver-webpack: '*' + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + eslint: + optional: true + eslint-import-resolver-node: + optional: true + eslint-import-resolver-typescript: + optional: true + eslint-import-resolver-webpack: + optional: true + dependencies: + '@typescript-eslint/parser': 5.61.0(eslint@8.47.0)(typescript@5.0.4) + debug: 3.2.7 + eslint: 8.47.0 + eslint-import-resolver-node: 0.3.9 + transitivePeerDependencies: + - supports-color + + /eslint-plugin-es@3.0.1(eslint@8.47.0): + resolution: {integrity: sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ==} + engines: {node: '>=8.10.0'} + peerDependencies: + eslint: '>=4.19.1' + dependencies: + eslint: 8.47.0 + eslint-utils: 2.1.0 + regexpp: 3.2.0 + dev: true + + /eslint-plugin-eslint-plugin@5.1.1(eslint@8.47.0): + resolution: {integrity: sha512-4MGDsG505Ot2TSDSYxFL0cpDo4Y+t6hKB8cfZw9Jx484VjXWDfiYC/A6cccWFtWoOOC0j+wGgQIIb11cdIAMBg==} + engines: {node: ^14.17.0 || ^16.0.0 || >= 18.0.0} + peerDependencies: + eslint: '>=7.0.0' + dependencies: + eslint: 8.47.0 + eslint-utils: 3.0.0(eslint@8.47.0) + estraverse: 5.3.0 + dev: true + + /eslint-plugin-import@2.27.5(@typescript-eslint/parser@5.61.0)(eslint@8.47.0): + resolution: {integrity: sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + dependencies: + '@typescript-eslint/parser': 5.61.0(eslint@8.47.0)(typescript@5.0.4) + array-includes: 3.1.6 + array.prototype.flat: 1.3.1 + array.prototype.flatmap: 1.3.1 + debug: 3.2.7 + doctrine: 2.1.0 + eslint: 8.47.0 + eslint-import-resolver-node: 0.3.9 + eslint-module-utils: 2.8.0(@typescript-eslint/parser@5.61.0)(eslint-import-resolver-node@0.3.9)(eslint@8.47.0) + has: 1.0.3 + is-core-module: 2.13.0 + is-glob: 4.0.3 + minimatch: 3.1.2 + object.values: 1.1.6 + resolve: 1.22.4 + semver: 6.3.1 + tsconfig-paths: 3.14.2 + transitivePeerDependencies: + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - supports-color + dev: true + + /eslint-plugin-no-only-tests@3.0.0: + resolution: {integrity: sha512-I0PeXMs1vu21ap45hey4HQCJRqpcoIvGcNTPJe+UhUm8TwjQ6//mCrDqF8q0WS6LgmRDwQ4ovQej0AQsAHb5yg==} + engines: {node: '>=5.0.0'} + dev: true + + /eslint-plugin-node@11.1.0(eslint@8.47.0): + resolution: {integrity: sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g==} + engines: {node: '>=8.10.0'} + peerDependencies: + eslint: '>=5.16.0' + dependencies: + eslint: 8.47.0 + eslint-plugin-es: 3.0.1(eslint@8.47.0) + eslint-utils: 2.1.0 + ignore: 5.2.4 + minimatch: 3.1.2 + resolve: 1.22.4 + semver: 6.3.1 + dev: true + + /eslint-plugin-prettier@3.4.0(eslint-config-prettier@8.3.0)(eslint@8.47.0)(prettier@2.4.1): + resolution: {integrity: sha512-UDK6rJT6INSfcOo545jiaOwB701uAIt2/dR7WnFQoGCVl1/EMqdANBmwUaqqQ45aXprsTGzSa39LI1PyuRBxxw==} + engines: {node: '>=6.0.0'} + peerDependencies: + eslint: '>=5.0.0' + eslint-config-prettier: '*' + prettier: '>=1.13.0' + peerDependenciesMeta: + eslint-config-prettier: + optional: true + dependencies: + eslint: 8.47.0 + eslint-config-prettier: 8.3.0(eslint@8.47.0) + prettier: 2.4.1 + prettier-linter-helpers: 1.0.0 + dev: true + + /eslint-scope@5.1.1: + resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} + engines: {node: '>=8.0.0'} + dependencies: + esrecurse: 4.3.0 + estraverse: 4.3.0 + + /eslint-scope@7.2.2: + resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + + /eslint-utils@2.1.0: + resolution: {integrity: sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==} + engines: {node: '>=6'} + dependencies: + eslint-visitor-keys: 1.3.0 + dev: true + + /eslint-utils@3.0.0(eslint@8.47.0): + resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==} + engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0} + peerDependencies: + eslint: '>=5' + dependencies: + eslint: 8.47.0 + eslint-visitor-keys: 2.1.0 + dev: true + + /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: + resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} + engines: {node: '>=10'} + dev: true + + /eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + /eslint@8.47.0: + resolution: {integrity: sha512-spUQWrdPt+pRVP1TTJLmfRNJJHHZryFmptzcafwSvHsceV81djHOdnEeDmkdotZyLNjDhrOasNK8nikkoG1O8Q==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + hasBin: true + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.47.0) + '@eslint-community/regexpp': 4.6.2 + '@eslint/eslintrc': 2.1.2 + '@eslint/js': 8.47.0 + '@humanwhocodes/config-array': 0.11.10 + '@humanwhocodes/module-importer': 1.0.1 + '@nodelib/fs.walk': 1.2.8 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.3 + debug: 4.3.4(supports-color@8.1.1) + doctrine: 3.0.0 + escape-string-regexp: 4.0.0 + eslint-scope: 7.2.2 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 + esquery: 1.5.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 6.0.1 + find-up: 5.0.0 + glob-parent: 6.0.2 + globals: 13.21.0 + graphemer: 1.4.0 + ignore: 5.2.4 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + is-path-inside: 3.0.3 + js-yaml: 4.1.0 + json-stable-stringify-without-jsonify: 1.0.1 + levn: 0.4.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.3 + strip-ansi: 6.0.1 + text-table: 0.2.0 + transitivePeerDependencies: + - supports-color + + /espree@9.6.1: + resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + acorn: 8.10.0 + acorn-jsx: 5.3.2(acorn@8.10.0) + eslint-visitor-keys: 3.4.3 + + /esprima@2.7.3: + resolution: {integrity: sha512-OarPfz0lFCiW4/AV2Oy1Rp9qu0iusTKqykwTspGCZtPxmF81JR4MmIebvF1F9+UOKth2ZubLQ4XGGaU+hSn99A==} + engines: {node: '>=0.10.0'} + hasBin: true + dev: true + + /esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + dev: true + + /esquery@1.5.0: + resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} + engines: {node: '>=0.10'} + dependencies: + estraverse: 5.3.0 + + /esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + dependencies: + estraverse: 5.3.0 + + /estraverse@1.9.3: + resolution: {integrity: sha512-25w1fMXQrGdoquWnScXZGckOv+Wes+JDnuN/+7ex3SauFRS72r2lFDec0EKPt2YD1wUJ/IrfEex+9yp4hfSOJA==} + engines: {node: '>=0.10.0'} + dev: true + + /estraverse@4.3.0: + resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} + engines: {node: '>=4.0'} + + /estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + /esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + /etag@1.8.1: + resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} + engines: {node: '>= 0.6'} + + /eth-ens-namehash@2.0.8: + resolution: {integrity: sha512-VWEI1+KJfz4Km//dadyvBBoBeSQ0MHTXPvr8UIXiLW6IanxvAV+DmlZAijZwAyggqGUfwQBeHf7tc9wzc1piSw==} + dependencies: + idna-uts46-hx: 2.3.1 + js-sha3: 0.5.7 + + /eth-gas-reporter@0.2.27: + resolution: {integrity: sha512-femhvoAM7wL0GcI8ozTdxfuBtBFJ9qsyIAsmKVjlWAHUbdnnXHt+lKzz/kmldM5lA9jLuNHGwuIxorNpLbR1Zw==} + peerDependencies: + '@codechecks/client': ^0.1.0 + peerDependenciesMeta: + '@codechecks/client': + optional: true + dependencies: + '@solidity-parser/parser': 0.14.5 + axios: 1.6.0(debug@4.3.4) + cli-table3: 0.5.1 + colors: 1.4.0 + ethereum-cryptography: 1.2.0 + ethers: 5.7.2 + fs-readdir-recursive: 1.1.0 + lodash: 4.17.21 + markdown-table: 1.1.3 + mocha: 10.2.0 + req-cwd: 2.0.0 + sha1: 1.1.1 + sync-request: 6.1.0 + transitivePeerDependencies: + - bufferutil + - debug + - utf-8-validate + dev: true + + /eth-lib@0.1.29: + resolution: {integrity: sha512-bfttrr3/7gG4E02HoWTDUcDDslN003OlOoBxk9virpAZQ1ja/jDgwkWB8QfJF7ojuEowrqy+lzp9VcJG7/k5bQ==} + dependencies: + bn.js: 4.12.0 + elliptic: 6.5.4 + nano-json-stream-parser: 0.1.2 + servify: 0.1.12 + ws: 3.3.3 + xhr-request-promise: 0.1.3 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + /eth-lib@0.2.7: + resolution: {integrity: sha512-VqEBQKH92jNsaE8lG9CTq8M/bc12gdAfb5MY8Ro1hVyXkh7rOtY3m5tRHK3Hus5HqIAAwU2ivcUjTLVwsvf/kw==} + dependencies: + bn.js: 4.12.0 + elliptic: 6.5.4 + xhr-request-promise: 0.1.3 + dev: false + + /eth-lib@0.2.8: + resolution: {integrity: sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==} + dependencies: + bn.js: 4.12.0 + elliptic: 6.5.4 + xhr-request-promise: 0.1.3 + + /ethereum-bloom-filters@1.0.10: + resolution: {integrity: sha512-rxJ5OFN3RwjQxDcFP2Z5+Q9ho4eIdEmSc2ht0fCu8Se9nbXjZ7/031uXoUYJ87KHCOdVeiUuwSnoS7hmYAGVHA==} + dependencies: + js-sha3: 0.8.0 + + /ethereum-cryptography@0.1.3: + resolution: {integrity: sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==} + dependencies: + '@types/pbkdf2': 3.1.0 + '@types/secp256k1': 4.0.3 + blakejs: 1.2.1 + browserify-aes: 1.2.0 + bs58check: 2.1.2 + create-hash: 1.2.0 + create-hmac: 1.1.7 + hash.js: 1.1.7 + keccak: 3.0.3 + pbkdf2: 3.1.2 + randombytes: 2.1.0 + safe-buffer: 5.2.1 + scrypt-js: 3.0.1 + secp256k1: 4.0.3 + setimmediate: 1.0.5 + + /ethereum-cryptography@1.2.0: + resolution: {integrity: sha512-6yFQC9b5ug6/17CQpCyE3k9eKBMdhyVjzUy1WkiuY/E4vj/SXDBbCw8QEIaXqf0Mf2SnY6RmpDcwlUmBSS0EJw==} + dependencies: + '@noble/hashes': 1.2.0 + '@noble/secp256k1': 1.7.1 + '@scure/bip32': 1.1.5 + '@scure/bip39': 1.1.1 + + /ethereum-cryptography@2.1.2: + resolution: {integrity: sha512-Z5Ba0T0ImZ8fqXrJbpHcbpAvIswRte2wGNR/KePnu8GbbvgJ47lMxT/ZZPG6i9Jaht4azPDop4HaM00J0J59ug==} + dependencies: + '@noble/curves': 1.1.0 + '@noble/hashes': 1.3.1 + '@scure/bip32': 1.3.1 + '@scure/bip39': 1.2.1 + + /ethereum-ens@0.8.0: + resolution: {integrity: sha512-a8cBTF4AWw1Q1Y37V1LSCS9pRY4Mh3f8vCg5cbXCCEJ3eno1hbI/+Ccv9SZLISYpqQhaglP3Bxb/34lS4Qf7Bg==} + dependencies: + bluebird: 3.7.2 + eth-ens-namehash: 2.0.8 + js-sha3: 0.5.7 + pako: 1.0.11 + underscore: 1.9.1 + web3: 1.10.3 + transitivePeerDependencies: + - bufferutil + - encoding + - supports-color + - utf-8-validate + dev: false + + /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: false + + /ethereumjs-common@1.5.2: + resolution: {integrity: sha512-hTfZjwGX52GS2jcVO6E2sx4YuFnf0Fhp5ylo4pEPhEffNln7vS59Hr5sLnp3/QCazFLluuBZ+FZ6J5HTp0EqCA==} + deprecated: 'New package name format for new versions: @ethereumjs/common. Please update.' + dev: false + + /ethereumjs-tx@2.1.2: + resolution: {integrity: sha512-zZEK1onCeiORb0wyCXUvg94Ve5It/K6GD1K+26KfFKodiBiS6d9lfCXlUKGBBdQ+bv7Day+JK0tj1K+BeNFRAw==} + deprecated: 'New package name format for new versions: @ethereumjs/tx. Please update.' + dependencies: + ethereumjs-common: 1.5.2 + ethereumjs-util: 6.2.1 + dev: false + + /ethereumjs-util@6.2.1: + resolution: {integrity: sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw==} + dependencies: + '@types/bn.js': 4.11.6 + bn.js: 4.12.0 + create-hash: 1.2.0 + elliptic: 6.5.4 + ethereum-cryptography: 0.1.3 + ethjs-util: 0.1.6 + rlp: 2.2.7 + dev: false + + /ethereumjs-util@7.1.4: + resolution: {integrity: sha512-p6KmuPCX4mZIqsQzXfmSx9Y0l2hqf+VkAiwSisW3UKUFdk8ZkAt+AYaor83z2nSi6CU2zSsXMlD80hAbNEGM0A==} + engines: {node: '>=10.0.0'} + dependencies: + '@types/bn.js': 5.1.1 + bn.js: 5.2.1 + create-hash: 1.2.0 + ethereum-cryptography: 0.1.3 + rlp: 2.2.7 + dev: false + + /ethereumjs-util@7.1.5: + resolution: {integrity: sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==} + engines: {node: '>=10.0.0'} + dependencies: + '@types/bn.js': 5.1.1 + bn.js: 5.2.1 + create-hash: 1.2.0 + ethereum-cryptography: 0.1.3 + rlp: 2.2.7 + + /ethers@4.0.49: + resolution: {integrity: sha512-kPltTvWiyu+OktYy1IStSO16i2e7cS9D9OxZ81q2UUaiNPVrm/RTcbxamCXF9VUSKzJIdJV68EAIhTEVBalRWg==} + dependencies: + aes-js: 3.0.0 + bn.js: 4.12.0 + elliptic: 6.5.4 + hash.js: 1.1.3 + js-sha3: 0.5.7 + scrypt-js: 2.0.4 + setimmediate: 1.0.4 + uuid: 2.0.1 + xmlhttprequest: 1.8.0 + dev: false + + /ethers@5.7.2: + resolution: {integrity: sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==} + dependencies: + '@ethersproject/abi': 5.7.0 + '@ethersproject/abstract-provider': 5.7.0 + '@ethersproject/abstract-signer': 5.7.0 + '@ethersproject/address': 5.7.0 + '@ethersproject/base64': 5.7.0 + '@ethersproject/basex': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/constants': 5.7.0 + '@ethersproject/contracts': 5.7.0 + '@ethersproject/hash': 5.7.0 + '@ethersproject/hdnode': 5.7.0 + '@ethersproject/json-wallets': 5.7.0 + '@ethersproject/keccak256': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/networks': 5.7.1 + '@ethersproject/pbkdf2': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/providers': 5.7.2 + '@ethersproject/random': 5.7.0 + '@ethersproject/rlp': 5.7.0 + '@ethersproject/sha2': 5.7.0 + '@ethersproject/signing-key': 5.7.0 + '@ethersproject/solidity': 5.7.0 + '@ethersproject/strings': 5.7.0 + '@ethersproject/transactions': 5.7.0 + '@ethersproject/units': 5.7.0 + '@ethersproject/wallet': 5.7.0 + '@ethersproject/web': 5.7.1 + '@ethersproject/wordlists': 5.7.0 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + /ethers@6.7.0: + resolution: {integrity: sha512-pxt5hK82RNwcTX2gOZP81t6qVPVspnkpeivwEgQuK9XUvbNtghBnT8GNIb/gPh+WnVSfi8cXC9XlfT8sqc6D6w==} + engines: {node: '>=14.0.0'} + dependencies: + '@adraffy/ens-normalize': 1.9.2 + '@noble/hashes': 1.1.2 + '@noble/secp256k1': 1.7.1 + '@types/node': 18.15.13 + aes-js: 4.0.0-beta.5 + tslib: 2.4.0 + ws: 8.5.0 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + /ethjs-abi@0.1.8: + resolution: {integrity: sha512-3SIJpF+LCVJrNht9OjSJ7+3B9ABZf6dEATMj1PaslL0BW547Cz6/kGyuDvvrcEBlSsbGpCWYrJX5B8OjhcAMFQ==} + engines: {node: '>=6.5.0', npm: '>=3'} + dependencies: + bn.js: 4.11.6 + js-sha3: 0.5.5 + number-to-bn: 1.7.0 + dev: false + + /ethjs-unit@0.1.6: + resolution: {integrity: sha512-/Sn9Y0oKl0uqQuvgFk/zQgR7aw1g36qX/jzSQ5lSwlO0GigPymk4eGQfeNTD03w1dPOqfz8V77Cy43jH56pagw==} + engines: {node: '>=6.5.0', npm: '>=3'} + dependencies: + bn.js: 4.11.6 + number-to-bn: 1.7.0 + + /ethjs-util@0.1.6: + resolution: {integrity: sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w==} + engines: {node: '>=6.5.0', npm: '>=3'} + dependencies: + is-hex-prefixed: 1.0.0 + strip-hex-prefix: 1.0.0 + dev: false + + /eventemitter3@4.0.4: + resolution: {integrity: sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ==} + + /events@3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} + dev: false + + /evp_bytestokey@1.0.3: + resolution: {integrity: sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==} + dependencies: + md5.js: 1.3.5 + safe-buffer: 5.2.1 + + /expand-template@2.0.3: + resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} + engines: {node: '>=6'} + dev: false + + /express@4.18.2: + resolution: {integrity: sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==} + engines: {node: '>= 0.10.0'} + dependencies: + accepts: 1.3.8 + array-flatten: 1.1.1 + body-parser: 1.20.1 + content-disposition: 0.5.4 + content-type: 1.0.5 + cookie: 0.5.0 + cookie-signature: 1.0.6 + debug: 2.6.9 + depd: 2.0.0 + encodeurl: 1.0.2 + escape-html: 1.0.3 + etag: 1.8.1 + finalhandler: 1.2.0 + fresh: 0.5.2 + http-errors: 2.0.0 + merge-descriptors: 1.0.1 + methods: 1.1.2 + on-finished: 2.4.1 + parseurl: 1.3.3 + path-to-regexp: 0.1.7 + proxy-addr: 2.0.7 + qs: 6.11.0 + range-parser: 1.2.1 + safe-buffer: 5.2.1 + send: 0.18.0 + serve-static: 1.15.0 + setprototypeof: 1.2.0 + statuses: 2.0.1 + type-is: 1.6.18 + utils-merge: 1.0.1 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + + /ext@1.7.0: + resolution: {integrity: sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==} + dependencies: + type: 2.7.2 + + /extend@3.0.2: + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + + /extendable-error@0.1.7: + resolution: {integrity: sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==} + dev: true + + /external-editor@3.1.0: + resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} + engines: {node: '>=4'} + dependencies: + chardet: 0.7.0 + iconv-lite: 0.4.24 + tmp: 0.0.33 + dev: true + + /extsprintf@1.3.0: + resolution: {integrity: sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==} + engines: {'0': node >=0.6.0} + + /fast-deep-equal@1.1.0: + resolution: {integrity: sha512-fueX787WZKCV0Is4/T2cyAdM4+x1S3MXXOAhavE1ys/W42SHAPacLTQhucja22QBYrfGw50M2sRiXPtTGv9Ymw==} + dev: false + + /fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + /fast-diff@1.3.0: + resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} + + /fast-glob@3.3.1: + resolution: {integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==} + engines: {node: '>=8.6.0'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.5 + + /fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + /fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + + /fastq@1.15.0: + resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} + dependencies: + reusify: 1.0.4 + + /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 + + /file-uri-to-path@1.0.0: + resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} + dev: false + + /fill-range@7.0.1: + resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + engines: {node: '>=8'} + dependencies: + to-regex-range: 5.0.1 + + /finalhandler@1.2.0: + resolution: {integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==} + engines: {node: '>= 0.8'} + dependencies: + debug: 2.6.9 + encodeurl: 1.0.2 + escape-html: 1.0.3 + on-finished: 2.4.1 + parseurl: 1.3.3 + statuses: 2.0.1 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + + /find-cache-dir@3.3.2: + resolution: {integrity: sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==} + engines: {node: '>=8'} + dependencies: + commondir: 1.0.1 + make-dir: 3.1.0 + pkg-dir: 4.2.0 + dev: true + + /find-replace@3.0.0: + resolution: {integrity: sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==} + engines: {node: '>=4.0.0'} + dependencies: + array-back: 3.1.0 + dev: true + + /find-up@2.1.0: + resolution: {integrity: sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==} + engines: {node: '>=4'} + dependencies: + locate-path: 2.0.0 + dev: false + + /find-up@3.0.0: + resolution: {integrity: sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==} + engines: {node: '>=6'} + dependencies: + locate-path: 3.0.0 + dev: true + + /find-up@4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + dependencies: + locate-path: 5.0.0 + path-exists: 4.0.0 + dev: true + + /find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + + /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@3.0.4: + resolution: {integrity: sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==} + engines: {node: ^10.12.0 || >=12.0.0} + dependencies: + flatted: 3.2.7 + rimraf: 3.0.2 + + /flat@4.1.1: + resolution: {integrity: sha512-FmTtBsHskrU6FJ2VxCnsDb84wu9zhmO3cUX2kGFb5tuwhfXxGciiT0oRY+cck35QmG+NmGh5eLz6lLCpWTqwpA==} + hasBin: true + dependencies: + is-buffer: 2.0.5 + dev: true + + /flat@5.0.2: + resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} + hasBin: true + + /flatted@3.2.7: + resolution: {integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==} + + /follow-redirects@1.15.2(debug@4.3.4): + resolution: {integrity: sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + dependencies: + debug: 4.3.4(supports-color@8.1.1) + + /for-each@0.3.3: + resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} + dependencies: + is-callable: 1.2.7 + + /foreground-child@2.0.0: + resolution: {integrity: sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==} + engines: {node: '>=8.0.0'} + dependencies: + cross-spawn: 7.0.3 + signal-exit: 3.0.7 + dev: true + + /forever-agent@0.6.1: + resolution: {integrity: sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==} + + /form-data-encoder@1.7.1: + resolution: {integrity: sha512-EFRDrsMm/kyqbTQocNvRXMLjc7Es2Vk+IQFx/YW7hkUH1eBl4J1fqiP34l74Yt0pFLCNpc06fkbVk00008mzjg==} + + /form-data@2.3.3: + resolution: {integrity: sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==} + engines: {node: '>= 0.12'} + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + + /form-data@2.5.1: + resolution: {integrity: sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==} + engines: {node: '>= 0.12'} + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + dev: true + + /form-data@4.0.0: + resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} + engines: {node: '>= 6'} + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + + /forwarded@0.2.0: + resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} + engines: {node: '>= 0.6'} + + /fp-ts@1.19.3: + resolution: {integrity: sha512-H5KQDspykdHuztLTg+ajGN0Z2qUjcEf3Ybxc6hLt0k7/zPkn29XnKnxlBPyW2XIddWrGaJBzBl4VLYOtk39yZg==} + dev: false + + /fresh@0.5.2: + resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} + engines: {node: '>= 0.6'} + + /fromentries@1.3.2: + resolution: {integrity: sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==} + dev: true + + /fs-constants@1.0.0: + resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} + dev: false + + /fs-extra@0.30.0: + resolution: {integrity: sha512-UvSPKyhMn6LEd/WpUaV9C9t3zATuqoqfWc3QdPhPLb58prN9tqYPlPWi8Krxi44loBoUzlobqZ3+8tGpxxSzwA==} + dependencies: + graceful-fs: 4.2.11 + jsonfile: 2.4.0 + klaw: 1.3.1 + path-is-absolute: 1.0.1 + rimraf: 2.7.1 + dev: false + + /fs-extra@4.0.3: + resolution: {integrity: sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==} + dependencies: + graceful-fs: 4.2.11 + jsonfile: 4.0.0 + universalify: 0.1.2 + + /fs-extra@7.0.1: + resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} + engines: {node: '>=6 <7 || >=8'} + dependencies: + graceful-fs: 4.2.11 + jsonfile: 4.0.0 + universalify: 0.1.2 + + /fs-extra@8.1.0: + resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} + engines: {node: '>=6 <7 || >=8'} + dependencies: + graceful-fs: 4.2.11 + jsonfile: 4.0.0 + universalify: 0.1.2 + dev: true + + /fs-extra@9.1.0: + resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} + engines: {node: '>=10'} + dependencies: + at-least-node: 1.0.0 + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.1 + dev: true + + /fs-minipass@1.2.7: + resolution: {integrity: sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==} + dependencies: + minipass: 2.9.0 + + /fs-readdir-recursive@1.1.0: + resolution: {integrity: sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==} + dev: true + + /fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + /fsevents@2.1.3: + resolution: {integrity: sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + deprecated: '"Please update to latest v2.3 or v2.2"' + requiresBuild: true + dev: true + optional: true + + /fsevents@2.3.2: + resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + optional: true + + /function-bind@1.1.1: + resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} + + /function.prototype.name@1.1.5: + resolution: {integrity: sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.22.1 + functions-have-names: 1.2.3 + dev: true + + /functional-red-black-tree@1.0.1: + resolution: {integrity: sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==} + dev: false + + /functions-have-names@1.2.3: + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + dev: true + + /ganache-cli@6.12.2: + resolution: {integrity: sha512-bnmwnJDBDsOWBUP8E/BExWf85TsdDEFelQSzihSJm9VChVO1SHp94YXLP5BlA4j/OTxp0wR4R1Tje9OHOuAJVw==} + deprecated: ganache-cli is now ganache; visit https://trfl.io/g7 for details + hasBin: true + dev: true + bundledDependencies: + - source-map-support + - yargs + - ethereumjs-util + + /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: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + /get-func-name@2.0.0: + resolution: {integrity: sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==} + + /get-intrinsic@1.2.1: + resolution: {integrity: sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==} + dependencies: + function-bind: 1.1.1 + has: 1.0.3 + has-proto: 1.0.1 + has-symbols: 1.0.3 + + /get-package-type@0.1.0: + resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} + engines: {node: '>=8.0.0'} + dev: true + + /get-port@3.2.0: + resolution: {integrity: sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg==} + engines: {node: '>=4'} + dev: true + + /get-port@5.1.1: + resolution: {integrity: sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ==} + engines: {node: '>=8'} + dev: true + + /get-stream@4.1.0: + resolution: {integrity: sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==} + engines: {node: '>=6'} + dependencies: + pump: 3.0.0 + dev: false + + /get-stream@5.2.0: + resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} + engines: {node: '>=8'} + dependencies: + pump: 3.0.0 + + /get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + + /get-symbol-description@1.0.0: + resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.2.1 + dev: true + + /getpass@0.1.7: + resolution: {integrity: sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==} + dependencies: + assert-plus: 1.0.0 + + /ghost-testrpc@0.0.2: + resolution: {integrity: sha512-i08dAEgJ2g8z5buJIrCTduwPIhih3DP+hOCTyyryikfV8T0bNvHnGXO67i0DD1H4GBDETTclPy9njZbfluQYrQ==} + hasBin: true + dependencies: + chalk: 2.4.2 + node-emoji: 1.11.0 + dev: true + + /github-from-package@0.0.0: + resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} + dev: false + + /glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + dependencies: + is-glob: 4.0.3 + + /glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + dependencies: + is-glob: 4.0.3 + + /glob@5.0.15: + resolution: {integrity: sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA==} + dependencies: + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + dev: true + + /glob@7.1.3: + resolution: {integrity: sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + dev: true + + /glob@7.1.7: + resolution: {integrity: sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + dev: true + + /glob@7.2.0: + resolution: {integrity: sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + + /glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + dev: true + + /glob@8.1.0: + resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} + engines: {node: '>=12'} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 5.0.1 + once: 1.4.0 + dev: false + + /global-modules@2.0.0: + resolution: {integrity: sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==} + engines: {node: '>=6'} + dependencies: + global-prefix: 3.0.0 + dev: true + + /global-prefix@3.0.0: + resolution: {integrity: sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==} + engines: {node: '>=6'} + dependencies: + ini: 1.3.8 + kind-of: 6.0.3 + which: 1.3.1 + dev: true + + /global@4.4.0: + resolution: {integrity: sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==} + dependencies: + min-document: 2.19.0 + process: 0.11.10 + + /globals@11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} + dev: true + + /globals@13.21.0: + resolution: {integrity: sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg==} + engines: {node: '>=8'} + dependencies: + type-fest: 0.20.2 + + /globalthis@1.0.3: + resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} + engines: {node: '>= 0.4'} + dependencies: + define-properties: 1.2.0 + dev: true + + /globby@10.0.2: + resolution: {integrity: sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==} + engines: {node: '>=8'} + dependencies: + '@types/glob': 7.2.0 + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.3.1 + glob: 7.2.0 + ignore: 5.2.4 + merge2: 1.4.1 + slash: 3.0.0 + dev: true + + /globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.3.1 + ignore: 5.2.4 + merge2: 1.4.1 + slash: 3.0.0 + + /gopd@1.0.1: + resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + dependencies: + get-intrinsic: 1.2.1 + + /got@11.8.6: + resolution: {integrity: sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==} + engines: {node: '>=10.19.0'} + dependencies: + '@sindresorhus/is': 4.6.0 + '@szmarczak/http-timer': 4.0.6 + '@types/cacheable-request': 6.0.3 + '@types/responselike': 1.0.3 + cacheable-lookup: 5.0.4 + cacheable-request: 7.0.4 + decompress-response: 6.0.0 + http2-wrapper: 1.0.3 + lowercase-keys: 2.0.0 + p-cancelable: 2.1.1 + responselike: 2.0.1 + + /got@12.1.0: + resolution: {integrity: sha512-hBv2ty9QN2RdbJJMK3hesmSkFTjVIHyIDDbssCKnSmq62edGgImJWD10Eb1k77TiV1bxloxqcFAVK8+9pkhOig==} + engines: {node: '>=14.16'} + dependencies: + '@sindresorhus/is': 4.6.0 + '@szmarczak/http-timer': 5.0.1 + '@types/cacheable-request': 6.0.3 + '@types/responselike': 1.0.3 + cacheable-lookup: 6.1.0 + cacheable-request: 7.0.4 + decompress-response: 6.0.0 + form-data-encoder: 1.7.1 + get-stream: 6.0.1 + http2-wrapper: 2.2.0 + lowercase-keys: 3.0.0 + p-cancelable: 3.0.0 + responselike: 2.0.1 + + /got@9.6.0: + resolution: {integrity: sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==} + engines: {node: '>=8.6'} + dependencies: + '@sindresorhus/is': 0.14.0 + '@szmarczak/http-timer': 1.1.2 + '@types/keyv': 3.1.4 + '@types/responselike': 1.0.3 + cacheable-request: 6.1.0 + decompress-response: 3.3.0 + duplexer3: 0.1.5 + get-stream: 4.1.0 + lowercase-keys: 1.0.1 + mimic-response: 1.0.1 + p-cancelable: 1.1.0 + to-readable-stream: 1.0.0 + url-parse-lax: 3.0.0 + dev: false + + /graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + /grapheme-splitter@1.0.4: + resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==} + dev: true + + /graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + + /growl@1.10.5: + resolution: {integrity: sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==} + engines: {node: '>=4.x'} + dev: true + + /handlebars@4.7.8: + resolution: {integrity: sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==} + engines: {node: '>=0.4.7'} + hasBin: true + dependencies: + minimist: 1.2.8 + neo-async: 2.6.2 + source-map: 0.6.1 + wordwrap: 1.0.0 + optionalDependencies: + uglify-js: 3.17.4 + dev: true + + /har-schema@2.0.0: + resolution: {integrity: sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==} + engines: {node: '>=4'} + + /har-validator@5.1.5: + resolution: {integrity: sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==} + engines: {node: '>=6'} + deprecated: this library is no longer supported + dependencies: + ajv: 6.12.6 + har-schema: 2.0.0 + + /hard-rejection@2.1.0: + resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==} + engines: {node: '>=6'} + dev: true + + /hardhat-gas-reporter@1.0.8(hardhat@packages+hardhat-core): + resolution: {integrity: sha512-1G5thPnnhcwLHsFnl759f2tgElvuwdkzxlI65fC9PwxYMEe9cmjkVAAWTf3/3y8uP6ZSPiUiOW8PgZnykmZe0g==} + peerDependencies: + hardhat: ^2.0.2 + dependencies: + array-uniq: 1.0.3 + eth-gas-reporter: 0.2.27 + hardhat: link:packages/hardhat-core + sha1: 1.1.1 + transitivePeerDependencies: + - '@codechecks/client' + - bufferutil + - debug + - utf-8-validate + dev: true + + /has-bigints@1.0.2: + resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} + dev: true + + /has-color@0.1.7: + resolution: {integrity: sha512-kaNz5OTAYYmt646Hkqw50/qyxP2vFnTVu5AQ1Zmk22Kk5+4Qx6BpO8+u7IKsML5fOsFk0ZT0AcCJNYwcvaLBvw==} + engines: {node: '>=0.10.0'} + dev: true + + /has-flag@1.0.0: + resolution: {integrity: sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==} + engines: {node: '>=0.10.0'} + dev: true + + /has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + + /has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + /has-property-descriptors@1.0.0: + resolution: {integrity: sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==} + dependencies: + get-intrinsic: 1.2.1 + dev: true + + /has-proto@1.0.1: + resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} + engines: {node: '>= 0.4'} + + /has-symbols@1.0.3: + resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} + engines: {node: '>= 0.4'} + + /has-tostringtag@1.0.0: + resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==} + engines: {node: '>= 0.4'} + dependencies: + has-symbols: 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 + + /hash-base@3.1.0: + resolution: {integrity: sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==} + engines: {node: '>=4'} + dependencies: + inherits: 2.0.4 + readable-stream: 3.6.2 + safe-buffer: 5.2.1 + + /hash.js@1.1.3: + resolution: {integrity: sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==} + dependencies: + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + dev: false + + /hash.js@1.1.7: + resolution: {integrity: sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==} + dependencies: + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + + /hasha@5.2.2: + resolution: {integrity: sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==} + engines: {node: '>=8'} + dependencies: + is-stream: 2.0.1 + type-fest: 0.8.1 + dev: true + + /he@1.2.0: + resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} + hasBin: true + + /heap@0.2.7: + resolution: {integrity: sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==} + dev: true + + /highlight.js@10.7.3: + resolution: {integrity: sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==} + dev: false + + /highlight.js@9.18.5: + resolution: {integrity: sha512-a5bFyofd/BHCX52/8i8uJkjr9DYwXIPnM/plwI6W7ezItLGqzt7X2G2nXuYSfsIJdkwwj/g9DG1LkcGJI/dDoA==} + deprecated: Support has ended for 9.x series. Upgrade to @latest + requiresBuild: true + dev: false + + /highlightjs-solidity@1.2.2: + resolution: {integrity: sha512-+cZ+1+nAO5Pi6c70TKuMcPmwqLECxiYhnQc1MxdXckK94zyWFMNZADzu98ECNlf5xCRdNh+XKp+eklmRU+Dniw==} + dev: false + + /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: + resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} + dev: true + + /html-escaper@2.0.2: + resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} + dev: true + + /htmlparser2@8.0.2: + resolution: {integrity: sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==} + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + domutils: 3.1.0 + entities: 4.5.0 + dev: false + + /http-basic@8.1.3: + resolution: {integrity: sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw==} + engines: {node: '>=6.0.0'} + dependencies: + caseless: 0.12.0 + concat-stream: 1.6.2 + http-response-object: 3.0.2 + parse-cache-control: 1.0.1 + dev: true + + /http-cache-semantics@4.1.1: + resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} + + /http-errors@2.0.0: + resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} + engines: {node: '>= 0.8'} + dependencies: + depd: 2.0.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 2.0.1 + toidentifier: 1.0.1 + + /http-https@1.0.0: + resolution: {integrity: sha512-o0PWwVCSp3O0wS6FvNr6xfBCHgt0m1tvPLFOCc2iFDKTRAXhB7m8klDf7ErowFH8POa6dVdGatKU5I1YYwzUyg==} + + /http-response-object@3.0.2: + resolution: {integrity: sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==} + dependencies: + '@types/node': 10.17.60 + dev: true + + /http-signature@1.2.0: + resolution: {integrity: sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==} + engines: {node: '>=0.8', npm: '>=1.3.7'} + dependencies: + assert-plus: 1.0.0 + jsprim: 1.4.2 + sshpk: 1.18.0 + + /http2-wrapper@1.0.3: + resolution: {integrity: sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==} + engines: {node: '>=10.19.0'} + dependencies: + quick-lru: 5.1.1 + resolve-alpn: 1.2.1 + + /http2-wrapper@2.2.0: + resolution: {integrity: sha512-kZB0wxMo0sh1PehyjJUWRFEd99KC5TLjZ2cULC4f9iqJBAmKQQXEICjxl5iPJRwP40dpeHFqqhm7tYCvODpqpQ==} + engines: {node: '>=10.19.0'} + dependencies: + quick-lru: 5.1.1 + resolve-alpn: 1.2.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(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + dev: false + + /human-id@1.0.2: + resolution: {integrity: sha512-UNopramDEhHJD+VR+ehk8rOslwSfByxPIZyJRfV739NDhN5LF1fa1MqnzKm2lGTQRjNrjK19Q5fhkgIfjlVUKw==} + dev: true + + /iconv-lite@0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} + dependencies: + safer-buffer: 2.1.2 + + /idna-uts46-hx@2.3.1: + resolution: {integrity: sha512-PWoF9Keq6laYdIRwwCdhTPl60xRqAloYNMQLiyUnG42VjT53oW07BXIRM+NK7eQjzXjAk2gUvX9caRxlnF9TAA==} + engines: {node: '>=4.0.0'} + dependencies: + punycode: 2.1.0 + + /ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + + /ignore@5.2.4: + resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} + engines: {node: '>= 4'} + + /immutable@4.3.2: + resolution: {integrity: sha512-oGXzbEDem9OOpDWZu88jGiYCvIsLHMvGw+8OXlpsvTFvIQplQbjg1B1cvKg8f7Hoch6+NGjpPsH1Fr+Mc2D1aA==} + dev: false + + /import-fresh@3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + /imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + /indent-string@4.0.0: + resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} + engines: {node: '>=8'} + + /inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + /inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + /ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + + /internal-slot@1.0.5: + resolution: {integrity: sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==} + engines: {node: '>= 0.4'} + dependencies: + get-intrinsic: 1.2.1 + has: 1.0.3 + side-channel: 1.0.4 + dev: true + + /interpret@1.4.0: + resolution: {integrity: sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==} + engines: {node: '>= 0.10'} + dev: true + + /invariant@2.2.4: + resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==} + dependencies: + loose-envify: 1.4.0 + dev: false + + /io-ts@1.10.4: + resolution: {integrity: sha512-b23PteSnYXSONJ6JQXRAlvJhuw8KOtkqa87W4wDtvMrud/DTJd5X+NpOOI+O/zZwVq6v0VLAaJ+1EDViKEuN9g==} + dependencies: + fp-ts: 1.19.3 + dev: false + + /ipaddr.js@1.9.1: + resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} + engines: {node: '>= 0.10'} + + /is-arguments@1.1.1: + resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + has-tostringtag: 1.0.0 + + /is-array-buffer@3.0.2: + resolution: {integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.2.1 + is-typed-array: 1.1.12 + dev: true + + /is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + + /is-bigint@1.0.4: + resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} + dependencies: + has-bigints: 1.0.2 + dev: true + + /is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + dependencies: + binary-extensions: 2.2.0 + + /is-boolean-object@1.1.2: + resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + has-tostringtag: 1.0.0 + dev: true + + /is-buffer@2.0.5: + resolution: {integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==} + engines: {node: '>=4'} + + /is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + + /is-ci@3.0.1: + resolution: {integrity: sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==} + hasBin: true + dependencies: + ci-info: 3.8.0 + dev: true + + /is-core-module@2.13.0: + resolution: {integrity: sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==} + dependencies: + has: 1.0.3 + + /is-date-object@1.0.5: + resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.0 + dev: true + + /is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.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: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + /is-function@1.0.2: + resolution: {integrity: sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==} + + /is-generator-function@1.0.10: + resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.0 + + /is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + dependencies: + is-extglob: 2.1.1 + + /is-hex-prefixed@1.0.0: + resolution: {integrity: sha512-WvtOiug1VFrE9v1Cydwm+FnXd3+w9GaeVUss5W4v/SLy3UW00vP+6iNF2SdnfiBoLy4bTqVdkftNGTUeOFVsbA==} + engines: {node: '>=6.5.0', npm: '>=3'} + + /is-interactive@1.0.0: + resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} + engines: {node: '>=8'} + dev: false + + /is-negative-zero@2.0.2: + resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==} + engines: {node: '>= 0.4'} + dev: true + + /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: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + /is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + + /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: + resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} + engines: {node: '>=8'} + + /is-regex@1.1.4: + resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + has-tostringtag: 1.0.0 + dev: true + + /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: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + dev: true + + /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: + resolution: {integrity: sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw==} + engines: {node: '>=4'} + dependencies: + better-path-resolve: 1.0.0 + dev: true + + /is-symbol@1.0.4: + resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} + engines: {node: '>= 0.4'} + dependencies: + has-symbols: 1.0.3 + dev: true + + /is-typed-array@1.1.12: + resolution: {integrity: sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==} + engines: {node: '>= 0.4'} + dependencies: + which-typed-array: 1.1.11 + + /is-typedarray@1.0.0: + resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} + + /is-unicode-supported@0.1.0: + resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} + engines: {node: '>=10'} + + /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: + resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} + engines: {node: '>=0.10.0'} + dev: true + + /isarray@0.0.1: + resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==} + dev: true + + /isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + dev: true + + /isarray@2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + dev: true + + /isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + /iso-url@0.4.7: + resolution: {integrity: sha512-27fFRDnPAMnHGLq36bWTpKET+eiXct3ENlCcdcMdk+mjXrb2kw3mhBUg1B7ewAC0kVzlOPhADzQgz1SE6Tglog==} + engines: {node: '>=10'} + dev: false + + /isomorphic-ws@5.0.0(ws@8.13.0): + resolution: {integrity: sha512-muId7Zzn9ywDsyXgTIafTry2sV3nySZeUDe6YedVd1Hvuuep5AsIlqK+XefWpYTyJG5e503F2xIuT2lcU6rCSw==} + peerDependencies: + ws: '*' + dependencies: + ws: 8.13.0 + dev: true + + /isstream@0.1.2: + resolution: {integrity: sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==} + + /istanbul-lib-coverage@3.2.1: + resolution: {integrity: sha512-opCrKqbthmq3SKZ10mFMQG9dk3fTa3quaOLD35kJa5ejwZHd9xAr+kLuziiZz2cG32s4lMZxNdmdcEQnTDP4+g==} + engines: {node: '>=8'} + dev: true + + /istanbul-lib-hook@3.0.0: + resolution: {integrity: sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==} + engines: {node: '>=8'} + dependencies: + append-transform: 2.0.0 + dev: true + + /istanbul-lib-instrument@4.0.3: + resolution: {integrity: sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==} + engines: {node: '>=8'} + dependencies: + '@babel/core': 7.23.2 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-coverage: 3.2.1 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + dev: true + + /istanbul-lib-processinfo@2.0.3: + resolution: {integrity: sha512-NkwHbo3E00oybX6NGJi6ar0B29vxyvNwoC7eJ4G4Yq28UfY758Hgn/heV8VRFhevPED4LXfFz0DQ8z/0kw9zMg==} + engines: {node: '>=8'} + dependencies: + archy: 1.0.0 + cross-spawn: 7.0.3 + istanbul-lib-coverage: 3.2.1 + p-map: 3.0.0 + rimraf: 3.0.2 + uuid: 8.3.2 + dev: true + + /istanbul-lib-report@3.0.1: + resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} + engines: {node: '>=10'} + dependencies: + istanbul-lib-coverage: 3.2.1 + make-dir: 4.0.0 + supports-color: 7.2.0 + dev: true + + /istanbul-lib-source-maps@4.0.1: + resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} + engines: {node: '>=10'} + dependencies: + debug: 4.3.4(supports-color@8.1.1) + istanbul-lib-coverage: 3.2.1 + source-map: 0.6.1 + transitivePeerDependencies: + - supports-color + dev: true + + /istanbul-reports@3.1.6: + resolution: {integrity: sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==} + engines: {node: '>=8'} + dependencies: + html-escaper: 2.0.2 + istanbul-lib-report: 3.0.1 + dev: true + + /jest-diff@29.7.0: + resolution: {integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + chalk: 4.1.2 + diff-sequences: 29.6.3 + jest-get-type: 29.6.3 + pretty-format: 29.7.0 + dev: true + + /jest-get-type@29.6.3: + resolution: {integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dev: true + + /js-sdsl@4.4.2: + resolution: {integrity: sha512-dwXFwByc/ajSV6m5bcKAPwe4yDDF6D614pxmIi5odytzxRlwqF6nwoiCek80Ixc7Cvma5awClxrzFtxCQvcM8w==} + dev: false + + /js-sha3@0.5.5: + resolution: {integrity: sha512-yLLwn44IVeunwjpDVTDZmQeVbB0h+dZpY2eO68B/Zik8hu6dH+rKeLxwua79GGIvW6xr8NBAcrtiUbYrTjEFTA==} + dev: false + + /js-sha3@0.5.7: + resolution: {integrity: sha512-GII20kjaPX0zJ8wzkTbNDYMY7msuZcTWk8S5UOh6806Jq/wz1J8/bnr8uGU0DAUmYDjj2Mr4X1cW8v/GLYnR+g==} + + /js-sha3@0.8.0: + resolution: {integrity: sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==} + + /js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + /js-yaml@3.13.1: + resolution: {integrity: sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==} + hasBin: true + dependencies: + argparse: 1.0.10 + esprima: 4.0.1 + dev: true + + /js-yaml@3.14.1: + resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} + hasBin: true + dependencies: + argparse: 1.0.10 + esprima: 4.0.1 + dev: true + + /js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + dependencies: + argparse: 2.0.1 + + /jsbn@0.1.1: + resolution: {integrity: sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==} + + /jsesc@2.5.2: + resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} + engines: {node: '>=4'} + hasBin: true + dev: true + + /json-buffer@3.0.0: + resolution: {integrity: sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ==} + dev: false + + /json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + /json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + + /json-schema-traverse@0.3.1: + resolution: {integrity: sha512-4JD/Ivzg7PoW8NzdrBSr3UFwC9mHgvI7Z6z3QGBsSHgKaRTUDmyZAAKJo2UbG1kUVfS9WS8bi36N49U1xw43DA==} + dev: false + + /json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + /json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + + /json-schema@0.4.0: + resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==} + + /json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + + /json-stringify-safe@5.0.1: + resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} + + /json-text-sequence@0.1.1: + resolution: {integrity: sha512-L3mEegEWHRekSHjc7+sc8eJhba9Clq1PZ8kMkzf8OxElhXc8O4TS5MwcVlj9aEbm5dr81N90WHC5nAz3UO971w==} + dependencies: + delimit-stream: 0.1.0 + dev: false + + /json5@1.0.2: + resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} + hasBin: true + dependencies: + minimist: 1.2.8 + dev: true + + /json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + dev: true + + /jsonfile@2.4.0: + resolution: {integrity: sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw==} + optionalDependencies: + graceful-fs: 4.2.11 + dev: false + + /jsonfile@4.0.0: + resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} + optionalDependencies: + graceful-fs: 4.2.11 + + /jsonfile@6.1.0: + resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + dependencies: + universalify: 2.0.1 + optionalDependencies: + graceful-fs: 4.2.11 + dev: true + + /jsonschema@1.4.1: + resolution: {integrity: sha512-S6cATIPVv1z0IlxdN+zUk5EPjkGCdnhN4wVSBlvoUO1tOLJootbo9CquNJmbIh4yikWHiUedhRYrNPn1arpEmQ==} + dev: true + + /jsprim@1.4.2: + resolution: {integrity: sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==} + engines: {node: '>=0.6.0'} + dependencies: + assert-plus: 1.0.0 + extsprintf: 1.3.0 + json-schema: 0.4.0 + verror: 1.10.0 + + /just-extend@4.2.1: + resolution: {integrity: sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==} + dev: true + + /keccak@3.0.3: + resolution: {integrity: sha512-JZrLIAJWuZxKbCilMpNz5Vj7Vtb4scDG3dMXLOsbzBmQGyjwE61BbW7bJkfKKCShXiQZt3T6sBgALRtmd+nZaQ==} + engines: {node: '>=10.0.0'} + requiresBuild: true + dependencies: + node-addon-api: 2.0.2 + node-gyp-build: 4.6.0 + readable-stream: 3.6.2 + + /keyv@3.1.0: + resolution: {integrity: sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==} + dependencies: + json-buffer: 3.0.0 + dev: false + + /keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + dependencies: + json-buffer: 3.0.1 + + /kind-of@6.0.3: + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: '>=0.10.0'} + dev: true + + /klaw@1.3.1: + resolution: {integrity: sha512-TED5xi9gGQjGpNnvRWknrwAB1eL5GciPfVFOt3Vk1OJCVDQbzuSfrF3hkUQKlsgKrG1F+0t5W0m+Fje1jIt8rw==} + optionalDependencies: + graceful-fs: 4.2.11 + dev: false + + /kleur@4.1.5: + resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} + engines: {node: '>=6'} + dev: true + + /level-supports@4.0.1: + resolution: {integrity: sha512-PbXpve8rKeNcZ9C1mUicC9auIYFyGpkV9/i6g76tLgANwWhtG2v7I4xNBUlkn3lE2/dZF3Pi0ygYGtLc4RXXdA==} + engines: {node: '>=12'} + dev: false + + /level-transcoder@1.0.1: + resolution: {integrity: sha512-t7bFwFtsQeD8cl8NIoQ2iwxA0CL/9IFw7/9gAjOonH0PWTTiRfY7Hq+Ejbsxh86tXobDQ6IOiddjNYIfOBs06w==} + engines: {node: '>=12'} + dependencies: + buffer: 6.0.3 + module-error: 1.0.2 + dev: false + + /level@8.0.0: + resolution: {integrity: sha512-ypf0jjAk2BWI33yzEaaotpq7fkOPALKAgDBxggO6Q9HGX2MRXn0wbP1Jn/tJv1gtL867+YOjOB49WaUF3UoJNQ==} + engines: {node: '>=12'} + dependencies: + browser-level: 1.0.1 + classic-level: 1.3.0 + dev: false + + /levn@0.3.0: + resolution: {integrity: sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.1.2 + type-check: 0.3.2 + dev: true + + /levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + + /lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + /load-yaml-file@0.2.0: + resolution: {integrity: sha512-OfCBkGEw4nN6JLtgRidPX6QxjBQGQf72q3si2uvqyFEMbycSFFHwAZeXx6cJgFM9wmLrf9zBwCP3Ivqa+LLZPw==} + engines: {node: '>=6'} + dependencies: + graceful-fs: 4.2.11 + js-yaml: 3.14.1 + pify: 4.0.1 + strip-bom: 3.0.0 + dev: true + + /locate-path@2.0.0: + resolution: {integrity: sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==} + engines: {node: '>=4'} + dependencies: + p-locate: 2.0.0 + path-exists: 3.0.0 + dev: false + + /locate-path@3.0.0: + resolution: {integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==} + engines: {node: '>=6'} + dependencies: + p-locate: 3.0.0 + path-exists: 3.0.0 + dev: true + + /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: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + dependencies: + p-locate: 5.0.0 + + /lodash.camelcase@4.3.0: + resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} + dev: true + + /lodash.clonedeep@4.5.0: + resolution: {integrity: sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==} + dev: false + + /lodash.escaperegexp@4.1.2: + resolution: {integrity: sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw==} + dev: false + + /lodash.flattendeep@4.4.0: + resolution: {integrity: sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==} + dev: true + + /lodash.get@4.4.2: + resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==} + dev: true + + /lodash.isequal@4.5.0: + resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==} + dev: false + + /lodash.memoize@4.1.2: + resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} + dev: false + + /lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + + /lodash.partition@4.6.0: + resolution: {integrity: sha512-35L3dSF3Q6V1w5j6V3NhNlQjzsRDC/pYKCTdYTmwqSib+Q8ponkAmt/PwEOq3EmI38DSCl+SkIVwLd+uSlVdrg==} + dev: false + + /lodash.startcase@4.4.0: + resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} + dev: true + + /lodash.sum@4.0.2: + resolution: {integrity: sha512-1GcLFsMpU0K7uGPjo5FePq0fNlL3sSTZtSWwQUxr9VL8T3xeJiprwbfjDptTUPtkB8cUBpAnMtvQpju5XXaBeA==} + dev: false + + /lodash.truncate@4.4.2: + resolution: {integrity: sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==} + dev: false + + /lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + /log-symbols@3.0.0: + resolution: {integrity: sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==} + engines: {node: '>=8'} + dependencies: + chalk: 2.4.2 + dev: true + + /log-symbols@4.1.0: + resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} + engines: {node: '>=10'} + dependencies: + chalk: 4.1.2 + is-unicode-supported: 0.1.0 + + /loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + dependencies: + js-tokens: 4.0.0 + dev: false + + /loupe@2.3.6: + resolution: {integrity: sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==} + dependencies: + get-func-name: 2.0.0 + + /lower-case@2.0.2: + resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} + dependencies: + tslib: 2.6.1 + dev: true + + /lowercase-keys@1.0.1: + resolution: {integrity: sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==} + engines: {node: '>=0.10.0'} + dev: false + + /lowercase-keys@2.0.0: + resolution: {integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==} + engines: {node: '>=8'} + + /lowercase-keys@3.0.0: + resolution: {integrity: sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + /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: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + dependencies: + yallist: 3.1.1 + + /lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + dependencies: + yallist: 4.0.0 + + /lru_map@0.3.3: + resolution: {integrity: sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ==} + dev: false + + /make-dir@3.1.0: + resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} + engines: {node: '>=8'} + dependencies: + semver: 6.3.1 + dev: true + + /make-dir@4.0.0: + resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} + engines: {node: '>=10'} + dependencies: + semver: 7.5.4 + dev: true + + /make-error@1.3.6: + resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + dev: true + + /map-obj@1.0.1: + resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==} + engines: {node: '>=0.10.0'} + dev: true + + /map-obj@4.3.0: + resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==} + engines: {node: '>=8'} + dev: true + + /markdown-table@1.1.3: + resolution: {integrity: sha512-1RUZVgQlpJSPWYbFSpmudq5nHY1doEIv89gBtF0s4gW1GF2XorxcA/70M5vq7rLv0a6mhOUccRsqkwhwLCIQ2Q==} + dev: true + + /markdown-table@3.0.3: + resolution: {integrity: sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==} + dev: true + + /mcl-wasm@0.7.9: + resolution: {integrity: sha512-iJIUcQWA88IJB/5L15GnJVnSQJmf/YaxxV6zRavv83HILHaJQb6y0iFyDMdDO0gN8X37tdxmAOrH/P8B6RB8sQ==} + engines: {node: '>=8.9.0'} + dev: false + + /md5.js@1.3.5: + resolution: {integrity: sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==} + dependencies: + hash-base: 3.1.0 + inherits: 2.0.4 + safe-buffer: 5.2.1 + + /media-typer@0.3.0: + resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} + engines: {node: '>= 0.6'} + + /memory-level@1.0.0: + resolution: {integrity: sha512-UXzwewuWeHBz5krr7EvehKcmLFNoXxGcvuYhC41tRnkrTbJohtS7kVn9akmgirtRygg+f7Yjsfi8Uu5SGSQ4Og==} + engines: {node: '>=12'} + dependencies: + abstract-level: 1.0.3 + functional-red-black-tree: 1.0.1 + module-error: 1.0.2 + dev: false + + /memorystream@0.3.1: + resolution: {integrity: sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==} + engines: {node: '>= 0.10.0'} + dev: false + + /meow@6.1.1: + resolution: {integrity: sha512-3YffViIt2QWgTy6Pale5QpopX/IvU3LPL03jOTqp6pGj3VjesdO/U8CuHMKpnQr4shCNCM5fd5XFFvIIl6JBHg==} + engines: {node: '>=8'} + dependencies: + '@types/minimist': 1.2.2 + camelcase-keys: 6.2.2 + decamelize-keys: 1.1.1 + hard-rejection: 2.1.0 + minimist-options: 4.1.0 + normalize-package-data: 2.5.0 + read-pkg-up: 7.0.1 + redent: 3.0.0 + trim-newlines: 3.0.1 + type-fest: 0.13.1 + yargs-parser: 18.1.3 + dev: true + + /merge-descriptors@1.0.1: + resolution: {integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==} + + /merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + /methods@1.1.2: + resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} + engines: {node: '>= 0.6'} + + /micro-ftch@0.3.1: + resolution: {integrity: sha512-/0LLxhzP0tfiR5hcQebtudP56gUurs2CLkGarnCiB/OqEyUFQ6U3paQi/tgLv0hBJYt2rnr9MNpxz4fiiugstg==} + + /micromatch@4.0.5: + resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + engines: {node: '>=8.6'} + dependencies: + braces: 3.0.2 + picomatch: 2.3.1 + + /miller-rabin@4.0.1: + resolution: {integrity: sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==} + hasBin: true + dependencies: + bn.js: 4.12.0 + brorand: 1.1.0 + dev: false + + /mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + /mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + dependencies: + mime-db: 1.52.0 + + /mime@1.6.0: + resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} + engines: {node: '>=4'} + hasBin: true + + /mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + dev: false + + /mimic-response@1.0.1: + resolution: {integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==} + engines: {node: '>=4'} + + /mimic-response@3.1.0: + resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} + engines: {node: '>=10'} + + /min-document@2.19.0: + resolution: {integrity: sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ==} + dependencies: + dom-walk: 0.1.2 + + /min-indent@1.0.1: + resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} + engines: {node: '>=4'} + + /minimalistic-assert@1.0.1: + resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} + + /minimalistic-crypto-utils@1.0.1: + resolution: {integrity: sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==} + + /minimatch@3.0.4: + resolution: {integrity: sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==} + dependencies: + brace-expansion: 1.1.11 + dev: true + + /minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + dependencies: + brace-expansion: 1.1.11 + + /minimatch@5.0.1: + resolution: {integrity: sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==} + engines: {node: '>=10'} + dependencies: + brace-expansion: 2.0.1 + + /minimist-options@4.1.0: + resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==} + engines: {node: '>= 6'} + dependencies: + arrify: 1.0.1 + is-plain-obj: 1.1.0 + kind-of: 6.0.3 + dev: true + + /minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + /minipass@2.9.0: + resolution: {integrity: sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==} + dependencies: + safe-buffer: 5.2.1 + yallist: 3.1.1 + + /minizlib@1.3.3: + resolution: {integrity: sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==} + dependencies: + minipass: 2.9.0 + + /mixme@0.5.9: + resolution: {integrity: sha512-VC5fg6ySUscaWUpI4gxCBTQMH2RdUpNrk+MsbpCYtIvf9SBJdiUey4qE7BXviJsJR4nDQxCZ+3yaYNW3guz/Pw==} + engines: {node: '>= 8.0.0'} + dev: true + + /mkdirp-classic@0.5.3: + resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} + dev: false + + /mkdirp-promise@5.0.1: + resolution: {integrity: sha512-Hepn5kb1lJPtVW84RFT40YG1OddBNTOVUZR2bzQUHc+Z03en8/3uX0+060JDhcEzyO08HmipsN9DcnFMxhIL9w==} + engines: {node: '>=4'} + deprecated: This package is broken and no longer maintained. 'mkdirp' itself supports promises now, please switch to that. + dependencies: + mkdirp: 1.0.4 + + /mkdirp@0.5.5: + resolution: {integrity: sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==} + hasBin: true + dependencies: + minimist: 1.2.8 + dev: true + + /mkdirp@0.5.6: + resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} + hasBin: true + dependencies: + minimist: 1.2.8 + + /mkdirp@1.0.4: + resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} + engines: {node: '>=10'} + hasBin: true + + /mnemonist@0.38.5: + resolution: {integrity: sha512-bZTFT5rrPKtPJxj8KSV0WkPyNxl72vQepqqVUAW2ARUpUSF2qXMB6jZj7hW5/k7C1rtpzqbD/IIbJwLXUjCHeg==} + dependencies: + obliterator: 2.0.4 + dev: false + + /mocha@10.2.0: + resolution: {integrity: sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==} + engines: {node: '>= 14.0.0'} + hasBin: true + dependencies: + ansi-colors: 4.1.1 + browser-stdout: 1.3.1 + chokidar: 3.5.3 + debug: 4.3.4(supports-color@8.1.1) + diff: 5.0.0 + escape-string-regexp: 4.0.0 + find-up: 5.0.0 + glob: 7.2.0 + he: 1.2.0 + js-yaml: 4.1.0 + log-symbols: 4.1.0 + minimatch: 5.0.1 + ms: 2.1.3 + nanoid: 3.3.3 + serialize-javascript: 6.0.0 + strip-json-comments: 3.1.1 + supports-color: 8.1.1 + workerpool: 6.2.1 + yargs: 16.2.0 + yargs-parser: 20.2.4 + yargs-unparser: 2.0.0 + + /mocha@7.1.2: + resolution: {integrity: sha512-o96kdRKMKI3E8U0bjnfqW4QMk12MwZ4mhdBTf+B5a1q9+aq2HRnj+3ZdJu0B/ZhJeK78MgYuv6L8d/rA5AeBJA==} + engines: {node: '>= 8.10.0'} + hasBin: true + dependencies: + ansi-colors: 3.2.3 + browser-stdout: 1.3.1 + chokidar: 3.3.0 + debug: 3.2.6(supports-color@6.0.0) + diff: 3.5.0 + escape-string-regexp: 1.0.5 + find-up: 3.0.0 + glob: 7.1.3 + growl: 1.10.5 + he: 1.2.0 + js-yaml: 3.13.1 + log-symbols: 3.0.0 + minimatch: 3.0.4 + mkdirp: 0.5.5 + ms: 2.1.1 + node-environment-flags: 1.0.6 + object.assign: 4.1.0 + strip-json-comments: 2.0.1 + supports-color: 6.0.0 + which: 1.3.1 + wide-align: 1.1.3 + yargs: 13.3.2 + yargs-parser: 13.1.2 + yargs-unparser: 1.6.0 + dev: true + + /mock-fs@4.14.0: + resolution: {integrity: sha512-qYvlv/exQ4+svI3UOvPUpLDF0OMX5euvUH0Ny4N5QyRyhNdgAgUrVH3iUINSzEPLvx0kbo/Bp28GJKIqvE7URw==} + + /module-error@1.0.2: + resolution: {integrity: sha512-0yuvsqSCv8LbaOKhnsQ/T5JhyFlCYLPXK3U2sgV10zoKQwzs/MyfuQUOZQ1V/6OCOJsK/TRgNVrPuPDqtdMFtA==} + engines: {node: '>=10'} + dev: false + + /ms@2.0.0: + resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + + /ms@2.1.1: + resolution: {integrity: sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==} + dev: true + + /ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + + /ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + /multibase@0.6.1: + resolution: {integrity: sha512-pFfAwyTjbbQgNc3G7D48JkJxWtoJoBMaR4xQUOuB8RnCgRqaYmWNFeJTTvrJ2w51bjLq2zTby6Rqj9TQ9elSUw==} + deprecated: This module has been superseded by the multiformats module + dependencies: + base-x: 3.0.9 + buffer: 5.7.1 + + /multibase@0.7.0: + resolution: {integrity: sha512-TW8q03O0f6PNFTQDvh3xxH03c8CjGaaYrjkl9UQPG6rz53TQzzxJVCIWVjzcbN/Q5Y53Zd0IBQBMVktVgNx4Fg==} + deprecated: This module has been superseded by the multiformats module + dependencies: + base-x: 3.0.9 + buffer: 5.7.1 + + /multicodec@0.5.7: + resolution: {integrity: sha512-PscoRxm3f+88fAtELwUnZxGDkduE2HD9Q6GHUOywQLjOGT/HAdhjLDYNZ1e7VR0s0TP0EwZ16LNUTFpoBGivOA==} + deprecated: This module has been superseded by the multiformats module + dependencies: + varint: 5.0.2 + + /multicodec@1.0.4: + resolution: {integrity: sha512-NDd7FeS3QamVtbgfvu5h7fd1IlbaC4EQ0/pgU4zqE2vdHCmBGsUa0TiM8/TdSeG6BMPC92OOCf8F1ocE/Wkrrg==} + deprecated: This module has been superseded by the multiformats module + dependencies: + buffer: 5.7.1 + varint: 5.0.2 + + /multihashes@0.4.21: + resolution: {integrity: sha512-uVSvmeCWf36pU2nB4/1kzYZjsXD9vofZKpgudqkceYY5g2aZZXJ5r9lxuzoRLl1OAp28XljXsEJ/X/85ZsKmKw==} + dependencies: + buffer: 5.7.1 + multibase: 0.7.0 + varint: 5.0.2 + + /mz@2.7.0: + resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + dependencies: + any-promise: 1.3.0 + object-assign: 4.1.1 + thenify-all: 1.6.0 + dev: false + + /nano-json-stream-parser@0.1.2: + resolution: {integrity: sha512-9MqxMH/BSJC7dnLsEMPyfN5Dvoo49IsPFYMcHw3Bcfc2kN0lpHRBSzlMSVx4HGyJ7s9B31CyBTVehWJoQ8Ctew==} + + /nanoid@3.3.3: + resolution: {integrity: sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + /napi-build-utils@1.0.2: + resolution: {integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==} + dev: false + + /napi-macros@2.2.2: + resolution: {integrity: sha512-hmEVtAGYzVQpCKdbQea4skABsdXW4RUh5t5mJ2zzqowJS2OyXZTU1KhDVFhx+NlWZ4ap9mqR9TcDO3LTTttd+g==} + dev: false + + /natural-compare-lite@1.4.0: + resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} + dev: true + + /natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + + /negotiator@0.6.3: + resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} + engines: {node: '>= 0.6'} + + /neo-async@2.6.2: + resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + dev: true + + /next-tick@1.1.0: + resolution: {integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==} + + /nise@4.1.0: + resolution: {integrity: sha512-eQMEmGN/8arp0xsvGoQ+B1qvSkR73B1nWSCh7nOt5neMCtwcQVYQGdzQMhcNscktTsWB54xnlSQFzOAPJD8nXA==} + dependencies: + '@sinonjs/commons': 1.8.6 + '@sinonjs/fake-timers': 6.0.1 + '@sinonjs/text-encoding': 0.7.2 + just-extend: 4.2.1 + path-to-regexp: 1.8.0 + dev: true + + /no-case@3.0.4: + resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} + dependencies: + lower-case: 2.0.2 + tslib: 2.6.1 + dev: true + + /node-abi@3.51.0: + resolution: {integrity: sha512-SQkEP4hmNWjlniS5zdnfIXTk1x7Ome85RDzHlTbBtzE97Gfwz/Ipw4v/Ryk20DWIy3yCNVLVlGKApCnmvYoJbA==} + engines: {node: '>=10'} + dependencies: + semver: 7.5.4 + dev: false + + /node-addon-api@2.0.2: + resolution: {integrity: sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==} + + /node-addon-api@3.2.1: + resolution: {integrity: sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==} + dev: false + + /node-addon-api@4.3.0: + resolution: {integrity: sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ==} + dev: false + + /node-emoji@1.11.0: + resolution: {integrity: sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==} + dependencies: + lodash: 4.17.21 + dev: true + + /node-environment-flags@1.0.6: + resolution: {integrity: sha512-5Evy2epuL+6TM0lCQGpFIj6KwiEsGh1SrHUhTbNX+sLbBtjidPZFAnVK9y5yU1+h//RitLbRHTIMyxQPtxMdHw==} + dependencies: + object.getownpropertydescriptors: 2.1.7 + semver: 5.7.2 + dev: true + + /node-fetch@2.7.0: + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + dependencies: + whatwg-url: 5.0.0 + + /node-gyp-build@4.6.0: + resolution: {integrity: sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ==} + hasBin: true + + /node-hid@2.1.2: + resolution: {integrity: sha512-qhCyQqrPpP93F/6Wc/xUR7L8mAJW0Z6R7HMQV8jCHHksAxNDe/4z4Un/H9CpLOT+5K39OPyt9tIQlavxWES3lg==} + engines: {node: '>=10'} + hasBin: true + requiresBuild: true + dependencies: + bindings: 1.5.0 + node-addon-api: 3.2.1 + prebuild-install: 7.1.1 + dev: false + + /node-preload@0.2.1: + resolution: {integrity: sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==} + engines: {node: '>=8'} + dependencies: + process-on-spawn: 1.0.0 + dev: true + + /node-releases@2.0.13: + resolution: {integrity: sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==} + dev: true + + /nofilter@3.1.0: + resolution: {integrity: sha512-l2NNj07e9afPnhAhvgVrCD/oy2Ai1yfLpuo3EpiO1jFTsB4sFz6oIfAfSZyQzVpkZQ9xS8ZS5g1jCBgq4Hwo0g==} + engines: {node: '>=12.19'} + dev: false + + /nopt@3.0.6: + resolution: {integrity: sha512-4GUt3kSEYmk4ITxzB/b9vaIDfUVWN/Ml1Fwl11IlnIG2iaJ9O6WXZ9SrYM9NLI8OCBieN2Y8SWC2oJV0RQ7qYg==} + hasBin: true + dependencies: + abbrev: 1.0.9 + dev: true + + /normalize-package-data@2.5.0: + resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} + dependencies: + hosted-git-info: 2.8.9 + resolve: 1.17.0 + semver: 5.7.2 + validate-npm-package-license: 3.0.4 + dev: true + + /normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + /normalize-url@4.5.1: + resolution: {integrity: sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==} + engines: {node: '>=8'} + dev: false + + /normalize-url@6.1.0: + resolution: {integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==} + engines: {node: '>=10'} + + /nth-check@2.1.1: + resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + dependencies: + boolbase: 1.0.0 + dev: false + + /number-to-bn@1.7.0: + resolution: {integrity: sha512-wsJ9gfSz1/s4ZsJN01lyonwuxA1tml6X1yBDnfpMglypcBRFZZkus26EdPSlqS5GJfYddVZa22p3VNb3z5m5Ig==} + engines: {node: '>=6.5.0', npm: '>=3'} + dependencies: + bn.js: 4.11.6 + strip-hex-prefix: 1.0.0 + + /nyc@15.1.0: + resolution: {integrity: sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A==} + engines: {node: '>=8.9'} + hasBin: true + dependencies: + '@istanbuljs/load-nyc-config': 1.1.0 + '@istanbuljs/schema': 0.1.3 + caching-transform: 4.0.0 + convert-source-map: 1.9.0 + decamelize: 1.2.0 + find-cache-dir: 3.3.2 + find-up: 4.1.0 + foreground-child: 2.0.0 + get-package-type: 0.1.0 + glob: 7.2.0 + istanbul-lib-coverage: 3.2.1 + istanbul-lib-hook: 3.0.0 + istanbul-lib-instrument: 4.0.3 + istanbul-lib-processinfo: 2.0.3 + istanbul-lib-report: 3.0.1 + istanbul-lib-source-maps: 4.0.1 + istanbul-reports: 3.1.6 + make-dir: 3.1.0 + node-preload: 0.2.1 + p-map: 3.0.0 + process-on-spawn: 1.0.0 + resolve-from: 5.0.0 + rimraf: 3.0.2 + signal-exit: 3.0.7 + spawn-wrap: 2.0.0 + test-exclude: 6.0.0 + yargs: 15.4.1 + transitivePeerDependencies: + - supports-color + dev: true + + /oauth-sign@0.9.0: + resolution: {integrity: sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==} + + /object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + /object-inspect@1.12.3: + resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==} + + /object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + dev: true + + /object.assign@4.1.0: + resolution: {integrity: sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==} + engines: {node: '>= 0.4'} + dependencies: + define-properties: 1.2.0 + function-bind: 1.1.1 + has-symbols: 1.0.3 + object-keys: 1.1.1 + dev: true + + /object.assign@4.1.4: + resolution: {integrity: sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + has-symbols: 1.0.3 + object-keys: 1.1.1 + dev: true + + /object.getownpropertydescriptors@2.1.7: + resolution: {integrity: sha512-PrJz0C2xJ58FNn11XV2lr4Jt5Gzl94qpy9Lu0JlfEj14z88sqbSBJCBEzdlNUCzY2gburhbrwOZ5BHCmuNUy0g==} + engines: {node: '>= 0.8'} + dependencies: + array.prototype.reduce: 1.0.6 + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.22.1 + safe-array-concat: 1.0.0 + dev: true + + /object.values@1.1.6: + resolution: {integrity: sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.22.1 + dev: true + + /obliterator@2.0.4: + resolution: {integrity: sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ==} + dev: false + + /oboe@2.1.5: + resolution: {integrity: sha512-zRFWiF+FoicxEs3jNI/WYUrVEgA7DeET/InK0XQuudGHRg8iIob3cNPrJTKaz4004uaA9Pbe+Dwa8iluhjLZWA==} + dependencies: + http-https: 1.0.0 + + /on-finished@2.4.1: + resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} + engines: {node: '>= 0.8'} + dependencies: + ee-first: 1.1.1 + + /once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + dependencies: + wrappy: 1.0.2 + + /onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + dependencies: + mimic-fn: 2.1.0 + dev: false + + /optionator@0.8.3: + resolution: {integrity: sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==} + engines: {node: '>= 0.8.0'} + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.3.0 + prelude-ls: 1.1.2 + type-check: 0.3.2 + word-wrap: 1.2.5 + dev: true + + /optionator@0.9.3: + resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} + engines: {node: '>= 0.8.0'} + dependencies: + '@aashutoshrathi/word-wrap': 1.2.6 + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + + /ora@5.4.1: + resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} + engines: {node: '>=10'} + dependencies: + bl: 4.1.0 + chalk: 4.1.2 + cli-cursor: 3.1.0 + cli-spinners: 2.9.1 + is-interactive: 1.0.0 + is-unicode-supported: 0.1.0 + log-symbols: 4.1.0 + strip-ansi: 6.0.1 + wcwidth: 1.0.1 + dev: false + + /ordinal@1.0.3: + resolution: {integrity: sha512-cMddMgb2QElm8G7vdaa02jhUNbTSrhsgAGUz1OokD83uJTwSUn+nKoNoKVVaRa08yF6sgfO7Maou1+bgLd9rdQ==} + dev: false + + /os-tmpdir@1.0.2: + resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} + engines: {node: '>=0.10.0'} + + /outdent@0.5.0: + resolution: {integrity: sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==} + dev: true + + /p-cancelable@1.1.0: + resolution: {integrity: sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==} + engines: {node: '>=6'} + dev: false + + /p-cancelable@2.1.1: + resolution: {integrity: sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==} + engines: {node: '>=8'} + + /p-cancelable@3.0.0: + resolution: {integrity: sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==} + engines: {node: '>=12.20'} + + /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: + resolution: {integrity: sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==} + engines: {node: '>=4'} + dependencies: + p-try: 1.0.0 + dev: false + + /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: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + dependencies: + yocto-queue: 0.1.0 + + /p-locate@2.0.0: + resolution: {integrity: sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==} + engines: {node: '>=4'} + dependencies: + p-limit: 1.3.0 + dev: false + + /p-locate@3.0.0: + resolution: {integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==} + engines: {node: '>=6'} + dependencies: + p-limit: 2.3.0 + dev: true + + /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: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + dependencies: + p-limit: 3.1.0 + + /p-map@2.1.0: + resolution: {integrity: sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==} + engines: {node: '>=6'} + dev: true + + /p-map@3.0.0: + resolution: {integrity: sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==} + engines: {node: '>=8'} + dependencies: + aggregate-error: 3.1.0 + dev: true + + /p-map@4.0.0: + resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} + engines: {node: '>=10'} + dependencies: + aggregate-error: 3.1.0 + dev: false + + /p-try@1.0.0: + resolution: {integrity: sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==} + engines: {node: '>=4'} + dev: false + + /p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + dev: true + + /package-hash@4.0.0: + resolution: {integrity: sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==} + engines: {node: '>=8'} + dependencies: + graceful-fs: 4.2.11 + hasha: 5.2.2 + lodash.flattendeep: 4.4.0 + release-zalgo: 1.0.0 + dev: true + + /pako@1.0.11: + resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} + dev: false + + /parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + dependencies: + callsites: 3.1.0 + + /parse-asn1@5.1.6: + resolution: {integrity: sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==} + dependencies: + asn1.js: 5.4.1 + browserify-aes: 1.2.0 + evp_bytestokey: 1.0.3 + pbkdf2: 3.1.2 + safe-buffer: 5.2.1 + dev: false + + /parse-cache-control@1.0.1: + resolution: {integrity: sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg==} + dev: true + + /parse-headers@2.0.5: + resolution: {integrity: sha512-ft3iAoLOB/MlwbNXgzy43SWGP6sQki2jQvAyBg/zDFAgr9bfNWZIUj42Kw2eJIl8kEi4PbgE6U1Zau/HwI75HA==} + + /parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + dependencies: + '@babel/code-frame': 7.22.10 + error-ex: 1.3.2 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + + /parse-ms@0.1.2: + resolution: {integrity: sha512-VwMglE9412ifMHcRFEVJePEpreQh90wjIiOdP0UQQGKV4l+QprdKI+p5noXTkmGjznBMb40s+VymcclATAVvYA==} + engines: {node: '>=0.10.0'} + dev: true + + /parse5-htmlparser2-tree-adapter@7.0.0: + resolution: {integrity: sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==} + dependencies: + domhandler: 5.0.3 + parse5: 7.1.2 + dev: false + + /parse5@7.1.2: + resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} + dependencies: + entities: 4.5.0 + dev: false + + /parseurl@1.3.3: + resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} + engines: {node: '>= 0.8'} + + /path-exists@3.0.0: + resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} + engines: {node: '>=4'} + + /path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + /path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + /path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + /path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + /path-to-regexp@0.1.7: + resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==} + + /path-to-regexp@1.8.0: + resolution: {integrity: sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==} + dependencies: + isarray: 0.0.1 + dev: true + + /path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + + /pathval@1.1.1: + resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} + + /pbkdf2@3.1.2: + resolution: {integrity: sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==} + engines: {node: '>=0.12'} + dependencies: + create-hash: 1.2.0 + create-hmac: 1.1.7 + ripemd160: 2.0.2 + safe-buffer: 5.2.1 + sha.js: 2.4.11 + + /performance-now@2.1.0: + resolution: {integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==} + + /picocolors@1.0.0: + resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + dev: true + + /picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + /pify@4.0.1: + resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} + engines: {node: '>=6'} + dev: true + + /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 + + /pluralize@8.0.0: + resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} + engines: {node: '>=4'} + dev: false + + /prebuild-install@7.1.1: + resolution: {integrity: sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==} + engines: {node: '>=10'} + hasBin: true + dependencies: + detect-libc: 2.0.2 + expand-template: 2.0.3 + github-from-package: 0.0.0 + minimist: 1.2.8 + mkdirp-classic: 0.5.3 + napi-build-utils: 1.0.2 + node-abi: 3.51.0 + pump: 3.0.0 + rc: 1.2.8 + simple-get: 4.0.1 + tar-fs: 2.1.1 + tunnel-agent: 0.6.0 + dev: false + + /preferred-pm@3.0.3: + resolution: {integrity: sha512-+wZgbxNES/KlJs9q40F/1sfOd/j7f1O9JaHcW5Dsn3aUUOZg3L2bjpVUcKV2jvtElYfoTuQiNeMfQJ4kwUAhCQ==} + engines: {node: '>=10'} + dependencies: + find-up: 5.0.0 + find-yarn-workspace-root2: 1.2.16 + path-exists: 4.0.0 + which-pm: 2.0.0 + dev: true + + /prelude-ls@1.1.2: + resolution: {integrity: sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==} + engines: {node: '>= 0.8.0'} + dev: true + + /prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + + /prepend-http@2.0.0: + resolution: {integrity: sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA==} + engines: {node: '>=4'} + dev: false + + /prettier-linter-helpers@1.0.0: + resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} + engines: {node: '>=6.0.0'} + dependencies: + fast-diff: 1.3.0 + dev: true + + /prettier@2.4.1: + resolution: {integrity: sha512-9fbDAXSBcc6Bs1mZrDYb3XKzDLm4EXXL9sC1LqKP5rZkT6KRr/rf9amVUcODVXgguK/isJz0d0hP72WeaKWsvA==} + engines: {node: '>=10.13.0'} + hasBin: true + dev: true + + /prettier@2.8.8: + resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} + engines: {node: '>=10.13.0'} + hasBin: true + + /pretty-format@29.7.0: + resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/schemas': 29.6.3 + ansi-styles: 5.2.0 + react-is: 18.2.0 + dev: true + + /pretty-ms@0.2.2: + resolution: {integrity: sha512-ah/vWDJAT0arxQwVcSGp6etaLTZr4IsrXTy/khfjimzdYgSxYWzTMByrtpJUWinAnVY8szDg+qQhsE5MUMz3lQ==} + engines: {node: '>=0.10.0'} + hasBin: true + dependencies: + parse-ms: 0.1.2 + dev: true + + /process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + dev: true + + /process-on-spawn@1.0.0: + resolution: {integrity: sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg==} + engines: {node: '>=8'} + dependencies: + fromentries: 1.3.2 + dev: true + + /process@0.11.10: + resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} + engines: {node: '>= 0.6.0'} + + /promise@8.3.0: + resolution: {integrity: sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==} + dependencies: + asap: 2.0.6 + dev: true + + /proxy-addr@2.0.7: + resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} + engines: {node: '>= 0.10'} + dependencies: + forwarded: 0.2.0 + ipaddr.js: 1.9.1 + + /proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + + /pseudomap@1.0.2: + resolution: {integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==} + dev: true + + /psl@1.9.0: + resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==} + + /public-encrypt@4.0.3: + resolution: {integrity: sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==} + dependencies: + bn.js: 4.12.0 + browserify-rsa: 4.1.0 + create-hash: 1.2.0 + parse-asn1: 5.1.6 + randombytes: 2.1.0 + safe-buffer: 5.2.1 + dev: false + + /pump@3.0.0: + resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} + dependencies: + end-of-stream: 1.4.4 + once: 1.4.0 + + /punycode@2.1.0: + resolution: {integrity: sha512-Yxz2kRwT90aPiWEMHVYnEf4+rhwF1tBmmZ4KepCP+Wkium9JxtWnUm1nqGwpiAHr/tnTSeHqr3wb++jgSkXjhA==} + engines: {node: '>=6'} + + /punycode@2.3.0: + resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} + engines: {node: '>=6'} + + /qs@6.11.0: + resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==} + engines: {node: '>=0.6'} + dependencies: + side-channel: 1.0.4 + + /qs@6.11.2: + resolution: {integrity: sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==} + engines: {node: '>=0.6'} + dependencies: + side-channel: 1.0.4 + dev: true + + /qs@6.5.3: + resolution: {integrity: sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==} + engines: {node: '>=0.6'} + + /query-string@5.1.1: + resolution: {integrity: sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==} + engines: {node: '>=0.10.0'} + dependencies: + decode-uri-component: 0.2.2 + object-assign: 4.1.1 + strict-uri-encode: 1.1.0 + + /queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + /quick-lru@4.0.1: + resolution: {integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==} + engines: {node: '>=8'} + dev: true + + /quick-lru@5.1.1: + resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} + engines: {node: '>=10'} + + /randombytes@2.1.0: + resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + dependencies: + safe-buffer: 5.2.1 + + /randomfill@1.0.4: + resolution: {integrity: sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==} + dependencies: + randombytes: 2.1.0 + safe-buffer: 5.2.1 + dev: false + + /range-parser@1.2.1: + resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} + engines: {node: '>= 0.6'} + + /raw-body@2.5.1: + resolution: {integrity: sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==} + engines: {node: '>= 0.8'} + dependencies: + bytes: 3.1.2 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + unpipe: 1.0.0 + + /raw-body@2.5.2: + resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} + engines: {node: '>= 0.8'} + dependencies: + bytes: 3.1.2 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + unpipe: 1.0.0 + + /rc@1.2.8: + resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} + hasBin: true + dependencies: + deep-extend: 0.6.0 + ini: 1.3.8 + minimist: 1.2.8 + strip-json-comments: 2.0.1 + dev: false + + /react-dom@17.0.2(react@17.0.2): + resolution: {integrity: sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==} + peerDependencies: + react: 17.0.2 + dependencies: + loose-envify: 1.4.0 + object-assign: 4.1.1 + react: 17.0.2 + scheduler: 0.20.2 + dev: false + + /react-is@18.2.0: + resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} + dev: true + + /react@17.0.2: + resolution: {integrity: sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==} + engines: {node: '>=0.10.0'} + dependencies: + loose-envify: 1.4.0 + object-assign: 4.1.1 + dev: false + + /read-pkg-up@7.0.1: + resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} + engines: {node: '>=8'} + dependencies: + find-up: 4.1.0 + read-pkg: 5.2.0 + type-fest: 0.8.1 + dev: true + + /read-pkg@5.2.0: + resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} + engines: {node: '>=8'} + dependencies: + '@types/normalize-package-data': 2.4.1 + normalize-package-data: 2.5.0 + parse-json: 5.2.0 + type-fest: 0.6.0 + dev: true + + /read-yaml-file@1.1.0: + resolution: {integrity: sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==} + engines: {node: '>=6'} + dependencies: + graceful-fs: 4.2.11 + js-yaml: 3.14.1 + pify: 4.0.1 + strip-bom: 3.0.0 + dev: true + + /readable-stream@2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 2.0.1 + safe-buffer: 5.1.2 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + dev: true + + /readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + + /readdirp@3.2.0: + resolution: {integrity: sha512-crk4Qu3pmXwgxdSgGhgA/eXiJAPQiX4GMOZZMXnqKxHX7TaoL+3gQVo/WeuAiogr07DpnfjIMpXXa+PAIvwPGQ==} + engines: {node: '>= 8'} + dependencies: + picomatch: 2.3.1 + dev: true + + /readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + dependencies: + picomatch: 2.3.1 + + /rechoir@0.6.2: + resolution: {integrity: sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==} + engines: {node: '>= 0.10'} + dependencies: + resolve: 1.22.4 + dev: true + + /recursive-readdir@2.2.3: + resolution: {integrity: sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==} + engines: {node: '>=6.0.0'} + dependencies: + minimatch: 3.1.2 + dev: true + + /redent@3.0.0: + resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} + engines: {node: '>=8'} + dependencies: + indent-string: 4.0.0 + strip-indent: 3.0.0 + dev: true + + /reduce-flatten@2.0.0: + resolution: {integrity: sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w==} + engines: {node: '>=6'} + dev: true + + /regenerator-runtime@0.14.0: + resolution: {integrity: sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==} + dev: true + + /regexp.prototype.flags@1.5.0: + resolution: {integrity: sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + functions-have-names: 1.2.3 + dev: true + + /regexpp@3.2.0: + resolution: {integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==} + engines: {node: '>=8'} + dev: true + + /release-zalgo@1.0.0: + resolution: {integrity: sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA==} + engines: {node: '>=4'} + dependencies: + es6-error: 4.1.1 + dev: true + + /req-cwd@2.0.0: + resolution: {integrity: sha512-ueoIoLo1OfB6b05COxAA9UpeoscNpYyM+BqYlA7H6LVF4hKGPXQQSSaD2YmvDVJMkk4UDpAHIeU1zG53IqjvlQ==} + engines: {node: '>=4'} + dependencies: + req-from: 2.0.0 + dev: true + + /req-from@2.0.0: + resolution: {integrity: sha512-LzTfEVDVQHBRfjOUMgNBA+V6DWsSnoeKzf42J7l0xa/B4jyPOuuF5MlNSmomLNGemWTnV2TIdjSSLnEn95fOQA==} + engines: {node: '>=4'} + dependencies: + resolve-from: 3.0.0 + dev: true + + /request@2.88.2: + resolution: {integrity: sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==} + engines: {node: '>= 6'} + deprecated: request has been deprecated, see https://github.com/request/request/issues/3142 + dependencies: + aws-sign2: 0.7.0 + aws4: 1.12.0 + caseless: 0.12.0 + combined-stream: 1.0.8 + extend: 3.0.2 + forever-agent: 0.6.1 + form-data: 2.3.3 + har-validator: 5.1.5 + http-signature: 1.2.0 + is-typedarray: 1.0.0 + isstream: 0.1.2 + json-stringify-safe: 5.0.1 + mime-types: 2.1.35 + oauth-sign: 0.9.0 + performance-now: 2.1.0 + qs: 6.5.3 + safe-buffer: 5.2.1 + tough-cookie: 2.5.0 + tunnel-agent: 0.6.0 + uuid: 3.4.0 + + /require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + /require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + + /require-main-filename@2.0.0: + resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} + dev: true + + /requireindex@1.2.0: + resolution: {integrity: sha512-L9jEkOi3ASd9PYit2cwRfyppc9NoABujTP8/5gFcbERmo5jUoAKovIC3fsF17pkTnGsrByysqX+Kxd2OTNI1ww==} + engines: {node: '>=0.10.5'} + dev: false + + /resolve-alpn@1.2.1: + resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==} + + /resolve-from@3.0.0: + resolution: {integrity: sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==} + engines: {node: '>=4'} + dev: true + + /resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + /resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + dev: true + + /resolve@1.1.7: + resolution: {integrity: sha512-9znBF0vBcaSN3W2j7wKvdERPwqTxSpCq+if5C0WoTCyV9n24rua28jeuQ2pL/HOf+yUe/Mef+H/5p60K0Id3bg==} + dev: true + + /resolve@1.17.0: + resolution: {integrity: sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==} + dependencies: + path-parse: 1.0.7 + + /resolve@1.22.4: + resolution: {integrity: sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==} + hasBin: true + dependencies: + is-core-module: 2.13.0 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + /responselike@1.0.2: + resolution: {integrity: sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ==} + dependencies: + lowercase-keys: 1.0.1 + dev: false + + /responselike@2.0.1: + resolution: {integrity: sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==} + dependencies: + lowercase-keys: 2.0.0 + + /restore-cursor@3.1.0: + resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} + engines: {node: '>=8'} + dependencies: + onetime: 5.1.2 + signal-exit: 3.0.7 + dev: false + + /reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + /rimraf@2.7.1: + resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==} + hasBin: true + dependencies: + glob: 7.2.0 + dev: false + + /rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + hasBin: true + dependencies: + glob: 7.2.0 + + /ripemd160@2.0.2: + resolution: {integrity: sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==} + dependencies: + hash-base: 3.1.0 + inherits: 2.0.4 + + /rlp@2.2.7: + resolution: {integrity: sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ==} + hasBin: true + dependencies: + bn.js: 5.2.1 + + /run-parallel-limit@1.1.0: + resolution: {integrity: sha512-jJA7irRNM91jaKc3Hcl1npHsFLOXOoTkPCUL1JEa1R82O2miplXXRaGdjW/KM/98YQWDhJLiSs793CnXfblJUw==} + dependencies: + queue-microtask: 1.2.3 + dev: false + + /run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + dependencies: + queue-microtask: 1.2.3 + + /rustbn.js@0.2.0: + resolution: {integrity: sha512-4VlvkRUuCJvr2J6Y0ImW7NvTCriMi7ErOAqWk1y69vAdoNIzCF3yPmgeNzx+RQTLEDFq5sHfscn1MwHxP9hNfA==} + dev: false + + /rxjs@6.6.7: + resolution: {integrity: sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==} + engines: {npm: '>=2.0.0'} + dependencies: + tslib: 1.14.1 + dev: false + + /safe-array-concat@1.0.0: + resolution: {integrity: sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ==} + engines: {node: '>=0.4'} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.2.1 + has-symbols: 1.0.3 + isarray: 2.0.5 + dev: true + + /safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + + /safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + /safe-regex-test@1.0.0: + resolution: {integrity: sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.2.1 + is-regex: 1.1.4 + dev: true + + /safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + /sc-istanbul@0.4.6: + resolution: {integrity: sha512-qJFF/8tW/zJsbyfh/iT/ZM5QNHE3CXxtLJbZsL+CzdJLBsPD7SedJZoUA4d8iAcN2IoMp/Dx80shOOd2x96X/g==} + hasBin: true + dependencies: + abbrev: 1.0.9 + async: 1.5.2 + escodegen: 1.8.1 + esprima: 2.7.3 + glob: 5.0.15 + handlebars: 4.7.8 + js-yaml: 3.14.1 + mkdirp: 0.5.6 + nopt: 3.0.6 + once: 1.4.0 + resolve: 1.1.7 + supports-color: 3.2.3 + which: 1.3.1 + wordwrap: 1.0.0 + dev: true + + /scheduler@0.20.2: + resolution: {integrity: sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==} + dependencies: + loose-envify: 1.4.0 + object-assign: 4.1.1 + dev: false + + /scrypt-js@2.0.4: + resolution: {integrity: sha512-4KsaGcPnuhtCZQCxFxN3GVYIhKFPTdLd8PLC552XwbMndtD0cjRFAhDuuydXQ0h08ZfPgzqe6EKHozpuH74iDw==} + dev: false + + /scrypt-js@3.0.1: + resolution: {integrity: sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==} + + /secp256k1@4.0.3: + resolution: {integrity: sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA==} + engines: {node: '>=10.0.0'} + requiresBuild: true + dependencies: + elliptic: 6.5.4 + node-addon-api: 2.0.2 + node-gyp-build: 4.6.0 + + /semver@5.7.2: + resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} + hasBin: true + + /semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + /semver@7.5.4: + resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} + engines: {node: '>=10'} + hasBin: true + dependencies: + lru-cache: 6.0.0 + + /send@0.18.0: + resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} + engines: {node: '>= 0.8.0'} + dependencies: + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + encodeurl: 1.0.2 + escape-html: 1.0.3 + etag: 1.8.1 + fresh: 0.5.2 + http-errors: 2.0.0 + mime: 1.6.0 + ms: 2.1.3 + on-finished: 2.4.1 + range-parser: 1.2.1 + statuses: 2.0.1 + transitivePeerDependencies: + - supports-color + + /serialize-javascript@6.0.0: + resolution: {integrity: sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==} + dependencies: + randombytes: 2.1.0 + + /serve-static@1.15.0: + resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==} + engines: {node: '>= 0.8.0'} + dependencies: + encodeurl: 1.0.2 + escape-html: 1.0.3 + parseurl: 1.3.3 + send: 0.18.0 + transitivePeerDependencies: + - supports-color + + /servify@0.1.12: + resolution: {integrity: sha512-/xE6GvsKKqyo1BAY+KxOWXcLpPsUUyji7Qg3bVD7hh1eRze5bR1uYiuDA/k3Gof1s9BTzQZEJK8sNcNGFIzeWw==} + engines: {node: '>=6'} + dependencies: + body-parser: 1.20.2 + cors: 2.8.5 + express: 4.18.2 + request: 2.88.2 + xhr: 2.6.0 + transitivePeerDependencies: + - supports-color + + /set-blocking@2.0.0: + resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} + dev: true + + /setimmediate@1.0.4: + resolution: {integrity: sha512-/TjEmXQVEzdod/FFskf3o7oOAsGhHf2j1dZqRFbDzq4F3mvvxflIIi4Hd3bLQE9y/CpwqfSQam5JakI/mi3Pog==} + dev: false + + /setimmediate@1.0.5: + resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} + + /setprototypeof@1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + + /sha.js@2.4.11: + resolution: {integrity: sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==} + hasBin: true + dependencies: + inherits: 2.0.4 + safe-buffer: 5.2.1 + + /sha1@1.1.1: + resolution: {integrity: sha512-dZBS6OrMjtgVkopB1Gmo4RQCDKiZsqcpAQpkV/aaj+FCrCg8r4I4qMkDPQjBgLIxlmu9k4nUbWq6ohXahOneYA==} + dependencies: + charenc: 0.0.2 + crypt: 0.0.2 + dev: true + + /sha3@2.1.4: + resolution: {integrity: sha512-S8cNxbyb0UGUM2VhRD4Poe5N58gJnJsLJ5vC7FYWGUmGhcsj4++WaIOBFVDxlG0W3To6xBuiRh+i0Qp2oNCOtg==} + dependencies: + buffer: 6.0.3 + dev: true + + /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: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + dependencies: + shebang-regex: 3.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: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + /shelljs@0.8.5: + resolution: {integrity: sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==} + engines: {node: '>=4'} + hasBin: true + dependencies: + glob: 7.2.3 + interpret: 1.4.0 + rechoir: 0.6.2 + dev: true + + /side-channel@1.0.4: + resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.2.1 + object-inspect: 1.12.3 + + /signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + + /simple-concat@1.0.1: + resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} + + /simple-get@2.8.2: + resolution: {integrity: sha512-Ijd/rV5o+mSBBs4F/x9oDPtTx9Zb6X9brmnXvMW4J7IR15ngi9q5xxqWBKU744jTZiaXtxaPL7uHG6vtN8kUkw==} + dependencies: + decompress-response: 3.3.0 + once: 1.4.0 + simple-concat: 1.0.1 + + /simple-get@4.0.1: + resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} + dependencies: + decompress-response: 6.0.0 + once: 1.4.0 + simple-concat: 1.0.1 + dev: false + + /sinon-chai@3.7.0(chai@4.3.7)(sinon@9.2.4): + resolution: {integrity: sha512-mf5NURdUaSdnatJx3uhoBOrY9dtL19fiOtAdT1Azxg3+lNJFiuN0uzaU3xX1LeAfL17kHQhTAJgpsfhbMJMY2g==} + peerDependencies: + chai: ^4.0.0 + sinon: '>=4.0.0' + dependencies: + chai: 4.3.7 + sinon: 9.2.4 + dev: true + + /sinon@9.2.4: + resolution: {integrity: sha512-zljcULZQsJxVra28qIAL6ow1Z9tpattkCTEJR4RBP3TGc00FcttsP5pK284Nas5WjMZU5Yzy3kAIp3B3KRf5Yg==} + deprecated: 16.1.1 + dependencies: + '@sinonjs/commons': 1.8.6 + '@sinonjs/fake-timers': 6.0.1 + '@sinonjs/samsam': 5.3.1 + diff: 4.0.2 + nise: 4.1.0 + supports-color: 7.2.0 + dev: true + + /slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + + /slice-ansi@4.0.0: + resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + astral-regex: 2.0.0 + is-fullwidth-code-point: 3.0.0 + dev: false + + /smartwrap@2.0.2: + resolution: {integrity: sha512-vCsKNQxb7PnCNd2wY1WClWifAc2lwqsG8OaswpJkVJsvMGcnEntdTCDajZCkk93Ay1U3t/9puJmb525Rg5MZBA==} + engines: {node: '>=6'} + hasBin: true + dependencies: + array.prototype.flat: 1.3.1 + breakword: 1.0.6 + grapheme-splitter: 1.0.4 + strip-ansi: 6.0.1 + wcwidth: 1.0.1 + yargs: 15.4.1 + dev: true + + /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) + fs-extra: 0.30.0 + js-sha3: 0.8.0 + memorystream: 0.3.1 + require-from-string: 2.0.2 + semver: 5.7.2 + tmp: 0.0.33 + transitivePeerDependencies: + - debug + dev: false + + /solhint@3.4.0: + resolution: {integrity: sha512-FYEs/LoTxMsWFP/OGsEqR1CBDn3Bn7hrTWsgtjai17MzxITgearIdlo374KKZjjIycu8E2xBcJ+RSWeoBvQmkw==} + hasBin: true + dependencies: + '@solidity-parser/parser': 0.15.0 + ajv: 6.12.6 + antlr4: 4.13.1 + ast-parents: 0.0.1 + chalk: 4.1.2 + commander: 10.0.1 + cosmiconfig: 8.2.0 + fast-diff: 1.3.0 + glob: 8.1.0 + ignore: 5.2.4 + js-yaml: 4.1.0 + lodash: 4.17.21 + pluralize: 8.0.0 + semver: 6.3.1 + strip-ansi: 6.0.1 + table: 6.8.1 + text-table: 0.2.0 + optionalDependencies: + prettier: 2.8.8 + dev: false + + /solidity-coverage@0.8.1(hardhat@packages+hardhat-core): + resolution: {integrity: sha512-IsXuCmgofoph8gA5x93NWYoqHD1pNJBW/OfSXQsIqHL7g3n7/zKW7k9u4t9wJspJuXu+QcW3+oc/ryw7khoLzw==} + hasBin: true + peerDependencies: + hardhat: ^2.11.0 + dependencies: + '@ethersproject/abi': 5.7.0 + '@solidity-parser/parser': 0.14.5 + chalk: 2.4.2 + death: 1.1.0 + detect-port: 1.5.1 + difflib: 0.2.4 + fs-extra: 8.1.0 + ghost-testrpc: 0.0.2 + global-modules: 2.0.0 + globby: 10.0.2 + hardhat: link:packages/hardhat-core + jsonschema: 1.4.1 + lodash: 4.17.21 + mocha: 7.1.2 + node-emoji: 1.11.0 + pify: 4.0.1 + recursive-readdir: 2.2.3 + sc-istanbul: 0.4.6 + semver: 7.5.4 + shelljs: 0.8.5 + web3-utils: 1.3.0 + transitivePeerDependencies: + - supports-color + dev: true + + /solpp@0.11.5: + resolution: {integrity: sha512-LjzCGMrTDXtera2C4mbQGZSpBznP+o3/82L2CneAAMNbm+t4xPsvfrgJkIaY+IZ5YLrB8IXn7cYthwHMKvAWnQ==} + engines: {node: '>=8.15.1'} + hasBin: true + dependencies: + antlr4: 4.8.0 + axios: 0.21.4 + bn-str-256: 1.9.1 + commander: 2.20.3 + ethereumjs-util: 6.2.1 + lodash: 4.17.21 + mz: 2.7.0 + resolve: 1.17.0 + semver: 5.7.2 + transitivePeerDependencies: + - debug + dev: false + + /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: false + + /source-map@0.2.0: + resolution: {integrity: sha512-CBdZ2oa/BHhS4xj5DlhjWNHcan57/5YuvfdLf17iVmIpd9KRm+DFLmC6nBNj+6Ua7Kt3TmOjDpQT1aTYOQtoUA==} + engines: {node: '>=0.8.0'} + requiresBuild: true + dependencies: + amdefine: 1.0.1 + dev: true + optional: true + + /source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + /spawn-wrap@2.0.0: + resolution: {integrity: sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==} + engines: {node: '>=8'} + dependencies: + foreground-child: 2.0.0 + is-windows: 1.0.2 + make-dir: 3.1.0 + rimraf: 3.0.2 + signal-exit: 3.0.7 + which: 2.0.2 + dev: true + + /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.2.0: + resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} + dependencies: + spdx-expression-parse: 3.0.1 + spdx-license-ids: 3.0.13 + dev: true + + /spdx-exceptions@2.3.0: + resolution: {integrity: sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==} + dev: true + + /spdx-expression-parse@3.0.1: + resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} + dependencies: + spdx-exceptions: 2.3.0 + spdx-license-ids: 3.0.13 + dev: true + + /spdx-license-ids@3.0.13: + resolution: {integrity: sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==} + dev: true + + /sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + dev: true + + /sshpk@1.18.0: + resolution: {integrity: sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==} + engines: {node: '>=0.10.0'} + hasBin: true + dependencies: + asn1: 0.2.6 + assert-plus: 1.0.0 + bcrypt-pbkdf: 1.0.2 + dashdash: 1.14.1 + ecc-jsbn: 0.1.2 + getpass: 0.1.7 + jsbn: 0.1.1 + safer-buffer: 2.1.2 + tweetnacl: 0.14.5 + + /stacktrace-parser@0.1.10: + resolution: {integrity: sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg==} + engines: {node: '>=6'} + dependencies: + type-fest: 0.7.1 + dev: false + + /statuses@2.0.1: + resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} + engines: {node: '>= 0.8'} + + /stream-transform@2.1.3: + resolution: {integrity: sha512-9GHUiM5hMiCi6Y03jD2ARC1ettBXkQBoQAe7nJsPknnI0ow10aXjTnew8QtYQmLjzn974BnmWEAJgCY6ZP1DeQ==} + dependencies: + mixme: 0.5.9 + dev: true + + /streamsearch@1.1.0: + resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} + engines: {node: '>=10.0.0'} + dev: false + + /strict-uri-encode@1.1.0: + resolution: {integrity: sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ==} + engines: {node: '>=0.10.0'} + + /string-format@2.0.0: + resolution: {integrity: sha512-bbEs3scLeYNXLecRRuk6uJxdXUSj6le/8rNPHChIJTn2V79aXVTR1EH2OH5zLKKoz0V02fOUKZZcw01pLUShZA==} + dev: true + + /string-width@2.1.1: + resolution: {integrity: sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==} + engines: {node: '>=4'} + dependencies: + is-fullwidth-code-point: 2.0.0 + strip-ansi: 4.0.0 + dev: true + + /string-width@3.1.0: + resolution: {integrity: sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==} + engines: {node: '>=6'} + dependencies: + emoji-regex: 7.0.3 + is-fullwidth-code-point: 2.0.0 + strip-ansi: 5.2.0 + dev: true + + /string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + /string.prototype.trim@1.2.7: + resolution: {integrity: sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.22.1 + dev: true + + /string.prototype.trimend@1.0.6: + resolution: {integrity: sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.22.1 + dev: true + + /string.prototype.trimstart@1.0.6: + resolution: {integrity: sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.22.1 + dev: true + + /string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + dependencies: + safe-buffer: 5.1.2 + dev: true + + /string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + dependencies: + safe-buffer: 5.2.1 + + /strip-ansi@0.1.1: + resolution: {integrity: sha512-behete+3uqxecWlDAm5lmskaSaISA+ThQ4oNNBDTBJt0x2ppR6IPqfZNuj6BLaLJ/Sji4TPZlcRyOis8wXQTLg==} + engines: {node: '>=0.8.0'} + hasBin: true + dev: true + + /strip-ansi@4.0.0: + resolution: {integrity: sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==} + engines: {node: '>=4'} + dependencies: + ansi-regex: 3.0.1 + + /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: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + dependencies: + ansi-regex: 5.0.1 + + /strip-bom@3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + dev: true + + /strip-bom@4.0.0: + resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} + engines: {node: '>=8'} + dev: true + + /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 + + /strip-indent@2.0.0: + resolution: {integrity: sha512-RsSNPLpq6YUL7QYy44RnPVTn/lcVZtb48Uof3X5JLbF4zD/Gs7ZFDv2HWol+leoQN2mT86LAzSshGfkTlSOpsA==} + engines: {node: '>=4'} + dev: false + + /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: + resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} + engines: {node: '>=0.10.0'} + + /strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + + /super-split@1.1.0: + resolution: {integrity: sha512-I4bA5mgcb6Fw5UJ+EkpzqXfiuvVGS/7MuND+oBxNFmxu3ugLNrdIatzBLfhFRMVMLxgSsRy+TjIktgkF9RFSNQ==} + dev: false + + /supports-color@3.2.3: + resolution: {integrity: sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==} + engines: {node: '>=0.8.0'} + dependencies: + has-flag: 1.0.0 + dev: true + + /supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + dependencies: + has-flag: 3.0.0 + + /supports-color@6.0.0: + resolution: {integrity: sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==} + engines: {node: '>=6'} + dependencies: + has-flag: 3.0.0 + dev: true + + /supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + dependencies: + has-flag: 4.0.0 + + /supports-color@8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} + dependencies: + has-flag: 4.0.0 + + /supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + /swarm-js@0.1.42: + resolution: {integrity: sha512-BV7c/dVlA3R6ya1lMlSSNPLYrntt0LUq4YMgy3iwpCIc6rZnS5W2wUoctarZ5pXlpKtxDDf9hNziEkcfrxdhqQ==} + dependencies: + bluebird: 3.7.2 + buffer: 5.7.1 + eth-lib: 0.1.29 + fs-extra: 4.0.3 + got: 11.8.6 + mime-types: 2.1.35 + mkdirp-promise: 5.0.1 + mock-fs: 4.14.0 + setimmediate: 1.0.5 + tar: 4.4.19 + xhr-request: 1.1.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + /sync-request@6.1.0: + resolution: {integrity: sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw==} + engines: {node: '>=8.0.0'} + dependencies: + http-response-object: 3.0.2 + sync-rpc: 1.3.6 + then-request: 6.0.2 + dev: true + + /sync-rpc@1.3.6: + resolution: {integrity: sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw==} + dependencies: + get-port: 3.2.0 + dev: true + + /table-layout@1.0.2: + resolution: {integrity: sha512-qd/R7n5rQTRFi+Zf2sk5XVVd9UQl6ZkduPFC3S7WEGJAmetDTjY3qPN50eSKzwuzEyQKy5TN2TiZdkIjos2L6A==} + engines: {node: '>=8.0.0'} + dependencies: + array-back: 4.0.2 + deep-extend: 0.6.0 + typical: 5.2.0 + wordwrapjs: 4.0.1 + dev: true + + /table@6.8.1: + resolution: {integrity: sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==} + engines: {node: '>=10.0.0'} + dependencies: + ajv: 8.12.0 + lodash.truncate: 4.4.2 + slice-ansi: 4.0.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + dev: false + + /tar-fs@2.1.1: + resolution: {integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==} + dependencies: + chownr: 1.1.4 + mkdirp-classic: 0.5.3 + pump: 3.0.0 + tar-stream: 2.2.0 + dev: false + + /tar-stream@2.2.0: + resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} + engines: {node: '>=6'} + dependencies: + bl: 4.1.0 + end-of-stream: 1.4.4 + fs-constants: 1.0.0 + inherits: 2.0.4 + readable-stream: 3.6.2 + dev: false + + /tar@4.4.19: + resolution: {integrity: sha512-a20gEsvHnWe0ygBY8JbxoM4w3SJdhc7ZAuxkLqh+nvNQN2IOt0B5lLgM490X5Hl8FF0dl0tOf2ewFYAlIFgzVA==} + engines: {node: '>=4.5'} + dependencies: + chownr: 1.1.4 + fs-minipass: 1.2.7 + minipass: 2.9.0 + minizlib: 1.3.3 + mkdirp: 0.5.6 + safe-buffer: 5.2.1 + yallist: 3.1.1 + + /term-size@2.2.1: + resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} + engines: {node: '>=8'} + dev: true + + /test-exclude@6.0.0: + resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} + engines: {node: '>=8'} + dependencies: + '@istanbuljs/schema': 0.1.3 + glob: 7.2.0 + minimatch: 3.1.2 + dev: true + + /text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + + /then-request@6.0.2: + resolution: {integrity: sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA==} + engines: {node: '>=6.0.0'} + dependencies: + '@types/concat-stream': 1.6.1 + '@types/form-data': 0.0.33 + '@types/node': 8.10.66 + '@types/qs': 6.9.10 + caseless: 0.12.0 + concat-stream: 1.6.2 + form-data: 2.5.1 + http-basic: 8.1.3 + http-response-object: 3.0.2 + promise: 8.3.0 + qs: 6.11.2 + dev: true + + /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: false + + /thenify@3.3.1: + resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + dependencies: + any-promise: 1.3.0 + dev: false + + /time-require@0.1.2: + resolution: {integrity: sha512-IqcSpa1sVNleRbC9eHnN7p7vwEHNmsjsXUDqjlnvo4+2VLJ7/gIY2XACTBuRhMB4weYbDYKsR3av2ySykRhDIA==} + engines: {node: '>= 0.10.0'} + dependencies: + chalk: 0.4.0 + date-time: 0.1.1 + pretty-ms: 0.2.2 + text-table: 0.2.0 + dev: true + + /timed-out@4.0.1: + resolution: {integrity: sha512-G7r3AhovYtr5YKOWQkta8RKAPb+J9IsO4uVmzjl8AZwfhs8UcUwTiD6gcJYSgOtzyjvQKrKYn41syHbUWMkafA==} + engines: {node: '>=0.10.0'} + + /tmp@0.0.33: + resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} + engines: {node: '>=0.6.0'} + dependencies: + os-tmpdir: 1.0.2 + + /to-fast-properties@2.0.0: + resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} + engines: {node: '>=4'} + dev: true + + /to-readable-stream@1.0.0: + resolution: {integrity: sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==} + engines: {node: '>=6'} + dev: false + + /to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + dependencies: + is-number: 7.0.0 + + /toidentifier@1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} + + /tough-cookie@2.5.0: + resolution: {integrity: sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==} + engines: {node: '>=0.8'} + dependencies: + psl: 1.9.0 + punycode: 2.3.0 + + /tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + + /trim-newlines@3.0.1: + resolution: {integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==} + engines: {node: '>=8'} + dev: true + + /truffle-blockchain-utils@0.0.5: + resolution: {integrity: sha512-eCCV8FbYOuKagRY5NiqJCZrrh9GjWX2573ahqZPvUrzxYGIvCpSsHpGCub2e00YefpMfBqwscbsDTK7WNVfwoA==} + deprecated: 'WARNING: This package has been renamed to @truffle/blockchain-utils.' + dev: false + + /truffle-contract-schema@2.0.3: + resolution: {integrity: sha512-eI5cFifbB3zpcO4RsXSnjN9JMSlJ4M50GQPdrfbrIXRTXHsyQ433SkgFjIATUwfq++TXWkCRfKMjN8eA7YQ3+Q==} + deprecated: 'WARNING: This package has been renamed to @truffle/contract-schema.' + dependencies: + ajv: 5.5.2 + crypto-js: 3.3.0 + debug: 3.2.7 + transitivePeerDependencies: + - supports-color + dev: false + + /truffle-contract@3.0.7: + resolution: {integrity: sha512-av4MTJDP29PI3oVh8TrvRzRHt+nZJH8ODSiil/TfcXrKMSes52DTA5LHj00siLvcadkxUgoEZfEZ04qqhNGoiA==} + deprecated: 'WARNING: This package has been renamed to @truffle/contract.' + dependencies: + ethjs-abi: 0.1.8 + truffle-blockchain-utils: 0.0.5 + truffle-contract-schema: 2.0.3 + truffle-error: 0.0.3 + web3: 0.20.6 + transitivePeerDependencies: + - supports-color + dev: false + + /truffle-error@0.0.3: + resolution: {integrity: sha512-9gxs1z6BUn7MqrE4NPm/jcYe8rLok3Z57aweGIh1+CoRJSttzYqwcXCqaPRSNrTFnsTeZMBukkYr/PUcADoihw==} + deprecated: 'WARNING: This package has been renamed to @truffle/error.' + dev: false + + /ts-command-line-args@2.5.1: + resolution: {integrity: sha512-H69ZwTw3rFHb5WYpQya40YAX2/w7Ut75uUECbgBIsLmM+BNuYnxsltfyyLMxy6sEeKxgijLTnQtLd0nKd6+IYw==} + hasBin: true + dependencies: + chalk: 4.1.2 + command-line-args: 5.2.1 + command-line-usage: 6.1.3 + string-format: 2.0.0 + dev: true + + /ts-essentials@7.0.3(typescript@5.0.4): + resolution: {integrity: sha512-8+gr5+lqO3G84KdiTSMRLtuyJ+nTBVRKuCrK4lidMPdVeEp0uqC875uE5NMcaA7YYMN7XsNiFQuMvasF8HT/xQ==} + peerDependencies: + typescript: '>=3.7.0' + dependencies: + typescript: 5.0.4 + dev: true + + /ts-node@10.9.1(@types/node@16.18.40)(typescript@5.0.4): + resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} + hasBin: true + peerDependencies: + '@swc/core': '>=1.2.50' + '@swc/wasm': '>=1.2.50' + '@types/node': '*' + typescript: '>=2.7' + peerDependenciesMeta: + '@swc/core': + optional: true + '@swc/wasm': + optional: true + dependencies: + '@cspotcode/source-map-support': 0.8.1 + '@tsconfig/node10': 1.0.9 + '@tsconfig/node12': 1.0.11 + '@tsconfig/node14': 1.0.3 + '@tsconfig/node16': 1.0.4 + '@types/node': 16.18.40 + acorn: 8.10.0 + acorn-walk: 8.2.0 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.2 + make-error: 1.3.6 + typescript: 5.0.4 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + dev: true + + /tsconfig-paths@3.14.2: + resolution: {integrity: sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==} + dependencies: + '@types/json5': 0.0.29 + json5: 1.0.2 + minimist: 1.2.8 + strip-bom: 3.0.0 + dev: true + + /tslib@1.14.1: + resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} + + /tslib@2.4.0: + resolution: {integrity: sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==} + + /tslib@2.6.1: + resolution: {integrity: sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==} + dev: true + + /tsort@0.0.1: + resolution: {integrity: sha512-Tyrf5mxF8Ofs1tNoxA13lFeZ2Zrbd6cKbuH3V+MQ5sb6DtBj5FjrXVsRWT8YvNAQTqNoz66dz1WsbigI22aEnw==} + dev: false + + /tsutils@3.21.0(typescript@5.0.4): + resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} + engines: {node: '>= 6'} + peerDependencies: + typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' + dependencies: + tslib: 1.14.1 + typescript: 5.0.4 + + /tty-table@4.2.1: + resolution: {integrity: sha512-xz0uKo+KakCQ+Dxj1D/tKn2FSyreSYWzdkL/BYhgN6oMW808g8QRMuh1atAV9fjTPbWBjfbkKQpI/5rEcnAc7g==} + engines: {node: '>=8.0.0'} + hasBin: true + dependencies: + chalk: 4.1.2 + csv: 5.5.3 + kleur: 4.1.5 + smartwrap: 2.0.2 + strip-ansi: 6.0.1 + wcwidth: 1.0.1 + yargs: 17.7.2 + dev: true + + /tunnel-agent@0.6.0: + resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} + dependencies: + safe-buffer: 5.2.1 + + /tweetnacl-util@0.15.1: + resolution: {integrity: sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw==} + dev: false + + /tweetnacl@0.14.5: + resolution: {integrity: sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==} + + /tweetnacl@1.0.3: + resolution: {integrity: sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==} + dev: false + + /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: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.2.1 + + /type-detect@4.0.8: + resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} + engines: {node: '>=4'} + + /type-fest@0.13.1: + resolution: {integrity: sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==} + engines: {node: '>=10'} + dev: true + + /type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + + /type-fest@0.21.3: + resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} + engines: {node: '>=10'} + dev: false + + /type-fest@0.6.0: + resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} + engines: {node: '>=8'} + dev: true + + /type-fest@0.7.1: + resolution: {integrity: sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==} + engines: {node: '>=8'} + dev: false + + /type-fest@0.8.1: + resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} + engines: {node: '>=8'} + dev: true + + /type-fest@2.19.0: + resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} + engines: {node: '>=12.20'} + dev: true + + /type-fest@3.13.1: + resolution: {integrity: sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==} + engines: {node: '>=14.16'} + dev: true + + /type-is@1.6.18: + resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} + engines: {node: '>= 0.6'} + dependencies: + media-typer: 0.3.0 + mime-types: 2.1.35 + + /type@1.2.0: + resolution: {integrity: sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==} + + /type@2.7.2: + resolution: {integrity: sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==} + + /typechain@8.3.1(typescript@5.0.4): + resolution: {integrity: sha512-fA7clol2IP/56yq6vkMTR+4URF1nGjV82Wx6Rf09EsqD4tkzMAvEaqYxVFCavJm/1xaRga/oD55K+4FtuXwQOQ==} + hasBin: true + peerDependencies: + typescript: '>=4.3.0' + dependencies: + '@types/prettier': 2.7.3 + debug: 4.3.4(supports-color@8.1.1) + fs-extra: 7.0.1 + glob: 7.1.7 + js-sha3: 0.8.0 + lodash: 4.17.21 + mkdirp: 1.0.4 + prettier: 2.4.1 + ts-command-line-args: 2.5.1 + ts-essentials: 7.0.3(typescript@5.0.4) + typescript: 5.0.4 + transitivePeerDependencies: + - supports-color + dev: true + + /typed-array-buffer@1.0.0: + resolution: {integrity: sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.2.1 + is-typed-array: 1.1.12 + dev: true + + /typed-array-byte-length@1.0.0: + resolution: {integrity: sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + for-each: 0.3.3 + has-proto: 1.0.1 + is-typed-array: 1.1.12 + dev: true + + /typed-array-byte-offset@1.0.0: + resolution: {integrity: sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==} + engines: {node: '>= 0.4'} + dependencies: + available-typed-arrays: 1.0.5 + call-bind: 1.0.2 + for-each: 0.3.3 + has-proto: 1.0.1 + is-typed-array: 1.1.12 + dev: true + + /typed-array-length@1.0.4: + resolution: {integrity: sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==} + dependencies: + call-bind: 1.0.2 + for-each: 0.3.3 + is-typed-array: 1.1.12 + dev: true + + /typedarray-to-buffer@3.1.5: + resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} + dependencies: + is-typedarray: 1.0.0 + + /typedarray@0.0.6: + resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} + dev: true + + /typescript@5.0.4: + resolution: {integrity: sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==} + engines: {node: '>=12.20'} + hasBin: true + + /typical@4.0.0: + resolution: {integrity: sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==} + engines: {node: '>=8'} + dev: true + + /typical@5.2.0: + resolution: {integrity: sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==} + engines: {node: '>=8'} + dev: true + + /uglify-js@3.17.4: + resolution: {integrity: sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==} + engines: {node: '>=0.8.0'} + hasBin: true + requiresBuild: true + dev: true + optional: true + + /ultron@1.1.1: + resolution: {integrity: sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==} + + /unbox-primitive@1.0.2: + resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} + dependencies: + call-bind: 1.0.2 + has-bigints: 1.0.2 + has-symbols: 1.0.3 + which-boxed-primitive: 1.0.2 + dev: true + + /underscore@1.12.1: + resolution: {integrity: sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw==} + dev: false + + /underscore@1.9.1: + resolution: {integrity: sha512-5/4etnCkd9c8gwgowi5/om/mYO5ajCaOgdzj/oW+0eQV9WxKBDZw5+ycmKmeaTXjInS/W0BzpGLo2xR2aBwZdg==} + + /undici@5.23.0: + resolution: {integrity: sha512-1D7w+fvRsqlQ9GscLBwcAJinqcZGHUKjbOmXdlE/v8BvEGXjeWAax+341q44EuTcHXXnfyKNbKRq4Lg7OzhMmg==} + engines: {node: '>=14.0'} + dependencies: + busboy: 1.6.0 + dev: false + + /universalify@0.1.2: + resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} + engines: {node: '>= 4.0.0'} + + /universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + dev: true + + /unpipe@1.0.0: + resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} + engines: {node: '>= 0.8'} + + /untildify@4.0.0: + resolution: {integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==} + engines: {node: '>=8'} + dev: false + + /update-browserslist-db@1.0.13(browserslist@4.22.1): + resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + dependencies: + browserslist: 4.22.1 + escalade: 3.1.1 + picocolors: 1.0.0 + dev: true + + /uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + dependencies: + punycode: 2.3.0 + + /url-parse-lax@3.0.0: + resolution: {integrity: sha512-NjFKA0DidqPa5ciFcSrXnAltTtzz84ogy+NebPvfEgAck0+TNg4UJ4IN+fB7zRZfbgUf0syOo9MDxFkDSMuFaQ==} + engines: {node: '>=4'} + dependencies: + prepend-http: 2.0.0 + dev: false + + /url-set-query@1.0.0: + resolution: {integrity: sha512-3AChu4NiXquPfeckE5R5cGdiHCMWJx1dwCWOmWIL4KHAziJNOFIYJlpGFeKDvwLPHovZRCxK3cYlwzqI9Vp+Gg==} + + /usb@1.9.2: + resolution: {integrity: sha512-dryNz030LWBPAf6gj8vyq0Iev3vPbCLHCT8dBw3gQRXRzVNsIdeuU+VjPp3ksmSPkeMAl1k+kQ14Ij0QHyeiAg==} + engines: {node: '>=10.16.0'} + requiresBuild: true + dependencies: + node-addon-api: 4.3.0 + node-gyp-build: 4.6.0 + dev: false + + /utf-8-validate@5.0.10: + resolution: {integrity: sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==} + engines: {node: '>=6.14.2'} + requiresBuild: true + dependencies: + node-gyp-build: 4.6.0 + + /utf8@2.1.2: + resolution: {integrity: sha512-QXo+O/QkLP/x1nyi54uQiG0XrODxdysuQvE5dtVqv7F5K2Qb6FsN+qbr6KhF5wQ20tfcV3VQp0/2x1e1MRSPWg==} + + /utf8@3.0.0: + resolution: {integrity: sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ==} + + /util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + /util@0.12.5: + resolution: {integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==} + dependencies: + inherits: 2.0.4 + is-arguments: 1.1.1 + is-generator-function: 1.0.10 + is-typed-array: 1.1.12 + which-typed-array: 1.1.11 + + /utils-merge@1.0.1: + resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} + engines: {node: '>= 0.4.0'} + + /uuid@2.0.1: + resolution: {integrity: sha512-nWg9+Oa3qD2CQzHIP4qKUqwNfzKn8P0LtFhotaCTFchsV7ZfDhAybeip/HZVeMIpZi9JgY1E3nUlwaCmZT1sEg==} + deprecated: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details. + dev: false + + /uuid@3.3.2: + resolution: {integrity: sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==} + deprecated: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details. + hasBin: true + dev: false + + /uuid@3.4.0: + resolution: {integrity: sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==} + deprecated: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details. + hasBin: true + + /uuid@8.3.2: + resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} + hasBin: true + + /uuid@9.0.1: + resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} + hasBin: true + + /v8-compile-cache-lib@3.0.1: + resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} + dev: true + + /validate-npm-package-license@3.0.4: + resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + dependencies: + spdx-correct: 3.2.0 + spdx-expression-parse: 3.0.1 + dev: true + + /varint@5.0.2: + resolution: {integrity: sha512-lKxKYG6H03yCZUpAGOPOsMcGxd1RHCu1iKvEHYDPmTyq2HueGhD73ssNBqqQWfvYs04G9iUFRvmAVLW20Jw6ow==} + + /vary@1.1.2: + resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} + engines: {node: '>= 0.8'} + + /verror@1.10.0: + resolution: {integrity: sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==} + engines: {'0': node >=0.6.0} + dependencies: + assert-plus: 1.0.0 + core-util-is: 1.0.2 + extsprintf: 1.3.0 + + /viem@1.15.1(typescript@5.0.4): + resolution: {integrity: sha512-lxk8wwUK7ZivYAUZ6pH+9Y6jjrfXXjafCOoASa4lw3ULUCT2BajU4SELarlxJQimpsFd7OZD4m4iEXYLF/bt6w==} + peerDependencies: + typescript: '>=5.0.4' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@adraffy/ens-normalize': 1.9.4 + '@noble/curves': 1.2.0 + '@noble/hashes': 1.3.2 + '@scure/bip32': 1.3.2 + '@scure/bip39': 1.2.1 + '@types/ws': 8.5.9 + abitype: 0.9.8(typescript@5.0.4) + isomorphic-ws: 5.0.0(ws@8.13.0) + typescript: 5.0.4 + ws: 8.13.0 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + - zod + dev: true + + /wcwidth@1.0.1: + resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} + dependencies: + defaults: 1.0.4 + + /web3-bzz@1.10.3: + resolution: {integrity: sha512-XDIRsTwekdBXtFytMpHBuun4cK4x0ZMIDXSoo1UVYp+oMyZj07c7gf7tNQY5qZ/sN+CJIas4ilhN25VJcjSijQ==} + engines: {node: '>=8.0.0'} + requiresBuild: true + dependencies: + '@types/node': 12.20.55 + got: 12.1.0 + swarm-js: 0.1.42 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + /web3-bzz@1.3.6: + resolution: {integrity: sha512-ibHdx1wkseujFejrtY7ZyC0QxQ4ATXjzcNUpaLrvM6AEae8prUiyT/OloG9FWDgFD2CPLwzKwfSQezYQlANNlw==} + engines: {node: '>=8.0.0'} + requiresBuild: true + dependencies: + '@types/node': 12.20.55 + got: 9.6.0 + swarm-js: 0.1.42 + underscore: 1.12.1 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: false + + /web3-core-helpers@1.10.3: + resolution: {integrity: sha512-Yv7dQC3B9ipOc5sWm3VAz1ys70Izfzb8n9rSiQYIPjpqtJM+3V4EeK6ghzNR6CO2es0+Yu9CtCkw0h8gQhrTxA==} + engines: {node: '>=8.0.0'} + dependencies: + web3-eth-iban: 1.10.3 + web3-utils: 1.10.3 + + /web3-core-helpers@1.3.6: + resolution: {integrity: sha512-nhtjA2ZbkppjlxTSwG0Ttu6FcPkVu1rCN5IFAOVpF/L0SEt+jy+O5l90+cjDq0jAYvlBwUwnbh2mR9hwDEJCNA==} + engines: {node: '>=8.0.0'} + dependencies: + underscore: 1.12.1 + web3-eth-iban: 1.3.6 + web3-utils: 1.3.6 + dev: false + + /web3-core-method@1.10.3: + resolution: {integrity: sha512-VZ/Dmml4NBmb0ep5PTSg9oqKoBtG0/YoMPei/bq/tUdlhB2dMB79sbeJPwx592uaV0Vpk7VltrrrBv5hTM1y4Q==} + engines: {node: '>=8.0.0'} + dependencies: + '@ethersproject/transactions': 5.7.0 + web3-core-helpers: 1.10.3 + web3-core-promievent: 1.10.3 + web3-core-subscriptions: 1.10.3 + web3-utils: 1.10.3 + + /web3-core-method@1.3.6: + resolution: {integrity: sha512-RyegqVGxn0cyYW5yzAwkPlsSEynkdPiegd7RxgB4ak1eKk2Cv1q2x4C7D2sZjeeCEF+q6fOkVmo2OZNqS2iQxg==} + engines: {node: '>=8.0.0'} + dependencies: + '@ethersproject/transactions': 5.7.0 + underscore: 1.12.1 + web3-core-helpers: 1.3.6 + web3-core-promievent: 1.3.6 + web3-core-subscriptions: 1.3.6 + web3-utils: 1.3.6 + dev: false + + /web3-core-promievent@1.10.3: + resolution: {integrity: sha512-HgjY+TkuLm5uTwUtaAfkTgRx/NzMxvVradCi02gy17NxDVdg/p6svBHcp037vcNpkuGeFznFJgULP+s2hdVgUQ==} + engines: {node: '>=8.0.0'} + dependencies: + eventemitter3: 4.0.4 + + /web3-core-promievent@1.3.6: + resolution: {integrity: sha512-Z+QzfyYDTXD5wJmZO5wwnRO8bAAHEItT1XNSPVb4J1CToV/I/SbF7CuF8Uzh2jns0Cm1109o666H7StFFvzVKw==} + engines: {node: '>=8.0.0'} + dependencies: + eventemitter3: 4.0.4 + dev: false + + /web3-core-requestmanager@1.10.3: + resolution: {integrity: sha512-VT9sKJfgM2yBOIxOXeXiDuFMP4pxzF6FT+y8KTLqhDFHkbG3XRe42Vm97mB/IvLQCJOmokEjl3ps8yP1kbggyw==} + engines: {node: '>=8.0.0'} + dependencies: + util: 0.12.5 + web3-core-helpers: 1.10.3 + web3-providers-http: 1.10.3 + web3-providers-ipc: 1.10.3 + web3-providers-ws: 1.10.3 + transitivePeerDependencies: + - encoding + - supports-color + + /web3-core-requestmanager@1.3.6: + resolution: {integrity: sha512-2rIaeuqeo7QN1Eex7aXP0ZqeteJEPWXYFS/M3r3LXMiV8R4STQBKE+//dnHJXoo2ctzEB5cgd+7NaJM8S3gPyA==} + engines: {node: '>=8.0.0'} + dependencies: + underscore: 1.12.1 + util: 0.12.5 + web3-core-helpers: 1.3.6 + web3-providers-http: 1.3.6 + web3-providers-ipc: 1.3.6 + web3-providers-ws: 1.3.6 + transitivePeerDependencies: + - supports-color + dev: false + + /web3-core-subscriptions@1.10.3: + resolution: {integrity: sha512-KW0Mc8sgn70WadZu7RjQ4H5sNDJ5Lx8JMI3BWos+f2rW0foegOCyWhRu33W1s6ntXnqeBUw5rRCXZRlA3z+HNA==} + engines: {node: '>=8.0.0'} + dependencies: + eventemitter3: 4.0.4 + web3-core-helpers: 1.10.3 + + /web3-core-subscriptions@1.3.6: + resolution: {integrity: sha512-wi9Z9X5X75OKvxAg42GGIf81ttbNR2TxzkAsp1g+nnp5K8mBwgZvXrIsDuj7Z7gx72Y45mWJADCWjk/2vqNu8g==} + engines: {node: '>=8.0.0'} + dependencies: + eventemitter3: 4.0.4 + underscore: 1.12.1 + web3-core-helpers: 1.3.6 + dev: false + + /web3-core@1.10.3: + resolution: {integrity: sha512-Vbk0/vUNZxJlz3RFjAhNNt7qTpX8yE3dn3uFxfX5OHbuon5u65YEOd3civ/aQNW745N0vGUlHFNxxmn+sG9DIw==} + engines: {node: '>=8.0.0'} + dependencies: + '@types/bn.js': 5.1.1 + '@types/node': 12.20.55 + bignumber.js: 9.1.2 + web3-core-helpers: 1.10.3 + web3-core-method: 1.10.3 + web3-core-requestmanager: 1.10.3 + web3-utils: 1.10.3 + transitivePeerDependencies: + - encoding + - supports-color + + /web3-core@1.3.6: + resolution: {integrity: sha512-gkLDM4T1Sc0T+HZIwxrNrwPg0IfWI0oABSglP2X5ZbBAYVUeEATA0o92LWV8BeF+okvKXLK1Fek/p6axwM/h3Q==} + engines: {node: '>=8.0.0'} + dependencies: + '@types/bn.js': 4.11.6 + '@types/node': 12.20.55 + bignumber.js: 9.1.2 + web3-core-helpers: 1.3.6 + web3-core-method: 1.3.6 + web3-core-requestmanager: 1.3.6 + web3-utils: 1.3.6 + transitivePeerDependencies: + - supports-color + dev: false + + /web3-core@4.3.1: + resolution: {integrity: sha512-xa3w5n/ESxp5HIbrwsYBhpAPx2KI5LprjRFEtRwP0GpqqhTcCSMMYoyItRqQQ+k9YnB0PoFpWJfJI6Qn5x8YUQ==} + engines: {node: '>=14', npm: '>=6.12.0'} + dependencies: + web3-errors: 1.1.4 + web3-eth-iban: 4.0.7 + web3-providers-http: 4.1.0 + web3-providers-ws: 4.0.7 + web3-types: 1.3.1 + web3-utils: 4.0.7 + web3-validator: 2.0.3 + optionalDependencies: + web3-providers-ipc: 4.0.7 + transitivePeerDependencies: + - bufferutil + - encoding + - utf-8-validate + dev: true + + /web3-errors@1.1.4: + resolution: {integrity: sha512-WahtszSqILez+83AxGecVroyZsMuuRT+KmQp4Si5P4Rnqbczno1k748PCrZTS1J4UCPmXMG2/Vt+0Bz2zwXkwQ==} + engines: {node: '>=14', npm: '>=6.12.0'} + dependencies: + web3-types: 1.3.1 + dev: true + + /web3-eth-abi@1.10.3: + resolution: {integrity: sha512-O8EvV67uhq0OiCMekqYsDtb6FzfYzMXT7VMHowF8HV6qLZXCGTdB/NH4nJrEh2mFtEwVdS6AmLFJAQd2kVyoMQ==} + engines: {node: '>=8.0.0'} + dependencies: + '@ethersproject/abi': 5.7.0 + web3-utils: 1.10.3 + + /web3-eth-abi@1.3.6: + resolution: {integrity: sha512-Or5cRnZu6WzgScpmbkvC6bfNxR26hqiKK4i8sMPFeTUABQcb/FU3pBj7huBLYbp9dH+P5W79D2MqwbWwjj9DoQ==} + engines: {node: '>=8.0.0'} + dependencies: + '@ethersproject/abi': 5.0.7 + underscore: 1.12.1 + web3-utils: 1.3.6 + dev: false + + /web3-eth-abi@4.1.4(typescript@5.0.4): + resolution: {integrity: sha512-YLOBVVxxxLYKXjaiwZjEWYEnkMmmrm0nswZsvzSsINy/UgbWbzfoiZU+zn4YNWIEhORhx1p37iS3u/dP6VyC2w==} + engines: {node: '>=14', npm: '>=6.12.0'} + dependencies: + abitype: 0.7.1(typescript@5.0.4) + web3-errors: 1.1.4 + web3-types: 1.3.1 + web3-utils: 4.0.7 + web3-validator: 2.0.3 + transitivePeerDependencies: + - typescript + - zod + dev: true + + /web3-eth-accounts@1.10.3: + resolution: {integrity: sha512-8MipGgwusDVgn7NwKOmpeo3gxzzd+SmwcWeBdpXknuyDiZSQy9tXe+E9LeFGrmys/8mLLYP79n3jSbiTyv+6pQ==} + engines: {node: '>=8.0.0'} + dependencies: + '@ethereumjs/common': 2.6.5 + '@ethereumjs/tx': 3.5.2 + '@ethereumjs/util': 8.1.0 + eth-lib: 0.2.8 + scrypt-js: 3.0.1 + uuid: 9.0.1 + web3-core: 1.10.3 + web3-core-helpers: 1.10.3 + web3-core-method: 1.10.3 + web3-utils: 1.10.3 + transitivePeerDependencies: + - encoding + - supports-color + + /web3-eth-accounts@1.3.6: + resolution: {integrity: sha512-Ilr0hG6ONbCdSlVKffasCmNwftD5HsNpwyQASevocIQwHdTlvlwO0tb3oGYuajbKOaDzNTwXfz25bttAEoFCGA==} + engines: {node: '>=8.0.0'} + dependencies: + crypto-browserify: 3.12.0 + eth-lib: 0.2.8 + ethereumjs-common: 1.5.2 + ethereumjs-tx: 2.1.2 + scrypt-js: 3.0.1 + underscore: 1.12.1 + uuid: 3.3.2 + web3-core: 1.3.6 + web3-core-helpers: 1.3.6 + web3-core-method: 1.3.6 + web3-utils: 1.3.6 + transitivePeerDependencies: + - supports-color + dev: false + + /web3-eth-accounts@4.1.0: + resolution: {integrity: sha512-UFtAsOANsvihTQ6SSvOKguupmQkResyR9M9JNuOxYpKh7+3W+sTnbLXw2UbOSYIsKlc1mpqqW9bVr1SjqHDpUQ==} + engines: {node: '>=14', npm: '>=6.12.0'} + dependencies: + '@ethereumjs/rlp': 4.0.1 + crc-32: 1.2.2 + ethereum-cryptography: 2.1.2 + web3-errors: 1.1.4 + web3-types: 1.3.1 + web3-utils: 4.0.7 + web3-validator: 2.0.3 + dev: true + + /web3-eth-contract@1.10.3: + resolution: {integrity: sha512-Y2CW61dCCyY4IoUMD4JsEQWrILX4FJWDWC/Txx/pr3K/+fGsBGvS9kWQN5EsVXOp4g7HoFOfVh9Lf7BmVVSRmg==} + engines: {node: '>=8.0.0'} + dependencies: + '@types/bn.js': 5.1.1 + web3-core: 1.10.3 + web3-core-helpers: 1.10.3 + web3-core-method: 1.10.3 + web3-core-promievent: 1.10.3 + web3-core-subscriptions: 1.10.3 + web3-eth-abi: 1.10.3 + web3-utils: 1.10.3 + transitivePeerDependencies: + - encoding + - supports-color + + /web3-eth-contract@1.3.6: + resolution: {integrity: sha512-8gDaRrLF2HCg+YEZN1ov0zN35vmtPnGf3h1DxmJQK5Wm2lRMLomz9rsWsuvig3UJMHqZAQKD7tOl3ocJocQsmA==} + engines: {node: '>=8.0.0'} + dependencies: + '@types/bn.js': 4.11.6 + underscore: 1.12.1 + web3-core: 1.3.6 + web3-core-helpers: 1.3.6 + web3-core-method: 1.3.6 + web3-core-promievent: 1.3.6 + web3-core-subscriptions: 1.3.6 + web3-eth-abi: 1.3.6 + web3-utils: 1.3.6 + transitivePeerDependencies: + - supports-color + dev: false + + /web3-eth-contract@4.1.3(typescript@5.0.4): + resolution: {integrity: sha512-F6e3eyetUDiNOb78EDVJtNOb0H1GPz3xAZH8edSfYdhaxI9tTutP2V3p++kh2ZJ/RrdE2+xil7H/nPLgHymBvg==} + engines: {node: '>=14', npm: '>=6.12.0'} + dependencies: + web3-core: 4.3.1 + web3-errors: 1.1.4 + web3-eth: 4.3.1(typescript@5.0.4) + web3-eth-abi: 4.1.4(typescript@5.0.4) + web3-types: 1.3.1 + web3-utils: 4.0.7 + web3-validator: 2.0.3 + transitivePeerDependencies: + - bufferutil + - encoding + - typescript + - utf-8-validate + - zod + dev: true + + /web3-eth-ens@1.10.3: + resolution: {integrity: sha512-hR+odRDXGqKemw1GFniKBEXpjYwLgttTES+bc7BfTeoUyUZXbyDHe5ifC+h+vpzxh4oS0TnfcIoarK0Z9tFSiQ==} + engines: {node: '>=8.0.0'} + dependencies: + content-hash: 2.5.2 + eth-ens-namehash: 2.0.8 + web3-core: 1.10.3 + web3-core-helpers: 1.10.3 + web3-core-promievent: 1.10.3 + web3-eth-abi: 1.10.3 + web3-eth-contract: 1.10.3 + web3-utils: 1.10.3 + transitivePeerDependencies: + - encoding + - supports-color + + /web3-eth-ens@1.3.6: + resolution: {integrity: sha512-n27HNj7lpSkRxTgSx+Zo7cmKAgyg2ElFilaFlUu/X2CNH23lXfcPm2bWssivH9z0ndhg0OyR4AYFZqPaqDHkJA==} + engines: {node: '>=8.0.0'} + dependencies: + content-hash: 2.5.2 + eth-ens-namehash: 2.0.8 + underscore: 1.12.1 + web3-core: 1.3.6 + web3-core-helpers: 1.3.6 + web3-core-promievent: 1.3.6 + web3-eth-abi: 1.3.6 + web3-eth-contract: 1.3.6 + web3-utils: 1.3.6 + transitivePeerDependencies: + - supports-color + dev: false + + /web3-eth-ens@4.0.8(typescript@5.0.4): + resolution: {integrity: sha512-nj0JfeD45BbzVJcVYpUJnSo8iwDcY9CQ7CZhhIVVOFjvpMAPw0zEwjTvZEIQyCW61OoDG9xcBzwxe2tZoYhMRw==} + engines: {node: '>=14', npm: '>=6.12.0'} + dependencies: + '@adraffy/ens-normalize': 1.9.4 + web3-core: 4.3.1 + web3-errors: 1.1.4 + web3-eth: 4.3.1(typescript@5.0.4) + web3-eth-contract: 4.1.3(typescript@5.0.4) + web3-net: 4.0.7 + web3-types: 1.3.1 + web3-utils: 4.0.7 + web3-validator: 2.0.3 + transitivePeerDependencies: + - bufferutil + - encoding + - typescript + - utf-8-validate + - zod + dev: true + + /web3-eth-iban@1.10.3: + resolution: {integrity: sha512-ZCfOjYKAjaX2TGI8uif5ah+J3BYFuo+47JOIV1RIz2l7kD9VfnxvRH5UiQDRyMALQC7KFd2hUqIEtHklapNyKA==} + engines: {node: '>=8.0.0'} + dependencies: + bn.js: 5.2.1 + web3-utils: 1.10.3 + + /web3-eth-iban@1.3.6: + resolution: {integrity: sha512-nfMQaaLA/zsg5W4Oy/EJQbs8rSs1vBAX6b/35xzjYoutXlpHMQadujDx2RerTKhSHqFXSJeQAfE+2f6mdhYkRQ==} + engines: {node: '>=8.0.0'} + dependencies: + bn.js: 4.12.0 + web3-utils: 1.3.6 + dev: false + + /web3-eth-iban@4.0.7: + resolution: {integrity: sha512-8weKLa9KuKRzibC87vNLdkinpUE30gn0IGY027F8doeJdcPUfsa4IlBgNC4k4HLBembBB2CTU0Kr/HAOqMeYVQ==} + engines: {node: '>=14', npm: '>=6.12.0'} + dependencies: + web3-errors: 1.1.4 + web3-types: 1.3.1 + web3-utils: 4.0.7 + web3-validator: 2.0.3 + dev: true + + /web3-eth-personal@1.10.3: + resolution: {integrity: sha512-avrQ6yWdADIvuNQcFZXmGLCEzulQa76hUOuVywN7O3cklB4nFc/Gp3yTvD3bOAaE7DhjLQfhUTCzXL7WMxVTsw==} + engines: {node: '>=8.0.0'} + dependencies: + '@types/node': 12.20.55 + web3-core: 1.10.3 + web3-core-helpers: 1.10.3 + web3-core-method: 1.10.3 + web3-net: 1.10.3 + web3-utils: 1.10.3 + transitivePeerDependencies: + - encoding + - supports-color + + /web3-eth-personal@1.3.6: + resolution: {integrity: sha512-pOHU0+/h1RFRYoh1ehYBehRbcKWP4OSzd4F7mDljhHngv6W8ewMHrAN8O1ol9uysN2MuCdRE19qkRg5eNgvzFQ==} + engines: {node: '>=8.0.0'} + dependencies: + '@types/node': 12.20.55 + web3-core: 1.3.6 + web3-core-helpers: 1.3.6 + web3-core-method: 1.3.6 + web3-net: 1.3.6 + web3-utils: 1.3.6 + transitivePeerDependencies: + - supports-color + dev: false + + /web3-eth-personal@4.0.8(typescript@5.0.4): + resolution: {integrity: sha512-sXeyLKJ7ddQdMxz1BZkAwImjqh7OmKxhXoBNF3isDmD4QDpMIwv/t237S3q4Z0sZQamPa/pHebJRWVuvP8jZdw==} + engines: {node: '>=14', npm: '>=6.12.0'} + dependencies: + web3-core: 4.3.1 + web3-eth: 4.3.1(typescript@5.0.4) + web3-rpc-methods: 1.1.3 + web3-types: 1.3.1 + web3-utils: 4.0.7 + web3-validator: 2.0.3 + transitivePeerDependencies: + - bufferutil + - encoding + - typescript + - utf-8-validate + - zod + dev: true + + /web3-eth@1.10.3: + resolution: {integrity: sha512-Uk1U2qGiif2mIG8iKu23/EQJ2ksB1BQXy3wF3RvFuyxt8Ft9OEpmGlO7wOtAyJdoKzD5vcul19bJpPcWSAYZhA==} + engines: {node: '>=8.0.0'} + dependencies: + web3-core: 1.10.3 + web3-core-helpers: 1.10.3 + web3-core-method: 1.10.3 + web3-core-subscriptions: 1.10.3 + web3-eth-abi: 1.10.3 + web3-eth-accounts: 1.10.3 + web3-eth-contract: 1.10.3 + web3-eth-ens: 1.10.3 + web3-eth-iban: 1.10.3 + web3-eth-personal: 1.10.3 + web3-net: 1.10.3 + web3-utils: 1.10.3 + transitivePeerDependencies: + - encoding + - supports-color + + /web3-eth@1.3.6: + resolution: {integrity: sha512-9+rnywRRpyX3C4hfsAQXPQh6vHh9XzQkgLxo3gyeXfbhbShUoq2gFVuy42vsRs//6JlsKdyZS7Z3hHPHz2wreA==} + engines: {node: '>=8.0.0'} + dependencies: + underscore: 1.12.1 + web3-core: 1.3.6 + web3-core-helpers: 1.3.6 + web3-core-method: 1.3.6 + web3-core-subscriptions: 1.3.6 + web3-eth-abi: 1.3.6 + web3-eth-accounts: 1.3.6 + web3-eth-contract: 1.3.6 + web3-eth-ens: 1.3.6 + web3-eth-iban: 1.3.6 + web3-eth-personal: 1.3.6 + web3-net: 1.3.6 + web3-utils: 1.3.6 + transitivePeerDependencies: + - supports-color + dev: false + + /web3-eth@4.3.1(typescript@5.0.4): + resolution: {integrity: sha512-zJir3GOXooHQT85JB8SrufE+Voo5TtXdjhf1D8IGXmxM8MrhI8AT+Pgt4siBTupJcu5hF17iGmTP/Nj2XnaibQ==} + engines: {node: '>=14', npm: '>=6.12.0'} + dependencies: + setimmediate: 1.0.5 + web3-core: 4.3.1 + web3-errors: 1.1.4 + web3-eth-abi: 4.1.4(typescript@5.0.4) + web3-eth-accounts: 4.1.0 + web3-net: 4.0.7 + web3-providers-ws: 4.0.7 + web3-rpc-methods: 1.1.3 + web3-types: 1.3.1 + web3-utils: 4.0.7 + web3-validator: 2.0.3 + transitivePeerDependencies: + - bufferutil + - encoding + - typescript + - utf-8-validate + - zod + dev: true + + /web3-net@1.10.3: + resolution: {integrity: sha512-IoSr33235qVoI1vtKssPUigJU9Fc/Ph0T9CgRi15sx+itysmvtlmXMNoyd6Xrgm9LuM4CIhxz7yDzH93B79IFg==} + engines: {node: '>=8.0.0'} + dependencies: + web3-core: 1.10.3 + web3-core-method: 1.10.3 + web3-utils: 1.10.3 + transitivePeerDependencies: + - encoding + - supports-color + + /web3-net@1.3.6: + resolution: {integrity: sha512-KhzU3wMQY/YYjyMiQzbaLPt2kut88Ncx2iqjy3nw28vRux3gVX0WOCk9EL/KVJBiAA/fK7VklTXvgy9dZnnipw==} + engines: {node: '>=8.0.0'} + dependencies: + web3-core: 1.3.6 + web3-core-method: 1.3.6 + web3-utils: 1.3.6 + transitivePeerDependencies: + - supports-color + dev: false + + /web3-net@4.0.7: + resolution: {integrity: sha512-SzEaXFrBjY25iQGk5myaOfO9ZyfTwQEa4l4Ps4HDNVMibgZji3WPzpjq8zomVHMwi8bRp6VV7YS71eEsX7zLow==} + engines: {node: '>=14', npm: '>=6.12.0'} + dependencies: + web3-core: 4.3.1 + web3-rpc-methods: 1.1.3 + web3-types: 1.3.1 + web3-utils: 4.0.7 + transitivePeerDependencies: + - bufferutil + - encoding + - utf-8-validate + dev: true + + /web3-providers-http@1.10.3: + resolution: {integrity: sha512-6dAgsHR3MxJ0Qyu3QLFlQEelTapVfWNTu5F45FYh8t7Y03T1/o+YAkVxsbY5AdmD+y5bXG/XPJ4q8tjL6MgZHw==} + engines: {node: '>=8.0.0'} + dependencies: + abortcontroller-polyfill: 1.7.5 + cross-fetch: 4.0.0 + es6-promise: 4.2.8 + web3-core-helpers: 1.10.3 + transitivePeerDependencies: + - encoding + + /web3-providers-http@1.3.6: + resolution: {integrity: sha512-OQkT32O1A06dISIdazpGLveZcOXhEo5cEX6QyiSQkiPk/cjzDrXMw4SKZOGQbbS1+0Vjizm1Hrp7O8Vp2D1M5Q==} + engines: {node: '>=8.0.0'} + dependencies: + web3-core-helpers: 1.3.6 + xhr2-cookies: 1.1.0 + dev: false + + /web3-providers-http@4.1.0: + resolution: {integrity: sha512-6qRUGAhJfVQM41E5t+re5IHYmb5hSaLc02BE2MaRQsz2xKA6RjmHpOA5h/+ojJxEpI9NI2CrfDKOAgtJfoUJQg==} + engines: {node: '>=14', npm: '>=6.12.0'} + dependencies: + cross-fetch: 4.0.0 + web3-errors: 1.1.4 + web3-types: 1.3.1 + web3-utils: 4.0.7 + transitivePeerDependencies: + - encoding + dev: true + + /web3-providers-ipc@1.10.3: + resolution: {integrity: sha512-vP5WIGT8FLnGRfswTxNs9rMfS1vCbMezj/zHbBe/zB9GauBRTYVrUo2H/hVrhLg8Ut7AbsKZ+tCJ4mAwpKi2hA==} + engines: {node: '>=8.0.0'} + dependencies: + oboe: 2.1.5 + web3-core-helpers: 1.10.3 + + /web3-providers-ipc@1.3.6: + resolution: {integrity: sha512-+TVsSd2sSVvVgHG4s6FXwwYPPT91boKKcRuEFXqEfAbUC5t52XOgmyc2LNiD9LzPhed65FbV4LqICpeYGUvSwA==} + engines: {node: '>=8.0.0'} + dependencies: + oboe: 2.1.5 + underscore: 1.12.1 + web3-core-helpers: 1.3.6 + dev: false + + /web3-providers-ipc@4.0.7: + resolution: {integrity: sha512-YbNqY4zUvIaK2MHr1lQFE53/8t/ejHtJchrWn9zVbFMGXlTsOAbNoIoZWROrg1v+hCBvT2c9z8xt7e/+uz5p1g==} + engines: {node: '>=14', npm: '>=6.12.0'} + requiresBuild: true + dependencies: + web3-errors: 1.1.4 + web3-types: 1.3.1 + web3-utils: 4.0.7 + dev: true + optional: true + + /web3-providers-ws@1.10.3: + resolution: {integrity: sha512-/filBXRl48INxsh6AuCcsy4v5ndnTZ/p6bl67kmO9aK1wffv7CT++DrtclDtVMeDGCgB3van+hEf9xTAVXur7Q==} + engines: {node: '>=8.0.0'} + dependencies: + eventemitter3: 4.0.4 + web3-core-helpers: 1.10.3 + websocket: 1.0.34 + transitivePeerDependencies: + - supports-color + + /web3-providers-ws@1.3.6: + resolution: {integrity: sha512-bk7MnJf5or0Re2zKyhR3L3CjGululLCHXx4vlbc/drnaTARUVvi559OI5uLytc/1k5HKUUyENAxLvetz2G1dnQ==} + engines: {node: '>=8.0.0'} + dependencies: + eventemitter3: 4.0.4 + underscore: 1.12.1 + web3-core-helpers: 1.3.6 + websocket: 1.0.34 + transitivePeerDependencies: + - supports-color + dev: false + + /web3-providers-ws@4.0.7: + resolution: {integrity: sha512-n4Dal9/rQWjS7d6LjyEPM2R458V8blRm0eLJupDEJOOIBhGYlxw5/4FthZZ/cqB7y/sLVi7K09DdYx2MeRtU5w==} + engines: {node: '>=14', npm: '>=6.12.0'} + dependencies: + '@types/ws': 8.5.3 + isomorphic-ws: 5.0.0(ws@8.13.0) + web3-errors: 1.1.4 + web3-types: 1.3.1 + web3-utils: 4.0.7 + ws: 8.13.0 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + dev: true + + /web3-rpc-methods@1.1.3: + resolution: {integrity: sha512-XB6SsCZZPdZUMPIRqDxJkZFKMu0/Y+yaExAt+Z7RqmuM7xF55fJ/Qb84LQho8zarvUoYziy4jnIfs+SXImxQUw==} + engines: {node: '>=14', npm: '>=6.12.0'} + dependencies: + web3-core: 4.3.1 + web3-types: 1.3.1 + web3-validator: 2.0.3 + transitivePeerDependencies: + - bufferutil + - encoding + - utf-8-validate + dev: true + + /web3-shh@1.10.3: + resolution: {integrity: sha512-cAZ60CPvs9azdwMSQ/PSUdyV4PEtaW5edAZhu3rCXf6XxQRliBboic+AvwUvB6j3eswY50VGa5FygfVmJ1JVng==} + engines: {node: '>=8.0.0'} + requiresBuild: true + dependencies: + web3-core: 1.10.3 + web3-core-method: 1.10.3 + web3-core-subscriptions: 1.10.3 + web3-net: 1.10.3 + transitivePeerDependencies: + - encoding + - supports-color + + /web3-shh@1.3.6: + resolution: {integrity: sha512-9zRo415O0iBslxBnmu9OzYjNErzLnzOsy+IOvSpIreLYbbAw0XkDWxv3SfcpKnTIWIACBR4AYMIxmmyi5iB3jw==} + engines: {node: '>=8.0.0'} + requiresBuild: true + dependencies: + web3-core: 1.3.6 + web3-core-method: 1.3.6 + web3-core-subscriptions: 1.3.6 + web3-net: 1.3.6 + transitivePeerDependencies: + - supports-color + dev: false + + /web3-types@1.3.1: + resolution: {integrity: sha512-8fXi7h/t95VKRtgU4sxprLPZpsTh3jYDfSghshIDBgUD/OoGe5S+syP24SUzBZYllZ/L+hMr2gdp/0bGJa8pYQ==} + engines: {node: '>=14', npm: '>=6.12.0'} + dev: true + + /web3-utils@1.10.3: + resolution: {integrity: sha512-OqcUrEE16fDBbGoQtZXWdavsPzbGIDc5v3VrRTZ0XrIpefC/viZ1ZU9bGEemazyS0catk/3rkOOxpzTfY+XsyQ==} + engines: {node: '>=8.0.0'} + dependencies: + '@ethereumjs/util': 8.1.0 + bn.js: 5.2.1 + ethereum-bloom-filters: 1.0.10 + ethereum-cryptography: 2.1.2 + ethjs-unit: 0.1.6 + number-to-bn: 1.7.0 + randombytes: 2.1.0 + utf8: 3.0.0 + + /web3-utils@1.2.9: + resolution: {integrity: sha512-9hcpuis3n/LxFzEVjwnVgvJzTirS2S9/MiNAa7l4WOEoywY+BSNwnRX4MuHnjkh9NY25B6QOjuNG6FNnSjTw1w==} + engines: {node: '>=8.0.0'} + dependencies: + bn.js: 4.11.8 + eth-lib: 0.2.7 + ethereum-bloom-filters: 1.0.10 + ethjs-unit: 0.1.6 + number-to-bn: 1.7.0 + randombytes: 2.1.0 + underscore: 1.9.1 + utf8: 3.0.0 + dev: false + + /web3-utils@1.3.0: + resolution: {integrity: sha512-2mS5axFCbkhicmoDRuJeuo0TVGQDgC2sPi/5dblfVC+PMtX0efrb8Xlttv/eGkq7X4E83Pds34FH98TP2WOUZA==} + engines: {node: '>=8.0.0'} + dependencies: + bn.js: 4.12.0 + eth-lib: 0.2.8 + ethereum-bloom-filters: 1.0.10 + ethjs-unit: 0.1.6 + number-to-bn: 1.7.0 + randombytes: 2.1.0 + underscore: 1.9.1 + utf8: 3.0.0 + dev: true + + /web3-utils@1.3.6: + resolution: {integrity: sha512-hHatFaQpkQgjGVER17gNx8u1qMyaXFZtM0y0XLGH1bzsjMPlkMPLRcYOrZ00rOPfTEuYFOdrpGOqZXVmGrMZRg==} + engines: {node: '>=8.0.0'} + dependencies: + bn.js: 4.12.0 + eth-lib: 0.2.8 + ethereum-bloom-filters: 1.0.10 + ethjs-unit: 0.1.6 + number-to-bn: 1.7.0 + randombytes: 2.1.0 + underscore: 1.12.1 + utf8: 3.0.0 + dev: false + + /web3-utils@4.0.7: + resolution: {integrity: sha512-sy8S6C2FIa5NNHc8DjND+Fx3S8KDAizuh5RbL1RX3h0PRbFgPfWzF5RfUns8gTt0mjJuOhs/IaDhrZfeTszG5A==} + engines: {node: '>=14', npm: '>=6.12.0'} + dependencies: + ethereum-cryptography: 2.1.2 + web3-errors: 1.1.4 + web3-types: 1.3.1 + web3-validator: 2.0.3 + dev: true + + /web3-validator@2.0.3: + resolution: {integrity: sha512-fJbAQh+9LSNWy+l5Ze6HABreml8fra98o5+vS073T35jUcLbRZ0IOjF/ZPJhJNbJDt+jP1vseZsc3z3uX9mxxQ==} + engines: {node: '>=14', npm: '>=6.12.0'} + dependencies: + ethereum-cryptography: 2.1.2 + util: 0.12.5 + web3-errors: 1.1.4 + web3-types: 1.3.1 + zod: 3.22.4 + dev: true + + /web3@0.20.0: + resolution: {integrity: sha512-S276pNYlSc7nmG8SQ2whmUbl+KSxIdN7akW2JYdUEpp8eR29/sq5lYM3BH4fU/8lyvc57ss62PV2wfRKRsWf5A==} + dependencies: + bignumber.js: github.com/frozeman/bignumber.js-nolookahead/57692b3ecfc98bbdd6b3a516cb2353652ea49934 + crypto-js: 3.3.0 + utf8: 2.1.2 + xhr2: 0.2.1 + xmlhttprequest: 1.8.0 + dev: true + + /web3@0.20.6: + resolution: {integrity: sha512-diON1+Y8sPQ33htuTMZfyo+qlsmCBSYwi+MVTRneS8anqZUaTrGaBkTpPkPUvfX1X+NK+Y2spLaaei3HfXeSuw==} + dependencies: + bignumber.js: github.com/frozeman/bignumber.js-nolookahead/57692b3ecfc98bbdd6b3a516cb2353652ea49934 + crypto-js: 3.3.0 + utf8: 2.1.2 + xhr2: 0.2.1 + xmlhttprequest: 1.8.0 + dev: false + + /web3@1.10.3: + resolution: {integrity: sha512-DgUdOOqC/gTqW+VQl1EdPxrVRPB66xVNtuZ5KD4adVBtko87hkgM8BTZ0lZ8IbUfnQk6DyjcDujMiH3oszllAw==} + engines: {node: '>=8.0.0'} + requiresBuild: true + dependencies: + web3-bzz: 1.10.3 + web3-core: 1.10.3 + web3-eth: 1.10.3 + web3-eth-personal: 1.10.3 + web3-net: 1.10.3 + web3-shh: 1.10.3 + web3-utils: 1.10.3 + transitivePeerDependencies: + - bufferutil + - encoding + - supports-color + - utf-8-validate + + /web3@1.3.6: + resolution: {integrity: sha512-jEpPhnL6GDteifdVh7ulzlPrtVQeA30V9vnki9liYlUvLV82ZM7BNOQJiuzlDePuE+jZETZSP/0G/JlUVt6pOA==} + engines: {node: '>=8.0.0'} + requiresBuild: true + dependencies: + web3-bzz: 1.3.6 + web3-core: 1.3.6 + web3-eth: 1.3.6 + web3-eth-personal: 1.3.6 + web3-net: 1.3.6 + web3-shh: 1.3.6 + web3-utils: 1.3.6 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: false + + /web3@4.2.2(typescript@5.0.4): + resolution: {integrity: sha512-im7weoHY7TW87nhFk10ysupZnsDJEO/xDpz985AgrTd/7KxExlzjjKd+4nue0WskUF0th0mgoMs1YaA8xUjCjw==} + engines: {node: '>=14.0.0', npm: '>=6.12.0'} + dependencies: + web3-core: 4.3.1 + web3-errors: 1.1.4 + web3-eth: 4.3.1(typescript@5.0.4) + web3-eth-abi: 4.1.4(typescript@5.0.4) + web3-eth-accounts: 4.1.0 + web3-eth-contract: 4.1.3(typescript@5.0.4) + web3-eth-ens: 4.0.8(typescript@5.0.4) + web3-eth-iban: 4.0.7 + web3-eth-personal: 4.0.8(typescript@5.0.4) + web3-net: 4.0.7 + web3-providers-http: 4.1.0 + web3-providers-ws: 4.0.7 + web3-rpc-methods: 1.1.3 + web3-types: 1.3.1 + web3-utils: 4.0.7 + web3-validator: 2.0.3 + transitivePeerDependencies: + - bufferutil + - encoding + - typescript + - utf-8-validate + - zod + dev: true + + /webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + + /websocket@1.0.34: + resolution: {integrity: sha512-PRDso2sGwF6kM75QykIesBijKSVceR6jL2G8NGYyq2XrItNC2P5/qL5XeR056GhA+Ly7JMFvJb9I312mJfmqnQ==} + engines: {node: '>=4.0.0'} + dependencies: + bufferutil: 4.0.8 + debug: 2.6.9 + es5-ext: 0.10.62 + typedarray-to-buffer: 3.1.5 + utf-8-validate: 5.0.10 + yaeti: 0.0.6 + transitivePeerDependencies: + - supports-color + + /whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + + /which-boxed-primitive@1.0.2: + resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} + dependencies: + is-bigint: 1.0.4 + is-boolean-object: 1.1.2 + is-number-object: 1.0.7 + is-string: 1.0.7 + is-symbol: 1.0.4 + dev: true + + /which-module@2.0.1: + resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==} + dev: true + + /which-pm@2.0.0: + resolution: {integrity: sha512-Lhs9Pmyph0p5n5Z3mVnN0yWcbQYUAD7rbQUiMsQxOJ3T57k7RFe35SUwWMf7dsbDZks1uOmw4AecB/JMDj3v/w==} + engines: {node: '>=8.15'} + dependencies: + load-yaml-file: 0.2.0 + path-exists: 4.0.0 + dev: true + + /which-typed-array@1.1.11: + resolution: {integrity: sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==} + engines: {node: '>= 0.4'} + dependencies: + available-typed-arrays: 1.0.5 + call-bind: 1.0.2 + for-each: 0.3.3 + gopd: 1.0.1 + has-tostringtag: 1.0.0 + + /which@1.3.1: + resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} + hasBin: true + dependencies: + isexe: 2.0.0 + dev: true + + /which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + dependencies: + isexe: 2.0.0 + + /wide-align@1.1.3: + resolution: {integrity: sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==} + dependencies: + string-width: 2.1.1 + dev: true + + /widest-line@3.1.0: + resolution: {integrity: sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==} + engines: {node: '>=8'} + dependencies: + string-width: 4.2.3 + dev: false + + /word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + dev: true + + /wordwrap@1.0.0: + resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} + dev: true + + /wordwrapjs@4.0.1: + resolution: {integrity: sha512-kKlNACbvHrkpIw6oPeYDSmdCTu2hdMHoyXLTcUKala++lx5Y+wjJ/e474Jqv5abnVmwxw08DiTuHmw69lJGksA==} + engines: {node: '>=8.0.0'} + dependencies: + reduce-flatten: 2.0.0 + typical: 5.2.0 + dev: true + + /workerpool@6.2.1: + resolution: {integrity: sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==} + + /wrap-ansi@5.1.0: + resolution: {integrity: sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==} + engines: {node: '>=6'} + dependencies: + ansi-styles: 3.2.1 + string-width: 3.1.0 + strip-ansi: 5.2.0 + dev: true + + /wrap-ansi@6.2.0: + resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} + engines: {node: '>=8'} + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + dev: true + + /wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + /wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + /write-file-atomic@3.0.3: + resolution: {integrity: sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==} + dependencies: + imurmurhash: 0.1.4 + is-typedarray: 1.0.0 + signal-exit: 3.0.7 + typedarray-to-buffer: 3.1.5 + dev: true + + /ws@3.3.3: + resolution: {integrity: sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + dependencies: + async-limiter: 1.0.1 + safe-buffer: 5.1.2 + ultron: 1.1.1 + + /ws@7.4.6: + resolution: {integrity: sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==} + engines: {node: '>=8.3.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + /ws@8.13.0: + resolution: {integrity: sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + dev: true + + /ws@8.5.0: + resolution: {integrity: sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + /xhr-request-promise@0.1.3: + resolution: {integrity: sha512-YUBytBsuwgitWtdRzXDDkWAXzhdGB8bYm0sSzMPZT7Z2MBjMSTHFsyCT1yCRATY+XC69DUrQraRAEgcoCRaIPg==} + dependencies: + xhr-request: 1.1.0 + + /xhr-request@1.1.0: + resolution: {integrity: sha512-Y7qzEaR3FDtL3fP30k9wO/e+FBnBByZeybKOhASsGP30NIkRAAkKD/sCnLvgEfAIEC1rcmK7YG8f4oEnIrrWzA==} + dependencies: + buffer-to-arraybuffer: 0.0.5 + object-assign: 4.1.1 + query-string: 5.1.1 + simple-get: 2.8.2 + timed-out: 4.0.1 + url-set-query: 1.0.0 + xhr: 2.6.0 + + /xhr2-cookies@1.1.0: + resolution: {integrity: sha512-hjXUA6q+jl/bd8ADHcVfFsSPIf+tyLIjuO9TwJC9WI6JP2zKcS7C+p56I9kCLLsaCiNT035iYvEUUzdEFj/8+g==} + dependencies: + cookiejar: 2.1.4 + dev: false + + /xhr2@0.2.1: + resolution: {integrity: sha512-sID0rrVCqkVNUn8t6xuv9+6FViXjUVXq8H5rWOH2rz9fDNQEd4g0EA2XlcEdJXRz5BMEn4O1pJFdT+z4YHhoWw==} + engines: {node: '>= 6'} + + /xhr@2.6.0: + resolution: {integrity: sha512-/eCGLb5rxjx5e3mF1A7s+pLlR6CGyqWN91fv1JgER5mVWg1MZmlhBvy9kjcsOdRk8RrIujotWyJamfyrp+WIcA==} + dependencies: + global: 4.4.0 + is-function: 1.0.2 + parse-headers: 2.0.5 + xtend: 4.0.2 + + /xmlhttprequest@1.8.0: + resolution: {integrity: sha512-58Im/U0mlVBLM38NdZjHyhuMtCqa61469k2YP/AaPbvCoV9aQGUpbJBj1QRm2ytRiVQBD/fsw7L2bJGDVQswBA==} + engines: {node: '>=0.4.0'} + + /xtend@4.0.2: + resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} + engines: {node: '>=0.4'} + + /y18n@4.0.3: + resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} + dev: true + + /y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + /yaeti@0.0.6: + resolution: {integrity: sha512-MvQa//+KcZCUkBTIC9blM+CU9J2GzuTytsOUwf2lidtvkx/6gnEp1QvJv34t9vdjhFmha/mUiNDbN0D0mJWdug==} + engines: {node: '>=0.10.32'} + + /yallist@2.1.2: + resolution: {integrity: sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==} + dev: true + + /yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + + /yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + + /yargs-parser@13.1.2: + resolution: {integrity: sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==} + dependencies: + camelcase: 5.3.1 + decamelize: 1.2.0 + dev: true + + /yargs-parser@18.1.3: + resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==} + engines: {node: '>=6'} + dependencies: + camelcase: 5.3.1 + decamelize: 1.2.0 + dev: true + + /yargs-parser@20.2.4: + resolution: {integrity: sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==} + engines: {node: '>=10'} + + /yargs-parser@20.2.9: + resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} + engines: {node: '>=10'} + + /yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + dev: true + + /yargs-unparser@1.6.0: + resolution: {integrity: sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw==} + engines: {node: '>=6'} + dependencies: + flat: 4.1.1 + lodash: 4.17.21 + yargs: 13.3.2 + dev: true + + /yargs-unparser@2.0.0: + resolution: {integrity: sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==} + engines: {node: '>=10'} + dependencies: + camelcase: 6.3.0 + decamelize: 4.0.0 + flat: 5.0.2 + is-plain-obj: 2.1.0 + + /yargs@13.3.2: + resolution: {integrity: sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==} + dependencies: + cliui: 5.0.0 + find-up: 3.0.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + require-main-filename: 2.0.0 + set-blocking: 2.0.0 + string-width: 3.1.0 + which-module: 2.0.1 + y18n: 4.0.3 + yargs-parser: 13.1.2 + dev: true + + /yargs@15.4.1: + resolution: {integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==} + engines: {node: '>=8'} + dependencies: + cliui: 6.0.0 + decamelize: 1.2.0 + find-up: 4.1.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + require-main-filename: 2.0.0 + set-blocking: 2.0.0 + string-width: 4.2.3 + which-module: 2.0.1 + y18n: 4.0.3 + yargs-parser: 18.1.3 + dev: true + + /yargs@16.2.0: + resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} + engines: {node: '>=10'} + dependencies: + cliui: 7.0.4 + escalade: 3.1.1 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 20.2.9 + + /yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + dependencies: + cliui: 8.0.1 + escalade: 3.1.1 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + dev: true + + /yn@3.1.1: + resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} + engines: {node: '>=6'} + dev: true + + /yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + + /zod@3.22.4: + resolution: {integrity: sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==} + dev: true + + github.com/frozeman/bignumber.js-nolookahead/57692b3ecfc98bbdd6b3a516cb2353652ea49934: + resolution: {tarball: https://codeload.github.com/frozeman/bignumber.js-nolookahead/tar.gz/57692b3ecfc98bbdd6b3a516cb2353652ea49934} + name: bignumber.js + version: 2.0.7 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml new file mode 100644 index 00000000000..dee51e928d8 --- /dev/null +++ b/pnpm-workspace.yaml @@ -0,0 +1,2 @@ +packages: + - "packages/*" diff --git a/scripts/check-dependencies.js b/scripts/check-dependencies.js index a9012784e58..a5819789159 100644 --- a/scripts/check-dependencies.js +++ b/scripts/check-dependencies.js @@ -14,16 +14,8 @@ const IGNORE_SAME_VERSION_FOR_PACKAGES = { "@nomiclabs/hardhat-truffle5", ], ethers: ["@nomicfoundation/hardhat-verify"], - ["@types/node"]: ["docs"], - ["@typescript-eslint/eslint-plugin"]: ["docs"], - ["@typescript-eslint/parser"]: ["docs"], - eslint: ["docs"], - ["eslint-config-prettier"]: ["docs"], - ["eslint-plugin-prettier"]: ["docs"], - ["glob"]: ["docs"], - ["undici"]: ["docs"], - ["ts-node"]: ["docs", "hardhat"], - ["typescript"]: ["docs", "hardhat"], + ["ts-node"]: ["hardhat"], + ["typescript"]: ["hardhat"], }; const IGNORE_PEER_DEPENDENCIES_CHECK_FOR_PACKAGES = { @@ -64,10 +56,20 @@ function checkPeerDepedencies(packageJson) { continue; } - if ( - packageJson.peerDependencies[dependency] !== - packageJson.devDependencies[dependency] - ) { + const peerDep = packageJson.peerDependencies[dependency]; + if (peerDep.startsWith("workspace:")) { + console.error( + `${packageJson.name} uses the workspace protocol for ${dependency}, which is a peer dependency` + ); + + success = false; + } + + const devDep = packageJson.devDependencies[dependency].replace( + /^workspace:/, + "" + ); + if (peerDep !== devDep) { console.error( `${packageJson.name} has different versions of ${dependency} as peerDependency and devDependency` ); @@ -84,7 +86,8 @@ function addDependencies(packageName, dependenciesToAdd, allDependenciesMap) { return; } - for (const [name, spec] of Object.entries(dependenciesToAdd)) { + for (const [name, specWithWorspace] of Object.entries(dependenciesToAdd)) { + const spec = specWithWorspace.replace(/^workspace:/, ""); if (IGNORE_SAME_VERSION_FROM_ALL.includes(name)) { continue; } @@ -147,12 +150,12 @@ function mergeDependenciesMap(dependencyMaps) { function getAllPackageJsonPaths() { const packageNames = fs.readdirSync(path.join(__dirname, "..", "packages")); - const packageJsons = packageNames.map((p) => - path.join(__dirname, "..", "packages", p, "package.json") - ); + const packageJsons = packageNames + // ignore hh-etherscan and hh-waffle because they only have a readme + .filter((p) => !["hardhat-etherscan", "hardhat-waffle"].includes(p)) + .map((p) => path.join(__dirname, "..", "packages", p, "package.json")); packageJsons.push(path.join(__dirname, "..", "package.json")); - packageJsons.push(path.join(__dirname, "..", "docs", "package.json")); return packageJsons; } @@ -168,8 +171,11 @@ function main() { const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, "utf-8")); - // temporarily ignore hardhat-toolbox - if (packageJson.name === "@nomicfoundation/hardhat-toolbox") { + // temporarily ignore hardhat toolboxs + if ( + packageJson.name === "@nomicfoundation/hardhat-toolbox" || + packageJson.name === "@nomicfoundation/hardhat-toolbox-viem" + ) { continue; } diff --git a/scripts/run-tests-with-custom-solc.sh b/scripts/run-tests-with-custom-solc.sh index 7497d6f0938..3a1c6801409 100755 --- a/scripts/run-tests-with-custom-solc.sh +++ b/scripts/run-tests-with-custom-solc.sh @@ -11,8 +11,8 @@ fi cd "$(git rev-parse --show-toplevel)" # install dependencies -yarn +pnpm install # run hardhat tests cd packages/hardhat-core -yarn test +pnpm test diff --git a/scripts/run-tests.js b/scripts/run-tests.js index ed6aa380964..c9cf5ea8040 100644 --- a/scripts/run-tests.js +++ b/scripts/run-tests.js @@ -13,7 +13,7 @@ const isGithubActions = process.env.GITHUB_WORKFLOW !== undefined; const isLinux = os.type() === "Linux"; const isWindows = os.type() === "Windows_NT"; -shell.exec("yarn build"); +shell.exec("pnpm build"); // ** check for packages to be ignored ** // @@ -23,7 +23,7 @@ const shouldIgnoreSolppTests = isWindows; const ignoredPackagesList = []; if (shouldIgnoreSolppTests) { - ignoredPackagesList.push("--exclude @nomiclabs/hardhat-solpp"); + ignoredPackagesList.push("--filter=!@nomiclabs/hardhat-solpp"); } const ignoredPackages = ignoredPackagesList.join(" "); @@ -32,8 +32,8 @@ function runTests() { console.time("Total test time"); try { - const fastExit = process.env.NO_FAST_EXIT ? "" : "--fast-exit"; - const command = `yarn wsrun --serial ${fastExit} --exclude-missing ${ignoredPackages} test`; + const fastExit = process.env.NO_FAST_EXIT ? "--no-bail" : "--bail"; + const command = `pnpm run --recursive --workspace-concurrency 1 ${fastExit} ${ignoredPackages} test`; shell.exec(command); } finally { diff --git a/yarn.lock b/yarn.lock index 8f15159e611..fc992d90e85 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4,41 +4,41 @@ "@ampproject/remapping@^2.2.0": version "2.2.1" - resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.1.tgz#99e8e11851128b8702cd57c33684f1d0f260b630" + resolved "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz" integrity sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg== dependencies: "@jridgewell/gen-mapping" "^0.3.0" "@jridgewell/trace-mapping" "^0.3.9" -"@babel/code-frame@7.12.11": +"@babel/code-frame@^7.0.0", "@babel/code-frame@7.12.11": version "7.12.11" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.11.tgz#f4ad435aa263db935b8f10f2c552d23fb716a63f" + resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz" integrity sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw== dependencies: "@babel/highlight" "^7.10.4" -"@babel/code-frame@^7.0.0": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.18.6.tgz#3b25d38c89600baa2dcc219edfa88a74eb2c427a" - integrity sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q== +"@babel/code-frame@^7.18.6": + version "7.21.4" + resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.21.4.tgz" + integrity sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g== dependencies: "@babel/highlight" "^7.18.6" -"@babel/code-frame@^7.18.6", "@babel/code-frame@^7.21.4": +"@babel/code-frame@^7.21.4": version "7.21.4" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.21.4.tgz#d0fa9e4413aca81f2b23b9442797bda1826edb39" + resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.21.4.tgz" integrity sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g== dependencies: "@babel/highlight" "^7.18.6" "@babel/compat-data@^7.21.4": version "7.21.4" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.21.4.tgz#457ffe647c480dff59c2be092fc3acf71195c87f" + resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.21.4.tgz" integrity sha512-/DYyDpeCfaVinT40FPGdkkb+lYSKvsVuMjDAG7jPOWWiM1ibOaB9CXJAlc4d1QpP/U2q2P9jbrSlClKSErd55g== -"@babel/core@^7.7.5": +"@babel/core@^7.0.0", "@babel/core@^7.7.5": version "7.21.4" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.21.4.tgz#c6dc73242507b8e2a27fd13a9c1814f9fa34a659" + resolved "https://registry.npmjs.org/@babel/core/-/core-7.21.4.tgz" integrity sha512-qt/YV149Jman/6AfmlxJ04LMIu8bMoyl3RB91yTFrxQmgbrSvQMy7cI8Q62FHx1t8wJ8B5fu0UDoLwHAhUo1QA== dependencies: "@ampproject/remapping" "^2.2.0" @@ -59,7 +59,7 @@ "@babel/generator@^7.21.4": version "7.21.4" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.21.4.tgz#64a94b7448989f421f919d5239ef553b37bb26bc" + resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.21.4.tgz" integrity sha512-NieM3pVIYW2SwGzKoqfPrQsf4xGs9M9AIG3ThppsSRmO+m7eQhmI6amajKMUeIO37wFfsvnvcxQFx6x6iqxDnA== dependencies: "@babel/types" "^7.21.4" @@ -69,7 +69,7 @@ "@babel/helper-compilation-targets@^7.21.4": version "7.21.4" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.21.4.tgz#770cd1ce0889097ceacb99418ee6934ef0572656" + resolved "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.21.4.tgz" integrity sha512-Fa0tTuOXZ1iL8IeDFUWCzjZcn+sJGd9RZdH9esYVjEejGmzf+FFYQpMi/kZUk2kPy/q1H3/GPw7np8qar/stfg== dependencies: "@babel/compat-data" "^7.21.4" @@ -80,12 +80,12 @@ "@babel/helper-environment-visitor@^7.18.9": version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz#0c0cee9b35d2ca190478756865bb3528422f51be" + resolved "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz" integrity sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg== "@babel/helper-function-name@^7.21.0": version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz#d552829b10ea9f120969304023cd0645fa00b1b4" + resolved "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz" integrity sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg== dependencies: "@babel/template" "^7.20.7" @@ -93,21 +93,21 @@ "@babel/helper-hoist-variables@^7.18.6": version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz#d4d2c8fb4baeaa5c68b99cc8245c56554f926678" + resolved "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz" integrity sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q== dependencies: "@babel/types" "^7.18.6" "@babel/helper-module-imports@^7.18.6": version "7.21.4" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.21.4.tgz#ac88b2f76093637489e718a90cec6cf8a9b029af" + resolved "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.21.4.tgz" integrity sha512-orajc5T2PsRYUN3ZryCEFeMDYwyw09c/pZeaQEZPH0MpKzSvn3e0uXsDBu3k03VI+9DBiRo+l22BfKTpKwa/Wg== dependencies: "@babel/types" "^7.21.4" "@babel/helper-module-transforms@^7.21.2": version "7.21.2" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.21.2.tgz#160caafa4978ac8c00ac66636cb0fa37b024e2d2" + resolved "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.21.2.tgz" integrity sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ== dependencies: "@babel/helper-environment-visitor" "^7.18.9" @@ -121,36 +121,36 @@ "@babel/helper-simple-access@^7.20.2": version "7.20.2" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz#0ab452687fe0c2cfb1e2b9e0015de07fc2d62dd9" + resolved "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz" integrity sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA== dependencies: "@babel/types" "^7.20.2" "@babel/helper-split-export-declaration@^7.18.6": version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz#7367949bc75b20c6d5a5d4a97bba2824ae8ef075" + resolved "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz" integrity sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA== dependencies: "@babel/types" "^7.18.6" "@babel/helper-string-parser@^7.19.4": version "7.19.4" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz#38d3acb654b4701a9b77fb0615a96f775c3a9e63" + resolved "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz" integrity sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw== "@babel/helper-validator-identifier@^7.18.6", "@babel/helper-validator-identifier@^7.19.1": version "7.19.1" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz#7eea834cf32901ffdc1a7ee555e2f9c27e249ca2" + resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz" integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w== "@babel/helper-validator-option@^7.21.0": version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz#8224c7e13ace4bafdc4004da2cf064ef42673180" + resolved "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz" integrity sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ== "@babel/helpers@^7.21.0": version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.21.0.tgz#9dd184fb5599862037917cdc9eecb84577dc4e7e" + resolved "https://registry.npmjs.org/@babel/helpers/-/helpers-7.21.0.tgz" integrity sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA== dependencies: "@babel/template" "^7.20.7" @@ -159,7 +159,7 @@ "@babel/highlight@^7.10.4", "@babel/highlight@^7.18.6": version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.18.6.tgz#81158601e93e2563795adcbfbdf5d64be3f2ecdf" + resolved "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz" integrity sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g== dependencies: "@babel/helper-validator-identifier" "^7.18.6" @@ -168,19 +168,19 @@ "@babel/parser@^7.20.7", "@babel/parser@^7.21.4": version "7.21.4" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.21.4.tgz#94003fdfc520bbe2875d4ae557b43ddb6d880f17" + resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.21.4.tgz" integrity sha512-alVJj7k7zIxqBZ7BTRhz0IqJFxW1VJbm6N8JbcYhQ186df9ZBPbZBmWSqAMXwHGsCJdYks7z/voa3ibiS5bCIw== "@babel/runtime@^7.20.1", "@babel/runtime@^7.4.4", "@babel/runtime@^7.5.5": version "7.20.13" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.20.13.tgz#7055ab8a7cff2b8f6058bf6ae45ff84ad2aded4b" + resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.13.tgz" integrity sha512-gt3PKXs0DBoL9xCvOIIZ2NEqAGZqHjAnmVbfQtB620V0uReIQutpel14KcneZuer7UioY8ALKZ7iocavvzTNFA== dependencies: regenerator-runtime "^0.13.11" "@babel/template@^7.20.7": version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.20.7.tgz#a15090c2839a83b02aa996c0b4994005841fd5a8" + resolved "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz" integrity sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw== dependencies: "@babel/code-frame" "^7.18.6" @@ -189,7 +189,7 @@ "@babel/traverse@^7.21.0", "@babel/traverse@^7.21.2", "@babel/traverse@^7.21.4": version "7.21.4" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.21.4.tgz#a836aca7b116634e97a6ed99976236b3282c9d36" + resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.4.tgz" integrity sha512-eyKrRHKdyZxqDm+fV1iqL9UAHMoIg0nDaGqfIOd8rKH17m5snv7Gn4qgjBoFfLz9APvjFU/ICT00NVCv1Epp8Q== dependencies: "@babel/code-frame" "^7.21.4" @@ -205,7 +205,7 @@ "@babel/types@^7.18.6", "@babel/types@^7.20.2", "@babel/types@^7.20.7", "@babel/types@^7.21.0", "@babel/types@^7.21.2", "@babel/types@^7.21.4": version "7.21.4" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.21.4.tgz#2d5d6bb7908699b3b416409ffd3b5daa25b030d4" + resolved "https://registry.npmjs.org/@babel/types/-/types-7.21.4.tgz" integrity sha512-rU2oY501qDxE8Pyo7i/Orqma4ziCOrby0/9mvbDUGEfvZjb279Nk9k19e2fiCxHbRRpY2ZyrgW1eq22mvmOIzA== dependencies: "@babel/helper-string-parser" "^7.19.4" @@ -214,26 +214,26 @@ "@chainsafe/as-sha256@^0.3.1": version "0.3.1" - resolved "https://registry.yarnpkg.com/@chainsafe/as-sha256/-/as-sha256-0.3.1.tgz#3639df0e1435cab03f4d9870cc3ac079e57a6fc9" + resolved "https://registry.npmjs.org/@chainsafe/as-sha256/-/as-sha256-0.3.1.tgz" integrity sha512-hldFFYuf49ed7DAakWVXSJODuq3pzJEguD8tQ7h+sGkM18vja+OFoJI9krnGmgzyuZC2ETX0NOIcCTy31v2Mtg== "@chainsafe/persistent-merkle-tree@^0.4.2": version "0.4.2" - resolved "https://registry.yarnpkg.com/@chainsafe/persistent-merkle-tree/-/persistent-merkle-tree-0.4.2.tgz#4c9ee80cc57cd3be7208d98c40014ad38f36f7ff" + resolved "https://registry.npmjs.org/@chainsafe/persistent-merkle-tree/-/persistent-merkle-tree-0.4.2.tgz" integrity sha512-lLO3ihKPngXLTus/L7WHKaw9PnNJWizlOF1H9NNzHP6Xvh82vzg9F2bzkXhYIFshMZ2gTCEz8tq6STe7r5NDfQ== dependencies: "@chainsafe/as-sha256" "^0.3.1" "@chainsafe/persistent-merkle-tree@^0.5.0": version "0.5.0" - resolved "https://registry.yarnpkg.com/@chainsafe/persistent-merkle-tree/-/persistent-merkle-tree-0.5.0.tgz#2b4a62c9489a5739dedd197250d8d2f5427e9f63" + resolved "https://registry.npmjs.org/@chainsafe/persistent-merkle-tree/-/persistent-merkle-tree-0.5.0.tgz" integrity sha512-l0V1b5clxA3iwQLXP40zYjyZYospQLZXzBVIhhr9kDg/1qHZfzzHw0jj4VPBijfYCArZDlPkRi1wZaV2POKeuw== dependencies: "@chainsafe/as-sha256" "^0.3.1" "@chainsafe/ssz@^0.10.0": version "0.10.2" - resolved "https://registry.yarnpkg.com/@chainsafe/ssz/-/ssz-0.10.2.tgz#c782929e1bb25fec66ba72e75934b31fd087579e" + resolved "https://registry.npmjs.org/@chainsafe/ssz/-/ssz-0.10.2.tgz" integrity sha512-/NL3Lh8K+0q7A3LsiFq09YXS9fPE+ead2rr7vM2QK8PLzrNsw3uqrif9bpRX5UxgeRjM+vYi+boCM3+GM4ovXg== dependencies: "@chainsafe/as-sha256" "^0.3.1" @@ -241,7 +241,7 @@ "@chainsafe/ssz@^0.9.2": version "0.9.4" - resolved "https://registry.yarnpkg.com/@chainsafe/ssz/-/ssz-0.9.4.tgz#696a8db46d6975b600f8309ad3a12f7c0e310497" + resolved "https://registry.npmjs.org/@chainsafe/ssz/-/ssz-0.9.4.tgz" integrity sha512-77Qtg2N1ayqs4Bg/wvnWfg5Bta7iy7IRh8XqXh7oNMeP2HBbBwx8m6yTpA8p0EHItWPEBkgZd5S5/LSlp3GXuQ== dependencies: "@chainsafe/as-sha256" "^0.3.1" @@ -250,7 +250,7 @@ "@changesets/apply-release-plan@^6.1.3": version "6.1.3" - resolved "https://registry.yarnpkg.com/@changesets/apply-release-plan/-/apply-release-plan-6.1.3.tgz#3bcc0bd57ba00d50d20df7d0141f1a9b2134eaf7" + resolved "https://registry.npmjs.org/@changesets/apply-release-plan/-/apply-release-plan-6.1.3.tgz" integrity sha512-ECDNeoc3nfeAe1jqJb5aFQX7CqzQhD2klXRez2JDb/aVpGUbX673HgKrnrgJRuQR/9f2TtLoYIzrGB9qwD77mg== dependencies: "@babel/runtime" "^7.20.1" @@ -269,7 +269,7 @@ "@changesets/assemble-release-plan@^5.2.3": version "5.2.3" - resolved "https://registry.yarnpkg.com/@changesets/assemble-release-plan/-/assemble-release-plan-5.2.3.tgz#5ce6191c6e193d40b566a7b0e01690cfb106f4db" + resolved "https://registry.npmjs.org/@changesets/assemble-release-plan/-/assemble-release-plan-5.2.3.tgz" integrity sha512-g7EVZCmnWz3zMBAdrcKhid4hkHT+Ft1n0mLussFMcB1dE2zCuwcvGoy9ec3yOgPGF4hoMtgHaMIk3T3TBdvU9g== dependencies: "@babel/runtime" "^7.20.1" @@ -281,14 +281,14 @@ "@changesets/changelog-git@^0.1.14": version "0.1.14" - resolved "https://registry.yarnpkg.com/@changesets/changelog-git/-/changelog-git-0.1.14.tgz#852caa7727dcf91497c131d05bc2cd6248532ada" + resolved "https://registry.npmjs.org/@changesets/changelog-git/-/changelog-git-0.1.14.tgz" integrity sha512-+vRfnKtXVWsDDxGctOfzJsPhaCdXRYoe+KyWYoq5X/GqoISREiat0l3L8B0a453B2B4dfHGcZaGyowHbp9BSaA== dependencies: "@changesets/types" "^5.2.1" "@changesets/cli@^2.16.0": version "2.26.0" - resolved "https://registry.yarnpkg.com/@changesets/cli/-/cli-2.26.0.tgz#f215ddb2b41574ffd0dda9cd77fac927ba048fd3" + resolved "https://registry.npmjs.org/@changesets/cli/-/cli-2.26.0.tgz" integrity sha512-0cbTiDms+ICTVtEwAFLNW0jBNex9f5+fFv3I771nBvdnV/mOjd1QJ4+f8KtVSOrwD9SJkk9xbDkWFb0oXd8d1Q== dependencies: "@babel/runtime" "^7.20.1" @@ -327,7 +327,7 @@ "@changesets/config@^2.3.0": version "2.3.0" - resolved "https://registry.yarnpkg.com/@changesets/config/-/config-2.3.0.tgz#bff074d6492fa772cee139f9a04efa4cd56445bb" + resolved "https://registry.npmjs.org/@changesets/config/-/config-2.3.0.tgz" integrity sha512-EgP/px6mhCx8QeaMAvWtRrgyxW08k/Bx2tpGT+M84jEdX37v3VKfh4Cz1BkwrYKuMV2HZKeHOh8sHvja/HcXfQ== dependencies: "@changesets/errors" "^0.1.4" @@ -340,14 +340,14 @@ "@changesets/errors@^0.1.4": version "0.1.4" - resolved "https://registry.yarnpkg.com/@changesets/errors/-/errors-0.1.4.tgz#f79851746c43679a66b383fdff4c012f480f480d" + resolved "https://registry.npmjs.org/@changesets/errors/-/errors-0.1.4.tgz" integrity sha512-HAcqPF7snsUJ/QzkWoKfRfXushHTu+K5KZLJWPb34s4eCZShIf8BFO3fwq6KU8+G7L5KdtN2BzQAXOSXEyiY9Q== dependencies: extendable-error "^0.1.5" "@changesets/get-dependents-graph@^1.3.5": version "1.3.5" - resolved "https://registry.yarnpkg.com/@changesets/get-dependents-graph/-/get-dependents-graph-1.3.5.tgz#f94c6672d2f9a87aa35512eea74550585ba41c21" + resolved "https://registry.npmjs.org/@changesets/get-dependents-graph/-/get-dependents-graph-1.3.5.tgz" integrity sha512-w1eEvnWlbVDIY8mWXqWuYE9oKhvIaBhzqzo4ITSJY9hgoqQ3RoBqwlcAzg11qHxv/b8ReDWnMrpjpKrW6m1ZTA== dependencies: "@changesets/types" "^5.2.1" @@ -358,7 +358,7 @@ "@changesets/get-release-plan@^3.0.16": version "3.0.16" - resolved "https://registry.yarnpkg.com/@changesets/get-release-plan/-/get-release-plan-3.0.16.tgz#5d9cfc4ffda02c496ef0fde407210de8e3a0fb19" + resolved "https://registry.npmjs.org/@changesets/get-release-plan/-/get-release-plan-3.0.16.tgz" integrity sha512-OpP9QILpBp1bY2YNIKFzwigKh7Qe9KizRsZomzLe6pK8IUo8onkAAVUD8+JRKSr8R7d4+JRuQrfSSNlEwKyPYg== dependencies: "@babel/runtime" "^7.20.1" @@ -371,12 +371,12 @@ "@changesets/get-version-range-type@^0.3.2": version "0.3.2" - resolved "https://registry.yarnpkg.com/@changesets/get-version-range-type/-/get-version-range-type-0.3.2.tgz#8131a99035edd11aa7a44c341cbb05e668618c67" + resolved "https://registry.npmjs.org/@changesets/get-version-range-type/-/get-version-range-type-0.3.2.tgz" integrity sha512-SVqwYs5pULYjYT4op21F2pVbcrca4qA/bAA3FmFXKMN7Y+HcO8sbZUTx3TAy2VXulP2FACd1aC7f2nTuqSPbqg== "@changesets/git@^2.0.0": version "2.0.0" - resolved "https://registry.yarnpkg.com/@changesets/git/-/git-2.0.0.tgz#8de57649baf13a86eb669a25fa51bcad5cea517f" + resolved "https://registry.npmjs.org/@changesets/git/-/git-2.0.0.tgz" integrity sha512-enUVEWbiqUTxqSnmesyJGWfzd51PY4H7mH9yUw0hPVpZBJ6tQZFMU3F3mT/t9OJ/GjyiM4770i+sehAn6ymx6A== dependencies: "@babel/runtime" "^7.20.1" @@ -389,14 +389,14 @@ "@changesets/logger@^0.0.5": version "0.0.5" - resolved "https://registry.yarnpkg.com/@changesets/logger/-/logger-0.0.5.tgz#68305dd5a643e336be16a2369cb17cdd8ed37d4c" + resolved "https://registry.npmjs.org/@changesets/logger/-/logger-0.0.5.tgz" integrity sha512-gJyZHomu8nASHpaANzc6bkQMO9gU/ib20lqew1rVx753FOxffnCrJlGIeQVxNWCqM+o6OOleCo/ivL8UAO5iFw== dependencies: chalk "^2.1.0" "@changesets/parse@^0.3.16": version "0.3.16" - resolved "https://registry.yarnpkg.com/@changesets/parse/-/parse-0.3.16.tgz#f8337b70aeb476dc81745ab3294022909bc4a84a" + resolved "https://registry.npmjs.org/@changesets/parse/-/parse-0.3.16.tgz" integrity sha512-127JKNd167ayAuBjUggZBkmDS5fIKsthnr9jr6bdnuUljroiERW7FBTDNnNVyJ4l69PzR57pk6mXQdtJyBCJKg== dependencies: "@changesets/types" "^5.2.1" @@ -404,7 +404,7 @@ "@changesets/pre@^1.0.14": version "1.0.14" - resolved "https://registry.yarnpkg.com/@changesets/pre/-/pre-1.0.14.tgz#9df73999a4d15804da7381358d77bb37b00ddf0f" + resolved "https://registry.npmjs.org/@changesets/pre/-/pre-1.0.14.tgz" integrity sha512-dTsHmxQWEQekHYHbg+M1mDVYFvegDh9j/kySNuDKdylwfMEevTeDouR7IfHNyVodxZXu17sXoJuf2D0vi55FHQ== dependencies: "@babel/runtime" "^7.20.1" @@ -415,7 +415,7 @@ "@changesets/read@^0.5.9": version "0.5.9" - resolved "https://registry.yarnpkg.com/@changesets/read/-/read-0.5.9.tgz#a1b63a82b8e9409738d7a0f9cc39b6d7c28cbab0" + resolved "https://registry.npmjs.org/@changesets/read/-/read-0.5.9.tgz" integrity sha512-T8BJ6JS6j1gfO1HFq50kU3qawYxa4NTbI/ASNVVCBTsKquy2HYwM9r7ZnzkiMe8IEObAJtUVGSrePCOxAK2haQ== dependencies: "@babel/runtime" "^7.20.1" @@ -429,17 +429,17 @@ "@changesets/types@^4.0.1": version "4.1.0" - resolved "https://registry.yarnpkg.com/@changesets/types/-/types-4.1.0.tgz#fb8f7ca2324fd54954824e864f9a61a82cb78fe0" + resolved "https://registry.npmjs.org/@changesets/types/-/types-4.1.0.tgz" integrity sha512-LDQvVDv5Kb50ny2s25Fhm3d9QSZimsoUGBsUioj6MC3qbMUCuC8GPIvk/M6IvXx3lYhAs0lwWUQLb+VIEUCECw== "@changesets/types@^5.2.1": version "5.2.1" - resolved "https://registry.yarnpkg.com/@changesets/types/-/types-5.2.1.tgz#a228c48004aa8a93bce4be2d1d31527ef3bf21f6" + resolved "https://registry.npmjs.org/@changesets/types/-/types-5.2.1.tgz" integrity sha512-myLfHbVOqaq9UtUKqR/nZA/OY7xFjQMdfgfqeZIBK4d0hA6pgxArvdv8M+6NUzzBsjWLOtvApv8YHr4qM+Kpfg== "@changesets/write@^0.2.3": version "0.2.3" - resolved "https://registry.yarnpkg.com/@changesets/write/-/write-0.2.3.tgz#baf6be8ada2a67b9aba608e251bfea4fdc40bc63" + resolved "https://registry.npmjs.org/@changesets/write/-/write-0.2.3.tgz" integrity sha512-Dbamr7AIMvslKnNYsLFafaVORx4H0pvCA2MHqgtNCySMe1blImEyAEOzDmcgKAkgz4+uwoLz7demIrX+JBr/Xw== dependencies: "@babel/runtime" "^7.20.1" @@ -450,14 +450,14 @@ "@cspotcode/source-map-support@^0.8.0": version "0.8.1" - resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" + resolved "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz" integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== dependencies: "@jridgewell/trace-mapping" "0.3.9" "@ensdomains/address-encoder@^0.1.7": version "0.1.9" - resolved "https://registry.yarnpkg.com/@ensdomains/address-encoder/-/address-encoder-0.1.9.tgz#f948c485443d9ef7ed2c0c4790e931c33334d02d" + resolved "https://registry.npmjs.org/@ensdomains/address-encoder/-/address-encoder-0.1.9.tgz" integrity sha512-E2d2gP4uxJQnDu2Kfg1tHNspefzbLT8Tyjrm5sEuim32UkU2sm5xL4VXtgc2X33fmPEw9+jUMpGs4veMbf+PYg== dependencies: bech32 "^1.1.3" @@ -470,7 +470,7 @@ "@ensdomains/ens@0.4.5": version "0.4.5" - resolved "https://registry.yarnpkg.com/@ensdomains/ens/-/ens-0.4.5.tgz#e0aebc005afdc066447c6e22feb4eda89a5edbfc" + resolved "https://registry.npmjs.org/@ensdomains/ens/-/ens-0.4.5.tgz" integrity sha512-JSvpj1iNMFjK6K+uVl4unqMoa9rf5jopb8cya5UGBWz23Nw8hSNT7efgUx4BTlAPAgpNlEioUfeTyQ6J9ZvTVw== dependencies: bluebird "^3.5.2" @@ -481,7 +481,7 @@ "@ensdomains/ensjs@^2.0.1": version "2.1.0" - resolved "https://registry.yarnpkg.com/@ensdomains/ensjs/-/ensjs-2.1.0.tgz#0a7296c1f3d735ef019320d863a7846a0760c460" + resolved "https://registry.npmjs.org/@ensdomains/ensjs/-/ensjs-2.1.0.tgz" integrity sha512-GRbGPT8Z/OJMDuxs75U/jUNEC0tbL0aj7/L/QQznGYKm/tiasp+ndLOaoULy9kKJFC0TBByqfFliEHDgoLhyog== dependencies: "@babel/runtime" "^7.4.4" @@ -495,12 +495,12 @@ "@ensdomains/resolver@0.2.4": version "0.2.4" - resolved "https://registry.yarnpkg.com/@ensdomains/resolver/-/resolver-0.2.4.tgz#c10fe28bf5efbf49bff4666d909aed0265efbc89" + resolved "https://registry.npmjs.org/@ensdomains/resolver/-/resolver-0.2.4.tgz" integrity sha512-bvaTH34PMCbv6anRa9I/0zjLJgY4EuznbEMgbV77JBCQ9KNC46rzi0avuxpOfu+xDjPEtSFGqVEOr5GlUSGudA== "@eslint/eslintrc@^0.4.3": version "0.4.3" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.4.3.tgz#9e42981ef035beb3dd49add17acb96e8ff6f394c" + resolved "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz" integrity sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw== dependencies: ajv "^6.12.4" @@ -513,33 +513,39 @@ minimatch "^3.0.4" strip-json-comments "^3.1.1" -"@ethereumjs/common@2.5.0": +"@ethereumjs/common@^2.5.0", "@ethereumjs/common@2.5.0": version "2.5.0" - resolved "https://registry.yarnpkg.com/@ethereumjs/common/-/common-2.5.0.tgz#ec61551b31bef7a69d1dc634d8932468866a4268" + resolved "https://registry.npmjs.org/@ethereumjs/common/-/common-2.5.0.tgz" integrity sha512-DEHjW6e38o+JmB/NO3GZBpW4lpaiBpkFgXF6jLcJ6gETBYpEyaA5nTimsWBUJR3Vmtm/didUEbNjajskugZORg== dependencies: crc-32 "^1.2.0" ethereumjs-util "^7.1.1" -"@ethereumjs/common@^2.5.0": - version "2.6.5" - resolved "https://registry.yarnpkg.com/@ethereumjs/common/-/common-2.6.5.tgz#0a75a22a046272579d91919cb12d84f2756e8d30" - integrity sha512-lRyVQOeCDaIVtgfbowla32pzeDv2Obr8oR8Put5RdUBNRGr1VGPGQNGP6elWIpgK3YdpzqTOh4GyUGOureVeeA== - dependencies: - crc-32 "^1.2.0" - ethereumjs-util "^7.1.5" +"@ethereumjs/rlp@^4.0.1": + version "4.0.1" + resolved "https://registry.npmjs.org/@ethereumjs/rlp/-/rlp-4.0.1.tgz" + integrity sha512-tqsQiBQDQdmPWE1xkkBq4rlSW5QZpLOUJ5RJh2/9fug+q9tnUhuZoVLk7s0scUIKTOzEtR72DFBXI4WiZcMpvw== "@ethereumjs/tx@3.3.2": version "3.3.2" - resolved "https://registry.yarnpkg.com/@ethereumjs/tx/-/tx-3.3.2.tgz#348d4624bf248aaab6c44fec2ae67265efe3db00" + resolved "https://registry.npmjs.org/@ethereumjs/tx/-/tx-3.3.2.tgz" integrity sha512-6AaJhwg4ucmwTvw/1qLaZUX5miWrwZ4nLOUsKyb/HtzS3BMw/CasKhdi1ims9mBKeK9sOJCH4qGKOBGyJCeeog== dependencies: "@ethereumjs/common" "^2.5.0" ethereumjs-util "^7.1.2" -"@ethersproject/abi@5.7.0", "@ethersproject/abi@^5.0.0-beta.146", "@ethersproject/abi@^5.0.9", "@ethersproject/abi@^5.1.2", "@ethersproject/abi@^5.4.7", "@ethersproject/abi@^5.6.3", "@ethersproject/abi@^5.7.0": +"@ethereumjs/util@^8.1.0": + version "8.1.0" + resolved "https://registry.npmjs.org/@ethereumjs/util/-/util-8.1.0.tgz" + integrity sha512-zQ0IqbdX8FZ9aw11vP+dZkKDkS+kgIvQPHnSAXzP9pLu+Rfu3D3XEeLbicvoXJTYnhZiPmsZUxgdzXwNKxRPbA== + dependencies: + "@ethereumjs/rlp" "^4.0.1" + ethereum-cryptography "^2.0.0" + micro-ftch "^0.3.1" + +"@ethersproject/abi@^5.0.0", "@ethersproject/abi@^5.0.0-beta.146", "@ethersproject/abi@^5.0.9", "@ethersproject/abi@^5.1.2", "@ethersproject/abi@^5.4.7", "@ethersproject/abi@^5.6.3", "@ethersproject/abi@^5.7.0", "@ethersproject/abi@5.7.0": version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.7.0.tgz#b3f3e045bbbeed1af3947335c247ad625a44e449" + resolved "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.7.0.tgz" integrity sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA== dependencies: "@ethersproject/address" "^5.7.0" @@ -552,9 +558,9 @@ "@ethersproject/properties" "^5.7.0" "@ethersproject/strings" "^5.7.0" -"@ethersproject/abstract-provider@5.7.0", "@ethersproject/abstract-provider@^5.7.0": +"@ethersproject/abstract-provider@^5.7.0", "@ethersproject/abstract-provider@5.7.0": version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/abstract-provider/-/abstract-provider-5.7.0.tgz#b0a8550f88b6bf9d51f90e4795d48294630cb9ef" + resolved "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.7.0.tgz" integrity sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw== dependencies: "@ethersproject/bignumber" "^5.7.0" @@ -565,9 +571,9 @@ "@ethersproject/transactions" "^5.7.0" "@ethersproject/web" "^5.7.0" -"@ethersproject/abstract-signer@5.7.0", "@ethersproject/abstract-signer@^5.7.0": +"@ethersproject/abstract-signer@^5.7.0", "@ethersproject/abstract-signer@5.7.0": version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/abstract-signer/-/abstract-signer-5.7.0.tgz#13f4f32117868452191a4649723cb086d2b596b2" + resolved "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.7.0.tgz" integrity sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ== dependencies: "@ethersproject/abstract-provider" "^5.7.0" @@ -576,9 +582,9 @@ "@ethersproject/logger" "^5.7.0" "@ethersproject/properties" "^5.7.0" -"@ethersproject/address@5.7.0", "@ethersproject/address@^5.0.2", "@ethersproject/address@^5.7.0": +"@ethersproject/address@^5.0.2", "@ethersproject/address@^5.7.0", "@ethersproject/address@5.7.0": version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.7.0.tgz#19b56c4d74a3b0a46bfdbb6cfcc0a153fc697f37" + resolved "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz" integrity sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA== dependencies: "@ethersproject/bignumber" "^5.7.0" @@ -587,47 +593,47 @@ "@ethersproject/logger" "^5.7.0" "@ethersproject/rlp" "^5.7.0" -"@ethersproject/base64@5.7.0", "@ethersproject/base64@^5.7.0": +"@ethersproject/base64@^5.7.0", "@ethersproject/base64@5.7.0": version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/base64/-/base64-5.7.0.tgz#ac4ee92aa36c1628173e221d0d01f53692059e1c" + resolved "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.7.0.tgz" integrity sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ== dependencies: "@ethersproject/bytes" "^5.7.0" -"@ethersproject/basex@5.7.0", "@ethersproject/basex@^5.7.0": +"@ethersproject/basex@^5.7.0", "@ethersproject/basex@5.7.0": version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/basex/-/basex-5.7.0.tgz#97034dc7e8938a8ca943ab20f8a5e492ece4020b" + resolved "https://registry.npmjs.org/@ethersproject/basex/-/basex-5.7.0.tgz" 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": +"@ethersproject/bignumber@^5.7.0", "@ethersproject/bignumber@5.7.0": version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.7.0.tgz#e2f03837f268ba655ffba03a57853e18a18dc9c2" + resolved "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.7.0.tgz" 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": +"@ethersproject/bytes@^5.0.0", "@ethersproject/bytes@^5.7.0", "@ethersproject/bytes@5.7.0": version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.7.0.tgz#a00f6ea8d7e7534d6d87f47188af1148d71f155d" + resolved "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.7.0.tgz" integrity sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A== dependencies: "@ethersproject/logger" "^5.7.0" -"@ethersproject/constants@5.7.0", "@ethersproject/constants@^5.7.0": +"@ethersproject/constants@^5.7.0", "@ethersproject/constants@5.7.0": version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.7.0.tgz#df80a9705a7e08984161f09014ea012d1c75295e" + resolved "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.7.0.tgz" integrity sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA== dependencies: "@ethersproject/bignumber" "^5.7.0" "@ethersproject/contracts@5.7.0": version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/contracts/-/contracts-5.7.0.tgz#c305e775abd07e48aa590e1a877ed5c316f8bd1e" + resolved "https://registry.npmjs.org/@ethersproject/contracts/-/contracts-5.7.0.tgz" integrity sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg== dependencies: "@ethersproject/abi" "^5.7.0" @@ -641,9 +647,9 @@ "@ethersproject/properties" "^5.7.0" "@ethersproject/transactions" "^5.7.0" -"@ethersproject/hash@5.7.0", "@ethersproject/hash@^5.7.0": +"@ethersproject/hash@^5.7.0", "@ethersproject/hash@5.7.0": version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/hash/-/hash-5.7.0.tgz#eb7aca84a588508369562e16e514b539ba5240a7" + resolved "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.7.0.tgz" integrity sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g== dependencies: "@ethersproject/abstract-signer" "^5.7.0" @@ -656,9 +662,9 @@ "@ethersproject/properties" "^5.7.0" "@ethersproject/strings" "^5.7.0" -"@ethersproject/hdnode@5.7.0", "@ethersproject/hdnode@^5.7.0": +"@ethersproject/hdnode@^5.7.0", "@ethersproject/hdnode@5.7.0": version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/hdnode/-/hdnode-5.7.0.tgz#e627ddc6b466bc77aebf1a6b9e47405ca5aef9cf" + resolved "https://registry.npmjs.org/@ethersproject/hdnode/-/hdnode-5.7.0.tgz" integrity sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg== dependencies: "@ethersproject/abstract-signer" "^5.7.0" @@ -674,9 +680,9 @@ "@ethersproject/transactions" "^5.7.0" "@ethersproject/wordlists" "^5.7.0" -"@ethersproject/json-wallets@5.7.0", "@ethersproject/json-wallets@^5.7.0": +"@ethersproject/json-wallets@^5.7.0", "@ethersproject/json-wallets@5.7.0": version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/json-wallets/-/json-wallets-5.7.0.tgz#5e3355287b548c32b368d91014919ebebddd5360" + resolved "https://registry.npmjs.org/@ethersproject/json-wallets/-/json-wallets-5.7.0.tgz" integrity sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g== dependencies: "@ethersproject/abstract-signer" "^5.7.0" @@ -693,44 +699,44 @@ aes-js "3.0.0" scrypt-js "3.0.1" -"@ethersproject/keccak256@5.7.0", "@ethersproject/keccak256@^5.7.0": +"@ethersproject/keccak256@^5.7.0", "@ethersproject/keccak256@5.7.0": version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.7.0.tgz#3186350c6e1cd6aba7940384ec7d6d9db01f335a" + resolved "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.7.0.tgz" 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": +"@ethersproject/logger@^5.7.0", "@ethersproject/logger@5.7.0": version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.7.0.tgz#6ce9ae168e74fecf287be17062b590852c311892" + resolved "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.7.0.tgz" integrity sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig== -"@ethersproject/networks@5.7.1", "@ethersproject/networks@^5.7.0": +"@ethersproject/networks@^5.7.0", "@ethersproject/networks@5.7.1": version "5.7.1" - resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.7.1.tgz#118e1a981d757d45ccea6bb58d9fd3d9db14ead6" + resolved "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.7.1.tgz" integrity sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ== dependencies: "@ethersproject/logger" "^5.7.0" -"@ethersproject/pbkdf2@5.7.0", "@ethersproject/pbkdf2@^5.7.0": +"@ethersproject/pbkdf2@^5.7.0", "@ethersproject/pbkdf2@5.7.0": version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/pbkdf2/-/pbkdf2-5.7.0.tgz#d2267d0a1f6e123f3771007338c47cccd83d3102" + resolved "https://registry.npmjs.org/@ethersproject/pbkdf2/-/pbkdf2-5.7.0.tgz" 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": +"@ethersproject/properties@^5.7.0", "@ethersproject/properties@5.7.0": version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/properties/-/properties-5.7.0.tgz#a6e12cb0439b878aaf470f1902a176033067ed30" + resolved "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.7.0.tgz" integrity sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw== dependencies: "@ethersproject/logger" "^5.7.0" -"@ethersproject/providers@5.7.2", "@ethersproject/providers@^5.4.7", "@ethersproject/providers@^5.7.1", "@ethersproject/providers@^5.7.2": +"@ethersproject/providers@^5.0.0", "@ethersproject/providers@^5.4.7", "@ethersproject/providers@^5.7.1", "@ethersproject/providers@^5.7.2", "@ethersproject/providers@5.7.2": version "5.7.2" - resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.7.2.tgz#f8b1a4f275d7ce58cf0a2eec222269a08beb18cb" + resolved "https://registry.npmjs.org/@ethersproject/providers/-/providers-5.7.2.tgz" integrity sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg== dependencies: "@ethersproject/abstract-provider" "^5.7.0" @@ -754,34 +760,34 @@ bech32 "1.1.4" ws "7.4.6" -"@ethersproject/random@5.7.0", "@ethersproject/random@^5.7.0": +"@ethersproject/random@^5.7.0", "@ethersproject/random@5.7.0": version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/random/-/random-5.7.0.tgz#af19dcbc2484aae078bb03656ec05df66253280c" + resolved "https://registry.npmjs.org/@ethersproject/random/-/random-5.7.0.tgz" integrity sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ== dependencies: "@ethersproject/bytes" "^5.7.0" "@ethersproject/logger" "^5.7.0" -"@ethersproject/rlp@5.7.0", "@ethersproject/rlp@^5.7.0": +"@ethersproject/rlp@^5.7.0", "@ethersproject/rlp@5.7.0": version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/rlp/-/rlp-5.7.0.tgz#de39e4d5918b9d74d46de93af80b7685a9c21304" + resolved "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.7.0.tgz" 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": +"@ethersproject/sha2@^5.7.0", "@ethersproject/sha2@5.7.0": version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/sha2/-/sha2-5.7.0.tgz#9a5f7a7824ef784f7f7680984e593a800480c9fb" + resolved "https://registry.npmjs.org/@ethersproject/sha2/-/sha2-5.7.0.tgz" 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": +"@ethersproject/signing-key@^5.7.0", "@ethersproject/signing-key@5.7.0": version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/signing-key/-/signing-key-5.7.0.tgz#06b2df39411b00bc57c7c09b01d1e41cf1b16ab3" + resolved "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.7.0.tgz" integrity sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q== dependencies: "@ethersproject/bytes" "^5.7.0" @@ -793,7 +799,7 @@ "@ethersproject/solidity@5.7.0": version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/solidity/-/solidity-5.7.0.tgz#5e9c911d8a2acce2a5ebb48a5e2e0af20b631cb8" + resolved "https://registry.npmjs.org/@ethersproject/solidity/-/solidity-5.7.0.tgz" integrity sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA== dependencies: "@ethersproject/bignumber" "^5.7.0" @@ -803,18 +809,18 @@ "@ethersproject/sha2" "^5.7.0" "@ethersproject/strings" "^5.7.0" -"@ethersproject/strings@5.7.0", "@ethersproject/strings@^5.7.0": +"@ethersproject/strings@^5.7.0", "@ethersproject/strings@5.7.0": version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/strings/-/strings-5.7.0.tgz#54c9d2a7c57ae8f1205c88a9d3a56471e14d5ed2" + resolved "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.7.0.tgz" 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.6.2", "@ethersproject/transactions@^5.7.0": +"@ethersproject/transactions@^5.6.2", "@ethersproject/transactions@^5.7.0", "@ethersproject/transactions@5.7.0": version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.7.0.tgz#91318fc24063e057885a6af13fdb703e1f993d3b" + resolved "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.7.0.tgz" integrity sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ== dependencies: "@ethersproject/address" "^5.7.0" @@ -829,7 +835,7 @@ "@ethersproject/units@5.7.0": version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/units/-/units-5.7.0.tgz#637b563d7e14f42deeee39245275d477aae1d8b1" + resolved "https://registry.npmjs.org/@ethersproject/units/-/units-5.7.0.tgz" integrity sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg== dependencies: "@ethersproject/bignumber" "^5.7.0" @@ -838,7 +844,7 @@ "@ethersproject/wallet@5.7.0": version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/wallet/-/wallet-5.7.0.tgz#4e5d0790d96fe21d61d38fb40324e6c7ef350b2d" + resolved "https://registry.npmjs.org/@ethersproject/wallet/-/wallet-5.7.0.tgz" integrity sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA== dependencies: "@ethersproject/abstract-provider" "^5.7.0" @@ -857,9 +863,9 @@ "@ethersproject/transactions" "^5.7.0" "@ethersproject/wordlists" "^5.7.0" -"@ethersproject/web@5.7.1", "@ethersproject/web@^5.7.0": +"@ethersproject/web@^5.7.0", "@ethersproject/web@5.7.1": version "5.7.1" - resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.7.1.tgz#de1f285b373149bee5928f4eb7bcb87ee5fbb4ae" + resolved "https://registry.npmjs.org/@ethersproject/web/-/web-5.7.1.tgz" integrity sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w== dependencies: "@ethersproject/base64" "^5.7.0" @@ -868,9 +874,9 @@ "@ethersproject/properties" "^5.7.0" "@ethersproject/strings" "^5.7.0" -"@ethersproject/wordlists@5.7.0", "@ethersproject/wordlists@^5.7.0": +"@ethersproject/wordlists@^5.7.0", "@ethersproject/wordlists@5.7.0": version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/wordlists/-/wordlists-5.7.0.tgz#8fb2c07185d68c3e09eb3bfd6e779ba2774627f5" + resolved "https://registry.npmjs.org/@ethersproject/wordlists/-/wordlists-5.7.0.tgz" integrity sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA== dependencies: "@ethersproject/bytes" "^5.7.0" @@ -881,7 +887,7 @@ "@fvictorio/tabtab@^0.0.3": version "0.0.3" - resolved "https://registry.yarnpkg.com/@fvictorio/tabtab/-/tabtab-0.0.3.tgz#1b97981424386490fa2a5818706d2afd1f6e4659" + resolved "https://registry.npmjs.org/@fvictorio/tabtab/-/tabtab-0.0.3.tgz" integrity sha512-bT/BSy8MJThrTebqTCjXRnGSgZWthHLigZ4k2AvfNtC79vPyBS1myaxw8gRU6RxIcdDD3HBtm7pOsOoyC086Zg== dependencies: debug "^4.1.1" @@ -892,7 +898,7 @@ "@humanwhocodes/config-array@^0.5.0": version "0.5.0" - resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.5.0.tgz#1407967d4c6eecd7388f83acf1eaf4d0c6e58ef9" + resolved "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz" integrity sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg== dependencies: "@humanwhocodes/object-schema" "^1.2.0" @@ -901,12 +907,12 @@ "@humanwhocodes/object-schema@^1.2.0": version "1.2.1" - resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" + resolved "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz" integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== "@istanbuljs/load-nyc-config@^1.0.0": version "1.1.0" - resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" + resolved "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz" integrity sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ== dependencies: camelcase "^5.3.1" @@ -917,12 +923,12 @@ "@istanbuljs/schema@^0.1.2": version "0.1.3" - resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" + resolved "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz" integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== "@jest/types@^24.9.0": version "24.9.0" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-24.9.0.tgz#63cb26cb7500d069e5a389441a7c6ab5e909fc59" + resolved "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz" integrity sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw== dependencies: "@types/istanbul-lib-coverage" "^2.0.0" @@ -931,47 +937,47 @@ "@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2": version "0.3.3" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz#7e02e6eb5df901aaedb08514203b096614024098" + resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz" integrity sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ== dependencies: "@jridgewell/set-array" "^1.0.1" "@jridgewell/sourcemap-codec" "^1.4.10" "@jridgewell/trace-mapping" "^0.3.9" -"@jridgewell/resolve-uri@3.1.0", "@jridgewell/resolve-uri@^3.0.3": +"@jridgewell/resolve-uri@^3.0.3", "@jridgewell/resolve-uri@3.1.0": version "3.1.0" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" + resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz" integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== "@jridgewell/set-array@^1.0.1": version "1.1.2" - resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" + resolved "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz" integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== -"@jridgewell/sourcemap-codec@1.4.14", "@jridgewell/sourcemap-codec@^1.4.10": +"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@1.4.14": version "1.4.14" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" + resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz" integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== -"@jridgewell/trace-mapping@0.3.9": - version "0.3.9" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" - integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== - dependencies: - "@jridgewell/resolve-uri" "^3.0.3" - "@jridgewell/sourcemap-codec" "^1.4.10" - "@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.9": version "0.3.18" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz#25783b2086daf6ff1dcb53c9249ae480e4dd4cd6" + resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz" integrity sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA== dependencies: "@jridgewell/resolve-uri" "3.1.0" "@jridgewell/sourcemap-codec" "1.4.14" +"@jridgewell/trace-mapping@0.3.9": + version "0.3.9" + resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz" + integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== + dependencies: + "@jridgewell/resolve-uri" "^3.0.3" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@manypkg/find-root@^1.1.0": version "1.1.0" - resolved "https://registry.yarnpkg.com/@manypkg/find-root/-/find-root-1.1.0.tgz#a62d8ed1cd7e7d4c11d9d52a8397460b5d4ad29f" + resolved "https://registry.npmjs.org/@manypkg/find-root/-/find-root-1.1.0.tgz" integrity sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA== dependencies: "@babel/runtime" "^7.5.5" @@ -981,7 +987,7 @@ "@manypkg/get-packages@^1.1.3": version "1.1.3" - resolved "https://registry.yarnpkg.com/@manypkg/get-packages/-/get-packages-1.1.3.tgz#e184db9bba792fa4693de4658cfb1463ac2c9c47" + resolved "https://registry.npmjs.org/@manypkg/get-packages/-/get-packages-1.1.3.tgz" integrity sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A== dependencies: "@babel/runtime" "^7.5.5" @@ -993,7 +999,7 @@ "@metamask/eth-sig-util@^4.0.0": version "4.0.1" - resolved "https://registry.yarnpkg.com/@metamask/eth-sig-util/-/eth-sig-util-4.0.1.tgz#3ad61f6ea9ad73ba5b19db780d40d9aae5157088" + resolved "https://registry.npmjs.org/@metamask/eth-sig-util/-/eth-sig-util-4.0.1.tgz" integrity sha512-tghyZKLHZjcdlDqCA3gNZmLeR0XvOE9U1qoQO9ohyAZT6Pya+H9vkBPcsyXytmYLNgVoin7CKCmweo/R43V+tQ== dependencies: ethereumjs-abi "^0.6.8" @@ -1004,38 +1010,50 @@ "@morgan-stanley/ts-mocking-bird@^0.6.2": version "0.6.4" - resolved "https://registry.yarnpkg.com/@morgan-stanley/ts-mocking-bird/-/ts-mocking-bird-0.6.4.tgz#2e4b60d42957bab3b50b67dbf14c3da2f62a39f7" + resolved "https://registry.npmjs.org/@morgan-stanley/ts-mocking-bird/-/ts-mocking-bird-0.6.4.tgz" integrity sha512-57VJIflP8eR2xXa9cD1LUawh+Gh+BVQfVu0n6GALyg/AqV/Nz25kDRvws3i9kIe1PTrbsZZOYpsYp6bXPd6nVA== dependencies: lodash "^4.17.16" uuid "^7.0.3" -"@noble/hashes@1.2.0", "@noble/hashes@~1.2.0": +"@noble/curves@~1.1.0", "@noble/curves@1.1.0": + version "1.1.0" + resolved "https://registry.npmjs.org/@noble/curves/-/curves-1.1.0.tgz" + integrity sha512-091oBExgENk/kGj3AZmtBDMpxQPDtxQABR2B9lb1JbVTs6ytdzZNwvhxQ4MWasRNEzlbEH8jCWFCwhF/Obj5AA== + dependencies: + "@noble/hashes" "1.3.1" + +"@noble/hashes@~1.2.0", "@noble/hashes@1.2.0": version "1.2.0" - resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.2.0.tgz#a3150eeb09cc7ab207ebf6d7b9ad311a9bdbed12" + resolved "https://registry.npmjs.org/@noble/hashes/-/hashes-1.2.0.tgz" integrity sha512-FZfhjEDbT5GRswV3C6uvLPHMiVD6lQBmpoX5+eSiPaMTXte/IKqI5dykDxzZB/WBeK/CDuQRBWarPdi3FNY2zQ== -"@noble/secp256k1@1.7.1", "@noble/secp256k1@~1.7.0": +"@noble/hashes@~1.3.0", "@noble/hashes@~1.3.1", "@noble/hashes@1.3.1": + version "1.3.1" + resolved "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.1.tgz" + integrity sha512-EbqwksQwz9xDRGfDST86whPBgM65E0OH/pCgqW0GBVzO22bNE+NuIbeTb714+IfSjU3aRk47EUvXIb5bTsenKA== + +"@noble/secp256k1@~1.7.0", "@noble/secp256k1@1.7.1": version "1.7.1" - resolved "https://registry.yarnpkg.com/@noble/secp256k1/-/secp256k1-1.7.1.tgz#b251c70f824ce3ca7f8dc3df08d58f005cc0507c" + resolved "https://registry.npmjs.org/@noble/secp256k1/-/secp256k1-1.7.1.tgz" integrity sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw== "@nodelib/fs.scandir@2.1.5": version "2.1.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" + resolved "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz" integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== dependencies: "@nodelib/fs.stat" "2.0.5" run-parallel "^1.1.9" -"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": +"@nodelib/fs.stat@^2.0.2", "@nodelib/fs.stat@2.0.5": version "2.0.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" + resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== "@nodelib/fs.walk@^1.2.3": version "1.2.8" - resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" + resolved "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz" integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== dependencies: "@nodelib/fs.scandir" "2.1.5" @@ -1043,7 +1061,7 @@ "@nomicfoundation/ethereumjs-block@5.0.1": version "5.0.1" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-block/-/ethereumjs-block-5.0.1.tgz#6f89664f55febbd723195b6d0974773d29ee133d" + resolved "https://registry.npmjs.org/@nomicfoundation/ethereumjs-block/-/ethereumjs-block-5.0.1.tgz" integrity sha512-u1Yioemi6Ckj3xspygu/SfFvm8vZEO8/Yx5a1QLzi6nVU0jz3Pg2OmHKJ5w+D9Ogk1vhwRiqEBAqcb0GVhCyHw== dependencies: "@nomicfoundation/ethereumjs-common" "4.0.1" @@ -1056,7 +1074,7 @@ "@nomicfoundation/ethereumjs-blockchain@7.0.1": version "7.0.1" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-blockchain/-/ethereumjs-blockchain-7.0.1.tgz#80e0bd3535bfeb9baa29836b6f25123dab06a726" + resolved "https://registry.npmjs.org/@nomicfoundation/ethereumjs-blockchain/-/ethereumjs-blockchain-7.0.1.tgz" integrity sha512-NhzndlGg829XXbqJEYrF1VeZhAwSPgsK/OB7TVrdzft3y918hW5KNd7gIZ85sn6peDZOdjBsAXIpXZ38oBYE5A== dependencies: "@nomicfoundation/ethereumjs-block" "5.0.1" @@ -1075,7 +1093,7 @@ "@nomicfoundation/ethereumjs-common@4.0.1": version "4.0.1" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-common/-/ethereumjs-common-4.0.1.tgz#4702d82df35b07b5407583b54a45bf728e46a2f0" + resolved "https://registry.npmjs.org/@nomicfoundation/ethereumjs-common/-/ethereumjs-common-4.0.1.tgz" integrity sha512-OBErlkfp54GpeiE06brBW/TTbtbuBJV5YI5Nz/aB2evTDo+KawyEzPjBlSr84z/8MFfj8wS2wxzQX1o32cev5g== dependencies: "@nomicfoundation/ethereumjs-util" "9.0.1" @@ -1083,7 +1101,7 @@ "@nomicfoundation/ethereumjs-ethash@3.0.1": version "3.0.1" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-ethash/-/ethereumjs-ethash-3.0.1.tgz#65ca494d53e71e8415c9a49ef48bc921c538fc41" + resolved "https://registry.npmjs.org/@nomicfoundation/ethereumjs-ethash/-/ethereumjs-ethash-3.0.1.tgz" integrity sha512-KDjGIB5igzWOp8Ik5I6QiRH5DH+XgILlplsHR7TEuWANZA759G6krQ6o8bvj+tRUz08YygMQu/sGd9mJ1DYT8w== dependencies: "@nomicfoundation/ethereumjs-block" "5.0.1" @@ -1095,7 +1113,7 @@ "@nomicfoundation/ethereumjs-evm@2.0.1": version "2.0.1" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-evm/-/ethereumjs-evm-2.0.1.tgz#f35681e203363f69ce2b3d3bf9f44d4e883ca1f1" + resolved "https://registry.npmjs.org/@nomicfoundation/ethereumjs-evm/-/ethereumjs-evm-2.0.1.tgz" integrity sha512-oL8vJcnk0Bx/onl+TgQOQ1t/534GKFaEG17fZmwtPFeH8S5soiBYPCLUrvANOl4sCp9elYxIMzIiTtMtNNN8EQ== dependencies: "@ethersproject/providers" "^5.7.1" @@ -1109,12 +1127,12 @@ "@nomicfoundation/ethereumjs-rlp@5.0.1": version "5.0.1" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-rlp/-/ethereumjs-rlp-5.0.1.tgz#0b30c1cf77d125d390408e391c4bb5291ef43c28" + resolved "https://registry.npmjs.org/@nomicfoundation/ethereumjs-rlp/-/ethereumjs-rlp-5.0.1.tgz" integrity sha512-xtxrMGa8kP4zF5ApBQBtjlSbN5E2HI8m8FYgVSYAnO6ssUoY5pVPGy2H8+xdf/bmMa22Ce8nWMH3aEW8CcqMeQ== "@nomicfoundation/ethereumjs-statemanager@2.0.1": version "2.0.1" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-statemanager/-/ethereumjs-statemanager-2.0.1.tgz#8824a97938db4471911e2d2f140f79195def5935" + resolved "https://registry.npmjs.org/@nomicfoundation/ethereumjs-statemanager/-/ethereumjs-statemanager-2.0.1.tgz" integrity sha512-B5ApMOnlruVOR7gisBaYwFX+L/AP7i/2oAahatssjPIBVDF6wTX1K7Qpa39E/nzsH8iYuL3krkYeUFIdO3EMUQ== dependencies: "@nomicfoundation/ethereumjs-common" "4.0.1" @@ -1126,7 +1144,7 @@ "@nomicfoundation/ethereumjs-trie@6.0.1": version "6.0.1" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-trie/-/ethereumjs-trie-6.0.1.tgz#662c55f6b50659fd4b22ea9f806a7401cafb7717" + resolved "https://registry.npmjs.org/@nomicfoundation/ethereumjs-trie/-/ethereumjs-trie-6.0.1.tgz" integrity sha512-A64It/IMpDVODzCgxDgAAla8jNjNtsoQZIzZUfIV5AY6Coi4nvn7+VReBn5itlxMiL2yaTlQr9TRWp3CSI6VoA== dependencies: "@nomicfoundation/ethereumjs-rlp" "5.0.1" @@ -1137,7 +1155,7 @@ "@nomicfoundation/ethereumjs-tx@5.0.1": version "5.0.1" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-tx/-/ethereumjs-tx-5.0.1.tgz#7629dc2036b4a33c34e9f0a592b43227ef4f0c7d" + resolved "https://registry.npmjs.org/@nomicfoundation/ethereumjs-tx/-/ethereumjs-tx-5.0.1.tgz" integrity sha512-0HwxUF2u2hrsIM1fsasjXvlbDOq1ZHFV2dd1yGq8CA+MEYhaxZr8OTScpVkkxqMwBcc5y83FyPl0J9MZn3kY0w== dependencies: "@chainsafe/ssz" "^0.9.2" @@ -1149,7 +1167,7 @@ "@nomicfoundation/ethereumjs-util@9.0.1": version "9.0.1" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-util/-/ethereumjs-util-9.0.1.tgz#530cda8bae33f8b5020a8f199ed1d0a2ce48ec89" + resolved "https://registry.npmjs.org/@nomicfoundation/ethereumjs-util/-/ethereumjs-util-9.0.1.tgz" integrity sha512-TwbhOWQ8QoSCFhV/DDfSmyfFIHjPjFBj957219+V3jTZYZ2rf9PmDtNOeZWAE3p3vlp8xb02XGpd0v6nTUPbsA== dependencies: "@chainsafe/ssz" "^0.10.0" @@ -1158,7 +1176,7 @@ "@nomicfoundation/ethereumjs-vm@7.0.1": version "7.0.1" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-vm/-/ethereumjs-vm-7.0.1.tgz#7d035e0993bcad10716c8b36e61dfb87fa3ca05f" + resolved "https://registry.npmjs.org/@nomicfoundation/ethereumjs-vm/-/ethereumjs-vm-7.0.1.tgz" integrity sha512-rArhyn0jPsS/D+ApFsz3yVJMQ29+pVzNZ0VJgkzAZ+7FqXSRtThl1C1prhmlVr3YNUlfpZ69Ak+RUT4g7VoOuQ== dependencies: "@nomicfoundation/ethereumjs-block" "5.0.1" @@ -1175,59 +1193,54 @@ mcl-wasm "^0.7.1" rustbn.js "~0.2.0" -"@nomicfoundation/solidity-analyzer-darwin-arm64@0.1.0": - version "0.1.0" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-darwin-arm64/-/solidity-analyzer-darwin-arm64-0.1.0.tgz#83a7367342bd053a76d04bbcf4f373fef07cf760" - integrity sha512-vEF3yKuuzfMHsZecHQcnkUrqm8mnTWfJeEVFHpg+cO+le96xQA4lAJYdUan8pXZohQxv1fSReQsn4QGNuBNuCw== - -"@nomicfoundation/solidity-analyzer-darwin-x64@0.1.0": - version "0.1.0" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-darwin-x64/-/solidity-analyzer-darwin-x64-0.1.0.tgz#1225f7da647ae1ad25a87125664704ecc0af6ccc" - integrity sha512-dlHeIg0pTL4dB1l9JDwbi/JG6dHQaU1xpDK+ugYO8eJ1kxx9Dh2isEUtA4d02cQAl22cjOHTvifAk96A+ItEHA== - -"@nomicfoundation/solidity-analyzer-freebsd-x64@0.1.0": - version "0.1.0" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-freebsd-x64/-/solidity-analyzer-freebsd-x64-0.1.0.tgz#dbc052dcdfd50ae50fd5ae1788b69b4e0fa40040" - integrity sha512-WFCZYMv86WowDA4GiJKnebMQRt3kCcFqHeIomW6NMyqiKqhK1kIZCxSLDYsxqlx396kKLPN1713Q1S8tu68GKg== - -"@nomicfoundation/solidity-analyzer-linux-arm64-gnu@0.1.0": - version "0.1.0" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-arm64-gnu/-/solidity-analyzer-linux-arm64-gnu-0.1.0.tgz#e6b2eea633995b557e74e881d2a43eab4760903d" - integrity sha512-DTw6MNQWWlCgc71Pq7CEhEqkb7fZnS7oly13pujs4cMH1sR0JzNk90Mp1zpSCsCs4oKan2ClhMlLKtNat/XRKQ== - -"@nomicfoundation/solidity-analyzer-linux-arm64-musl@0.1.0": - version "0.1.0" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-arm64-musl/-/solidity-analyzer-linux-arm64-musl-0.1.0.tgz#af81107f5afa794f19988a368647727806e18dc4" - integrity sha512-wUpUnR/3GV5Da88MhrxXh/lhb9kxh9V3Jya2NpBEhKDIRCDmtXMSqPMXHZmOR9DfCwCvG6vLFPr/+YrPCnUN0w== +"@nomicfoundation/hardhat-chai-matchers@^1.0.0", "@nomicfoundation/hardhat-chai-matchers@file:C:\\Users\\apich\\GitHub\\hardhat\\packages\\hardhat-chai-matchers": + version "1.0.6" + resolved "file:packages/hardhat-chai-matchers" + dependencies: + "@ethersproject/abi" "^5.1.2" + "@types/chai-as-promised" "^7.1.3" + chai-as-promised "^7.1.1" + deep-eql "^4.0.1" + ordinal "^1.0.3" -"@nomicfoundation/solidity-analyzer-linux-x64-gnu@0.1.0": - version "0.1.0" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-x64-gnu/-/solidity-analyzer-linux-x64-gnu-0.1.0.tgz#6877e1da1a06a9f08446070ab6e0a5347109f868" - integrity sha512-lR0AxK1x/MeKQ/3Pt923kPvwigmGX3OxeU5qNtQ9pj9iucgk4PzhbS3ruUeSpYhUxG50jN4RkIGwUMoev5lguw== +"@nomicfoundation/hardhat-foundry@file:C:\\Users\\apich\\GitHub\\hardhat\\packages\\hardhat-foundry": + version "1.0.1" + resolved "file:packages/hardhat-foundry" + dependencies: + chalk "^2.4.2" -"@nomicfoundation/solidity-analyzer-linux-x64-musl@0.1.0": - version "0.1.0" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-x64-musl/-/solidity-analyzer-linux-x64-musl-0.1.0.tgz#bb6cd83a0c259eccef4183796b6329a66cf7ebd9" - integrity sha512-A1he/8gy/JeBD3FKvmI6WUJrGrI5uWJNr5Xb9WdV+DK0F8msuOqpEByLlnTdLkXMwW7nSl3awvLezOs9xBHJEg== +"@nomicfoundation/hardhat-network-helpers@^1.0.0", "@nomicfoundation/hardhat-network-helpers@file:C:\\Users\\apich\\GitHub\\hardhat\\packages\\hardhat-network-helpers": + version "1.0.8" + resolved "file:packages/hardhat-network-helpers" + dependencies: + ethereumjs-util "^7.1.4" -"@nomicfoundation/solidity-analyzer-win32-arm64-msvc@0.1.0": - version "0.1.0" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-win32-arm64-msvc/-/solidity-analyzer-win32-arm64-msvc-0.1.0.tgz#9d4bca1cc9a1333fde985675083b0b7d165f6076" - integrity sha512-7x5SXZ9R9H4SluJZZP8XPN+ju7Mx+XeUMWZw7ZAqkdhP5mK19I4vz3x0zIWygmfE8RT7uQ5xMap0/9NPsO+ykw== +"@nomicfoundation/hardhat-toolbox@file:C:\\Users\\apich\\GitHub\\hardhat\\packages\\hardhat-toolbox": + version "2.0.2" + resolved "file:packages/hardhat-toolbox" -"@nomicfoundation/solidity-analyzer-win32-ia32-msvc@0.1.0": - version "0.1.0" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-win32-ia32-msvc/-/solidity-analyzer-win32-ia32-msvc-0.1.0.tgz#0db5bfc6aa952bea4098d8d2c8947b4e5c4337ee" - integrity sha512-m7w3xf+hnE774YRXu+2mGV7RiF3QJtUoiYU61FascCkQhX3QMQavh7saH/vzb2jN5D24nT/jwvaHYX/MAM9zUw== +"@nomicfoundation/hardhat-verify@file:C:\\Users\\apich\\GitHub\\hardhat\\packages\\hardhat-verify": + version "1.0.0" + resolved "file:packages/hardhat-verify" + dependencies: + "@ethersproject/abi" "^5.1.2" + "@ethersproject/address" "^5.0.2" + cbor "^8.1.0" + chalk "^2.4.2" + debug "^4.1.1" + lodash.clonedeep "^4.5.0" + semver "^6.3.0" + table "^6.8.0" + undici "^5.14.0" "@nomicfoundation/solidity-analyzer-win32-x64-msvc@0.1.0": version "0.1.0" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-win32-x64-msvc/-/solidity-analyzer-win32-x64-msvc-0.1.0.tgz#2e0f39a2924dcd77db6b419828595e984fabcb33" + resolved "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-win32-x64-msvc/-/solidity-analyzer-win32-x64-msvc-0.1.0.tgz" integrity sha512-xCuybjY0sLJQnJhupiFAXaek2EqF0AP0eBjgzaalPXSNvCEN6ZYHvUzdA50ENDVeSYFXcUsYf3+FsD3XKaeptA== "@nomicfoundation/solidity-analyzer@^0.1.0": version "0.1.0" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer/-/solidity-analyzer-0.1.0.tgz#e5ddc43ad5c0aab96e5054520d8e16212e125f50" + resolved "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer/-/solidity-analyzer-0.1.0.tgz" integrity sha512-xGWAiVCGOycvGiP/qrlf9f9eOn7fpNbyJygcB0P21a1MDuVPlKt0Srp7rvtBEutYQ48ouYnRXm33zlRnlTOPHg== optionalDependencies: "@nomicfoundation/solidity-analyzer-darwin-arm64" "0.1.0" @@ -1241,9 +1254,21 @@ "@nomicfoundation/solidity-analyzer-win32-ia32-msvc" "0.1.0" "@nomicfoundation/solidity-analyzer-win32-x64-msvc" "0.1.0" +"@nomiclabs/common@file:C:\\Users\\apich\\GitHub\\hardhat\\packages\\common": + version "0.0.1" + resolved "file:packages/common" + +"@nomiclabs/eslint-plugin-hardhat-internal-rules@^1.0.0", "@nomiclabs/eslint-plugin-hardhat-internal-rules@file:C:\\Users\\apich\\GitHub\\hardhat\\packages\\eslint-plugin": + version "1.0.2" + resolved "file:packages/eslint-plugin" + +"@nomiclabs/hardhat-ethers@^2.0.0", "@nomiclabs/hardhat-ethers@file:C:\\Users\\apich\\GitHub\\hardhat\\packages\\hardhat-ethers": + version "2.2.3" + resolved "file:packages/hardhat-ethers" + "@nomiclabs/hardhat-etherscan@^3.0.0": version "3.1.7" - resolved "https://registry.yarnpkg.com/@nomiclabs/hardhat-etherscan/-/hardhat-etherscan-3.1.7.tgz#72e3d5bd5d0ceb695e097a7f6f5ff6fcbf062b9a" + resolved "https://registry.npmjs.org/@nomiclabs/hardhat-etherscan/-/hardhat-etherscan-3.1.7.tgz" integrity sha512-tZ3TvSgpvsQ6B6OGmo1/Au6u8BrAkvs1mIC/eURA3xgIfznUZBhmpne8hv7BXUzw9xNL3fXdpOYgOQlVMTcoHQ== dependencies: "@ethersproject/abi" "^5.1.2" @@ -1257,9 +1282,62 @@ table "^6.8.0" undici "^5.14.0" +"@nomiclabs/hardhat-solhint@file:C:\\Users\\apich\\GitHub\\hardhat\\packages\\hardhat-solhint": + version "3.0.1" + resolved "file:packages/hardhat-solhint" + dependencies: + solhint "^3.4.0" + +"@nomiclabs/hardhat-solpp@file:C:\\Users\\apich\\GitHub\\hardhat\\packages\\hardhat-solpp": + version "2.0.1" + resolved "file:packages/hardhat-solpp" + dependencies: + fs-extra "^7.0.1" + solpp "^0.11.5" + +"@nomiclabs/hardhat-truffle4@file:C:\\Users\\apich\\GitHub\\hardhat\\packages\\hardhat-truffle4": + version "2.0.6" + resolved "file:packages/hardhat-truffle4" + dependencies: + "@types/chai" "^4.2.0" + chai "^4.2.0" + ethereumjs-util "^7.1.4" + fs-extra "^7.0.1" + truffle-contract "^3.0.7" + +"@nomiclabs/hardhat-truffle5@file:C:\\Users\\apich\\GitHub\\hardhat\\packages\\hardhat-truffle5": + version "2.0.7" + resolved "file:packages/hardhat-truffle5" + dependencies: + "@nomiclabs/truffle-contract" "^4.2.23" + "@types/chai" "^4.2.0" + chai "^4.2.0" + ethereumjs-util "^7.1.4" + fs-extra "^7.0.1" + +"@nomiclabs/hardhat-vyper@file:C:\\Users\\apich\\GitHub\\hardhat\\packages\\hardhat-vyper": + version "3.0.3" + resolved "file:packages/hardhat-vyper" + dependencies: + debug "^4.1.1" + fs-extra "^7.0.1" + io-ts "1.10.4" + lodash "^4.17.11" + semver "^6.3.0" + +"@nomiclabs/hardhat-web3-legacy@^2.0.0", "@nomiclabs/hardhat-web3-legacy@file:C:\\Users\\apich\\GitHub\\hardhat\\packages\\hardhat-web3-legacy": + version "2.0.0" + resolved "file:packages/hardhat-web3-legacy" + +"@nomiclabs/hardhat-web3@^2.0.0", "@nomiclabs/hardhat-web3@file:C:\\Users\\apich\\GitHub\\hardhat\\packages\\hardhat-web3": + version "2.0.0" + resolved "file:packages/hardhat-web3" + dependencies: + "@types/bignumber.js" "^5.0.0" + "@nomiclabs/truffle-contract@^4.2.23": version "4.5.10" - resolved "https://registry.yarnpkg.com/@nomiclabs/truffle-contract/-/truffle-contract-4.5.10.tgz#52adcca1068647e1c2b44bf0e6a89fc4ad7f9213" + resolved "https://registry.npmjs.org/@nomiclabs/truffle-contract/-/truffle-contract-4.5.10.tgz" integrity sha512-nF/6InFV+0hUvutyFgsdOMCoYlr//2fJbRER4itxYtQtc4/O1biTwZIKRu+5l2J5Sq6LU2WX7vZHtDgQdhWxIQ== dependencies: "@ensdomains/ensjs" "^2.0.1" @@ -1275,29 +1353,46 @@ "@scure/base@~1.1.0": version "1.1.1" - resolved "https://registry.yarnpkg.com/@scure/base/-/base-1.1.1.tgz#ebb651ee52ff84f420097055f4bf46cfba403938" + resolved "https://registry.npmjs.org/@scure/base/-/base-1.1.1.tgz" integrity sha512-ZxOhsSyxYwLJj3pLZCefNitxsj093tb2vq90mp2txoYeBqbcjDjqFhyM8eUjq/uFm6zJ+mUuqxlS2FkuSY1MTA== "@scure/bip32@1.1.5": version "1.1.5" - resolved "https://registry.yarnpkg.com/@scure/bip32/-/bip32-1.1.5.tgz#d2ccae16dcc2e75bc1d75f5ef3c66a338d1ba300" + resolved "https://registry.npmjs.org/@scure/bip32/-/bip32-1.1.5.tgz" integrity sha512-XyNh1rB0SkEqd3tXcXMi+Xe1fvg+kUIcoRIEujP1Jgv7DqW2r9lg3Ah0NkFaCs9sTkQAQA8kw7xiRXzENi9Rtw== dependencies: "@noble/hashes" "~1.2.0" "@noble/secp256k1" "~1.7.0" "@scure/base" "~1.1.0" +"@scure/bip32@1.3.1": + version "1.3.1" + resolved "https://registry.npmjs.org/@scure/bip32/-/bip32-1.3.1.tgz" + integrity sha512-osvveYtyzdEVbt3OfwwXFr4P2iVBL5u1Q3q4ONBfDY/UpOuXmOlbgwc1xECEboY8wIays8Yt6onaWMUdUbfl0A== + dependencies: + "@noble/curves" "~1.1.0" + "@noble/hashes" "~1.3.1" + "@scure/base" "~1.1.0" + "@scure/bip39@1.1.1": version "1.1.1" - resolved "https://registry.yarnpkg.com/@scure/bip39/-/bip39-1.1.1.tgz#b54557b2e86214319405db819c4b6a370cf340c5" + resolved "https://registry.npmjs.org/@scure/bip39/-/bip39-1.1.1.tgz" integrity sha512-t+wDck2rVkh65Hmv280fYdVdY25J9YeEUIgn2LG1WM6gxFkGzcksoDiUkWVpVp3Oex9xGC68JU2dSbUfwZ2jPg== dependencies: "@noble/hashes" "~1.2.0" "@scure/base" "~1.1.0" +"@scure/bip39@1.2.1": + version "1.2.1" + resolved "https://registry.npmjs.org/@scure/bip39/-/bip39-1.2.1.tgz" + integrity sha512-Z3/Fsz1yr904dduJD0NpiyRHhRYHdcnyh73FZWiV+/qhWi83wNJ3NWolYqCEN+ZWsUz2TWwajJggcRE9r1zUYg== + dependencies: + "@noble/hashes" "~1.3.0" + "@scure/base" "~1.1.0" + "@sentry/core@5.30.0": version "5.30.0" - resolved "https://registry.yarnpkg.com/@sentry/core/-/core-5.30.0.tgz#6b203664f69e75106ee8b5a2fe1d717379b331f3" + resolved "https://registry.npmjs.org/@sentry/core/-/core-5.30.0.tgz" integrity sha512-TmfrII8w1PQZSZgPpUESqjB+jC6MvZJZdLtE/0hZ+SrnKhW3x5WlYLvTXZpcWePYBku7rl2wn1RZu6uT0qCTeg== dependencies: "@sentry/hub" "5.30.0" @@ -1308,7 +1403,7 @@ "@sentry/hub@5.30.0": version "5.30.0" - resolved "https://registry.yarnpkg.com/@sentry/hub/-/hub-5.30.0.tgz#2453be9b9cb903404366e198bd30c7ca74cdc100" + resolved "https://registry.npmjs.org/@sentry/hub/-/hub-5.30.0.tgz" integrity sha512-2tYrGnzb1gKz2EkMDQcfLrDTvmGcQPuWxLnJKXJvYTQDGLlEvi2tWz1VIHjunmOvJrB5aIQLhm+dcMRwFZDCqQ== dependencies: "@sentry/types" "5.30.0" @@ -1317,7 +1412,7 @@ "@sentry/minimal@5.30.0": version "5.30.0" - resolved "https://registry.yarnpkg.com/@sentry/minimal/-/minimal-5.30.0.tgz#ce3d3a6a273428e0084adcb800bc12e72d34637b" + resolved "https://registry.npmjs.org/@sentry/minimal/-/minimal-5.30.0.tgz" integrity sha512-BwWb/owZKtkDX+Sc4zCSTNcvZUq7YcH3uAVlmh/gtR9rmUvbzAA3ewLuB3myi4wWRAMEtny6+J/FN/x+2wn9Xw== dependencies: "@sentry/hub" "5.30.0" @@ -1326,7 +1421,7 @@ "@sentry/node@^5.18.1": version "5.30.0" - resolved "https://registry.yarnpkg.com/@sentry/node/-/node-5.30.0.tgz#4ca479e799b1021285d7fe12ac0858951c11cd48" + resolved "https://registry.npmjs.org/@sentry/node/-/node-5.30.0.tgz" integrity sha512-Br5oyVBF0fZo6ZS9bxbJZG4ApAjRqAnqFFurMVJJdunNb80brh7a5Qva2kjhm+U6r9NJAB5OmDyPkA1Qnt+QVg== dependencies: "@sentry/core" "5.30.0" @@ -1341,7 +1436,7 @@ "@sentry/tracing@5.30.0": version "5.30.0" - resolved "https://registry.yarnpkg.com/@sentry/tracing/-/tracing-5.30.0.tgz#501d21f00c3f3be7f7635d8710da70d9419d4e1f" + resolved "https://registry.npmjs.org/@sentry/tracing/-/tracing-5.30.0.tgz" integrity sha512-dUFowCr0AIMwiLD7Fs314Mdzcug+gBVo/+NCMyDw8tFxJkwWAKl7Qa2OZxLQ0ZHjakcj1hNKfCQJ9rhyfOl4Aw== dependencies: "@sentry/hub" "5.30.0" @@ -1352,12 +1447,12 @@ "@sentry/types@5.30.0": version "5.30.0" - resolved "https://registry.yarnpkg.com/@sentry/types/-/types-5.30.0.tgz#19709bbe12a1a0115bc790b8942917da5636f402" + resolved "https://registry.npmjs.org/@sentry/types/-/types-5.30.0.tgz" integrity sha512-R8xOqlSTZ+htqrfteCWU5Nk0CDN5ApUTvrlvBuiH1DyP6czDZ4ktbZB0hAgBlVcK0U+qpD3ag3Tqqpa5Q67rPw== "@sentry/utils@5.30.0": version "5.30.0" - resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-5.30.0.tgz#9a5bd7ccff85ccfe7856d493bffa64cabc41e980" + resolved "https://registry.npmjs.org/@sentry/utils/-/utils-5.30.0.tgz" integrity sha512-zaYmoH0NWWtvnJjC9/CBseXMtKHm/tm40sz3YfJRxeQjyzRqNQPgivpd9R/oDJCYj999mzdW382p/qi2ypjLww== dependencies: "@sentry/types" "5.30.0" @@ -1365,26 +1460,26 @@ "@sindresorhus/is@^4.0.0", "@sindresorhus/is@^4.6.0": version "4.6.0" - resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-4.6.0.tgz#3c7c9c46e678feefe7a2e5bb609d3dbd665ffb3f" + resolved "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz" integrity sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw== "@sinonjs/commons@^1.6.0", "@sinonjs/commons@^1.7.0", "@sinonjs/commons@^1.8.1": version "1.8.6" - resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.6.tgz#80c516a4dc264c2a69115e7578d62581ff455ed9" + resolved "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz" integrity sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ== dependencies: type-detect "4.0.8" "@sinonjs/fake-timers@^6.0.0", "@sinonjs/fake-timers@^6.0.1": version "6.0.1" - resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz#293674fccb3262ac782c7aadfdeca86b10c75c40" + resolved "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz" integrity sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA== dependencies: "@sinonjs/commons" "^1.7.0" "@sinonjs/samsam@^5.3.1": version "5.3.1" - resolved "https://registry.yarnpkg.com/@sinonjs/samsam/-/samsam-5.3.1.tgz#375a45fe6ed4e92fca2fb920e007c48232a6507f" + resolved "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-5.3.1.tgz" integrity sha512-1Hc0b1TtyfBu8ixF/tpfSHTVWKwCBLY4QJbkgnE7HcwyvT2xArDxb4K7dMgqRm3szI+LJbzmW/s4xxEhv6hwDg== dependencies: "@sinonjs/commons" "^1.6.0" @@ -1393,40 +1488,40 @@ "@sinonjs/text-encoding@^0.7.1": version "0.7.2" - resolved "https://registry.yarnpkg.com/@sinonjs/text-encoding/-/text-encoding-0.7.2.tgz#5981a8db18b56ba38ef0efb7d995b12aa7b51918" + resolved "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.2.tgz" integrity sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ== "@solidity-parser/parser@^0.14.0", "@solidity-parser/parser@^0.14.1": version "0.14.5" - resolved "https://registry.yarnpkg.com/@solidity-parser/parser/-/parser-0.14.5.tgz#87bc3cc7b068e08195c219c91cd8ddff5ef1a804" + resolved "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.14.5.tgz" integrity sha512-6dKnHZn7fg/iQATVEzqyUOyEidbn05q7YA2mQ9hC0MMXhhV3/JrsxmFSYZAcr7j1yUP700LLhTruvJ3MiQmjJg== dependencies: antlr4ts "^0.5.0-alpha.4" "@solidity-parser/parser@^0.15.0": version "0.15.0" - resolved "https://registry.yarnpkg.com/@solidity-parser/parser/-/parser-0.15.0.tgz#1d359be40be84f174dd616ccfadcf43346c6bf63" + resolved "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.15.0.tgz" integrity sha512-5UFJJTzWi1hgFk6aGCZ5rxG2DJkCJOzJ74qg7UkWSNCDSigW+CJLoYUb5bLiKrtI34Nr9rpFSUNHfkqtlL+N/w== dependencies: antlr4ts "^0.5.0-alpha.4" "@szmarczak/http-timer@^4.0.5": version "4.0.6" - resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-4.0.6.tgz#b4a914bb62e7c272d4e5989fe4440f812ab1d807" + resolved "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz" integrity sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w== dependencies: defer-to-connect "^2.0.0" "@szmarczak/http-timer@^5.0.1": version "5.0.1" - resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-5.0.1.tgz#c7c1bf1141cdd4751b0399c8fc7b8b664cd5be3a" + resolved "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz" integrity sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw== dependencies: defer-to-connect "^2.0.1" "@truffle/abi-utils@^0.3.7": version "0.3.7" - resolved "https://registry.yarnpkg.com/@truffle/abi-utils/-/abi-utils-0.3.7.tgz#db2fa6080af712709021ffc19eb3d75baa8c146d" + resolved "https://registry.npmjs.org/@truffle/abi-utils/-/abi-utils-0.3.7.tgz" integrity sha512-IhX+Hxu9fTEOxR+34r3Tt/AJS1gkqdEBZDzERG/9X43bLGzu5pLWzDgDBpNDqYM3lTICIg3UHfqLdUzSC7g4pg== dependencies: change-case "3.0.2" @@ -1435,12 +1530,12 @@ "@truffle/blockchain-utils@^0.1.3": version "0.1.6" - resolved "https://registry.yarnpkg.com/@truffle/blockchain-utils/-/blockchain-utils-0.1.6.tgz#7ea0a16b8135e5aeb688bf3bd014fa8f6ba45adb" + resolved "https://registry.npmjs.org/@truffle/blockchain-utils/-/blockchain-utils-0.1.6.tgz" integrity sha512-SldoNRIFSm3+HMBnSc2jFsu5TWDkCN4X6vL3wrd0t6DIeF7nD6EoPPjxwbFSoqCnkkRxMuZeL6sUx7UMJS/wSA== "@truffle/codec@^0.14.14": version "0.14.14" - resolved "https://registry.yarnpkg.com/@truffle/codec/-/codec-0.14.14.tgz#c91cdb8672f11b85272aaac6e07538fe0a96f8f8" + resolved "https://registry.npmjs.org/@truffle/codec/-/codec-0.14.14.tgz" integrity sha512-EP+iTGowElaJJgQI4Ztizmb+hYOHwOv4OiX09sjqX/v/GdmnvyWoS8RGHtERze8DoBi5cs4ZY8vlM3nVDbRv5A== dependencies: "@truffle/abi-utils" "^0.3.7" @@ -1456,7 +1551,7 @@ "@truffle/compile-common@^0.9.2": version "0.9.2" - resolved "https://registry.yarnpkg.com/@truffle/compile-common/-/compile-common-0.9.2.tgz#da8aed5c9c8da119cb4b7ee5a425d2559a99bfb7" + resolved "https://registry.npmjs.org/@truffle/compile-common/-/compile-common-0.9.2.tgz" integrity sha512-n7MF/4/dntccj44RGe3PRMD8Vk46PU8dJtzd1VLAfgokK2Y2N+SjAzDskBnmAydZVWAM315nZIUQsgnY8xoATw== dependencies: "@truffle/error" "^0.2.0" @@ -1464,7 +1559,7 @@ "@truffle/contract-schema@^3.4.7": version "3.4.11" - resolved "https://registry.yarnpkg.com/@truffle/contract-schema/-/contract-schema-3.4.11.tgz#ac5fc8be656b786c2bd5d3a2ca6faeb2949e7ff3" + resolved "https://registry.npmjs.org/@truffle/contract-schema/-/contract-schema-3.4.11.tgz" integrity sha512-wReyVZUPyU9Zy5PSCugBLG1nnruBmRAJ/gmoirQiJ9N2n+s1iGBTY49tkDqFMz3XUUE0kplfdb9YKZJlLkTWzQ== dependencies: ajv "^6.10.0" @@ -1472,7 +1567,7 @@ "@truffle/debug-utils@^6.0.22": version "6.0.45" - resolved "https://registry.yarnpkg.com/@truffle/debug-utils/-/debug-utils-6.0.45.tgz#a4df479872f82d3d314248be43114431469b8792" + resolved "https://registry.npmjs.org/@truffle/debug-utils/-/debug-utils-6.0.45.tgz" integrity sha512-yrEM8znplrVzxczzsvRlFrA56S3KSLD0XZpAQ8nDRd82Omn4Y7AaJtkAoOILjkPHeuBS1bvHm7FjKhszgOe3mg== dependencies: "@truffle/codec" "^0.14.14" @@ -1484,17 +1579,17 @@ "@truffle/error@^0.1.0": version "0.1.1" - resolved "https://registry.yarnpkg.com/@truffle/error/-/error-0.1.1.tgz#e52026ac8ca7180d83443dca73c03e07ace2a301" + resolved "https://registry.npmjs.org/@truffle/error/-/error-0.1.1.tgz" integrity sha512-sE7c9IHIGdbK4YayH4BC8i8qMjoAOeg6nUXUDZZp8wlU21/EMpaG+CLx+KqcIPyR+GSWIW3Dm0PXkr2nlggFDA== "@truffle/error@^0.2.0": version "0.2.0" - resolved "https://registry.yarnpkg.com/@truffle/error/-/error-0.2.0.tgz#65de6f03f5c041f883cc87677eecf8231428f1ab" + resolved "https://registry.npmjs.org/@truffle/error/-/error-0.2.0.tgz" integrity sha512-Fe0/z4WWb7IP2gBnv3l6zqP87Y0kSMs7oiSLakKJq17q3GUunrHSdioKuNspdggxkXIBhEQLhi8C+LJdwmHKWQ== "@truffle/interface-adapter@^0.5.16": version "0.5.28" - resolved "https://registry.yarnpkg.com/@truffle/interface-adapter/-/interface-adapter-0.5.28.tgz#814f8090dc845015d3b43c702aa90fbae3ef72e8" + resolved "https://registry.npmjs.org/@truffle/interface-adapter/-/interface-adapter-0.5.28.tgz" integrity sha512-xnjWXiOihApI+XLrs0xpw9s+av6Qvrc2lkXAfrBluuKgaJOQIdLVz6vi2Bt6oiTQAoWUkUGa0hne78mxFI2J1w== dependencies: bn.js "^5.1.3" @@ -1503,7 +1598,7 @@ "@trufflesuite/chromafi@^3.0.0": version "3.0.0" - resolved "https://registry.yarnpkg.com/@trufflesuite/chromafi/-/chromafi-3.0.0.tgz#f6956408c1af6a38a6ed1657783ce59504a1eb8b" + resolved "https://registry.npmjs.org/@trufflesuite/chromafi/-/chromafi-3.0.0.tgz" integrity sha512-oqWcOqn8nT1bwlPPfidfzS55vqcIDdpfzo3HbU9EnUmcSTX+I8z0UyUFI3tZQjByVJulbzxHxUGS3ZJPwK/GPQ== dependencies: camelcase "^4.1.0" @@ -1517,27 +1612,27 @@ "@tsconfig/node10@^1.0.7": version "1.0.9" - resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.9.tgz#df4907fc07a886922637b15e02d4cebc4c0021b2" + resolved "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz" integrity sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA== "@tsconfig/node12@^1.0.7": version "1.0.11" - resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.11.tgz#ee3def1f27d9ed66dac6e46a295cffb0152e058d" + resolved "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz" integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== "@tsconfig/node14@^1.0.0": version "1.0.3" - resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.3.tgz#e4386316284f00b98435bf40f72f75a09dabf6c1" + resolved "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz" integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== "@tsconfig/node16@^1.0.2": version "1.0.3" - resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.3.tgz#472eaab5f15c1ffdd7f8628bd4c4f753995ec79e" + resolved "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz" integrity sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ== -"@typechain/ethers-v5@^10.1.0": +"@typechain/ethers-v5@^10.1.0", "@typechain/ethers-v5@^10.2.0": version "10.2.0" - resolved "https://registry.yarnpkg.com/@typechain/ethers-v5/-/ethers-v5-10.2.0.tgz#68f5963efb5214cb2d881477228e4b5b315473e1" + resolved "https://registry.npmjs.org/@typechain/ethers-v5/-/ethers-v5-10.2.0.tgz" integrity sha512-ikaq0N/w9fABM+G01OFmU3U3dNnyRwEahkdvi9mqy1a3XwKiPZaF/lu54OcNaEWnpvEYyhhS0N7buCtLQqC92w== dependencies: lodash "^4.17.15" @@ -1545,40 +1640,40 @@ "@typechain/hardhat@^6.1.2": version "6.1.5" - resolved "https://registry.yarnpkg.com/@typechain/hardhat/-/hardhat-6.1.5.tgz#caad58a1d3e9cd88061a584eb4f4fa763d5dcad1" + resolved "https://registry.npmjs.org/@typechain/hardhat/-/hardhat-6.1.5.tgz" integrity sha512-lg7LW4qDZpxFMknp3Xool61Fg6Lays8F8TXdFGBG+MxyYcYU5795P1U2XdStuzGq9S2Dzdgh+1jGww9wvZ6r4Q== dependencies: fs-extra "^9.1.0" "@types/async-eventemitter@^0.2.1": version "0.2.1" - resolved "https://registry.yarnpkg.com/@types/async-eventemitter/-/async-eventemitter-0.2.1.tgz#f8e6280e87e8c60b2b938624b0a3530fb3e24712" + resolved "https://registry.npmjs.org/@types/async-eventemitter/-/async-eventemitter-0.2.1.tgz" integrity sha512-M2P4Ng26QbAeITiH7w1d7OxtldgfAe0wobpyJzVK/XOb0cUGKU2R4pfAhqcJBXAe2ife5ZOhSv4wk7p+ffURtg== "@types/bignumber.js@^5.0.0": version "5.0.0" - resolved "https://registry.yarnpkg.com/@types/bignumber.js/-/bignumber.js-5.0.0.tgz#d9f1a378509f3010a3255e9cc822ad0eeb4ab969" + resolved "https://registry.npmjs.org/@types/bignumber.js/-/bignumber.js-5.0.0.tgz" integrity sha512-0DH7aPGCClywOFaxxjE6UwpN2kQYe9LwuDQMv+zYA97j5GkOMo8e66LYT+a8JYU7jfmUFRZLa9KycxHDsKXJCA== dependencies: bignumber.js "*" "@types/bn.js@^4.11.3": version "4.11.6" - resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-4.11.6.tgz#c306c70d9358aaea33cd4eda092a742b9505967c" + resolved "https://registry.npmjs.org/@types/bn.js/-/bn.js-4.11.6.tgz" integrity sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg== dependencies: "@types/node" "*" "@types/bn.js@^5.1.0": version "5.1.1" - resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-5.1.1.tgz#b51e1b55920a4ca26e9285ff79936bbdec910682" + resolved "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.1.tgz" integrity sha512-qNrYbZqMx0uJAfKnKclPh+dTwK33KfLHYqtyODwd5HnXOjnkhc4qgn3BrK6RWyGZm5+sIFE7Q7Vz6QQtJB7w7g== dependencies: "@types/node" "*" "@types/cacheable-request@^6.0.1", "@types/cacheable-request@^6.0.2": version "6.0.3" - resolved "https://registry.yarnpkg.com/@types/cacheable-request/-/cacheable-request-6.0.3.tgz#a430b3260466ca7b5ca5bfd735693b36e7a9d183" + resolved "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz" integrity sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw== dependencies: "@types/http-cache-semantics" "*" @@ -1588,57 +1683,57 @@ "@types/chai-as-promised@^7.1.3": version "7.1.5" - resolved "https://registry.yarnpkg.com/@types/chai-as-promised/-/chai-as-promised-7.1.5.tgz#6e016811f6c7a64f2eed823191c3a6955094e255" + resolved "https://registry.npmjs.org/@types/chai-as-promised/-/chai-as-promised-7.1.5.tgz" integrity sha512-jStwss93SITGBwt/niYrkf2C+/1KTeZCZl1LaeezTlqppAKeoQC7jxyqYuP72sxBGKCIbw7oHgbYssIRzT5FCQ== dependencies: "@types/chai" "*" "@types/chai@*", "@types/chai@^4.2.0": version "4.3.4" - resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.3.4.tgz#e913e8175db8307d78b4e8fa690408ba6b65dee4" + resolved "https://registry.npmjs.org/@types/chai/-/chai-4.3.4.tgz" integrity sha512-KnRanxnpfpjUTqTCXslZSEdLfXExwgNxYPdiO2WGUj8+HDjFi8R3k5RVKPeSCzLjCcshCAtVO2QBbVuAV4kTnw== "@types/ci-info@^2.0.0": version "2.0.0" - resolved "https://registry.yarnpkg.com/@types/ci-info/-/ci-info-2.0.0.tgz#51848cc0f5c30c064f4b25f7f688bf35825b3971" + resolved "https://registry.npmjs.org/@types/ci-info/-/ci-info-2.0.0.tgz" integrity sha512-5R2/MHILQLDCzTuhs1j4Qqq8AaKUf7Ma4KSSkCtc12+fMs47zfa34qhto9goxpyX00tQK1zxB885VCiawZ5Qhg== "@types/concat-stream@^1.6.0": version "1.6.1" - resolved "https://registry.yarnpkg.com/@types/concat-stream/-/concat-stream-1.6.1.tgz#24bcfc101ecf68e886aaedce60dfd74b632a1b74" + resolved "https://registry.npmjs.org/@types/concat-stream/-/concat-stream-1.6.1.tgz" integrity sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA== dependencies: "@types/node" "*" "@types/debug@^4.1.4": version "4.1.7" - resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.7.tgz#7cc0ea761509124709b8b2d1090d8f6c17aadb82" + resolved "https://registry.npmjs.org/@types/debug/-/debug-4.1.7.tgz" integrity sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg== dependencies: "@types/ms" "*" "@types/find-up@^2.1.1": version "2.1.1" - resolved "https://registry.yarnpkg.com/@types/find-up/-/find-up-2.1.1.tgz#1cd2d240f1ad1f48d32346074724dc3107248a11" + resolved "https://registry.npmjs.org/@types/find-up/-/find-up-2.1.1.tgz" integrity sha512-60LC501bQRN9/3yfVaEEMd7IndaufffL56PBRAejPpUrY304Ps1jfnjNqPw5jmM5R8JHWiKBAe5IHzNcPV41AA== "@types/form-data@0.0.33": version "0.0.33" - resolved "https://registry.yarnpkg.com/@types/form-data/-/form-data-0.0.33.tgz#c9ac85b2a5fd18435b8c85d9ecb50e6d6c893ff8" + resolved "https://registry.npmjs.org/@types/form-data/-/form-data-0.0.33.tgz" integrity sha512-8BSvG1kGm83cyJITQMZSulnl6QV8jqAGreJsc5tPu1Jq0vTSOiY/k24Wx82JRpWwZSqrala6sd5rWi6aNXvqcw== dependencies: "@types/node" "*" "@types/fs-extra@^5.1.0": version "5.1.0" - resolved "https://registry.yarnpkg.com/@types/fs-extra/-/fs-extra-5.1.0.tgz#2a325ef97901504a3828718c390d34b8426a10a1" + resolved "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-5.1.0.tgz" integrity sha512-AInn5+UBFIK9FK5xc9yP5e3TQSPNNgjHByqYcj9g5elVBnDQcQL7PlO1CIRy2gWlbwK7UPYqi7vRvFA44dCmYQ== dependencies: "@types/node" "*" "@types/glob@^7.1.1": version "7.2.0" - resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.2.0.tgz#bc1b5bf3aa92f25bd5dd39f35c57361bdce5b2eb" + resolved "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz" integrity sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA== dependencies: "@types/minimatch" "*" @@ -1646,31 +1741,31 @@ "@types/http-cache-semantics@*": version "4.0.1" - resolved "https://registry.yarnpkg.com/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz#0ea7b61496902b95890dc4c3a116b60cb8dae812" + resolved "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz" integrity sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ== "@types/is-ci@^3.0.0": version "3.0.0" - resolved "https://registry.yarnpkg.com/@types/is-ci/-/is-ci-3.0.0.tgz#7e8910af6857601315592436f030aaa3ed9783c3" + resolved "https://registry.npmjs.org/@types/is-ci/-/is-ci-3.0.0.tgz" integrity sha512-Q0Op0hdWbYd1iahB+IFNQcWXFq4O0Q5MwQP7uN0souuQ4rPg1vEYcnIOfr1gY+M+6rc8FGoRaBO1mOOvL29sEQ== dependencies: ci-info "^3.1.0" "@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0": version "2.0.4" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz#8467d4b3c087805d63580480890791277ce35c44" + resolved "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz" integrity sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g== "@types/istanbul-lib-report@*": version "3.0.0" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#c14c24f18ea8190c118ee7562b7ff99a36552686" + resolved "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz" integrity sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg== dependencies: "@types/istanbul-lib-coverage" "*" "@types/istanbul-reports@^1.1.1": version "1.1.2" - resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-1.1.2.tgz#e875cc689e47bce549ec81f3df5e6f6f11cfaeb2" + resolved "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.2.tgz" integrity sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw== dependencies: "@types/istanbul-lib-coverage" "*" @@ -1678,120 +1773,115 @@ "@types/json-schema@^7.0.7", "@types/json-schema@^7.0.9": version "7.0.11" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3" + resolved "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz" integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ== "@types/json5@^0.0.29": version "0.0.29" - resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" + resolved "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz" integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== "@types/keccak@^3.0.1": version "3.0.1" - resolved "https://registry.yarnpkg.com/@types/keccak/-/keccak-3.0.1.tgz#1dfad12395f32927cf409707534dd796d57aa84c" + resolved "https://registry.npmjs.org/@types/keccak/-/keccak-3.0.1.tgz" integrity sha512-/MxAVmtyyeOvZ6dGf3ciLwFRuV5M8DRIyYNFGHYI6UyBW4/XqyO0LZw+JFMvaeY3cHItQAkELclBU1x5ank6mg== dependencies: "@types/node" "*" "@types/keyv@^3.1.4": version "3.1.4" - resolved "https://registry.yarnpkg.com/@types/keyv/-/keyv-3.1.4.tgz#3ccdb1c6751b0c7e52300bcdacd5bcbf8faa75b6" + resolved "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz" integrity sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg== dependencies: "@types/node" "*" "@types/lodash.clonedeep@^4.5.7": version "4.5.7" - resolved "https://registry.yarnpkg.com/@types/lodash.clonedeep/-/lodash.clonedeep-4.5.7.tgz#0e119f582ed6f9e6b373c04a644651763214f197" + resolved "https://registry.npmjs.org/@types/lodash.clonedeep/-/lodash.clonedeep-4.5.7.tgz" integrity sha512-ccNqkPptFIXrpVqUECi60/DFxjNKsfoQxSQsgcBJCX/fuX1wgyQieojkcWH/KpE3xzLoWN/2k+ZeGqIN3paSvw== dependencies: "@types/lodash" "*" -"@types/lodash@*": - version "4.14.194" - resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.194.tgz#b71eb6f7a0ff11bff59fc987134a093029258a76" - integrity sha512-r22s9tAS7imvBt2lyHC9B8AGwWnXaYb1tY09oyLkXDs4vArpYJzw09nj8MLx5VfciBPGIb+ZwG0ssYnEPJxn/g== - -"@types/lodash@^4.14.123": +"@types/lodash@*", "@types/lodash@^4.14.123": version "4.14.191" - resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.191.tgz#09511e7f7cba275acd8b419ddac8da9a6a79e2fa" + resolved "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.191.tgz" integrity sha512-BdZ5BCCvho3EIXw6wUCXHe7rS53AIDPLE+JzwgT+OsJk53oBfbSmZZ7CX4VaRoN78N+TJpFi9QPlfIVNmJYWxQ== "@types/lru-cache@^5.1.0": version "5.1.1" - resolved "https://registry.yarnpkg.com/@types/lru-cache/-/lru-cache-5.1.1.tgz#c48c2e27b65d2a153b19bfc1a317e30872e01eef" + resolved "https://registry.npmjs.org/@types/lru-cache/-/lru-cache-5.1.1.tgz" integrity sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw== "@types/minimatch@*": version "5.1.2" - resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-5.1.2.tgz#07508b45797cb81ec3f273011b054cd0755eddca" + resolved "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz" integrity sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA== "@types/minimist@^1.2.0": version "1.2.2" - resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.2.tgz#ee771e2ba4b3dc5b372935d549fd9617bf345b8c" + resolved "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz" integrity sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ== "@types/mocha@>=9.1.0": version "10.0.1" - resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-10.0.1.tgz#2f4f65bb08bc368ac39c96da7b2f09140b26851b" + resolved "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.1.tgz" integrity sha512-/fvYntiO1GeICvqbQ3doGDIP97vWmvFt83GKguJ6prmQM2iXZfFcq6YE8KteFyRtX2/h5Hf91BYvPodJKFYv5Q== "@types/ms@*": version "0.7.31" - resolved "https://registry.yarnpkg.com/@types/ms/-/ms-0.7.31.tgz#31b7ca6407128a3d2bbc27fe2d21b345397f6197" + resolved "https://registry.npmjs.org/@types/ms/-/ms-0.7.31.tgz" integrity sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA== -"@types/node@*": - version "18.13.0" - resolved "https://registry.yarnpkg.com/@types/node/-/node-18.13.0.tgz#0400d1e6ce87e9d3032c19eb6c58205b0d3f7850" - integrity sha512-gC3TazRzGoOnoKAhUx+Q0t8S9Tzs74z7m0ipwGpSqQrleP14hKxP4/JUeEQcD3W1/aIpnWl8pHowI7WokuZpXg== +"@types/node@*", "@types/node@^14.0.0": + version "14.18.36" + resolved "https://registry.npmjs.org/@types/node/-/node-14.18.36.tgz" + integrity sha512-FXKWbsJ6a1hIrRxv+FoukuHnGTgEzKYGi7kilfMae96AL9UNkPFNWJEEYWzdRI9ooIkbr4AKldyuSTLql06vLQ== "@types/node@^10.0.3": version "10.17.60" - resolved "https://registry.yarnpkg.com/@types/node/-/node-10.17.60.tgz#35f3d6213daed95da7f0f73e75bcc6980e90597b" + resolved "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz" integrity sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw== -"@types/node@^12.12.6", "@types/node@^12.7.1": +"@types/node@^12.12.6": version "12.20.55" - resolved "https://registry.yarnpkg.com/@types/node/-/node-12.20.55.tgz#c329cbd434c42164f846b909bd6f85b5537f6240" + resolved "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz" integrity sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ== -"@types/node@^14.0.0": - version "14.18.36" - resolved "https://registry.yarnpkg.com/@types/node/-/node-14.18.36.tgz#c414052cb9d43fab67d679d5f3c641be911f5835" - integrity sha512-FXKWbsJ6a1hIrRxv+FoukuHnGTgEzKYGi7kilfMae96AL9UNkPFNWJEEYWzdRI9ooIkbr4AKldyuSTLql06vLQ== +"@types/node@^12.7.1": + version "12.20.55" + resolved "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz" + integrity sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ== "@types/node@^8.0.0": version "8.10.66" - resolved "https://registry.yarnpkg.com/@types/node/-/node-8.10.66.tgz#dd035d409df322acc83dff62a602f12a5783bbb3" + resolved "https://registry.npmjs.org/@types/node/-/node-8.10.66.tgz" integrity sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw== "@types/normalize-package-data@^2.4.0": version "2.4.1" - resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz#d3357479a0fdfdd5907fe67e17e0a85c906e1301" + resolved "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz" integrity sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw== "@types/pbkdf2@^3.0.0": version "3.1.0" - resolved "https://registry.yarnpkg.com/@types/pbkdf2/-/pbkdf2-3.1.0.tgz#039a0e9b67da0cdc4ee5dab865caa6b267bb66b1" + resolved "https://registry.npmjs.org/@types/pbkdf2/-/pbkdf2-3.1.0.tgz" integrity sha512-Cf63Rv7jCQ0LaL8tNXmEyqTHuIJxRdlS5vMh1mj5voN4+QFhVZnlZruezqpWYDiJ8UTzhP0VmeLXCmBk66YrMQ== dependencies: "@types/node" "*" "@types/prettier@^2.1.1": version "2.7.2" - resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.7.2.tgz#6c2324641cc4ba050a8c710b2b251b377581fbf0" + resolved "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.2.tgz" integrity sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg== "@types/qs@^6.2.31", "@types/qs@^6.5.3": version "6.9.7" - resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.7.tgz#63bb7d067db107cc1e457c303bc25d511febf6cb" + resolved "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz" integrity sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw== "@types/readable-stream@^2.3.13": version "2.3.15" - resolved "https://registry.yarnpkg.com/@types/readable-stream/-/readable-stream-2.3.15.tgz#3d79c9ceb1b6a57d5f6e6976f489b9b5384321ae" + resolved "https://registry.npmjs.org/@types/readable-stream/-/readable-stream-2.3.15.tgz" integrity sha512-oM5JSKQCcICF1wvGgmecmHldZ48OZamtMxcGGVICOJA8o8cahXC1zEVAif8iwoc5j8etxFaRFnf095+CDsuoFQ== dependencies: "@types/node" "*" @@ -1799,87 +1889,80 @@ "@types/resolve@^1.17.1": version "1.20.2" - resolved "https://registry.yarnpkg.com/@types/resolve/-/resolve-1.20.2.tgz#97d26e00cd4a0423b4af620abecf3e6f442b7975" + resolved "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.2.tgz" integrity sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q== "@types/responselike@^1.0.0": version "1.0.0" - resolved "https://registry.yarnpkg.com/@types/responselike/-/responselike-1.0.0.tgz#251f4fe7d154d2bad125abe1b429b23afd262e29" + resolved "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz" integrity sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA== dependencies: "@types/node" "*" "@types/secp256k1@^4.0.1": version "4.0.3" - resolved "https://registry.yarnpkg.com/@types/secp256k1/-/secp256k1-4.0.3.tgz#1b8e55d8e00f08ee7220b4d59a6abe89c37a901c" + resolved "https://registry.npmjs.org/@types/secp256k1/-/secp256k1-4.0.3.tgz" integrity sha512-Da66lEIFeIz9ltsdMZcpQvmrmmoqrfju8pm1BH8WbYjZSwUgCwXLb9C+9XYogwBITnbsSaMdVPb2ekf7TV+03w== dependencies: "@types/node" "*" "@types/semver@^6.0.0", "@types/semver@^6.0.2": version "6.2.3" - resolved "https://registry.yarnpkg.com/@types/semver/-/semver-6.2.3.tgz#5798ecf1bec94eaa64db39ee52808ec0693315aa" + resolved "https://registry.npmjs.org/@types/semver/-/semver-6.2.3.tgz" integrity sha512-KQf+QAMWKMrtBMsB8/24w53tEsxllMj6TuA80TT/5igJalLI/zm0L3oXRbIAl4Ohfc85gyHX/jhMwsVkmhLU4A== "@types/semver@^7.3.12": version "7.3.13" - resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.3.13.tgz#da4bfd73f49bd541d28920ab0e2bf0ee80f71c91" + resolved "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz" integrity sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw== "@types/sinon-chai@^3.2.9": version "3.2.9" - resolved "https://registry.yarnpkg.com/@types/sinon-chai/-/sinon-chai-3.2.9.tgz#71feb938574bbadcb176c68e5ff1a6014c5e69d4" + resolved "https://registry.npmjs.org/@types/sinon-chai/-/sinon-chai-3.2.9.tgz" integrity sha512-/19t63pFYU0ikrdbXKBWj9PCdnKyTd0Qkz0X91Ta081cYsq90OxYdcWwK/dwEoDa6dtXgj2HJfmzgq+QZTHdmQ== dependencies: "@types/chai" "*" "@types/sinon" "*" -"@types/sinon@*": - version "10.0.14" - resolved "https://registry.yarnpkg.com/@types/sinon/-/sinon-10.0.14.tgz#6bd18b088ea5ef1e5153fa37d0b68e91eff09e22" - integrity sha512-mn72up6cjaMyMuaPaa/AwKf6WtsSRysQC7wxFkCm1XcOKXPM1z+5Y4H5wjIVBz4gdAkjvZxVVfjA6ba1nHr5WQ== - dependencies: - "@types/sinonjs__fake-timers" "*" - -"@types/sinon@^9.0.8": +"@types/sinon@*", "@types/sinon@^9.0.8": version "9.0.11" - resolved "https://registry.yarnpkg.com/@types/sinon/-/sinon-9.0.11.tgz#7af202dda5253a847b511c929d8b6dda170562eb" + resolved "https://registry.npmjs.org/@types/sinon/-/sinon-9.0.11.tgz" integrity sha512-PwP4UY33SeeVKodNE37ZlOsR9cReypbMJOhZ7BVE0lB+Hix3efCOxiJWiE5Ia+yL9Cn2Ch72EjFTRze8RZsNtg== dependencies: "@types/sinonjs__fake-timers" "*" "@types/sinonjs__fake-timers@*": version "8.1.2" - resolved "https://registry.yarnpkg.com/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.2.tgz#bf2e02a3dbd4aecaf95942ecd99b7402e03fad5e" + resolved "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.2.tgz" integrity sha512-9GcLXF0/v3t80caGs5p2rRfkB+a8VBGLJZVih6CNFkx8IZ994wiKKLSRs9nuFwk1HevWs/1mnUmkApGrSGsShA== "@types/uuid@^8.3.1": version "8.3.4" - resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-8.3.4.tgz#bd86a43617df0594787d38b735f55c805becf1bc" + resolved "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.4.tgz" integrity sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw== "@types/ws@^7.2.1": version "7.4.7" - resolved "https://registry.yarnpkg.com/@types/ws/-/ws-7.4.7.tgz#f7c390a36f7a0679aa69de2d501319f4f8d9b702" + resolved "https://registry.npmjs.org/@types/ws/-/ws-7.4.7.tgz" integrity sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww== dependencies: "@types/node" "*" "@types/yargs-parser@*": version "21.0.0" - resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.0.tgz#0c60e537fa790f5f9472ed2776c2b71ec117351b" + resolved "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz" integrity sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA== "@types/yargs@^13.0.0": version "13.0.12" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-13.0.12.tgz#d895a88c703b78af0465a9de88aa92c61430b092" + resolved "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.12.tgz" integrity sha512-qCxJE1qgz2y0hA4pIxjBR+PelCH0U5CK1XJXFwCNqfmliatKp47UCXXE9Dyk1OXBDLvsCF57TqQEJaeLfDYEOQ== dependencies: "@types/yargs-parser" "*" "@typescript-eslint/eslint-plugin@4.29.2": version "4.29.2" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.29.2.tgz#f54dc0a32b8f61c6024ab8755da05363b733838d" + resolved "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.29.2.tgz" integrity sha512-x4EMgn4BTfVd9+Z+r+6rmWxoAzBaapt4QFqE+d8L8sUtYZYLDTK6VG/y/SMMWA5t1/BVU5Kf+20rX4PtWzUYZg== dependencies: "@typescript-eslint/experimental-utils" "4.29.2" @@ -1892,7 +1975,7 @@ "@typescript-eslint/eslint-plugin@5.53.0": version "5.53.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.53.0.tgz#24b8b4a952f3c615fe070e3c461dd852b5056734" + resolved "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.53.0.tgz" integrity sha512-alFpFWNucPLdUOySmXCJpzr6HKC3bu7XooShWM+3w/EL6J2HIoB2PFxpLnq4JauWVk6DiVeNKzQlFEaE+X9sGw== dependencies: "@typescript-eslint/scope-manager" "5.53.0" @@ -1908,7 +1991,7 @@ "@typescript-eslint/experimental-utils@4.29.2": version "4.29.2" - resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-4.29.2.tgz#5f67fb5c5757ef2cb3be64817468ba35c9d4e3b7" + resolved "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.29.2.tgz" integrity sha512-P6mn4pqObhftBBPAv4GQtEK7Yos1fz/MlpT7+YjH9fTxZcALbiiPKuSIfYP/j13CeOjfq8/fr9Thr2glM9ub7A== dependencies: "@types/json-schema" "^7.0.7" @@ -1918,9 +2001,9 @@ eslint-scope "^5.1.1" eslint-utils "^3.0.0" -"@typescript-eslint/parser@4.29.2": +"@typescript-eslint/parser@^4.0.0", "@typescript-eslint/parser@4.29.2": version "4.29.2" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-4.29.2.tgz#1c7744f4c27aeb74610c955d3dce9250e95c370a" + resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.29.2.tgz" integrity sha512-WQ6BPf+lNuwteUuyk1jD/aHKqMQ9jrdCn7Gxt9vvBnzbpj7aWEf+aZsJ1zvTjx5zFxGCt000lsbD9tQPEL8u6g== dependencies: "@typescript-eslint/scope-manager" "4.29.2" @@ -1928,9 +2011,9 @@ "@typescript-eslint/typescript-estree" "4.29.2" debug "^4.3.1" -"@typescript-eslint/parser@5.53.0": +"@typescript-eslint/parser@^5.0.0", "@typescript-eslint/parser@5.53.0": version "5.53.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.53.0.tgz#a1f2b9ae73b83181098747e96683f1b249ecab52" + resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.53.0.tgz" integrity sha512-MKBw9i0DLYlmdOb3Oq/526+al20AJZpANdT6Ct9ffxcV8nKCHz63t/S0IhlTFNsBIHJv+GY5SFJ0XfqVeydQrQ== dependencies: "@typescript-eslint/scope-manager" "5.53.0" @@ -1940,7 +2023,7 @@ "@typescript-eslint/scope-manager@4.29.2": version "4.29.2" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-4.29.2.tgz#442b0f029d981fa402942715b1718ac7fcd5aa1b" + resolved "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.29.2.tgz" integrity sha512-mfHmvlQxmfkU8D55CkZO2sQOueTxLqGvzV+mG6S/6fIunDiD2ouwsAoiYCZYDDK73QCibYjIZmGhpvKwAB5BOA== dependencies: "@typescript-eslint/types" "4.29.2" @@ -1948,7 +2031,7 @@ "@typescript-eslint/scope-manager@5.53.0": version "5.53.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.53.0.tgz#42b54f280e33c82939275a42649701024f3fafef" + resolved "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.53.0.tgz" integrity sha512-Opy3dqNsp/9kBBeCPhkCNR7fmdSQqA+47r21hr9a14Bx0xnkElEQmhoHga+VoaoQ6uDHjDKmQPIYcUcKJifS7w== dependencies: "@typescript-eslint/types" "5.53.0" @@ -1956,7 +2039,7 @@ "@typescript-eslint/type-utils@5.53.0": version "5.53.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.53.0.tgz#41665449935ba9b4e6a1ba6e2a3f4b2c31d6cf97" + resolved "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.53.0.tgz" integrity sha512-HO2hh0fmtqNLzTAme/KnND5uFNwbsdYhCZghK2SoxGp3Ifn2emv+hi0PBUjzzSh0dstUIFqOj3bp0AwQlK4OWw== dependencies: "@typescript-eslint/typescript-estree" "5.53.0" @@ -1966,17 +2049,17 @@ "@typescript-eslint/types@4.29.2": version "4.29.2" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-4.29.2.tgz#fc0489c6b89773f99109fb0aa0aaddff21f52fcd" + resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.29.2.tgz" integrity sha512-K6ApnEXId+WTGxqnda8z4LhNMa/pZmbTFkDxEBLQAbhLZL50DjeY0VIDCml/0Y3FlcbqXZrABqrcKxq+n0LwzQ== "@typescript-eslint/types@5.53.0": version "5.53.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.53.0.tgz#f79eca62b97e518ee124086a21a24f3be267026f" + resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.53.0.tgz" integrity sha512-5kcDL9ZUIP756K6+QOAfPkigJmCPHcLN7Zjdz76lQWWDdzfOhZDTj1irs6gPBKiXx5/6O3L0+AvupAut3z7D2A== "@typescript-eslint/typescript-estree@4.29.2": version "4.29.2" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-4.29.2.tgz#a0ea8b98b274adbb2577100ba545ddf8bf7dc219" + resolved "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.29.2.tgz" integrity sha512-TJ0/hEnYxapYn9SGn3dCnETO0r+MjaxtlWZ2xU+EvytF0g4CqTpZL48SqSNn2hXsPolnewF30pdzR9a5Lj3DNg== dependencies: "@typescript-eslint/types" "4.29.2" @@ -1989,7 +2072,7 @@ "@typescript-eslint/typescript-estree@5.53.0": version "5.53.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.53.0.tgz#bc651dc28cf18ab248ecd18a4c886c744aebd690" + resolved "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.53.0.tgz" integrity sha512-eKmipH7QyScpHSkhbptBBYh9v8FxtngLquq292YTEQ1pxVs39yFBlLC1xeIZcPPz1RWGqb7YgERJRGkjw8ZV7w== dependencies: "@typescript-eslint/types" "5.53.0" @@ -2002,7 +2085,7 @@ "@typescript-eslint/utils@5.53.0": version "5.53.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.53.0.tgz#e55eaad9d6fffa120575ffaa530c7e802f13bce8" + resolved "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.53.0.tgz" integrity sha512-VUOOtPv27UNWLxFwQK/8+7kvxVC+hPHNsJjzlJyotlaHjLSIgOCKj9I0DBUjwOOA64qjBwx5afAPjksqOxMO0g== dependencies: "@types/json-schema" "^7.0.9" @@ -2016,7 +2099,7 @@ "@typescript-eslint/visitor-keys@4.29.2": version "4.29.2" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-4.29.2.tgz#d2da7341f3519486f50655159f4e5ecdcb2cd1df" + resolved "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.29.2.tgz" integrity sha512-bDgJLQ86oWHJoZ1ai4TZdgXzJxsea3Ee9u9wsTAvjChdj2WLcVsgWYAPeY7RQMn16tKrlQaBnpKv7KBfs4EQag== dependencies: "@typescript-eslint/types" "4.29.2" @@ -2024,37 +2107,32 @@ "@typescript-eslint/visitor-keys@5.53.0": version "5.53.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.53.0.tgz#8a5126623937cdd909c30d8fa72f79fa56cc1a9f" + resolved "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.53.0.tgz" integrity sha512-JqNLnX3leaHFZEN0gCh81sIvgrp/2GOACZNgO4+Tkf64u51kTpAyWFOY8XHx8XuXr3N2C9zgPPHtcpMg6z1g0w== dependencies: "@typescript-eslint/types" "5.53.0" eslint-visitor-keys "^3.3.0" -abbrev@1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" - integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== - -abbrev@1.0.x: +abbrev@1, abbrev@1.0.x: version "1.0.9" - resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.0.9.tgz#91b4792588a7738c25f35dd6f63752a2f8776135" + resolved "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz" integrity sha512-LEyx4aLEC3x6T0UguF6YILf+ntvmOaWsVfENmIW0E9H09vKlLDGelMjjSm0jkDHALj8A8quZ/HapKNigzwge+Q== abort-controller@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392" + resolved "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz" integrity sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg== dependencies: event-target-shim "^5.0.0" abortcontroller-polyfill@^1.7.3: version "1.7.5" - resolved "https://registry.yarnpkg.com/abortcontroller-polyfill/-/abortcontroller-polyfill-1.7.5.tgz#6738495f4e901fbb57b6c0611d0c75f76c485bed" + resolved "https://registry.npmjs.org/abortcontroller-polyfill/-/abortcontroller-polyfill-1.7.5.tgz" integrity sha512-JMJ5soJWP18htbbxJjG7bG6yuI6pRhgJ0scHHTfkUjf6wjP912xZWvM+A4sJK3gqd9E8fcPbDnOefbA9Th/FIQ== abstract-level@^1.0.0, abstract-level@^1.0.2, abstract-level@^1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/abstract-level/-/abstract-level-1.0.3.tgz#78a67d3d84da55ee15201486ab44c09560070741" + resolved "https://registry.npmjs.org/abstract-level/-/abstract-level-1.0.3.tgz" integrity sha512-t6jv+xHy+VYwc4xqZMn2Pa9DjcdzvzZmQGRjTFc8spIbRGHgBrEKbPq+rYXc7CCo0lxgYvSgKVg9qZAhpVQSjA== dependencies: buffer "^6.0.3" @@ -2067,7 +2145,7 @@ abstract-level@^1.0.0, abstract-level@^1.0.2, abstract-level@^1.0.3: accepts@~1.3.8: version "1.3.8" - resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" + resolved "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz" integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== dependencies: mime-types "~2.1.34" @@ -2075,49 +2153,49 @@ accepts@~1.3.8: acorn-jsx@^5.3.1: version "5.3.2" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" + resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== acorn-walk@^8.1.1: version "8.2.0" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" + resolved "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz" integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== -acorn@^7.4.0: +"acorn@^6.0.0 || ^7.0.0 || ^8.0.0", acorn@^7.4.0: version "7.4.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" + resolved "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz" integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== acorn@^8.4.1: version "8.8.2" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.2.tgz#1b2f25db02af965399b9776b0c2c391276d37c4a" + resolved "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz" integrity sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw== address@^1.0.1: version "1.2.2" - resolved "https://registry.yarnpkg.com/address/-/address-1.2.2.tgz#2b5248dac5485a6390532c6a517fda2e3faac89e" + resolved "https://registry.npmjs.org/address/-/address-1.2.2.tgz" integrity sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA== adm-zip@^0.4.16: version "0.4.16" - resolved "https://registry.yarnpkg.com/adm-zip/-/adm-zip-0.4.16.tgz#cf4c508fdffab02c269cbc7f471a875f05570365" + resolved "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.16.tgz" integrity sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg== aes-js@3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/aes-js/-/aes-js-3.0.0.tgz#e21df10ad6c2053295bcbb8dab40b09dbea87e4d" + resolved "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz" integrity sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw== agent-base@6: version "6.0.2" - resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" + resolved "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz" integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== dependencies: debug "4" aggregate-error@^3.0.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" + resolved "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz" integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== dependencies: clean-stack "^2.0.0" @@ -2125,7 +2203,7 @@ aggregate-error@^3.0.0: ajv@^5.1.1: version "5.5.2" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965" + resolved "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz" integrity sha512-Ajr4IcMXq/2QmMkEmSvxqfLN5zGmJ92gHXAeOXq1OekoH2rfDNsgdDoL2f7QaRCy7G/E6TpxBVdRuNraMztGHw== dependencies: co "^4.6.0" @@ -2135,7 +2213,7 @@ ajv@^5.1.1: ajv@^6.10.0, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.12.6: version "6.12.6" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== dependencies: fast-deep-equal "^3.1.1" @@ -2145,7 +2223,7 @@ ajv@^6.10.0, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.12.6: ajv@^8.0.1: version "8.12.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.12.0.tgz#d1a0527323e22f53562c567c00991577dfbe19d1" + resolved "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz" integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== dependencies: fast-deep-equal "^3.1.1" @@ -2155,88 +2233,95 @@ ajv@^8.0.1: amdefine@>=0.0.4: version "1.0.1" - resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" + resolved "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz" integrity sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg== +ansi-colors@^4.1.1, ansi-colors@^4.1.3: + version "4.1.3" + resolved "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz" + integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== + ansi-colors@3.2.3: version "3.2.3" - resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.3.tgz#57d35b8686e851e2cc04c403f1c00203976a1813" + resolved "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz" integrity sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw== ansi-colors@4.1.1: version "4.1.1" - resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" + resolved "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz" integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== -ansi-colors@^4.1.1, ansi-colors@^4.1.3: - version "4.1.3" - resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.3.tgz#37611340eb2243e70cc604cad35d63270d48781b" - integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== - ansi-escapes@^4.3.0: version "4.3.2" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" + resolved "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz" integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== dependencies: type-fest "^0.21.3" ansi-regex@^2.0.0: version "2.1.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz" integrity sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA== ansi-regex@^3.0.0: version "3.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.1.tgz#123d6479e92ad45ad897d4054e3c7ca7db4944e1" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz" integrity sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw== ansi-regex@^4.1.0: version "4.1.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.1.tgz#164daac87ab2d6f6db3a29875e2d1766582dabed" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz" integrity sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g== ansi-regex@^5.0.1: version "5.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== ansi-styles@^3.2.0, ansi-styles@^3.2.1: version "3.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz" integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== dependencies: color-convert "^1.9.0" -ansi-styles@^4.0.0, ansi-styles@^4.1.0: +ansi-styles@^4.0.0: + version "4.3.0" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +ansi-styles@^4.1.0: version "4.3.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== dependencies: color-convert "^2.0.1" ansi-styles@~1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-1.0.0.tgz#cb102df1c56f5123eab8b67cd7b98027a0279178" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.0.0.tgz" integrity sha512-3iF4FIKdxaVYT3JqQuY3Wat/T2t7TRbbQ94Fu50ZUCbLy4TFbTzr90NOHQodQkNqmeEGCw8WbeP78WNi6SKYUA== -antlr4@4.7.1, antlr4@^4.11.0, antlr4@~4.8.0: +antlr4@^4.11.0, antlr4@~4.8.0: version "4.7.1" - resolved "https://registry.yarnpkg.com/antlr4/-/antlr4-4.7.1.tgz#69984014f096e9e775f53dd9744bf994d8959773" + resolved "https://registry.npmjs.org/antlr4/-/antlr4-4.7.1.tgz" integrity sha512-haHyTW7Y9joE5MVs37P2lNYfU2RWBLfcRDD8OWldcdZm5TiCE91B5Xl1oWSwiDUSd4rlExpt2pu1fksYQjRBYQ== antlr4ts@^0.5.0-alpha.4: version "0.5.0-alpha.4" - resolved "https://registry.yarnpkg.com/antlr4ts/-/antlr4ts-0.5.0-alpha.4.tgz#71702865a87478ed0b40c0709f422cf14d51652a" + resolved "https://registry.npmjs.org/antlr4ts/-/antlr4ts-0.5.0-alpha.4.tgz" integrity sha512-WPQDt1B74OfPv/IMS2ekXAKkTZIHl88uMetg6q3OTqgFxZ/dxDXI0EWLyZid/1Pe6hTftyg5N7gel5wNAGxXyQ== any-promise@^1.0.0: version "1.3.0" - resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" + resolved "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz" integrity sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A== anymatch@~3.1.1, anymatch@~3.1.2: version "3.1.3" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" + resolved "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz" integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== dependencies: normalize-path "^3.0.0" @@ -2244,51 +2329,56 @@ anymatch@~3.1.1, anymatch@~3.1.2: append-transform@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/append-transform/-/append-transform-2.0.0.tgz#99d9d29c7b38391e6f428d28ce136551f0b77e12" + resolved "https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz" integrity sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg== dependencies: default-require-extensions "^3.0.0" archy@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/archy/-/archy-1.0.0.tgz#f9c8c13757cc1dd7bc379ac77b2c62a5c2868c40" + resolved "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz" integrity sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw== arg@^4.1.0: version "4.1.3" - resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" + resolved "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz" integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== argparse@^1.0.7: version "1.0.10" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + resolved "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz" integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== dependencies: sprintf-js "~1.0.2" argparse@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + resolved "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== array-back@^3.0.1, array-back@^3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/array-back/-/array-back-3.1.0.tgz#b8859d7a508871c9a7b2cf42f99428f65e96bfb0" + resolved "https://registry.npmjs.org/array-back/-/array-back-3.1.0.tgz" integrity sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q== -array-back@^4.0.1, array-back@^4.0.2: +array-back@^4.0.1: + version "4.0.2" + resolved "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz" + integrity sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg== + +array-back@^4.0.2: version "4.0.2" - resolved "https://registry.yarnpkg.com/array-back/-/array-back-4.0.2.tgz#8004e999a6274586beeb27342168652fdb89fa1e" + resolved "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz" integrity sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg== array-flatten@1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" + resolved "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz" integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== array-includes@^3.1.3: version "3.1.6" - resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.6.tgz#9e9e720e194f198266ba9e18c29e6a9b0e4b225f" + resolved "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz" integrity sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw== dependencies: call-bind "^1.0.2" @@ -2299,17 +2389,17 @@ array-includes@^3.1.3: array-union@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" + resolved "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz" integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== array-uniq@1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" + resolved "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz" integrity sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q== array.prototype.flat@^1.2.3, array.prototype.flat@^1.2.4: version "1.3.1" - resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz#ffc6576a7ca3efc2f46a143b9d1dda9b4b3cf5e2" + resolved "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz" integrity sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA== dependencies: call-bind "^1.0.2" @@ -2319,7 +2409,7 @@ array.prototype.flat@^1.2.3, array.prototype.flat@^1.2.4: array.prototype.reduce@^1.0.5: version "1.0.5" - resolved "https://registry.yarnpkg.com/array.prototype.reduce/-/array.prototype.reduce-1.0.5.tgz#6b20b0daa9d9734dd6bc7ea66b5bbce395471eac" + resolved "https://registry.npmjs.org/array.prototype.reduce/-/array.prototype.reduce-1.0.5.tgz" integrity sha512-kDdugMl7id9COE8R7MHF5jWk7Dqt/fs4Pv+JXoICnYwqpjjjbUurz6w5fT5IG6brLdJhv6/VoHB0H7oyIBXd+Q== dependencies: call-bind "^1.0.2" @@ -2330,196 +2420,215 @@ array.prototype.reduce@^1.0.5: arrify@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" + resolved "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz" integrity sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA== asap@~2.0.6: version "2.0.6" - resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" + resolved "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz" integrity sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA== asn1@~0.2.3: version "0.2.6" - resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.6.tgz#0d3a7bb6e64e02a90c0303b31f292868ea09a08d" + resolved "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz" integrity sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ== dependencies: safer-buffer "~2.1.0" -assert-plus@1.0.0, assert-plus@^1.0.0: +assert-plus@^1.0.0, assert-plus@1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + resolved "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz" integrity sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw== assertion-error@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" + resolved "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz" integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw== ast-parents@^0.0.1: version "0.0.1" - resolved "https://registry.yarnpkg.com/ast-parents/-/ast-parents-0.0.1.tgz#508fd0f05d0c48775d9eccda2e174423261e8dd3" + resolved "https://registry.npmjs.org/ast-parents/-/ast-parents-0.0.1.tgz" integrity sha512-XHusKxKz3zoYk1ic8Un640joHbFMhbqneyoZfoKnEGtf2ey9Uh/IdpcQplODdO/kENaMIWsD0nJm4+wX3UNLHA== astral-regex@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" + resolved "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz" integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== async-limiter@~1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" + resolved "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz" integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== async@1.x: version "1.5.2" - resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" + resolved "https://registry.npmjs.org/async/-/async-1.5.2.tgz" integrity sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w== asynckit@^0.4.0: version "0.4.0" - resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + resolved "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz" integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== at-least-node@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" + resolved "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz" integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== available-typed-arrays@^1.0.5: version "1.0.5" - resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" + resolved "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz" integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== aws-sign2@~0.7.0: version "0.7.0" - resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" + resolved "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz" integrity sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA== aws4@^1.8.0: version "1.12.0" - resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.12.0.tgz#ce1c9d143389679e253b314241ea9aa5cec980d3" + resolved "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz" integrity sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg== axios@^0.21.1: version "0.21.4" - resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.4.tgz#c67b90dc0568e5c1cf2b0b858c43ba28e2eda575" + resolved "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz" integrity sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg== dependencies: follow-redirects "^1.14.0" balanced-match@^1.0.0: version "1.0.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== base-x@^3.0.2, base-x@^3.0.8: version "3.0.9" - resolved "https://registry.yarnpkg.com/base-x/-/base-x-3.0.9.tgz#6349aaabb58526332de9f60995e548a53fe21320" + resolved "https://registry.npmjs.org/base-x/-/base-x-3.0.9.tgz" integrity sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ== dependencies: safe-buffer "^5.0.1" base64-js@^1.3.1: version "1.5.1" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + resolved "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== bcrypt-pbkdf@^1.0.0: version "1.0.2" - resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" + resolved "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz" integrity sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w== dependencies: tweetnacl "^0.14.3" -bech32@1.1.4, bech32@^1.1.3: +bech32@^1.1.3, bech32@1.1.4: version "1.1.4" - resolved "https://registry.yarnpkg.com/bech32/-/bech32-1.1.4.tgz#e38c9f37bf179b8eb16ae3a772b40c356d4832e9" + resolved "https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz" integrity sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ== better-path-resolve@1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/better-path-resolve/-/better-path-resolve-1.0.0.tgz#13a35a1104cdd48a7b74bf8758f96a1ee613f99d" + resolved "https://registry.npmjs.org/better-path-resolve/-/better-path-resolve-1.0.0.tgz" integrity sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g== dependencies: is-windows "^1.0.0" big-integer@1.6.36: version "1.6.36" - resolved "https://registry.yarnpkg.com/big-integer/-/big-integer-1.6.36.tgz#78631076265d4ae3555c04f85e7d9d2f3a071a36" + resolved "https://registry.npmjs.org/big-integer/-/big-integer-1.6.36.tgz" integrity sha512-t70bfa7HYEA1D9idDbmuv7YbsbVkQ+Hp+8KFSul4aE5e/i1bjCNIRYJZlA8Q8p0r9T8cF/RVvwUgRA//FydEyg== big.js@^6.0.3: version "6.2.1" - resolved "https://registry.yarnpkg.com/big.js/-/big.js-6.2.1.tgz#7205ce763efb17c2e41f26f121c420c6a7c2744f" + resolved "https://registry.npmjs.org/big.js/-/big.js-6.2.1.tgz" integrity sha512-bCtHMwL9LeDIozFn+oNhhFoq+yQ3BNdnsLSASUxLciOb1vgvpHsIO1dsENiGMgbb4SkP5TrzWzRiLddn8ahVOQ== bigint-crypto-utils@^3.0.23: version "3.1.8" - resolved "https://registry.yarnpkg.com/bigint-crypto-utils/-/bigint-crypto-utils-3.1.8.tgz#e2e0f40cf45488f9d7f0e32ff84152aa73819d5d" + resolved "https://registry.npmjs.org/bigint-crypto-utils/-/bigint-crypto-utils-3.1.8.tgz" integrity sha512-+VMV9Laq8pXLBKKKK49nOoq9bfR3j7NNQAtbA617a4nw9bVLo8rsqkKMBgM2AJWlNX9fEIyYaYX+d0laqYV4tw== dependencies: bigint-mod-arith "^3.1.0" bigint-mod-arith@^3.1.0: version "3.1.2" - resolved "https://registry.yarnpkg.com/bigint-mod-arith/-/bigint-mod-arith-3.1.2.tgz#658e416bc593a463d97b59766226d0a3021a76b1" + resolved "https://registry.npmjs.org/bigint-mod-arith/-/bigint-mod-arith-3.1.2.tgz" integrity sha512-nx8J8bBeiRR+NlsROFH9jHswW5HO8mgfOSqW0AmjicMMvaONDa8AO+5ViKDUUNytBPWiwfvZP4/Bj4Y3lUfvgQ== bignumber.js@*, bignumber.js@^9.0.0, bignumber.js@^9.0.1, bignumber.js@^9.0.2: version "9.1.1" - resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.1.1.tgz#c4df7dc496bd849d4c9464344c1aa74228b4dac6" + resolved "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.1.tgz" integrity sha512-pHm4LsMJ6lzgNGVfZHjMoO8sdoRhOzOH4MLmY65Jg70bpxCKu5iOHNJyfF6OyvYw7t8Fpf35RuzUyqnQsj8Vig== bignumber.js@^7.2.1: version "7.2.1" - resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-7.2.1.tgz#80c048759d826800807c4bfd521e50edbba57a5f" + resolved "https://registry.npmjs.org/bignumber.js/-/bignumber.js-7.2.1.tgz" integrity sha512-S4XzBk5sMB+Rcb/LNcpzXr57VRTxgAvaAEDAl1AwRx27j00hT84O6OkteE7u8UB3NuaaygCRrEpqox4uDOrbdQ== "bignumber.js@git+https://github.com/frozeman/bignumber.js-nolookahead.git": version "2.0.7" - resolved "git+https://github.com/frozeman/bignumber.js-nolookahead.git#57692b3ecfc98bbdd6b3a516cb2353652ea49934" + resolved "git+ssh://git@github.com/frozeman/bignumber.js-nolookahead.git" + integrity sha512-iDWOljwm6dBLAiFrlz2dn/XtjjjYtUL56CW8OpqhbjFzNAgfelX5AaDH1OA0iZ8JBe0y+/Ew4dzrOedvJfUPmg== binary-extensions@^2.0.0: version "2.2.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" + resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz" integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== blakejs@^1.1.0: version "1.2.1" - resolved "https://registry.yarnpkg.com/blakejs/-/blakejs-1.2.1.tgz#5057e4206eadb4a97f7c0b6e197a505042fc3814" + resolved "https://registry.npmjs.org/blakejs/-/blakejs-1.2.1.tgz" integrity sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ== bluebird@^3.4.7, bluebird@^3.5.0, bluebird@^3.5.1, bluebird@^3.5.2: version "3.7.2" - resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" + resolved "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz" integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== bn-str-256@^1.9.1: version "1.9.1" - resolved "https://registry.yarnpkg.com/bn-str-256/-/bn-str-256-1.9.1.tgz#898cebee70a3edc3968f97b4cebbc4771025aa82" + resolved "https://registry.npmjs.org/bn-str-256/-/bn-str-256-1.9.1.tgz" integrity sha512-u3muv3WO5sYv9nUQsPnDGLg731yNt/MOlKPK5pmBVqClcl7tY97tyfKxw8ed44HVrpi+7dkgJgQpbXP47a3GoQ== dependencies: decimal.js-light "^2.5.0" lodash "^4.17.11" -bn.js@4.11.6: - version "4.11.6" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.6.tgz#53344adb14617a13f6e8dd2ce28905d1c0ba3215" - integrity sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA== +bn.js@^4.11.0: + version "4.12.0" + resolved "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz" + integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== + +bn.js@^4.11.1, bn.js@^4.4.0: + version "4.11.9" -bn.js@^4.11.0, bn.js@^4.11.6, bn.js@^4.11.8, bn.js@^4.11.9: +bn.js@^4.11.6: version "4.12.0" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" + resolved "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz" + integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== + +bn.js@^4.11.8: + version "4.12.0" + resolved "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz" + integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== + +bn.js@^4.11.9: + version "4.12.0" + resolved "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz" integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== bn.js@^5.1.0, bn.js@^5.1.2, bn.js@^5.1.3, bn.js@^5.2.0, bn.js@^5.2.1: version "5.2.1" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.1.tgz#0bc527a6a0d18d0aa8d5b0538ce4a77dccfa7b70" + resolved "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz" integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ== -body-parser@1.20.1, body-parser@^1.16.0: +bn.js@4.11.6: + version "4.11.6" + resolved "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz" + integrity sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA== + +body-parser@^1.16.0, body-parser@1.20.1: version "1.20.1" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.1.tgz#b1812a8912c195cd371a3ee5e66faa2338a5c668" + resolved "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz" integrity sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw== dependencies: bytes "3.1.2" @@ -2537,12 +2646,12 @@ body-parser@1.20.1, body-parser@^1.16.0: boolbase@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" + resolved "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz" integrity sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww== brace-expansion@^1.1.7: version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== dependencies: balanced-match "^1.0.0" @@ -2550,33 +2659,36 @@ brace-expansion@^1.1.7: brace-expansion@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz" integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== dependencies: balanced-match "^1.0.0" braces@^3.0.2, braces@~3.0.2: version "3.0.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + resolved "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz" integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== dependencies: fill-range "^7.0.1" breakword@^1.0.5: version "1.0.5" - resolved "https://registry.yarnpkg.com/breakword/-/breakword-1.0.5.tgz#fd420a417f55016736b5b615161cae1c8f819810" + resolved "https://registry.npmjs.org/breakword/-/breakword-1.0.5.tgz" integrity sha512-ex5W9DoOQ/LUEU3PMdLs9ua/CYZl1678NUkKOdUSi8Aw5F1idieaiRURCBFJCwVcrD1J8Iy3vfWSloaMwO2qFg== dependencies: wcwidth "^1.0.1" +brorand@^1.0.1: + version "1.1.0" + brorand@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" + resolved "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz" integrity sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w== browser-level@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/browser-level/-/browser-level-1.0.1.tgz#36e8c3183d0fe1c405239792faaab5f315871011" + resolved "https://registry.npmjs.org/browser-level/-/browser-level-1.0.1.tgz" integrity sha512-XECYKJ+Dbzw0lbydyQuJzwNXtOpbMSq737qxJN11sIRTErOMShvDpbzTlgju7orJKvx4epULolZAuJGLzCmWRQ== dependencies: abstract-level "^1.0.2" @@ -2586,12 +2698,12 @@ browser-level@^1.0.1: browser-stdout@1.3.1: version "1.3.1" - resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" + resolved "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz" integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== browserify-aes@^1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" + resolved "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz" integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== dependencies: buffer-xor "^1.0.3" @@ -2601,9 +2713,9 @@ browserify-aes@^1.2.0: inherits "^2.0.1" safe-buffer "^5.0.1" -browserslist@^4.21.3: +browserslist@^4.21.3, "browserslist@>= 4.21.0": version "4.21.5" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.5.tgz#75c5dae60063ee641f977e00edd3cfb2fb7af6a7" + resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz" integrity sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w== dependencies: caniuse-lite "^1.0.30001449" @@ -2613,14 +2725,14 @@ browserslist@^4.21.3: bs58@^4.0.0, bs58@^4.0.1: version "4.0.1" - resolved "https://registry.yarnpkg.com/bs58/-/bs58-4.0.1.tgz#be161e76c354f6f788ae4071f63f34e8c4f0a42a" + resolved "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz" integrity sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw== dependencies: base-x "^3.0.2" bs58check@^2.1.2: version "2.1.2" - resolved "https://registry.yarnpkg.com/bs58check/-/bs58check-2.1.2.tgz#53b018291228d82a5aa08e7d796fdafda54aebfc" + resolved "https://registry.npmjs.org/bs58check/-/bs58check-2.1.2.tgz" integrity sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA== dependencies: bs58 "^4.0.0" @@ -2629,67 +2741,75 @@ bs58check@^2.1.2: buffer-from@^1.0.0: version "1.1.2" - resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" + resolved "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz" integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== buffer-to-arraybuffer@^0.0.5: version "0.0.5" - resolved "https://registry.yarnpkg.com/buffer-to-arraybuffer/-/buffer-to-arraybuffer-0.0.5.tgz#6064a40fa76eb43c723aba9ef8f6e1216d10511a" + resolved "https://registry.npmjs.org/buffer-to-arraybuffer/-/buffer-to-arraybuffer-0.0.5.tgz" integrity sha512-3dthu5CYiVB1DEJp61FtApNnNndTckcqe4pFcLdvHtrpG+kcyekCJKg4MRiDcFW7A6AODnXB9U4dwQiCW5kzJQ== buffer-xor@^1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" + resolved "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz" integrity sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ== -buffer@6.0.3, buffer@^6.0.3: - version "6.0.3" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" - integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== +buffer@^5.0.5: + version "5.7.1" + resolved "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz" + integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== dependencies: base64-js "^1.3.1" - ieee754 "^1.2.1" + ieee754 "^1.1.13" -buffer@^5.0.5, buffer@^5.5.0, buffer@^5.6.0: +buffer@^5.5.0, buffer@^5.6.0: version "5.7.1" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" + resolved "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz" integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== dependencies: base64-js "^1.3.1" ieee754 "^1.1.13" +buffer@^6.0.3, buffer@6.0.3: + version "6.0.3" + resolved "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz" + integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.2.1" + bufferutil@^4.0.1: version "4.0.7" - resolved "https://registry.yarnpkg.com/bufferutil/-/bufferutil-4.0.7.tgz#60c0d19ba2c992dd8273d3f73772ffc894c153ad" + resolved "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.7.tgz" integrity sha512-kukuqc39WOHtdxtw4UScxF/WVnMFVSQVKhtx3AjZJzhd0RGZZldcrfSEbVsWWe6KNH253574cq5F+wpv0G9pJw== dependencies: node-gyp-build "^4.3.0" busboy@^1.6.0: version "1.6.0" - resolved "https://registry.yarnpkg.com/busboy/-/busboy-1.6.0.tgz#966ea36a9502e43cdb9146962523b92f531f6893" + resolved "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz" integrity sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA== dependencies: streamsearch "^1.1.0" bytes@3.1.2: version "3.1.2" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" + resolved "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz" integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== cacheable-lookup@^5.0.3: version "5.0.4" - resolved "https://registry.yarnpkg.com/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz#5a6b865b2c44357be3d5ebc2a467b032719a7005" + resolved "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz" integrity sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA== cacheable-lookup@^6.0.4: version "6.1.0" - resolved "https://registry.yarnpkg.com/cacheable-lookup/-/cacheable-lookup-6.1.0.tgz#0330a543471c61faa4e9035db583aad753b36385" + resolved "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-6.1.0.tgz" integrity sha512-KJ/Dmo1lDDhmW2XDPMo+9oiy/CeqosPguPCrgcVzKyZrL6pM1gU2GmPY/xo6OQPTUaA/c0kwHuywB4E6nmT9ww== cacheable-request@^7.0.2: version "7.0.2" - resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-7.0.2.tgz#ea0d0b889364a25854757301ca12b2da77f91d27" + resolved "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.2.tgz" integrity sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew== dependencies: clone-response "^1.0.2" @@ -2702,7 +2822,7 @@ cacheable-request@^7.0.2: caching-transform@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/caching-transform/-/caching-transform-4.0.0.tgz#00d297a4206d71e2163c39eaffa8157ac0651f0f" + resolved "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz" integrity sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA== dependencies: hasha "^5.0.0" @@ -2712,7 +2832,7 @@ caching-transform@^4.0.0: call-bind@^1.0.0, call-bind@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" + resolved "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz" integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== dependencies: function-bind "^1.1.1" @@ -2720,12 +2840,12 @@ call-bind@^1.0.0, call-bind@^1.0.2: callsites@^3.0.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz" integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== camel-case@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-3.0.0.tgz#ca3c3688a4e9cf3a4cda777dc4dcbc713249cf73" + resolved "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz" integrity sha512-+MbKztAYHXPr1jNTSKQF52VpcFjwY5RkR7fxksV8Doo4KAYc5Fl4UJRgthBbTmEx8C54DqahhbLJkDwjI3PI/w== dependencies: no-case "^2.2.0" @@ -2733,7 +2853,7 @@ camel-case@^3.0.0: camelcase-keys@^6.2.2: version "6.2.2" - resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-6.2.2.tgz#5e755d6ba51aa223ec7d3d52f25778210f9dc3c0" + resolved "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz" integrity sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg== dependencies: camelcase "^5.3.1" @@ -2742,47 +2862,47 @@ camelcase-keys@^6.2.2: camelcase@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a" + resolved "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz" integrity sha512-4nhGqUkc4BqbBBB4Q6zLuD7lzzrHYrjKGeYaEji/3tFR5VdJu9v+LilhGIVe8wxEJPPOeWo7eg8dwY13TZ1BNg== camelcase@^4.1.0: version "4.1.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" + resolved "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz" integrity sha512-FxAv7HpHrXbh3aPo4o2qxHay2lkLY3x5Mw3KeE4KQE8ysVfziWeRZDwcjauvwBSGEC/nXUPzZy8zeh4HokqOnw== camelcase@^5.0.0, camelcase@^5.3.1: version "5.3.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" + resolved "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== camelcase@^6.0.0: version "6.3.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" + resolved "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz" integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== caniuse-lite@^1.0.30001449: version "1.0.30001480" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001480.tgz#9bbd35ee44c2480a1e3a3b9f4496f5066817164a" + resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001480.tgz" integrity sha512-q7cpoPPvZYgtyC4VaBSN0Bt+PJ4c4EYRf0DrduInOz2SkFpHD5p3LnvEpqBp7UnJn+8x1Ogl1s38saUxe+ihQQ== case@^1.6.3: version "1.6.3" - resolved "https://registry.yarnpkg.com/case/-/case-1.6.3.tgz#0a4386e3e9825351ca2e6216c60467ff5f1ea1c9" + resolved "https://registry.npmjs.org/case/-/case-1.6.3.tgz" integrity sha512-mzDSXIPaFwVDvZAHqZ9VlbyF4yyXRuX6IvB06WvPYkqJVO24kX1PPhv9bfpKNFZyxYFmmgo03HUiD8iklmJYRQ== caseless@^0.12.0, caseless@~0.12.0: version "0.12.0" - resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" + resolved "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz" integrity sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw== catering@^2.1.0, catering@^2.1.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/catering/-/catering-2.1.1.tgz#66acba06ed5ee28d5286133982a927de9a04b510" + resolved "https://registry.npmjs.org/catering/-/catering-2.1.1.tgz" integrity sha512-K7Qy8O9p76sL3/3m7/zLKbRkyOlSZAgzEaLhyj2mXS8PsCud2Eo4hAb8aLtZqHh0QGqLcb9dlJSu6lHRVENm1w== cbor@^5.2.0: version "5.2.0" - resolved "https://registry.yarnpkg.com/cbor/-/cbor-5.2.0.tgz#4cca67783ccd6de7b50ab4ed62636712f287a67c" + resolved "https://registry.npmjs.org/cbor/-/cbor-5.2.0.tgz" integrity sha512-5IMhi9e1QU76ppa5/ajP1BmMWZ2FHkhAhjeVKQ/EFCgYSEaeVaoGtL7cxJskf9oCCk+XjzaIdc3IuU/dbA/o2A== dependencies: bignumber.js "^9.0.1" @@ -2790,21 +2910,21 @@ cbor@^5.2.0: cbor@^8.1.0: version "8.1.0" - resolved "https://registry.yarnpkg.com/cbor/-/cbor-8.1.0.tgz#cfc56437e770b73417a2ecbfc9caf6b771af60d5" + resolved "https://registry.npmjs.org/cbor/-/cbor-8.1.0.tgz" integrity sha512-DwGjNW9omn6EwP70aXsn7FQJx5kO12tX0bZkaTjzdVFM6/7nhA4t0EENocKGx6D2Bch9PE2KzCUf5SceBdeijg== dependencies: nofilter "^3.1.0" chai-as-promised@^7.1.1: version "7.1.1" - resolved "https://registry.yarnpkg.com/chai-as-promised/-/chai-as-promised-7.1.1.tgz#08645d825deb8696ee61725dbf590c012eb00ca0" + resolved "https://registry.npmjs.org/chai-as-promised/-/chai-as-promised-7.1.1.tgz" integrity sha512-azL6xMoi+uxu6z4rhWQ1jbdUhOMhis2PvscD/xjLqNMkv3BPPp2JyyuTHOrf9BOosGpNQ11v6BKv/g57RXbiaA== dependencies: check-error "^1.0.2" -chai@^4.2.0: +chai@^4.0.0, chai@^4.2.0, "chai@>= 2.1.2 < 5": version "4.3.7" - resolved "https://registry.yarnpkg.com/chai/-/chai-4.3.7.tgz#ec63f6df01829088e8bf55fca839bcd464a8ec51" + resolved "https://registry.npmjs.org/chai/-/chai-4.3.7.tgz" integrity sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A== dependencies: assertion-error "^1.1.0" @@ -2817,7 +2937,7 @@ chai@^4.2.0: chalk@^0.4.0: version "0.4.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-0.4.0.tgz#5199a3ddcd0c1efe23bc08c1b027b06176e0c64f" + resolved "https://registry.npmjs.org/chalk/-/chalk-0.4.0.tgz" integrity sha512-sQfYDlfv2DGVtjdoQqxS0cEZDroyG8h6TamA6rvxwlrU5BaSLDx9xhatBYl2pxZ7gmpNaPFVwBtdGdu5rQ+tYQ== dependencies: ansi-styles "~1.0.0" @@ -2826,16 +2946,32 @@ chalk@^0.4.0: chalk@^2.0.0, chalk@^2.1.0, chalk@^2.3.0, chalk@^2.3.2, chalk@^2.4.2: version "2.4.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== dependencies: ansi-styles "^3.2.1" escape-string-regexp "^1.0.5" supports-color "^5.3.0" -chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.2: +chalk@^4.0.0: version "4.1.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chalk@^4.1.0: + version "4.1.2" + resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chalk@^4.1.2: + version "4.1.2" + resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== dependencies: ansi-styles "^4.1.0" @@ -2843,7 +2979,7 @@ chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.2: change-case@3.0.2: version "3.0.2" - resolved "https://registry.yarnpkg.com/change-case/-/change-case-3.0.2.tgz#fd48746cce02f03f0a672577d1d3a8dc2eceb037" + resolved "https://registry.npmjs.org/change-case/-/change-case-3.0.2.tgz" integrity sha512-Mww+SLF6MZ0U6kdg11algyKd5BARbyM4TbFBepwowYSR5ClfQGCGtxNXgykpN0uF/bstWeaGDT4JWaDh8zWAHA== dependencies: camel-case "^3.0.0" @@ -2867,22 +3003,22 @@ change-case@3.0.2: chardet@^0.7.0: version "0.7.0" - resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" + resolved "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz" integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== "charenc@>= 0.0.1": version "0.0.2" - resolved "https://registry.yarnpkg.com/charenc/-/charenc-0.0.2.tgz#c0a1d2f3a7092e03774bfa83f14c0fc5790a8667" + resolved "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz" integrity sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA== check-error@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82" + resolved "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz" integrity sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA== cheerio-select@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/cheerio-select/-/cheerio-select-2.1.0.tgz#4d8673286b8126ca2a8e42740d5e3c4884ae21b4" + resolved "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz" integrity sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g== dependencies: boolbase "^1.0.0" @@ -2894,7 +3030,7 @@ cheerio-select@^2.1.0: cheerio@^1.0.0-rc.2: version "1.0.0-rc.12" - resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-1.0.0-rc.12.tgz#788bf7466506b1c6bf5fae51d24a2c4d62e47683" + resolved "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz" integrity sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q== dependencies: cheerio-select "^2.1.0" @@ -2905,54 +3041,59 @@ cheerio@^1.0.0-rc.2: parse5 "^7.0.0" parse5-htmlparser2-tree-adapter "^7.0.0" -chokidar@3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.3.0.tgz#12c0714668c55800f659e262d4962a97faf554a6" - integrity sha512-dGmKLDdT3Gdl7fBUe8XK+gAtGmzy5Fn0XkkWQuYxGIgWVPPse2CxFA5mtrlD0TOHaHjEUqkWNyP1XdHoJES/4A== +chokidar@^3.4.0, chokidar@3.5.3: + version "3.5.3" + resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz" + integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== dependencies: - anymatch "~3.1.1" + anymatch "~3.1.2" braces "~3.0.2" - glob-parent "~5.1.0" + glob-parent "~5.1.2" is-binary-path "~2.1.0" is-glob "~4.0.1" normalize-path "~3.0.0" - readdirp "~3.2.0" + readdirp "~3.6.0" optionalDependencies: - fsevents "~2.1.1" + fsevents "~2.3.2" -chokidar@3.5.3, chokidar@^3.4.0: - version "3.5.3" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" - integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== +chokidar@3.3.0: + version "3.3.0" + resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.3.0.tgz" + integrity sha512-dGmKLDdT3Gdl7fBUe8XK+gAtGmzy5Fn0XkkWQuYxGIgWVPPse2CxFA5mtrlD0TOHaHjEUqkWNyP1XdHoJES/4A== dependencies: - anymatch "~3.1.2" + anymatch "~3.1.1" braces "~3.0.2" - glob-parent "~5.1.2" + glob-parent "~5.1.0" is-binary-path "~2.1.0" is-glob "~4.0.1" normalize-path "~3.0.0" - readdirp "~3.6.0" + readdirp "~3.2.0" optionalDependencies: - fsevents "~2.3.2" + fsevents "~2.1.1" chownr@^1.1.4: version "1.1.4" - resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" + resolved "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz" integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== ci-info@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" + resolved "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz" integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== -ci-info@^3.1.0, ci-info@^3.2.0: +ci-info@^3.1.0: + version "3.8.0" + resolved "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz" + integrity sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw== + +ci-info@^3.2.0: version "3.8.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.8.0.tgz#81408265a5380c929f0bc665d62256628ce9ef91" + resolved "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz" integrity sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw== cids@^0.7.1: version "0.7.5" - resolved "https://registry.yarnpkg.com/cids/-/cids-0.7.5.tgz#60a08138a99bfb69b6be4ceb63bfef7a396b28b2" + resolved "https://registry.npmjs.org/cids/-/cids-0.7.5.tgz" integrity sha512-zT7mPeghoWAu+ppn8+BS1tQ5qGmbMfB4AregnQjA/qHY3GC1m1ptI9GkWNlgeu38r7CuRdXB47uY2XgAYt6QVA== dependencies: buffer "^5.5.0" @@ -2963,7 +3104,7 @@ cids@^0.7.1: cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: version "1.0.4" - resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" + resolved "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz" integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q== dependencies: inherits "^2.0.1" @@ -2971,12 +3112,12 @@ cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: class-is@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/class-is/-/class-is-1.1.0.tgz#9d3c0fba0440d211d843cec3dedfa48055005825" + resolved "https://registry.npmjs.org/class-is/-/class-is-1.1.0.tgz" integrity sha512-rhjH9AG1fvabIDoGRVH587413LPjTZgmDF9fOFCbFJQV4yuocX1mHxxvXI4g3cGwbVY9wAYIoKlg1N79frJKQw== classic-level@^1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/classic-level/-/classic-level-1.2.0.tgz#2d52bdec8e7a27f534e67fdeb890abef3e643c27" + resolved "https://registry.npmjs.org/classic-level/-/classic-level-1.2.0.tgz" integrity sha512-qw5B31ANxSluWz9xBzklRWTUAJ1SXIdaVKTVS7HcTGKOAmExx65Wo5BUICW+YGORe2FOUaDghoI9ZDxj82QcFg== dependencies: abstract-level "^1.0.2" @@ -2987,12 +3128,12 @@ classic-level@^1.2.0: clean-stack@^2.0.0: version "2.2.0" - resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" + resolved "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz" integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== cli-table3@^0.5.0: version "0.5.1" - resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.5.1.tgz#0252372d94dfc40dbd8df06005f48f31f656f202" + resolved "https://registry.npmjs.org/cli-table3/-/cli-table3-0.5.1.tgz" integrity sha512-7Qg2Jrep1S/+Q3EceiZtQcDPWxhAvBw+ERf1162v4sikJrvojMHFqXt8QIVha8UlH9rgU0BeWPytZ9/TzYqlUw== dependencies: object-assign "^4.1.0" @@ -3002,7 +3143,7 @@ cli-table3@^0.5.0: cliui@^3.2.0: version "3.2.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" + resolved "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz" integrity sha512-0yayqDxWQbqk3ojkYqUKqaAQ6AfNKeKWRNA8kR0WXzAsdHpP4BIaOmMAG87JGuO6qcobyW4GjxHd9PmhEd+T9w== dependencies: string-width "^1.0.1" @@ -3011,7 +3152,7 @@ cliui@^3.2.0: cliui@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" + resolved "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz" integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA== dependencies: string-width "^3.1.0" @@ -3020,7 +3161,7 @@ cliui@^5.0.0: cliui@^6.0.0: version "6.0.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-6.0.0.tgz#511d702c0c4e41ca156d7d0e96021f23e13225b1" + resolved "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz" integrity sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ== dependencies: string-width "^4.2.0" @@ -3029,7 +3170,7 @@ cliui@^6.0.0: cliui@^7.0.2: version "7.0.4" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" + resolved "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz" integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== dependencies: string-width "^4.2.0" @@ -3038,7 +3179,7 @@ cliui@^7.0.2: cliui@^8.0.1: version "8.0.1" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" + resolved "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz" integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== dependencies: string-width "^4.2.0" @@ -3047,70 +3188,70 @@ cliui@^8.0.1: clone-response@^1.0.2: version "1.0.3" - resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.3.tgz#af2032aa47816399cf5f0a1d0db902f517abb8c3" + resolved "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz" integrity sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA== dependencies: mimic-response "^1.0.0" clone@^1.0.2: version "1.0.4" - resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" + resolved "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz" integrity sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg== co@^4.6.0: version "4.6.0" - resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" + resolved "https://registry.npmjs.org/co/-/co-4.6.0.tgz" integrity sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ== code-point-at@^1.0.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" + resolved "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz" integrity sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA== color-convert@^1.9.0: version "1.9.3" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz" integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== dependencies: color-name "1.1.3" color-convert@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz" integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== dependencies: color-name "~1.1.4" -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== - color-name@~1.1.4: version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== -colors@1.4.0, colors@^1.1.2: +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" + integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== + +colors@^1.1.2, colors@1.4.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78" + resolved "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz" integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA== combined-stream@^1.0.6, combined-stream@~1.0.6: version "1.0.8" - resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + resolved "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz" integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== dependencies: delayed-stream "~1.0.0" command-exists@^1.2.8: version "1.2.9" - resolved "https://registry.yarnpkg.com/command-exists/-/command-exists-1.2.9.tgz#c50725af3808c8ab0260fd60b01fbfa25b954f69" + resolved "https://registry.npmjs.org/command-exists/-/command-exists-1.2.9.tgz" integrity sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w== command-line-args@^5.1.1: version "5.2.1" - resolved "https://registry.yarnpkg.com/command-line-args/-/command-line-args-5.2.1.tgz#c44c32e437a57d7c51157696893c5909e9cec42e" + resolved "https://registry.npmjs.org/command-line-args/-/command-line-args-5.2.1.tgz" integrity sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg== dependencies: array-back "^3.1.0" @@ -3120,7 +3261,7 @@ command-line-args@^5.1.1: command-line-usage@^6.1.0: version "6.1.3" - resolved "https://registry.yarnpkg.com/command-line-usage/-/command-line-usage-6.1.3.tgz#428fa5acde6a838779dfa30e44686f4b6761d957" + resolved "https://registry.npmjs.org/command-line-usage/-/command-line-usage-6.1.3.tgz" integrity sha512-sH5ZSPr+7UStsloltmDh7Ce5fb8XPlHyoPzTpyyMuYCtervL65+ubVZ6Q61cFtFl62UyJlc8/JwERRbAFPUqgw== dependencies: array-back "^4.0.2" @@ -3128,34 +3269,34 @@ command-line-usage@^6.1.0: table-layout "^1.0.2" typical "^5.2.0" -commander@3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/commander/-/commander-3.0.2.tgz#6837c3fb677ad9933d1cfba42dd14d5117d6b39e" - integrity sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow== - commander@^10.0.0: version "10.0.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-10.0.0.tgz#71797971162cd3cf65f0b9d24eb28f8d303acdf1" + resolved "https://registry.npmjs.org/commander/-/commander-10.0.0.tgz" integrity sha512-zS5PnTI22FIRM6ylNW8G4Ap0IEOyk62fhLSD0+uHRT9McRCLGpkVNvao4bjimpK/GShynyQkFFxHhwMcETmduA== commander@^2.19.0: version "2.20.3" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + resolved "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== +commander@3.0.2: + version "3.0.2" + resolved "https://registry.npmjs.org/commander/-/commander-3.0.2.tgz" + integrity sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow== + commondir@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" + resolved "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz" integrity sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg== concat-map@0.0.1: version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== concat-stream@^1.6.0, concat-stream@^1.6.2: version "1.6.2" - resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" + resolved "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz" integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== dependencies: buffer-from "^1.0.0" @@ -3165,7 +3306,7 @@ concat-stream@^1.6.0, concat-stream@^1.6.2: constant-case@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/constant-case/-/constant-case-2.0.0.tgz#4175764d389d3fa9c8ecd29186ed6005243b6a46" + resolved "https://registry.npmjs.org/constant-case/-/constant-case-2.0.0.tgz" integrity sha512-eS0N9WwmjTqrOmR3o83F5vW8Z+9R1HnVz3xmzT2PMFug9ly+Au/fxRWlEBSb6LcZwspSsEn9Xs1uw9YgzAg1EQ== dependencies: snake-case "^2.1.0" @@ -3173,14 +3314,14 @@ constant-case@^2.0.0: content-disposition@0.5.4: version "0.5.4" - resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" + resolved "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz" integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== dependencies: safe-buffer "5.2.1" content-hash@^2.5.2: version "2.5.2" - resolved "https://registry.yarnpkg.com/content-hash/-/content-hash-2.5.2.tgz#bbc2655e7c21f14fd3bfc7b7d4bfe6e454c9e211" + resolved "https://registry.npmjs.org/content-hash/-/content-hash-2.5.2.tgz" integrity sha512-FvIQKy0S1JaWV10sMsA7TRx8bpU+pqPkhbsfvOJAdjRXvYxEckAwQWGwtRjiaJfh+E0DvcWUGqcdjwMGFjsSdw== dependencies: cids "^0.7.1" @@ -3189,47 +3330,42 @@ content-hash@^2.5.2: content-type@~1.0.4: version "1.0.5" - resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918" + resolved "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz" integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== convert-source-map@^1.7.0: version "1.9.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" + resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz" integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== cookie-signature@1.0.6: version "1.0.6" - resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" + resolved "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz" integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== -cookie@0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b" - integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== - cookie@^0.4.1: version "0.4.2" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.2.tgz#0e41f24de5ecf317947c82fc789e06a884824432" + resolved "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz" integrity sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA== +cookie@0.5.0: + version "0.5.0" + resolved "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz" + integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== + cookiejar@^2.1.1: version "2.1.4" - resolved "https://registry.yarnpkg.com/cookiejar/-/cookiejar-2.1.4.tgz#ee669c1fea2cf42dc31585469d193fef0d65771b" + resolved "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.4.tgz" integrity sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw== -core-util-is@1.0.2: +core-util-is@~1.0.0, core-util-is@1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + resolved "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz" integrity sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ== -core-util-is@~1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" - integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== - cors@^2.8.1: version "2.8.5" - resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29" + resolved "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz" integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g== dependencies: object-assign "^4" @@ -3237,7 +3373,7 @@ cors@^2.8.1: cosmiconfig@^8.0.0: version "8.1.0" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-8.1.0.tgz#947e174c796483ccf0a48476c24e4fefb7e1aea8" + resolved "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.1.0.tgz" integrity sha512-0tLZ9URlPGU7JsKq0DQOQ3FoRsYX8xDZ7xMiATQfaiGMz7EHowNkbU9u1coAOmnh9p/1ySpm0RB3JNWRXM5GCg== dependencies: import-fresh "^3.2.1" @@ -3247,12 +3383,12 @@ cosmiconfig@^8.0.0: crc-32@^1.2.0: version "1.2.2" - resolved "https://registry.yarnpkg.com/crc-32/-/crc-32-1.2.2.tgz#3cad35a934b8bf71f25ca524b6da51fb7eace2ff" + resolved "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz" integrity sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ== create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" + resolved "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz" integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== dependencies: cipher-base "^1.0.1" @@ -3263,7 +3399,7 @@ create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0: create-hmac@^1.1.4, create-hmac@^1.1.7: version "1.1.7" - resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" + resolved "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz" integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== dependencies: cipher-base "^1.0.3" @@ -3275,19 +3411,19 @@ create-hmac@^1.1.4, create-hmac@^1.1.7: create-require@^1.1.0: version "1.1.1" - resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" + resolved "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz" integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== cross-fetch@^3.1.4: version "3.1.5" - resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.5.tgz#e1389f44d9e7ba767907f7af8454787952ab534f" + resolved "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz" integrity sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw== dependencies: node-fetch "2.6.7" cross-spawn@^5.1.0: version "5.1.0" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" + resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz" integrity sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A== dependencies: lru-cache "^4.0.1" @@ -3296,7 +3432,7 @@ cross-spawn@^5.1.0: cross-spawn@^6.0.0: version "6.0.5" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" + resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz" integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== dependencies: nice-try "^1.0.4" @@ -3307,7 +3443,7 @@ cross-spawn@^6.0.0: cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3: version "7.0.3" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz" integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== dependencies: path-key "^3.1.0" @@ -3316,12 +3452,12 @@ cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3: "crypt@>= 0.0.1": version "0.0.2" - resolved "https://registry.yarnpkg.com/crypt/-/crypt-0.0.2.tgz#88d7ff7ec0dfb86f713dc87bbb42d044d3e6c41b" + resolved "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz" integrity sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow== crypto-addr-codec@^0.1.7: version "0.1.7" - resolved "https://registry.yarnpkg.com/crypto-addr-codec/-/crypto-addr-codec-0.1.7.tgz#e16cea892730178fe25a38f6d15b680cab3124ae" + resolved "https://registry.npmjs.org/crypto-addr-codec/-/crypto-addr-codec-0.1.7.tgz" integrity sha512-X4hzfBzNhy4mAc3UpiXEC/L0jo5E8wAa9unsnA8nNXYzXjCcGk83hfC5avJWCSGT8V91xMnAS9AKMHmjw5+XCg== dependencies: base-x "^3.0.8" @@ -3334,12 +3470,12 @@ crypto-addr-codec@^0.1.7: crypto-js@^3.1.4, crypto-js@^3.1.9-1: version "3.3.0" - resolved "https://registry.yarnpkg.com/crypto-js/-/crypto-js-3.3.0.tgz#846dd1cce2f68aacfa156c8578f926a609b7976b" + resolved "https://registry.npmjs.org/crypto-js/-/crypto-js-3.3.0.tgz" integrity sha512-DIT51nX0dCfKltpRiXV+/TVZq+Qq2NgF4644+K7Ttnla7zEzqc+kjJyiB96BHNyUTBxyjzRcZYpUdZa+QAqi6Q== css-select@^5.1.0: version "5.1.0" - resolved "https://registry.yarnpkg.com/css-select/-/css-select-5.1.0.tgz#b8ebd6554c3637ccc76688804ad3f6a6fdaea8a6" + resolved "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz" integrity sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg== dependencies: boolbase "^1.0.0" @@ -3350,27 +3486,27 @@ css-select@^5.1.0: css-what@^6.1.0: version "6.1.0" - resolved "https://registry.yarnpkg.com/css-what/-/css-what-6.1.0.tgz#fb5effcf76f1ddea2c81bdfaa4de44e79bac70f4" + resolved "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz" integrity sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw== csv-generate@^3.4.3: version "3.4.3" - resolved "https://registry.yarnpkg.com/csv-generate/-/csv-generate-3.4.3.tgz#bc42d943b45aea52afa896874291da4b9108ffff" + resolved "https://registry.npmjs.org/csv-generate/-/csv-generate-3.4.3.tgz" integrity sha512-w/T+rqR0vwvHqWs/1ZyMDWtHHSJaN06klRqJXBEpDJaM/+dZkso0OKh1VcuuYvK3XM53KysVNq8Ko/epCK8wOw== csv-parse@^4.16.3: version "4.16.3" - resolved "https://registry.yarnpkg.com/csv-parse/-/csv-parse-4.16.3.tgz#7ca624d517212ebc520a36873c3478fa66efbaf7" + resolved "https://registry.npmjs.org/csv-parse/-/csv-parse-4.16.3.tgz" integrity sha512-cO1I/zmz4w2dcKHVvpCr7JVRu8/FymG5OEpmvsZYlccYolPBLoVGKUHgNoc4ZGkFeFlWGEDmMyBM+TTqRdW/wg== csv-stringify@^5.6.5: version "5.6.5" - resolved "https://registry.yarnpkg.com/csv-stringify/-/csv-stringify-5.6.5.tgz#c6d74badda4b49a79bf4e72f91cce1e33b94de00" + resolved "https://registry.npmjs.org/csv-stringify/-/csv-stringify-5.6.5.tgz" integrity sha512-PjiQ659aQ+fUTQqSrd1XEDnOr52jh30RBurfzkscaE2tPaFsDH5wOAHJiw8XAHphRknCwMUE9KRayc4K/NbO8A== csv@^5.5.0: version "5.5.3" - resolved "https://registry.yarnpkg.com/csv/-/csv-5.5.3.tgz#cd26c1e45eae00ce6a9b7b27dcb94955ec95207d" + resolved "https://registry.npmjs.org/csv/-/csv-5.5.3.tgz" integrity sha512-QTaY0XjjhTQOdguARF0lGKm5/mEq9PD9/VhZZegHDIBq2tQwgNpHc3dneD4mGo2iJs+fTKv5Bp0fZ+BRuY3Z0g== dependencies: csv-generate "^3.4.3" @@ -3378,9 +3514,9 @@ csv@^5.5.0: csv-stringify "^5.6.5" stream-transform "^2.1.3" -d@1, d@^1.0.1: +d@^1.0.1, d@1: version "1.0.1" - resolved "https://registry.yarnpkg.com/d/-/d-1.0.1.tgz#8698095372d58dbee346ffd0c7093f99f8f9eb5a" + resolved "https://registry.npmjs.org/d/-/d-1.0.1.tgz" integrity sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA== dependencies: es5-ext "^0.10.50" @@ -3388,52 +3524,73 @@ d@1, d@^1.0.1: dashdash@^1.12.0: version "1.14.1" - resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" + resolved "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz" integrity sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g== dependencies: assert-plus "^1.0.0" date-time@^0.1.1: version "0.1.1" - resolved "https://registry.yarnpkg.com/date-time/-/date-time-0.1.1.tgz#ed2f6d93d9790ce2fd66d5b5ff3edd5bbcbf3b07" + resolved "https://registry.npmjs.org/date-time/-/date-time-0.1.1.tgz" integrity sha512-p4psdkgdNA6x0600SKbfWiOomNb33ADBMRHf49GMhYVgJsPefZlMSLXXVWWUpbqSxB3DL5/cxKa6a8i3XPK5Xg== death@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/death/-/death-1.1.0.tgz#01aa9c401edd92750514470b8266390c66c67318" + resolved "https://registry.npmjs.org/death/-/death-1.1.0.tgz" integrity sha512-vsV6S4KVHvTGxbEcij7hkWRv0It+sGGWVOM67dQde/o5Xjnr+KmLjxWJii2uEObIrt1CcM9w0Yaovx+iOlIL+w== -debug@2.6.9, debug@^2.2.0, debug@^2.6.9: +debug@^2.2.0: version "2.6.9" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz" integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== dependencies: ms "2.0.0" -debug@3.2.6: - version "3.2.6" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" - integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== +debug@^2.6.9: + version "2.6.9" + resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +debug@^3.1.0: + version "3.2.7" + resolved "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz" + integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== + dependencies: + ms "^2.1.1" + +debug@^3.2.7: + version "3.2.7" + resolved "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz" + integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== dependencies: ms "^2.1.1" -debug@4, debug@4.3.4, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.3, debug@^4.3.4: +debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.3, debug@^4.3.4, debug@4, debug@4.3.4: version "4.3.4" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" + resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== dependencies: ms "2.1.2" -debug@^3.1.0, debug@^3.2.7: - version "3.2.7" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" - integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== +debug@2.6.9: + version "2.6.9" + resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +debug@3.2.6: + version "3.2.6" + resolved "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz" + integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== dependencies: ms "^2.1.1" decamelize-keys@^1.1.0: version "1.1.1" - resolved "https://registry.yarnpkg.com/decamelize-keys/-/decamelize-keys-1.1.1.tgz#04a2d523b2f18d80d0158a43b895d56dff8d19d8" + resolved "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz" integrity sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg== dependencies: decamelize "^1.1.0" @@ -3441,77 +3598,77 @@ decamelize-keys@^1.1.0: decamelize@^1.1.0, decamelize@^1.1.1, decamelize@^1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + resolved "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz" integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== decamelize@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837" + resolved "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz" integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== decimal.js-light@^2.5.0: version "2.5.1" - resolved "https://registry.yarnpkg.com/decimal.js-light/-/decimal.js-light-2.5.1.tgz#134fd32508f19e208f4fb2f8dac0d2626a867934" + resolved "https://registry.npmjs.org/decimal.js-light/-/decimal.js-light-2.5.1.tgz" integrity sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg== decode-uri-component@^0.2.0: version "0.2.2" - resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.2.tgz#e69dbe25d37941171dd540e024c444cd5188e1e9" + resolved "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz" integrity sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ== decompress-response@^3.3.0: version "3.3.0" - resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3" + resolved "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz" integrity sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA== dependencies: mimic-response "^1.0.0" decompress-response@^6.0.0: version "6.0.0" - resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-6.0.0.tgz#ca387612ddb7e104bd16d85aab00d5ecf09c66fc" + resolved "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz" integrity sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ== dependencies: mimic-response "^3.1.0" deep-eql@^4.0.1, deep-eql@^4.1.2: version "4.1.3" - resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-4.1.3.tgz#7c7775513092f7df98d8df9996dd085eb668cc6d" + resolved "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz" integrity sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw== dependencies: type-detect "^4.0.0" deep-extend@~0.6.0: version "0.6.0" - resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" + resolved "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz" integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== deep-is@^0.1.3, deep-is@~0.1.3: version "0.1.4" - resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" + resolved "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz" integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== default-require-extensions@^3.0.0: version "3.0.1" - resolved "https://registry.yarnpkg.com/default-require-extensions/-/default-require-extensions-3.0.1.tgz#bfae00feeaeada68c2ae256c62540f60b80625bd" + resolved "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.1.tgz" integrity sha512-eXTJmRbm2TIt9MgWTsOH1wEuhew6XGZcMeGKCtLedIg/NCsg1iBePXkceTdK4Fii7pzmN9tGsZhKzZ4h7O/fxw== dependencies: strip-bom "^4.0.0" defaults@^1.0.3: version "1.0.4" - resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.4.tgz#b0b02062c1e2aa62ff5d9528f0f98baa90978d7a" + resolved "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz" integrity sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A== dependencies: clone "^1.0.2" defer-to-connect@^2.0.0, defer-to-connect@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-2.0.1.tgz#8016bdb4143e4632b77a3449c6236277de520587" + resolved "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz" integrity sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg== define-properties@^1.1.2, define-properties@^1.1.3, define-properties@^1.1.4: version "1.2.0" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.0.tgz#52988570670c9eacedd8064f4a990f2405849bd5" + resolved "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz" integrity sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA== dependencies: has-property-descriptors "^1.0.0" @@ -3519,83 +3676,88 @@ define-properties@^1.1.2, define-properties@^1.1.3, define-properties@^1.1.4: delayed-stream@~1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + resolved "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== depd@2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" + resolved "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz" integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== destroy@1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" + resolved "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz" integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== detect-indent@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-5.0.0.tgz#3871cc0a6a002e8c3e5b3cf7f336264675f06b9d" + resolved "https://registry.npmjs.org/detect-indent/-/detect-indent-5.0.0.tgz" integrity sha512-rlpvsxUtM0PQvy9iZe640/IWwWYyBsTApREbA1pHOpmOUIl9MkP/U4z7vTtg4Oaojvqhxt7sdufnT0EzGaR31g== detect-indent@^6.0.0: version "6.1.0" - resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-6.1.0.tgz#592485ebbbf6b3b1ab2be175c8393d04ca0d57e6" + resolved "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz" integrity sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA== detect-port@^1.3.0: version "1.5.1" - resolved "https://registry.yarnpkg.com/detect-port/-/detect-port-1.5.1.tgz#451ca9b6eaf20451acb0799b8ab40dff7718727b" + resolved "https://registry.npmjs.org/detect-port/-/detect-port-1.5.1.tgz" integrity sha512-aBzdj76lueB6uUst5iAs7+0H/oOjqI5D16XUWxlWMIMROhcM0rfsNVk93zTngq1dDNpoXRr++Sus7ETAExppAQ== dependencies: address "^1.0.1" debug "4" -diff@3.5.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" - integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA== - -diff@5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/diff/-/diff-5.0.0.tgz#7ed6ad76d859d030787ec35855f5b1daf31d852b" - integrity sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w== +diff@^4.0.1: + version "4.0.2" + resolved "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz" + integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== -diff@^4.0.1, diff@^4.0.2: +diff@^4.0.2: version "4.0.2" - resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" + resolved "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz" integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== +diff@3.5.0: + version "3.5.0" + resolved "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz" + integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA== + +diff@5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz" + integrity sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w== + difflib@^0.2.4: version "0.2.4" - resolved "https://registry.yarnpkg.com/difflib/-/difflib-0.2.4.tgz#b5e30361a6db023176d562892db85940a718f47e" + resolved "https://registry.npmjs.org/difflib/-/difflib-0.2.4.tgz" integrity sha512-9YVwmMb0wQHQNr5J9m6BSj6fk4pfGITGQOOs+D9Fl+INODWFOfvhIU1hNv6GgR1RBoC/9NJcwu77zShxV0kT7w== dependencies: heap ">= 0.2.0" dir-glob@^3.0.1: version "3.0.1" - resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" + resolved "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz" integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== dependencies: path-type "^4.0.0" doctrine@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" + resolved "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz" integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== dependencies: esutils "^2.0.2" doctrine@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" + resolved "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz" integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== dependencies: esutils "^2.0.2" dom-serializer@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-2.0.0.tgz#e41b802e1eedf9f6cae183ce5e622d789d7d8e53" + resolved "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz" integrity sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg== dependencies: domelementtype "^2.3.0" @@ -3604,24 +3766,24 @@ dom-serializer@^2.0.0: dom-walk@^0.1.0: version "0.1.2" - resolved "https://registry.yarnpkg.com/dom-walk/-/dom-walk-0.1.2.tgz#0c548bef048f4d1f2a97249002236060daa3fd84" + resolved "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz" integrity sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w== domelementtype@^2.3.0: version "2.3.0" - resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d" + resolved "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz" integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== domhandler@^5.0.1, domhandler@^5.0.2, domhandler@^5.0.3: version "5.0.3" - resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-5.0.3.tgz#cc385f7f751f1d1fc650c21374804254538c7d31" + resolved "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz" integrity sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w== dependencies: domelementtype "^2.3.0" domutils@^3.0.1: version "3.0.1" - resolved "https://registry.yarnpkg.com/domutils/-/domutils-3.0.1.tgz#696b3875238338cb186b6c0612bd4901c89a4f1c" + resolved "https://registry.npmjs.org/domutils/-/domutils-3.0.1.tgz" integrity sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q== dependencies: dom-serializer "^2.0.0" @@ -3630,14 +3792,14 @@ domutils@^3.0.1: dot-case@^2.1.0: version "2.1.1" - resolved "https://registry.yarnpkg.com/dot-case/-/dot-case-2.1.1.tgz#34dcf37f50a8e93c2b3bca8bb7fb9155c7da3bee" + resolved "https://registry.npmjs.org/dot-case/-/dot-case-2.1.1.tgz" integrity sha512-HnM6ZlFqcajLsyudHq7LeeLDr2rFAVYtDv/hV5qchQEidSck8j9OPUsXY9KwJv/lHMtYlX4DjRQqwFYa+0r8Ug== dependencies: no-case "^2.2.0" ecc-jsbn@~0.1.1: version "0.1.2" - resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" + resolved "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz" integrity sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw== dependencies: jsbn "~0.1.0" @@ -3645,17 +3807,17 @@ ecc-jsbn@~0.1.1: ee-first@1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + resolved "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz" integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== electron-to-chromium@^1.4.284: version "1.4.367" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.367.tgz#d9ddc529ba2315fc852b722c359e4a40e86aa742" + resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.367.tgz" integrity sha512-mNuDxb+HpLhPGUKrg0hSxbTjHWw8EziwkwlJNkFUj3W60ypigLDRVz04vU+VRsJPi8Gub+FDhYUpuTm9xiEwRQ== -elliptic@6.5.4, elliptic@^6.4.0, elliptic@^6.5.2, elliptic@^6.5.4: +elliptic@^6.4.0, elliptic@^6.5.2, elliptic@^6.5.4, elliptic@6.5.4: version "6.5.4" - resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" + resolved "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz" integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== dependencies: bn.js "^4.11.9" @@ -3668,53 +3830,53 @@ elliptic@6.5.4, elliptic@^6.4.0, elliptic@^6.5.2, elliptic@^6.5.4: emoji-regex@^7.0.1: version "7.0.3" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" + resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz" integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== emoji-regex@^8.0.0: version "8.0.0" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz" integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== encodeurl@~1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + resolved "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz" integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== end-of-stream@^1.1.0: version "1.4.4" - resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" + resolved "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz" integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== dependencies: once "^1.4.0" enquirer@^2.3.0, enquirer@^2.3.4, enquirer@^2.3.5: version "2.3.6" - resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" + resolved "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz" integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== dependencies: ansi-colors "^4.1.1" entities@^4.2.0, entities@^4.3.0, entities@^4.4.0: version "4.4.0" - resolved "https://registry.yarnpkg.com/entities/-/entities-4.4.0.tgz#97bdaba170339446495e653cfd2db78962900174" + resolved "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz" integrity sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA== env-paths@^2.2.0: version "2.2.1" - resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2" + resolved "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz" integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== error-ex@^1.2.0, error-ex@^1.3.1: version "1.3.2" - resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + resolved "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz" integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== dependencies: is-arrayish "^0.2.1" es-abstract@^1.19.0, es-abstract@^1.20.4: version "1.21.1" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.21.1.tgz#e6105a099967c08377830a0c9cb589d570dd86c6" + resolved "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.1.tgz" integrity sha512-QudMsPOz86xYz/1dG1OuGBKOELjCh99IIWHLzy5znUB6j8xG2yMA7bfTV86VSqKF+Y/H08vQPR+9jyXpuC6hfg== dependencies: available-typed-arrays "^1.0.5" @@ -3753,12 +3915,12 @@ es-abstract@^1.19.0, es-abstract@^1.20.4: es-array-method-boxes-properly@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz#873f3e84418de4ee19c5be752990b2e44718d09e" + resolved "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz" integrity sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA== es-set-tostringtag@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz#338d502f6f674301d710b80c8592de8a15f09cd8" + resolved "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz" integrity sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg== dependencies: get-intrinsic "^1.1.3" @@ -3767,14 +3929,14 @@ es-set-tostringtag@^2.0.1: es-shim-unscopables@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz#702e632193201e3edf8713635d083d378e510241" + resolved "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz" integrity sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w== dependencies: has "^1.0.3" es-to-primitive@^1.2.1: version "1.2.1" - resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" + resolved "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz" integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== dependencies: is-callable "^1.1.4" @@ -3783,7 +3945,7 @@ es-to-primitive@^1.2.1: es5-ext@^0.10.35, es5-ext@^0.10.50: version "0.10.62" - resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.62.tgz#5e6adc19a6da524bf3d1e02bbc8960e5eb49a9a5" + resolved "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.62.tgz" integrity sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA== dependencies: es6-iterator "^2.0.3" @@ -3792,12 +3954,12 @@ es5-ext@^0.10.35, es5-ext@^0.10.50: es6-error@^4.0.1: version "4.1.1" - resolved "https://registry.yarnpkg.com/es6-error/-/es6-error-4.1.1.tgz#9e3af407459deed47e9a91f9b885a84eb05c561d" + resolved "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz" integrity sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg== es6-iterator@^2.0.3: version "2.0.3" - resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7" + resolved "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz" integrity sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g== dependencies: d "1" @@ -3806,12 +3968,12 @@ es6-iterator@^2.0.3: es6-promise@^4.2.8: version "4.2.8" - resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a" + resolved "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz" integrity sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w== es6-symbol@^3.1.1, es6-symbol@^3.1.3: version "3.1.3" - resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.3.tgz#bad5d3c1bcdac28269f4cb331e431c78ac705d18" + resolved "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz" integrity sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA== dependencies: d "^1.0.1" @@ -3819,27 +3981,32 @@ es6-symbol@^3.1.1, es6-symbol@^3.1.3: escalade@^3.1.1: version "3.1.1" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" + resolved "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz" integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== escape-html@~1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + resolved "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz" integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== -escape-string-regexp@1.0.5, escape-string-regexp@^1.0.5: +escape-string-regexp@^1.0.5, escape-string-regexp@1.0.5: version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== -escape-string-regexp@4.0.0, escape-string-regexp@^4.0.0: +escape-string-regexp@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +escape-string-regexp@4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== escodegen@1.8.x: version "1.8.1" - resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.8.1.tgz#5a5b53af4693110bebb0867aa3430dd3b70a1018" + resolved "https://registry.npmjs.org/escodegen/-/escodegen-1.8.1.tgz" integrity sha512-yhi5S+mNTOuRvyW4gWlg5W1byMaQGWWSYHXsuFZ7GBo7tpyOwi2EdzMP/QWxh9hwkD2m+wDVHJsxhRIj+v/b/A== dependencies: esprima "^2.7.1" @@ -3851,12 +4018,12 @@ escodegen@1.8.x: eslint-config-prettier@8.3.0: version "8.3.0" - resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-8.3.0.tgz#f7471b20b6fe8a9a9254cc684454202886a2dd7a" + resolved "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.3.0.tgz" integrity sha512-BgZuLUSeKzvlL/VUjx/Yb787VQ26RU3gGjA3iiFvdsp/2bMfVIWUVP7tjxtjS0e+HP409cPlPvNkQloz8C91ew== eslint-import-resolver-node@^0.3.6: version "0.3.7" - resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz#83b375187d412324a1963d84fa664377a23eb4d7" + resolved "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz" integrity sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA== dependencies: debug "^3.2.7" @@ -3865,14 +4032,14 @@ eslint-import-resolver-node@^0.3.6: eslint-module-utils@^2.6.2: version "2.7.4" - resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.7.4.tgz#4f3e41116aaf13a20792261e61d3a2e7e0583974" + resolved "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.4.tgz" integrity sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA== dependencies: debug "^3.2.7" eslint-plugin-import@2.24.1: version "2.24.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.24.1.tgz#64aba8b567a1ba9921d5465586e86c491b8e2135" + resolved "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.24.1.tgz" integrity sha512-KSFWhNxPH8OGJwpRJJs+Z7I0a13E2iFQZJIvSnCu6KUs4qmgAm3xN9GYBCSoiGWmwA7gERZPXqYQjcoCROnYhQ== dependencies: array-includes "^3.1.3" @@ -3893,19 +4060,19 @@ eslint-plugin-import@2.24.1: eslint-plugin-no-only-tests@3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-no-only-tests/-/eslint-plugin-no-only-tests-3.0.0.tgz#026cbc8cb069c8da6b7e19d03654be7ad49893f6" + resolved "https://registry.npmjs.org/eslint-plugin-no-only-tests/-/eslint-plugin-no-only-tests-3.0.0.tgz" integrity sha512-I0PeXMs1vu21ap45hey4HQCJRqpcoIvGcNTPJe+UhUm8TwjQ6//mCrDqF8q0WS6LgmRDwQ4ovQej0AQsAHb5yg== eslint-plugin-prettier@3.4.0: version "3.4.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-3.4.0.tgz#cdbad3bf1dbd2b177e9825737fe63b476a08f0c7" + resolved "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.4.0.tgz" integrity sha512-UDK6rJT6INSfcOo545jiaOwB701uAIt2/dR7WnFQoGCVl1/EMqdANBmwUaqqQ45aXprsTGzSa39LI1PyuRBxxw== dependencies: prettier-linter-helpers "^1.0.0" eslint-scope@^5.1.1: version "5.1.1" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" + resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz" integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== dependencies: esrecurse "^4.3.0" @@ -3913,36 +4080,41 @@ eslint-scope@^5.1.1: eslint-utils@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27" + resolved "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz" integrity sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg== dependencies: eslint-visitor-keys "^1.1.0" eslint-utils@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-3.0.0.tgz#8aebaface7345bb33559db0a1f13a1d2d48c3672" + resolved "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz" integrity sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA== dependencies: eslint-visitor-keys "^2.0.0" -eslint-visitor-keys@^1.1.0, eslint-visitor-keys@^1.3.0: +eslint-visitor-keys@^1.1.0: + version "1.3.0" + resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz" + integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== + +eslint-visitor-keys@^1.3.0: version "1.3.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" + resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz" integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== eslint-visitor-keys@^2.0.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" + resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz" integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== eslint-visitor-keys@^3.3.0: version "3.3.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz#f6480fa6b1f30efe2d1968aa8ac745b862469826" + resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz" integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA== -eslint@^7.29.0: +eslint@*, "eslint@^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0", "eslint@^5.0.0 || ^6.0.0 || ^7.0.0", "eslint@^6.0.0 || ^7.0.0 || ^8.0.0", eslint@^7.29.0, eslint@>=5, eslint@>=5.0.0, eslint@>=7.0.0: version "7.32.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.32.0.tgz#c6d328a14be3fb08c8d1d21e12c02fdb7a2a812d" + resolved "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz" integrity sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA== dependencies: "@babel/code-frame" "7.12.11" @@ -3988,65 +4160,75 @@ eslint@^7.29.0: espree@^7.3.0, espree@^7.3.1: version "7.3.1" - resolved "https://registry.yarnpkg.com/espree/-/espree-7.3.1.tgz#f2df330b752c6f55019f8bd89b7660039c1bbbb6" + resolved "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz" integrity sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g== dependencies: acorn "^7.4.0" acorn-jsx "^5.3.1" eslint-visitor-keys "^1.3.0" -esprima@2.7.x, esprima@^2.7.1: +esprima@^2.7.1: version "2.7.3" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" + resolved "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz" integrity sha512-OarPfz0lFCiW4/AV2Oy1Rp9qu0iusTKqykwTspGCZtPxmF81JR4MmIebvF1F9+UOKth2ZubLQ4XGGaU+hSn99A== esprima@^4.0.0: version "4.0.1" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + resolved "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== +esprima@2.7.x: + version "2.7.3" + resolved "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz" + integrity sha512-OarPfz0lFCiW4/AV2Oy1Rp9qu0iusTKqykwTspGCZtPxmF81JR4MmIebvF1F9+UOKth2ZubLQ4XGGaU+hSn99A== + esquery@^1.4.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5" + resolved "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz" integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w== dependencies: estraverse "^5.1.0" esrecurse@^4.3.0: version "4.3.0" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + resolved "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz" integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== dependencies: estraverse "^5.2.0" estraverse@^1.9.1: version "1.9.3" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-1.9.3.tgz#af67f2dc922582415950926091a4005d29c9bb44" + resolved "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz" integrity sha512-25w1fMXQrGdoquWnScXZGckOv+Wes+JDnuN/+7ex3SauFRS72r2lFDec0EKPt2YD1wUJ/IrfEex+9yp4hfSOJA== estraverse@^4.1.1: version "4.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + resolved "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz" integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== -estraverse@^5.1.0, estraverse@^5.2.0: +estraverse@^5.1.0: + version "5.3.0" + resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + +estraverse@^5.2.0: version "5.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz" integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== esutils@^2.0.2: version "2.0.3" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== etag@~1.8.1: version "1.8.1" - resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + resolved "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz" integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== -eth-ens-namehash@2.0.8, eth-ens-namehash@^2.0.0, eth-ens-namehash@^2.0.8: +eth-ens-namehash@^2.0.0, eth-ens-namehash@^2.0.8, eth-ens-namehash@2.0.8: version "2.0.8" - resolved "https://registry.yarnpkg.com/eth-ens-namehash/-/eth-ens-namehash-2.0.8.tgz#229ac46eca86d52e0c991e7cb2aef83ff0f68bcf" + resolved "https://registry.npmjs.org/eth-ens-namehash/-/eth-ens-namehash-2.0.8.tgz" integrity sha512-VWEI1+KJfz4Km//dadyvBBoBeSQ0MHTXPvr8UIXiLW6IanxvAV+DmlZAijZwAyggqGUfwQBeHf7tc9wzc1piSw== dependencies: idna-uts46-hx "^2.3.1" @@ -4054,7 +4236,7 @@ eth-ens-namehash@2.0.8, eth-ens-namehash@^2.0.0, eth-ens-namehash@^2.0.8: eth-gas-reporter@^0.2.25: version "0.2.25" - resolved "https://registry.yarnpkg.com/eth-gas-reporter/-/eth-gas-reporter-0.2.25.tgz#546dfa946c1acee93cb1a94c2a1162292d6ff566" + resolved "https://registry.npmjs.org/eth-gas-reporter/-/eth-gas-reporter-0.2.25.tgz" integrity sha512-1fRgyE4xUB8SoqLgN3eDfpDfwEfRxh2Sz1b7wzFbyQA+9TekMmvSjjoRu9SKcSVyK+vLkLIsVbJDsTWjw195OQ== dependencies: "@ethersproject/abi" "^5.0.0-beta.146" @@ -4073,18 +4255,9 @@ eth-gas-reporter@^0.2.25: sha1 "^1.1.1" sync-request "^6.0.0" -eth-lib@0.2.8: - version "0.2.8" - resolved "https://registry.yarnpkg.com/eth-lib/-/eth-lib-0.2.8.tgz#b194058bef4b220ad12ea497431d6cb6aa0623c8" - integrity sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw== - dependencies: - bn.js "^4.11.6" - elliptic "^6.4.0" - xhr-request-promise "^0.1.2" - eth-lib@^0.1.26: version "0.1.29" - resolved "https://registry.yarnpkg.com/eth-lib/-/eth-lib-0.1.29.tgz#0c11f5060d42da9f931eab6199084734f4dbd1d9" + resolved "https://registry.npmjs.org/eth-lib/-/eth-lib-0.1.29.tgz" integrity sha512-bfttrr3/7gG4E02HoWTDUcDDslN003OlOoBxk9virpAZQ1ja/jDgwkWB8QfJF7ojuEowrqy+lzp9VcJG7/k5bQ== dependencies: bn.js "^4.11.6" @@ -4094,16 +4267,25 @@ eth-lib@^0.1.26: ws "^3.0.0" xhr-request-promise "^0.1.2" +eth-lib@0.2.8: + version "0.2.8" + resolved "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz" + integrity sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw== + dependencies: + bn.js "^4.11.6" + elliptic "^6.4.0" + xhr-request-promise "^0.1.2" + ethereum-bloom-filters@^1.0.6: version "1.0.10" - resolved "https://registry.yarnpkg.com/ethereum-bloom-filters/-/ethereum-bloom-filters-1.0.10.tgz#3ca07f4aed698e75bd134584850260246a5fed8a" + resolved "https://registry.npmjs.org/ethereum-bloom-filters/-/ethereum-bloom-filters-1.0.10.tgz" integrity sha512-rxJ5OFN3RwjQxDcFP2Z5+Q9ho4eIdEmSc2ht0fCu8Se9nbXjZ7/031uXoUYJ87KHCOdVeiUuwSnoS7hmYAGVHA== dependencies: js-sha3 "^0.8.0" -ethereum-cryptography@0.1.3, ethereum-cryptography@^0.1.3: +ethereum-cryptography@^0.1.3: version "0.1.3" - resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz#8d6143cfc3d74bf79bbd8edecdf29e4ae20dd191" + resolved "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz" integrity sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ== dependencies: "@types/pbkdf2" "^3.0.0" @@ -4124,7 +4306,7 @@ ethereum-cryptography@0.1.3, ethereum-cryptography@^0.1.3: ethereum-cryptography@^1.0.3: version "1.2.0" - resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-1.2.0.tgz#5ccfa183e85fdaf9f9b299a79430c044268c9b3a" + resolved "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-1.2.0.tgz" integrity sha512-6yFQC9b5ug6/17CQpCyE3k9eKBMdhyVjzUy1WkiuY/E4vj/SXDBbCw8QEIaXqf0Mf2SnY6RmpDcwlUmBSS0EJw== dependencies: "@noble/hashes" "1.2.0" @@ -4132,9 +4314,50 @@ ethereum-cryptography@^1.0.3: "@scure/bip32" "1.1.5" "@scure/bip39" "1.1.1" +ethereum-cryptography@^2.0.0: + version "2.1.2" + resolved "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-2.1.2.tgz" + integrity sha512-Z5Ba0T0ImZ8fqXrJbpHcbpAvIswRte2wGNR/KePnu8GbbvgJ47lMxT/ZZPG6i9Jaht4azPDop4HaM00J0J59ug== + dependencies: + "@noble/curves" "1.1.0" + "@noble/hashes" "1.3.1" + "@scure/bip32" "1.3.1" + "@scure/bip39" "1.2.1" + +ethereum-cryptography@^2.1.2: + version "2.1.2" + resolved "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-2.1.2.tgz" + integrity sha512-Z5Ba0T0ImZ8fqXrJbpHcbpAvIswRte2wGNR/KePnu8GbbvgJ47lMxT/ZZPG6i9Jaht4azPDop4HaM00J0J59ug== + dependencies: + "@noble/curves" "1.1.0" + "@noble/hashes" "1.3.1" + "@scure/bip32" "1.3.1" + "@scure/bip39" "1.2.1" + +ethereum-cryptography@0.1.3: + version "0.1.3" + resolved "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz" + integrity sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ== + dependencies: + "@types/pbkdf2" "^3.0.0" + "@types/secp256k1" "^4.0.1" + blakejs "^1.1.0" + browserify-aes "^1.2.0" + bs58check "^2.1.2" + create-hash "^1.2.0" + create-hmac "^1.1.7" + hash.js "^1.1.7" + keccak "^3.0.0" + pbkdf2 "^3.0.17" + randombytes "^2.1.0" + safe-buffer "^5.1.2" + scrypt-js "^3.0.0" + secp256k1 "^4.0.1" + setimmediate "^1.0.5" + ethereum-ens@^0.8.0: version "0.8.0" - resolved "https://registry.yarnpkg.com/ethereum-ens/-/ethereum-ens-0.8.0.tgz#6d0f79acaa61fdbc87d2821779c4e550243d4c57" + resolved "https://registry.npmjs.org/ethereum-ens/-/ethereum-ens-0.8.0.tgz" integrity sha512-a8cBTF4AWw1Q1Y37V1LSCS9pRY4Mh3f8vCg5cbXCCEJ3eno1hbI/+Ccv9SZLISYpqQhaglP3Bxb/34lS4Qf7Bg== dependencies: bluebird "^3.4.7" @@ -4146,15 +4369,15 @@ ethereum-ens@^0.8.0: ethereumjs-abi@^0.6.8: version "0.6.8" - resolved "https://registry.yarnpkg.com/ethereumjs-abi/-/ethereumjs-abi-0.6.8.tgz#71bc152db099f70e62f108b7cdfca1b362c6fcae" + resolved "https://registry.npmjs.org/ethereumjs-abi/-/ethereumjs-abi-0.6.8.tgz" integrity sha512-Tx0r/iXI6r+lRsdvkFDlut0N08jWMnKRZ6Gkq+Nmw75lZe4e6o3EkSnkaBP5NF6+m5PTGAr9JP43N3LyeoglsA== dependencies: bn.js "^4.11.8" ethereumjs-util "^6.0.0" -ethereumjs-util@6.2.1, ethereumjs-util@^6.0.0, ethereumjs-util@^6.2.1: +ethereumjs-util@^6.0.0, ethereumjs-util@^6.2.1: version "6.2.1" - resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz#fcb4e4dd5ceacb9d2305426ab1a5cd93e3163b69" + resolved "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz" integrity sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw== dependencies: "@types/bn.js" "^4.11.3" @@ -4165,9 +4388,20 @@ ethereumjs-util@6.2.1, ethereumjs-util@^6.0.0, ethereumjs-util@^6.2.1: ethjs-util "0.1.6" rlp "^2.2.3" -ethereumjs-util@^7.1.0, ethereumjs-util@^7.1.1, ethereumjs-util@^7.1.2, ethereumjs-util@^7.1.4, ethereumjs-util@^7.1.5: +ethereumjs-util@^7.1.0, ethereumjs-util@^7.1.4, ethereumjs-util@^7.1.5: + version "7.1.5" + resolved "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz" + integrity sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg== + dependencies: + "@types/bn.js" "^5.1.0" + bn.js "^5.1.2" + create-hash "^1.1.2" + ethereum-cryptography "^0.1.3" + rlp "^2.2.4" + +ethereumjs-util@^7.1.1: version "7.1.5" - resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz#9ecf04861e4fbbeed7465ece5f23317ad1129181" + resolved "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz" integrity sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg== dependencies: "@types/bn.js" "^5.1.0" @@ -4176,9 +4410,63 @@ ethereumjs-util@^7.1.0, ethereumjs-util@^7.1.1, ethereumjs-util@^7.1.2, ethereum ethereum-cryptography "^0.1.3" rlp "^2.2.4" -ethers@^4.0.0-beta.1, ethers@^4.0.32, ethers@^4.0.40: +ethereumjs-util@^7.1.2: + version "7.1.5" + resolved "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz" + integrity sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg== + dependencies: + "@types/bn.js" "^5.1.0" + bn.js "^5.1.2" + create-hash "^1.1.2" + ethereum-cryptography "^0.1.3" + rlp "^2.2.4" + +ethereumjs-util@6.2.1: + version "6.2.1" + resolved "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz" + integrity sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw== + dependencies: + "@types/bn.js" "^4.11.3" + bn.js "^4.11.0" + create-hash "^1.1.2" + elliptic "^6.5.2" + ethereum-cryptography "^0.1.3" + ethjs-util "0.1.6" + rlp "^2.2.3" + +ethers@^4.0.0-beta.1: + version "4.0.49" + resolved "https://registry.npmjs.org/ethers/-/ethers-4.0.49.tgz" + integrity sha512-kPltTvWiyu+OktYy1IStSO16i2e7cS9D9OxZ81q2UUaiNPVrm/RTcbxamCXF9VUSKzJIdJV68EAIhTEVBalRWg== + dependencies: + aes-js "3.0.0" + bn.js "^4.11.9" + elliptic "6.5.4" + hash.js "1.1.3" + js-sha3 "0.5.7" + scrypt-js "2.0.4" + setimmediate "1.0.4" + uuid "2.0.1" + xmlhttprequest "1.8.0" + +ethers@^4.0.32: + version "4.0.49" + resolved "https://registry.npmjs.org/ethers/-/ethers-4.0.49.tgz" + integrity sha512-kPltTvWiyu+OktYy1IStSO16i2e7cS9D9OxZ81q2UUaiNPVrm/RTcbxamCXF9VUSKzJIdJV68EAIhTEVBalRWg== + dependencies: + aes-js "3.0.0" + bn.js "^4.11.9" + elliptic "6.5.4" + hash.js "1.1.3" + js-sha3 "0.5.7" + scrypt-js "2.0.4" + setimmediate "1.0.4" + uuid "2.0.1" + xmlhttprequest "1.8.0" + +ethers@^4.0.40: version "4.0.49" - resolved "https://registry.yarnpkg.com/ethers/-/ethers-4.0.49.tgz#0eb0e9161a0c8b4761be547396bbe2fb121a8894" + resolved "https://registry.npmjs.org/ethers/-/ethers-4.0.49.tgz" integrity sha512-kPltTvWiyu+OktYy1IStSO16i2e7cS9D9OxZ81q2UUaiNPVrm/RTcbxamCXF9VUSKzJIdJV68EAIhTEVBalRWg== dependencies: aes-js "3.0.0" @@ -4191,9 +4479,9 @@ ethers@^4.0.0-beta.1, ethers@^4.0.32, ethers@^4.0.40: uuid "2.0.1" xmlhttprequest "1.8.0" -ethers@^5.0.0, ethers@^5.0.13, ethers@^5.4.7, ethers@^5.7.1: +ethers@^5.0.0, ethers@^5.0.13, ethers@^5.1.3, ethers@^5.4.7, ethers@^5.7.1: version "5.7.2" - resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.7.2.tgz#3a7deeabbb8c030d4126b24f84e525466145872e" + resolved "https://registry.npmjs.org/ethers/-/ethers-5.7.2.tgz" integrity sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg== dependencies: "@ethersproject/abi" "5.7.0" @@ -4229,7 +4517,7 @@ ethers@^5.0.0, ethers@^5.0.13, ethers@^5.4.7, ethers@^5.7.1: ethjs-abi@0.1.8: version "0.1.8" - resolved "https://registry.yarnpkg.com/ethjs-abi/-/ethjs-abi-0.1.8.tgz#cd288583ed628cdfadaf8adefa3ba1dbcbca6c18" + resolved "https://registry.npmjs.org/ethjs-abi/-/ethjs-abi-0.1.8.tgz" integrity sha512-3SIJpF+LCVJrNht9OjSJ7+3B9ABZf6dEATMj1PaslL0BW547Cz6/kGyuDvvrcEBlSsbGpCWYrJX5B8OjhcAMFQ== dependencies: bn.js "4.11.6" @@ -4238,15 +4526,15 @@ ethjs-abi@0.1.8: ethjs-unit@0.1.6: version "0.1.6" - resolved "https://registry.yarnpkg.com/ethjs-unit/-/ethjs-unit-0.1.6.tgz#c665921e476e87bce2a9d588a6fe0405b2c41699" + resolved "https://registry.npmjs.org/ethjs-unit/-/ethjs-unit-0.1.6.tgz" integrity sha512-/Sn9Y0oKl0uqQuvgFk/zQgR7aw1g36qX/jzSQ5lSwlO0GigPymk4eGQfeNTD03w1dPOqfz8V77Cy43jH56pagw== dependencies: bn.js "4.11.6" number-to-bn "1.7.0" -ethjs-util@0.1.6, ethjs-util@^0.1.6: +ethjs-util@^0.1.6, ethjs-util@0.1.6: version "0.1.6" - resolved "https://registry.yarnpkg.com/ethjs-util/-/ethjs-util-0.1.6.tgz#f308b62f185f9fe6237132fb2a9818866a5cd536" + resolved "https://registry.npmjs.org/ethjs-util/-/ethjs-util-0.1.6.tgz" integrity sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w== dependencies: is-hex-prefixed "1.0.0" @@ -4254,17 +4542,17 @@ ethjs-util@0.1.6, ethjs-util@^0.1.6: event-target-shim@^5.0.0: version "5.0.1" - resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789" + resolved "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz" integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== eventemitter3@4.0.4: version "4.0.4" - resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.4.tgz#b5463ace635a083d018bdc7c917b4c5f10a85384" + resolved "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.4.tgz" integrity sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ== evp_bytestokey@^1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" + resolved "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz" integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== dependencies: md5.js "^1.3.4" @@ -4272,7 +4560,7 @@ evp_bytestokey@^1.0.3: execa@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" + resolved "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz" integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA== dependencies: cross-spawn "^6.0.0" @@ -4285,7 +4573,7 @@ execa@^1.0.0: express@^4.14.0: version "4.18.2" - resolved "https://registry.yarnpkg.com/express/-/express-4.18.2.tgz#3fabe08296e930c796c19e3c516979386ba9fd59" + resolved "https://registry.npmjs.org/express/-/express-4.18.2.tgz" integrity sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ== dependencies: accepts "~1.3.8" @@ -4322,65 +4610,60 @@ express@^4.14.0: ext@^1.1.2: version "1.7.0" - resolved "https://registry.yarnpkg.com/ext/-/ext-1.7.0.tgz#0ea4383c0103d60e70be99e9a7f11027a33c4f5f" + resolved "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz" integrity sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw== dependencies: type "^2.7.2" extend@~3.0.2: version "3.0.2" - resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + resolved "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz" integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== extendable-error@^0.1.5: version "0.1.7" - resolved "https://registry.yarnpkg.com/extendable-error/-/extendable-error-0.1.7.tgz#60b9adf206264ac920058a7395685ae4670c2b96" + resolved "https://registry.npmjs.org/extendable-error/-/extendable-error-0.1.7.tgz" integrity sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg== external-editor@^3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" + resolved "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz" integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== dependencies: chardet "^0.7.0" iconv-lite "^0.4.24" tmp "^0.0.33" -extsprintf@1.3.0: +extsprintf@^1.2.0, extsprintf@1.3.0: version "1.3.0" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" + resolved "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz" integrity sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g== -extsprintf@^1.2.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.1.tgz#8d172c064867f235c0c84a596806d279bf4bcc07" - integrity sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA== - fast-check@3.1.1: version "3.1.1" - resolved "https://registry.yarnpkg.com/fast-check/-/fast-check-3.1.1.tgz#72c5ae7022a4e86504762e773adfb8a5b0b01252" + resolved "https://registry.npmjs.org/fast-check/-/fast-check-3.1.1.tgz" integrity sha512-3vtXinVyuUKCKFKYcwXhGE6NtGWkqF8Yh3rvMZNzmwz8EPrgoc/v4pDdLHyLnCyCI5MZpZZkDEwFyXyEONOxpA== dependencies: pure-rand "^5.0.1" fast-deep-equal@^1.0.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz#c053477817c86b51daa853c81e059b733d023614" + resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz" integrity sha512-fueX787WZKCV0Is4/T2cyAdM4+x1S3MXXOAhavE1ys/W42SHAPacLTQhucja22QBYrfGw50M2sRiXPtTGv9Ymw== fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== fast-diff@^1.1.2, fast-diff@^1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03" + resolved "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz" integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w== fast-glob@^3.0.3, fast-glob@^3.2.9: version "3.2.12" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.12.tgz#7f39ec99c2e6ab030337142da9e0c18f37afae80" + resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz" integrity sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w== dependencies: "@nodelib/fs.stat" "^2.0.2" @@ -4391,38 +4674,38 @@ fast-glob@^3.0.3, fast-glob@^3.2.9: fast-json-stable-stringify@^2.0.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6: version "2.0.6" - resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + resolved "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz" integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== fastq@^1.6.0: version "1.15.0" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.15.0.tgz#d04d07c6a2a68fe4599fea8d2e103a937fae6b3a" + resolved "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz" integrity sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw== dependencies: reusify "^1.0.4" file-entry-cache@^6.0.1: version "6.0.1" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" + resolved "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz" integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== dependencies: flat-cache "^3.0.4" fill-range@^7.0.1: version "7.0.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz" integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== dependencies: to-regex-range "^5.0.1" finalhandler@1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.2.0.tgz#7d23fe5731b207b4640e4fcd00aec1f9207a7b32" + resolved "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz" integrity sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg== dependencies: debug "2.6.9" @@ -4435,7 +4718,7 @@ finalhandler@1.2.0: find-cache-dir@^3.2.0: version "3.3.2" - resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.2.tgz#b30c5b6eff0730731aea9bbd9dbecbd80256d64b" + resolved "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz" integrity sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig== dependencies: commondir "^1.0.1" @@ -4444,29 +4727,14 @@ find-cache-dir@^3.2.0: find-replace@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/find-replace/-/find-replace-3.0.0.tgz#3e7e23d3b05167a76f770c9fbd5258b0def68c38" + resolved "https://registry.npmjs.org/find-replace/-/find-replace-3.0.0.tgz" integrity sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ== dependencies: array-back "^3.0.1" -find-up@3.0.0, find-up@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" - integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== - dependencies: - locate-path "^3.0.0" - -find-up@5.0.0, find-up@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" - integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== - dependencies: - locate-path "^6.0.0" - path-exists "^4.0.0" - find-up@^1.0.0: version "1.1.2" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" + resolved "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz" integrity sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA== dependencies: path-exists "^2.0.0" @@ -4474,22 +4742,53 @@ find-up@^1.0.0: find-up@^2.0.0, find-up@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" + resolved "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz" integrity sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ== dependencies: locate-path "^2.0.0" -find-up@^4.0.0, find-up@^4.1.0: +find-up@^3.0.0, find-up@3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz" + integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== + dependencies: + locate-path "^3.0.0" + +find-up@^4.0.0: + version "4.1.0" + resolved "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== + dependencies: + locate-path "^5.0.0" + path-exists "^4.0.0" + +find-up@^4.1.0: version "4.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" + resolved "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz" integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== dependencies: locate-path "^5.0.0" path-exists "^4.0.0" +find-up@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + +find-up@5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + find-yarn-workspace-root2@1.2.16: version "1.2.16" - resolved "https://registry.yarnpkg.com/find-yarn-workspace-root2/-/find-yarn-workspace-root2-1.2.16.tgz#60287009dd2f324f59646bdb4b7610a6b301c2a9" + resolved "https://registry.npmjs.org/find-yarn-workspace-root2/-/find-yarn-workspace-root2-1.2.16.tgz" integrity sha512-hr6hb1w8ePMpPVUK39S4RlwJzi+xPLuVuG8XlwXU3KD5Yn3qgBWVfy3AzNlDhWvE1EORCE65/Qm26rFQt3VLVA== dependencies: micromatch "^4.0.2" @@ -4497,7 +4796,7 @@ find-yarn-workspace-root2@1.2.16: flat-cache@^3.0.4: version "3.0.4" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" + resolved "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz" integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== dependencies: flatted "^3.1.0" @@ -4505,36 +4804,36 @@ flat-cache@^3.0.4: flat@^4.1.0: version "4.1.1" - resolved "https://registry.yarnpkg.com/flat/-/flat-4.1.1.tgz#a392059cc382881ff98642f5da4dde0a959f309b" + resolved "https://registry.npmjs.org/flat/-/flat-4.1.1.tgz" integrity sha512-FmTtBsHskrU6FJ2VxCnsDb84wu9zhmO3cUX2kGFb5tuwhfXxGciiT0oRY+cck35QmG+NmGh5eLz6lLCpWTqwpA== dependencies: is-buffer "~2.0.3" flat@^5.0.2: version "5.0.2" - resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" + resolved "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz" integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== flatted@^3.1.0: version "3.2.7" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.7.tgz#609f39207cb614b89d0765b477cb2d437fbf9787" + resolved "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz" integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ== follow-redirects@^1.12.1, follow-redirects@^1.14.0: version "1.15.2" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13" + resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz" integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== for-each@^0.3.3: version "0.3.3" - resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" + resolved "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz" integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== dependencies: is-callable "^1.1.3" foreground-child@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-2.0.0.tgz#71b32800c9f15aa8f2f83f4a6bd9bff35d861a53" + resolved "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz" integrity sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA== dependencies: cross-spawn "^7.0.0" @@ -4542,26 +4841,17 @@ foreground-child@^2.0.0: forever-agent@~0.6.1: version "0.6.1" - resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" + resolved "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz" integrity sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw== form-data-encoder@1.7.1: version "1.7.1" - resolved "https://registry.yarnpkg.com/form-data-encoder/-/form-data-encoder-1.7.1.tgz#ac80660e4f87ee0d3d3c3638b7da8278ddb8ec96" + resolved "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-1.7.1.tgz" integrity sha512-EFRDrsMm/kyqbTQocNvRXMLjc7Es2Vk+IQFx/YW7hkUH1eBl4J1fqiP34l74Yt0pFLCNpc06fkbVk00008mzjg== -form-data@^2.2.0: - version "2.5.1" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.5.1.tgz#f2cbec57b5e59e23716e128fe44d4e5dd23895f4" - integrity sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA== - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.6" - mime-types "^2.1.12" - -form-data@~2.3.2: +form-data@^2.2.0, form-data@~2.3.2: version "2.3.3" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" + resolved "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz" integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== dependencies: asynckit "^0.4.0" @@ -4570,32 +4860,27 @@ form-data@~2.3.2: forwarded@0.2.0: version "0.2.0" - resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" + resolved "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz" integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== -fp-ts@1.19.3: +fp-ts@^1.0.0, fp-ts@1.19.3: version "1.19.3" - resolved "https://registry.yarnpkg.com/fp-ts/-/fp-ts-1.19.3.tgz#261a60d1088fbff01f91256f91d21d0caaaaa96f" + resolved "https://registry.npmjs.org/fp-ts/-/fp-ts-1.19.3.tgz" integrity sha512-H5KQDspykdHuztLTg+ajGN0Z2qUjcEf3Ybxc6hLt0k7/zPkn29XnKnxlBPyW2XIddWrGaJBzBl4VLYOtk39yZg== -fp-ts@^1.0.0: - version "1.19.5" - resolved "https://registry.yarnpkg.com/fp-ts/-/fp-ts-1.19.5.tgz#3da865e585dfa1fdfd51785417357ac50afc520a" - integrity sha512-wDNqTimnzs8QqpldiId9OavWK2NptormjXnRJTQecNjzwfyp6P/8s/zG8e4h3ja3oqkKaY72UlTjQYt/1yXf9A== - fresh@0.5.2: version "0.5.2" - resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + resolved "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz" integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== fromentries@^1.2.0: version "1.3.2" - resolved "https://registry.yarnpkg.com/fromentries/-/fromentries-1.3.2.tgz#e4bca6808816bf8f93b52750f1127f5a6fd86e3a" + resolved "https://registry.npmjs.org/fromentries/-/fromentries-1.3.2.tgz" integrity sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg== fs-extra@^0.30.0: version "0.30.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-0.30.0.tgz#f233ffcc08d4da7d432daa449776989db1df93f0" + resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz" integrity sha512-UvSPKyhMn6LEd/WpUaV9C9t3zATuqoqfWc3QdPhPLb58prN9tqYPlPWi8Krxi44loBoUzlobqZ3+8tGpxxSzwA== dependencies: graceful-fs "^4.1.2" @@ -4606,7 +4891,7 @@ fs-extra@^0.30.0: fs-extra@^4.0.2: version "4.0.3" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-4.0.3.tgz#0d852122e5bc5beb453fb028e9c0c9bf36340c94" + resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz" integrity sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg== dependencies: graceful-fs "^4.1.2" @@ -4615,7 +4900,7 @@ fs-extra@^4.0.2: fs-extra@^7.0.0, fs-extra@^7.0.1: version "7.0.1" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9" + resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz" integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw== dependencies: graceful-fs "^4.1.2" @@ -4624,7 +4909,7 @@ fs-extra@^7.0.0, fs-extra@^7.0.1: fs-extra@^8.1.0: version "8.1.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" + resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz" integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== dependencies: graceful-fs "^4.2.0" @@ -4633,7 +4918,7 @@ fs-extra@^8.1.0: fs-extra@^9.1.0: version "9.1.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" + resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz" integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== dependencies: at-least-node "^1.0.0" @@ -4643,39 +4928,29 @@ fs-extra@^9.1.0: fs-minipass@^1.2.7: version "1.2.7" - resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.7.tgz#ccff8570841e7fe4265693da88936c55aed7f7c7" + resolved "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz" integrity sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA== dependencies: minipass "^2.6.0" fs-readdir-recursive@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz#e32fc030a2ccee44a6b5371308da54be0b397d27" + resolved "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz" integrity sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA== fs.realpath@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== -fsevents@~2.1.1: - version "2.1.3" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.3.tgz#fb738703ae8d2f9fe900c33836ddebee8b97f23e" - integrity sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ== - -fsevents@~2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" - integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== - function-bind@^1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz" integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== function.prototype.name@^1.1.5: version "1.1.5" - resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.5.tgz#cce0505fe1ffb80503e6f9e46cc64e46a12a9621" + resolved "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz" integrity sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA== dependencies: call-bind "^1.0.2" @@ -4685,17 +4960,17 @@ function.prototype.name@^1.1.5: functional-red-black-tree@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" + resolved "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz" integrity sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g== functions-have-names@^1.2.2: version "1.2.3" - resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" + resolved "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz" integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== ganache-cli@^6.12.2: version "6.12.2" - resolved "https://registry.yarnpkg.com/ganache-cli/-/ganache-cli-6.12.2.tgz#c0920f7db0d4ac062ffe2375cb004089806f627a" + resolved "https://registry.npmjs.org/ganache-cli/-/ganache-cli-6.12.2.tgz" integrity sha512-bnmwnJDBDsOWBUP8E/BExWf85TsdDEFelQSzihSJm9VChVO1SHp94YXLP5BlA4j/OTxp0wR4R1Tje9OHOuAJVw== dependencies: ethereumjs-util "6.2.1" @@ -4704,27 +4979,27 @@ ganache-cli@^6.12.2: gensync@^1.0.0-beta.2: version "1.0.0-beta.2" - resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" + resolved "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz" integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== get-caller-file@^1.0.1: version "1.0.3" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a" + resolved "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz" integrity sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w== get-caller-file@^2.0.1, get-caller-file@^2.0.5: version "2.0.5" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + resolved "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== get-func-name@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41" + resolved "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz" integrity sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig== get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.0.tgz#7ad1dc0535f3a2904bba075772763e5051f6d05f" + resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz" integrity sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q== dependencies: function-bind "^1.1.1" @@ -4733,41 +5008,41 @@ get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@ get-package-type@^0.1.0: version "0.1.0" - resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" + resolved "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz" integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== get-port@^3.1.0: version "3.2.0" - resolved "https://registry.yarnpkg.com/get-port/-/get-port-3.2.0.tgz#dd7ce7de187c06c8bf353796ac71e099f0980ebc" + resolved "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz" integrity sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg== get-port@^5.1.1: version "5.1.1" - resolved "https://registry.yarnpkg.com/get-port/-/get-port-5.1.1.tgz#0469ed07563479de6efb986baf053dcd7d4e3193" + resolved "https://registry.npmjs.org/get-port/-/get-port-5.1.1.tgz" integrity sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ== get-stream@^4.0.0: version "4.1.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" + resolved "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz" integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== dependencies: pump "^3.0.0" get-stream@^5.1.0: version "5.2.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" + resolved "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz" integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== dependencies: pump "^3.0.0" get-stream@^6.0.1: version "6.0.1" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" + resolved "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz" integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== get-symbol-description@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" + resolved "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz" integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== dependencies: call-bind "^1.0.2" @@ -4775,14 +5050,14 @@ get-symbol-description@^1.0.0: getpass@^0.1.1: version "0.1.7" - resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" + resolved "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz" integrity sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng== dependencies: assert-plus "^1.0.0" ghost-testrpc@^0.0.2: version "0.0.2" - resolved "https://registry.yarnpkg.com/ghost-testrpc/-/ghost-testrpc-0.0.2.tgz#c4de9557b1d1ae7b2d20bbe474a91378ca90ce92" + resolved "https://registry.npmjs.org/ghost-testrpc/-/ghost-testrpc-0.0.2.tgz" integrity sha512-i08dAEgJ2g8z5buJIrCTduwPIhih3DP+hOCTyyryikfV8T0bNvHnGXO67i0DD1H4GBDETTclPy9njZbfluQYrQ== dependencies: chalk "^2.4.2" @@ -4790,38 +5065,25 @@ ghost-testrpc@^0.0.2: glob-parent@^5.1.2, glob-parent@~5.1.0, glob-parent@~5.1.2: version "5.1.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== dependencies: is-glob "^4.0.1" -glob@7.1.3: - version "7.1.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" - integrity sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" - -glob@7.1.7: - version "7.1.7" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90" - integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ== +glob@^5.0.15: + version "5.0.15" + resolved "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz" + integrity sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA== dependencies: - fs.realpath "^1.0.0" inflight "^1.0.4" inherits "2" - minimatch "^3.0.4" + minimatch "2 || 3" once "^1.3.0" path-is-absolute "^1.0.0" -glob@7.2.0: +glob@^7.0.0, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, glob@7.2.0: version "7.2.0" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" + resolved "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz" integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== dependencies: fs.realpath "^1.0.0" @@ -4831,50 +5093,51 @@ glob@7.2.0: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^5.0.15: - version "5.0.15" - resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1" - integrity sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA== +glob@^8.0.3: + version "8.1.0" + resolved "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz" + integrity sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ== dependencies: + fs.realpath "^1.0.0" inflight "^1.0.4" inherits "2" - minimatch "2 || 3" + minimatch "^5.0.1" once "^1.3.0" - path-is-absolute "^1.0.0" -glob@^7.0.0, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: - version "7.2.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" - integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== +glob@7.1.3: + version "7.1.3" + resolved "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz" + integrity sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ== dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" inherits "2" - minimatch "^3.1.1" + minimatch "^3.0.4" once "^1.3.0" path-is-absolute "^1.0.0" -glob@^8.0.3: - version "8.1.0" - resolved "https://registry.yarnpkg.com/glob/-/glob-8.1.0.tgz#d388f656593ef708ee3e34640fdfb99a9fd1c33e" - integrity sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ== +glob@7.1.7: + version "7.1.7" + resolved "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz" + integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ== dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" inherits "2" - minimatch "^5.0.1" + minimatch "^3.0.4" once "^1.3.0" + path-is-absolute "^1.0.0" global-modules@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-2.0.0.tgz#997605ad2345f27f51539bea26574421215c7780" + resolved "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz" integrity sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A== dependencies: global-prefix "^3.0.0" global-prefix@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-3.0.0.tgz#fc85f73064df69f50421f47f883fe5b913ba9b97" + resolved "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz" integrity sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg== dependencies: ini "^1.3.5" @@ -4883,7 +5146,7 @@ global-prefix@^3.0.0: global@~4.4.0: version "4.4.0" - resolved "https://registry.yarnpkg.com/global/-/global-4.4.0.tgz#3e7b105179006a323ed71aafca3e9c57a5cc6406" + resolved "https://registry.npmjs.org/global/-/global-4.4.0.tgz" integrity sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w== dependencies: min-document "^2.19.0" @@ -4891,26 +5154,26 @@ global@~4.4.0: globals@^11.1.0: version "11.12.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + resolved "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz" integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== globals@^13.6.0, globals@^13.9.0: version "13.20.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-13.20.0.tgz#ea276a1e508ffd4f1612888f9d1bad1e2717bf82" + resolved "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz" integrity sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ== dependencies: type-fest "^0.20.2" globalthis@^1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.3.tgz#5852882a52b80dc301b0660273e1ed082f0b6ccf" + resolved "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz" integrity sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA== dependencies: define-properties "^1.1.3" globby@^10.0.1: version "10.0.2" - resolved "https://registry.yarnpkg.com/globby/-/globby-10.0.2.tgz#277593e745acaa4646c3ab411289ec47a0392543" + resolved "https://registry.npmjs.org/globby/-/globby-10.0.2.tgz" integrity sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg== dependencies: "@types/glob" "^7.1.1" @@ -4924,7 +5187,7 @@ globby@^10.0.1: globby@^11.0.0, globby@^11.0.3, globby@^11.1.0: version "11.1.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" + resolved "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz" integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== dependencies: array-union "^2.1.0" @@ -4936,14 +5199,31 @@ globby@^11.0.0, globby@^11.0.3, globby@^11.1.0: gopd@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" + resolved "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz" integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== dependencies: get-intrinsic "^1.1.3" +got@^11.8.5: + version "11.8.6" + resolved "https://registry.npmjs.org/got/-/got-11.8.6.tgz" + integrity sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g== + dependencies: + "@sindresorhus/is" "^4.0.0" + "@szmarczak/http-timer" "^4.0.5" + "@types/cacheable-request" "^6.0.1" + "@types/responselike" "^1.0.0" + cacheable-lookup "^5.0.3" + cacheable-request "^7.0.2" + decompress-response "^6.0.0" + http2-wrapper "^1.0.0-beta.5.2" + lowercase-keys "^2.0.0" + p-cancelable "^2.0.0" + responselike "^2.0.0" + got@12.1.0: version "12.1.0" - resolved "https://registry.yarnpkg.com/got/-/got-12.1.0.tgz#099f3815305c682be4fd6b0ee0726d8e4c6b0af4" + resolved "https://registry.npmjs.org/got/-/got-12.1.0.tgz" integrity sha512-hBv2ty9QN2RdbJJMK3hesmSkFTjVIHyIDDbssCKnSmq62edGgImJWD10Eb1k77TiV1bxloxqcFAVK8+9pkhOig== dependencies: "@sindresorhus/is" "^4.6.0" @@ -4960,46 +5240,24 @@ got@12.1.0: p-cancelable "^3.0.0" responselike "^2.0.0" -got@^11.8.5: - version "11.8.6" - resolved "https://registry.yarnpkg.com/got/-/got-11.8.6.tgz#276e827ead8772eddbcfc97170590b841823233a" - integrity sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g== - dependencies: - "@sindresorhus/is" "^4.0.0" - "@szmarczak/http-timer" "^4.0.5" - "@types/cacheable-request" "^6.0.1" - "@types/responselike" "^1.0.0" - cacheable-lookup "^5.0.3" - cacheable-request "^7.0.2" - decompress-response "^6.0.0" - http2-wrapper "^1.0.0-beta.5.2" - lowercase-keys "^2.0.0" - p-cancelable "^2.0.0" - responselike "^2.0.0" - -graceful-fs@^4.1.15: - version "4.2.11" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" - integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== - -graceful-fs@^4.1.2, graceful-fs@^4.1.5, graceful-fs@^4.1.6, graceful-fs@^4.1.9, graceful-fs@^4.2.0: +graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.5, graceful-fs@^4.1.6, graceful-fs@^4.1.9, graceful-fs@^4.2.0: version "4.2.10" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" + resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz" integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== grapheme-splitter@^1.0.4: version "1.0.4" - resolved "https://registry.yarnpkg.com/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz#9cf3a665c6247479896834af35cf1dbb4400767e" + resolved "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz" integrity sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ== growl@1.10.5: version "1.10.5" - resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" + resolved "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz" integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA== handlebars@^4.0.1: version "4.7.7" - resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.7.tgz#9ce33416aad02dbd6c8fafa8240d5d98004945a1" + resolved "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz" integrity sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA== dependencies: minimist "^1.2.5" @@ -5011,12 +5269,12 @@ handlebars@^4.0.1: har-schema@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" + resolved "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz" integrity sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q== har-validator@~5.1.3: version "5.1.5" - resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.5.tgz#1f0803b9f8cb20c0fa13822df1ecddb36bde1efd" + resolved "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz" integrity sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w== dependencies: ajv "^6.12.3" @@ -5024,102 +5282,165 @@ har-validator@~5.1.3: hard-rejection@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/hard-rejection/-/hard-rejection-2.1.0.tgz#1c6eda5c1685c63942766d79bb40ae773cecd883" + resolved "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz" integrity sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA== hardhat-gas-reporter@^1.0.8: version "1.0.9" - resolved "https://registry.yarnpkg.com/hardhat-gas-reporter/-/hardhat-gas-reporter-1.0.9.tgz#9a2afb354bc3b6346aab55b1c02ca556d0e16450" + resolved "https://registry.npmjs.org/hardhat-gas-reporter/-/hardhat-gas-reporter-1.0.9.tgz" integrity sha512-INN26G3EW43adGKBNzYWOlI3+rlLnasXTwW79YNnUhXPDa+yHESgt639dJEs37gCjhkbNKcRRJnomXEuMFBXJg== dependencies: array-uniq "1.0.3" eth-gas-reporter "^0.2.25" sha1 "^1.1.1" +"hardhat-shorthand@file:C:\\Users\\apich\\GitHub\\hardhat\\packages\\hardhat-shorthand": + version "1.0.0" + resolved "file:packages/hardhat-shorthand" + dependencies: + "@fvictorio/tabtab" "^0.0.3" + debug "^4.1.1" + semver "^6.3.0" + +hardhat@^2.0.0, hardhat@^2.0.2, hardhat@^2.0.4, hardhat@^2.11.0, hardhat@^2.12.6, hardhat@^2.6.4, hardhat@^2.8.3, hardhat@^2.9.4, hardhat@^2.9.5, hardhat@^2.9.9, "hardhat@file:C:\\Users\\apich\\GitHub\\hardhat\\packages\\hardhat-core": + version "2.14.0" + resolved "file:packages/hardhat-core" + dependencies: + "@ethersproject/abi" "^5.1.2" + "@metamask/eth-sig-util" "^4.0.0" + "@nomicfoundation/ethereumjs-block" "5.0.1" + "@nomicfoundation/ethereumjs-blockchain" "7.0.1" + "@nomicfoundation/ethereumjs-common" "4.0.1" + "@nomicfoundation/ethereumjs-evm" "2.0.1" + "@nomicfoundation/ethereumjs-rlp" "5.0.1" + "@nomicfoundation/ethereumjs-statemanager" "2.0.1" + "@nomicfoundation/ethereumjs-trie" "6.0.1" + "@nomicfoundation/ethereumjs-tx" "5.0.1" + "@nomicfoundation/ethereumjs-util" "9.0.1" + "@nomicfoundation/ethereumjs-vm" "7.0.1" + "@nomicfoundation/solidity-analyzer" "^0.1.0" + "@sentry/node" "^5.18.1" + "@types/bn.js" "^5.1.0" + "@types/lru-cache" "^5.1.0" + abort-controller "^3.0.0" + adm-zip "^0.4.16" + aggregate-error "^3.0.0" + ansi-escapes "^4.3.0" + chalk "^2.4.2" + chokidar "^3.4.0" + ci-info "^2.0.0" + debug "^4.1.1" + enquirer "^2.3.0" + env-paths "^2.2.0" + ethereum-cryptography "^1.0.3" + ethereumjs-abi "^0.6.8" + find-up "^2.1.0" + fp-ts "1.19.3" + fs-extra "^7.0.1" + glob "7.2.0" + immutable "^4.0.0-rc.12" + io-ts "1.10.4" + keccak "^3.0.2" + lodash "^4.17.11" + mnemonist "^0.38.0" + mocha "^10.0.0" + p-map "^4.0.0" + qs "^6.7.0" + raw-body "^2.4.1" + resolve "1.17.0" + semver "^6.3.0" + solc "0.7.3" + source-map-support "^0.5.13" + stacktrace-parser "^0.1.10" + tsort "0.0.1" + undici "^5.14.0" + uuid "^8.3.2" + ws "^7.4.6" + has-bigints@^1.0.1, has-bigints@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" + resolved "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz" integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== has-color@~0.1.0: version "0.1.7" - resolved "https://registry.yarnpkg.com/has-color/-/has-color-0.1.7.tgz#67144a5260c34fc3cca677d041daf52fe7b78b2f" + resolved "https://registry.npmjs.org/has-color/-/has-color-0.1.7.tgz" integrity sha512-kaNz5OTAYYmt646Hkqw50/qyxP2vFnTVu5AQ1Zmk22Kk5+4Qx6BpO8+u7IKsML5fOsFk0ZT0AcCJNYwcvaLBvw== has-flag@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz" integrity sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA== has-flag@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz" integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== has-flag@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== has-property-descriptors@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz#610708600606d36961ed04c196193b6a607fa861" + resolved "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz" integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ== dependencies: get-intrinsic "^1.1.1" has-proto@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.1.tgz#1885c1305538958aff469fef37937c22795408e0" + resolved "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz" integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg== has-symbols@^1.0.0, has-symbols@^1.0.2, has-symbols@^1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" + resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz" integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== has-tostringtag@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" + resolved "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz" integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== dependencies: has-symbols "^1.0.2" has@^1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + resolved "https://registry.npmjs.org/has/-/has-1.0.3.tgz" integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== dependencies: function-bind "^1.1.1" hash-base@^3.0.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.1.0.tgz#55c381d9e06e1d2997a883b4a3fddfe7f0d3af33" + resolved "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz" integrity sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA== dependencies: inherits "^2.0.4" readable-stream "^3.6.0" safe-buffer "^5.2.0" +hash.js@^1.0.0, hash.js@^1.0.3, hash.js@^1.1.7, hash.js@1.1.7: + version "1.1.7" + resolved "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz" + integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== + dependencies: + inherits "^2.0.3" + minimalistic-assert "^1.0.1" + hash.js@1.1.3: version "1.1.3" - resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.3.tgz#340dedbe6290187151c1ea1d777a3448935df846" + resolved "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz" integrity sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA== dependencies: inherits "^2.0.3" minimalistic-assert "^1.0.0" -hash.js@1.1.7, hash.js@^1.0.0, hash.js@^1.0.3, hash.js@^1.1.7: - version "1.1.7" - resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" - integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== - dependencies: - inherits "^2.0.3" - minimalistic-assert "^1.0.1" - hasha@^5.0.0: version "5.2.2" - resolved "https://registry.yarnpkg.com/hasha/-/hasha-5.2.2.tgz#a48477989b3b327aea3c04f53096d816d97522a1" + resolved "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz" integrity sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ== dependencies: is-stream "^2.0.0" @@ -5127,12 +5448,12 @@ hasha@^5.0.0: he@1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" + resolved "https://registry.npmjs.org/he/-/he-1.2.0.tgz" integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== header-case@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/header-case/-/header-case-1.0.1.tgz#9535973197c144b09613cd65d317ef19963bd02d" + resolved "https://registry.npmjs.org/header-case/-/header-case-1.0.1.tgz" integrity sha512-i0q9mkOeSuhXw6bGgiQCCBgY/jlZuV/7dZXyZ9c6LcBrqwvT8eT719E9uxE5LiZftdl+z81Ugbg/VvXV4OJOeQ== dependencies: no-case "^2.2.0" @@ -5140,22 +5461,29 @@ header-case@^1.0.0: "heap@>= 0.2.0": version "0.2.7" - resolved "https://registry.yarnpkg.com/heap/-/heap-0.2.7.tgz#1e6adf711d3f27ce35a81fe3b7bd576c2260a8fc" + resolved "https://registry.npmjs.org/heap/-/heap-0.2.7.tgz" integrity sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg== highlight.js@^10.4.1: version "10.7.3" - resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-10.7.3.tgz#697272e3991356e40c3cac566a74eef681756531" + resolved "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz" integrity sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A== highlightjs-solidity@^2.0.6: version "2.0.6" - resolved "https://registry.yarnpkg.com/highlightjs-solidity/-/highlightjs-solidity-2.0.6.tgz#e7a702a2b05e0a97f185e6ba39fd4846ad23a990" + resolved "https://registry.npmjs.org/highlightjs-solidity/-/highlightjs-solidity-2.0.6.tgz" integrity sha512-DySXWfQghjm2l6a/flF+cteroJqD4gI8GSdL4PtvxZSsAHie8m3yVe2JFoRg03ROKT6hp2Lc/BxXkqerNmtQYg== +hmac-drbg@^1.0.0: + version "1.0.1" + dependencies: + hash.js "^1.0.3" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.1" + hmac-drbg@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" + resolved "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz" integrity sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg== dependencies: hash.js "^1.0.3" @@ -5164,17 +5492,17 @@ hmac-drbg@^1.0.1: hosted-git-info@^2.1.4: version "2.8.9" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" + resolved "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz" integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== html-escaper@^2.0.0: version "2.0.2" - resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" + resolved "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz" integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== htmlparser2@^8.0.1: version "8.0.1" - resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-8.0.1.tgz#abaa985474fcefe269bc761a779b544d7196d010" + resolved "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.1.tgz" integrity sha512-4lVbmc1diZC7GUJQtRQ5yBAeUCL1exyMwmForWkRLnwyzWBFxN633SALPMGYaWZvKe9j1pRZJpauvmxENSp/EA== dependencies: domelementtype "^2.3.0" @@ -5184,7 +5512,7 @@ htmlparser2@^8.0.1: http-basic@^8.1.1: version "8.1.3" - resolved "https://registry.yarnpkg.com/http-basic/-/http-basic-8.1.3.tgz#a7cabee7526869b9b710136970805b1004261bbf" + resolved "https://registry.npmjs.org/http-basic/-/http-basic-8.1.3.tgz" integrity sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw== dependencies: caseless "^0.12.0" @@ -5194,12 +5522,12 @@ http-basic@^8.1.1: http-cache-semantics@^4.0.0: version "4.1.1" - resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz#abe02fcb2985460bf0323be664436ec3476a6d5a" + resolved "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz" integrity sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ== http-errors@2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" + resolved "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz" integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== dependencies: depd "2.0.0" @@ -5210,19 +5538,19 @@ http-errors@2.0.0: http-https@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/http-https/-/http-https-1.0.0.tgz#2f908dd5f1db4068c058cd6e6d4ce392c913389b" + resolved "https://registry.npmjs.org/http-https/-/http-https-1.0.0.tgz" integrity sha512-o0PWwVCSp3O0wS6FvNr6xfBCHgt0m1tvPLFOCc2iFDKTRAXhB7m8klDf7ErowFH8POa6dVdGatKU5I1YYwzUyg== http-response-object@^3.0.1: version "3.0.2" - resolved "https://registry.yarnpkg.com/http-response-object/-/http-response-object-3.0.2.tgz#7f435bb210454e4360d074ef1f989d5ea8aa9810" + resolved "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz" integrity sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA== dependencies: "@types/node" "^10.0.3" http-signature@~1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" + resolved "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz" integrity sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ== dependencies: assert-plus "^1.0.0" @@ -5231,7 +5559,7 @@ http-signature@~1.2.0: http2-wrapper@^1.0.0-beta.5.2: version "1.0.3" - resolved "https://registry.yarnpkg.com/http2-wrapper/-/http2-wrapper-1.0.3.tgz#b8f55e0c1f25d4ebd08b3b0c2c079f9590800b3d" + resolved "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz" integrity sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg== dependencies: quick-lru "^5.1.1" @@ -5239,7 +5567,7 @@ http2-wrapper@^1.0.0-beta.5.2: http2-wrapper@^2.1.10: version "2.2.0" - resolved "https://registry.yarnpkg.com/http2-wrapper/-/http2-wrapper-2.2.0.tgz#b80ad199d216b7d3680195077bd7b9060fa9d7f3" + resolved "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.0.tgz" integrity sha512-kZB0wxMo0sh1PehyjJUWRFEd99KC5TLjZ2cULC4f9iqJBAmKQQXEICjxl5iPJRwP40dpeHFqqhm7tYCvODpqpQ== dependencies: quick-lru "^5.1.1" @@ -5247,7 +5575,7 @@ http2-wrapper@^2.1.10: https-proxy-agent@^5.0.0: version "5.0.1" - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" + resolved "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz" integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== dependencies: agent-base "6" @@ -5255,46 +5583,46 @@ https-proxy-agent@^5.0.0: human-id@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/human-id/-/human-id-1.0.2.tgz#e654d4b2b0d8b07e45da9f6020d8af17ec0a5df3" + resolved "https://registry.npmjs.org/human-id/-/human-id-1.0.2.tgz" integrity sha512-UNopramDEhHJD+VR+ehk8rOslwSfByxPIZyJRfV739NDhN5LF1fa1MqnzKm2lGTQRjNrjK19Q5fhkgIfjlVUKw== -iconv-lite@0.4.24, iconv-lite@^0.4.24: +iconv-lite@^0.4.24, iconv-lite@0.4.24: version "0.4.24" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz" integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== dependencies: safer-buffer ">= 2.1.2 < 3" idna-uts46-hx@^2.3.1: version "2.3.1" - resolved "https://registry.yarnpkg.com/idna-uts46-hx/-/idna-uts46-hx-2.3.1.tgz#a1dc5c4df37eee522bf66d969cc980e00e8711f9" + resolved "https://registry.npmjs.org/idna-uts46-hx/-/idna-uts46-hx-2.3.1.tgz" integrity sha512-PWoF9Keq6laYdIRwwCdhTPl60xRqAloYNMQLiyUnG42VjT53oW07BXIRM+NK7eQjzXjAk2gUvX9caRxlnF9TAA== dependencies: punycode "2.1.0" ieee754@^1.1.13, ieee754@^1.2.1: version "1.2.1" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + resolved "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz" integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== ignore@^4.0.6: version "4.0.6" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" + resolved "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz" integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== ignore@^5.1.1, ignore@^5.2.0, ignore@^5.2.4: version "5.2.4" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324" + resolved "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz" integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== immutable@^4.0.0-rc.12: version "4.2.4" - resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.2.4.tgz#83260d50889526b4b531a5e293709a77f7c55a2a" + resolved "https://registry.npmjs.org/immutable/-/immutable-4.2.4.tgz" integrity sha512-WDxL3Hheb1JkRN3sQkyujNlL/xRjAo3rJtaU5xeufUauG66JdMr32bLj4gF+vWl84DIA3Zxw7tiAjneYzRRw+w== import-fresh@^3.0.0, import-fresh@^3.2.1: version "3.3.0" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" + resolved "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz" integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== dependencies: parent-module "^1.0.0" @@ -5302,35 +5630,35 @@ import-fresh@^3.0.0, import-fresh@^3.2.1: imurmurhash@^0.1.4: version "0.1.4" - resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + resolved "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz" integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== indent-string@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" + resolved "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz" integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== inflight@^1.0.4: version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== dependencies: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3: +inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3, inherits@2, inherits@2.0.4: version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== ini@^1.3.5: version "1.3.8" - resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" + resolved "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz" integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== internal-slot@^1.0.4: version "1.0.5" - resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.5.tgz#f2a2ee21f668f8627a4667f309dc0f4fb6674986" + resolved "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz" integrity sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ== dependencies: get-intrinsic "^1.2.0" @@ -5339,34 +5667,34 @@ internal-slot@^1.0.4: interpret@^1.0.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e" + resolved "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz" integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA== invert-kv@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" + resolved "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz" integrity sha512-xgs2NH9AE66ucSq4cNG1nhSFghr5l6tdL15Pk+jl46bmmBapgoaY/AacXyaDznAqmGL99TiLSQgO/XazFSKYeQ== invert-kv@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-2.0.0.tgz#7393f5afa59ec9ff5f67a27620d11c226e3eec02" + resolved "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz" integrity sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA== io-ts@1.10.4: version "1.10.4" - resolved "https://registry.yarnpkg.com/io-ts/-/io-ts-1.10.4.tgz#cd5401b138de88e4f920adbcb7026e2d1967e6e2" + resolved "https://registry.npmjs.org/io-ts/-/io-ts-1.10.4.tgz" integrity sha512-b23PteSnYXSONJ6JQXRAlvJhuw8KOtkqa87W4wDtvMrud/DTJd5X+NpOOI+O/zZwVq6v0VLAaJ+1EDViKEuN9g== dependencies: fp-ts "^1.0.0" ipaddr.js@1.9.1: version "1.9.1" - resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" + resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz" integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== is-arguments@^1.0.4: version "1.1.1" - resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" + resolved "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz" integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== dependencies: call-bind "^1.0.2" @@ -5374,7 +5702,7 @@ is-arguments@^1.0.4: is-array-buffer@^3.0.1: version "3.0.1" - resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.1.tgz#deb1db4fcae48308d54ef2442706c0393997052a" + resolved "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.1.tgz" integrity sha512-ASfLknmY8Xa2XtB4wmbz13Wu202baeA18cJBCeCy0wXUHZF0IPyVEXqKEcd+t2fNSLLL1vC6k7lxZEojNbISXQ== dependencies: call-bind "^1.0.2" @@ -5383,26 +5711,26 @@ is-array-buffer@^3.0.1: is-arrayish@^0.2.1: version "0.2.1" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + resolved "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz" integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== is-bigint@^1.0.1: version "1.0.4" - resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" + resolved "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz" integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== dependencies: has-bigints "^1.0.1" is-binary-path@~2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + resolved "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz" integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== dependencies: binary-extensions "^2.0.0" is-boolean-object@^1.1.0: version "1.1.2" - resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" + resolved "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz" integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== dependencies: call-bind "^1.0.2" @@ -5410,118 +5738,118 @@ is-boolean-object@^1.1.0: is-buffer@^2.0.5, is-buffer@~2.0.3: version "2.0.5" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191" + resolved "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz" integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: version "1.2.7" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" + resolved "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz" integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== is-ci@^3.0.1: version "3.0.1" - resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-3.0.1.tgz#db6ecbed1bd659c43dac0f45661e7674103d1867" + resolved "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz" integrity sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ== dependencies: ci-info "^3.2.0" is-core-module@^2.11.0, is-core-module@^2.6.0, is-core-module@^2.9.0: version "2.11.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.11.0.tgz#ad4cb3e3863e814523c96f3f58d26cc570ff0144" + resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz" integrity sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw== dependencies: has "^1.0.3" is-date-object@^1.0.1: version "1.0.5" - resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" + resolved "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz" integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== dependencies: has-tostringtag "^1.0.0" is-extglob@^2.1.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== is-fullwidth-code-point@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" + resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz" integrity sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw== dependencies: number-is-nan "^1.0.0" is-fullwidth-code-point@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz" integrity sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w== is-fullwidth-code-point@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz" integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== is-function@^1.0.1: version "1.0.2" - resolved "https://registry.yarnpkg.com/is-function/-/is-function-1.0.2.tgz#4f097f30abf6efadac9833b17ca5dc03f8144e08" + resolved "https://registry.npmjs.org/is-function/-/is-function-1.0.2.tgz" integrity sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ== is-generator-function@^1.0.7: version "1.0.10" - resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.10.tgz#f1558baf1ac17e0deea7c0415c438351ff2b3c72" + resolved "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz" integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A== dependencies: has-tostringtag "^1.0.0" is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: version "4.0.3" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== dependencies: is-extglob "^2.1.1" is-hex-prefixed@1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz#7d8d37e6ad77e5d127148913c573e082d777f554" + resolved "https://registry.npmjs.org/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz" integrity sha512-WvtOiug1VFrE9v1Cydwm+FnXd3+w9GaeVUss5W4v/SLy3UW00vP+6iNF2SdnfiBoLy4bTqVdkftNGTUeOFVsbA== is-lower-case@^1.1.0: version "1.1.3" - resolved "https://registry.yarnpkg.com/is-lower-case/-/is-lower-case-1.1.3.tgz#7e147be4768dc466db3bfb21cc60b31e6ad69393" + resolved "https://registry.npmjs.org/is-lower-case/-/is-lower-case-1.1.3.tgz" integrity sha512-+5A1e/WJpLLXZEDlgz4G//WYSHyQBD32qa4Jd3Lw06qQlv3fJHnp3YIHjTQSGzHMgzmVKz2ZP3rBxTHkPw/lxA== dependencies: lower-case "^1.1.0" is-negative-zero@^2.0.2: version "2.0.2" - resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" + resolved "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz" integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== is-number-object@^1.0.4: version "1.0.7" - resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc" + resolved "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz" integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== dependencies: has-tostringtag "^1.0.0" is-number@^7.0.0: version "7.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== is-plain-obj@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" + resolved "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz" integrity sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg== is-plain-obj@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" + resolved "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz" integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== is-regex@^1.1.4: version "1.1.4" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" + resolved "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz" integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== dependencies: call-bind "^1.0.2" @@ -5529,45 +5857,45 @@ is-regex@^1.1.4: is-shared-array-buffer@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz#8f259c573b60b6a32d4058a1a07430c0a7344c79" + resolved "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz" integrity sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA== dependencies: call-bind "^1.0.2" is-stream@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" + resolved "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz" integrity sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ== is-stream@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" + resolved "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz" integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== is-string@^1.0.5, is-string@^1.0.7: version "1.0.7" - resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" + resolved "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz" integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== dependencies: has-tostringtag "^1.0.0" is-subdir@^1.1.1: version "1.2.0" - resolved "https://registry.yarnpkg.com/is-subdir/-/is-subdir-1.2.0.tgz#b791cd28fab5202e91a08280d51d9d7254fd20d4" + resolved "https://registry.npmjs.org/is-subdir/-/is-subdir-1.2.0.tgz" integrity sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw== dependencies: better-path-resolve "1.0.0" is-symbol@^1.0.2, is-symbol@^1.0.3: version "1.0.4" - resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" + resolved "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz" integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== dependencies: has-symbols "^1.0.2" is-typed-array@^1.1.10, is-typed-array@^1.1.3, is-typed-array@^1.1.9: version "1.1.10" - resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.10.tgz#36a5b5cb4189b575d1a3e4b08536bfb485801e3f" + resolved "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz" integrity sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A== dependencies: available-typed-arrays "^1.0.5" @@ -5578,73 +5906,73 @@ is-typed-array@^1.1.10, is-typed-array@^1.1.3, is-typed-array@^1.1.9: is-typedarray@^1.0.0, is-typedarray@~1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + resolved "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz" integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA== is-unicode-supported@^0.1.0: version "0.1.0" - resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" + resolved "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz" integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== is-upper-case@^1.1.0: version "1.1.2" - resolved "https://registry.yarnpkg.com/is-upper-case/-/is-upper-case-1.1.2.tgz#8d0b1fa7e7933a1e58483600ec7d9661cbaf756f" + resolved "https://registry.npmjs.org/is-upper-case/-/is-upper-case-1.1.2.tgz" integrity sha512-GQYSJMgfeAmVwh9ixyk888l7OIhNAGKtY6QA+IrWlu9MDTCaXmeozOZ2S9Knj7bQwBO/H6J2kb+pbyTUiMNbsw== dependencies: upper-case "^1.1.0" is-utf8@^0.2.0: version "0.2.1" - resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" + resolved "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz" integrity sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q== is-weakref@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" + resolved "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz" integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== dependencies: call-bind "^1.0.2" is-windows@^1.0.0, is-windows@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" - integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== - -isarray@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" - integrity sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ== + resolved "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz" + integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== isarray@~1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + resolved "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== +isarray@0.0.1: + version "0.0.1" + resolved "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" + integrity sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ== + isexe@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== isstream@~0.1.2: version "0.1.2" - resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" + resolved "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz" integrity sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g== istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: version "3.2.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz#189e7909d0a39fa5a3dfad5b03f71947770191d3" + resolved "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz" integrity sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw== istanbul-lib-hook@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz#8f84c9434888cc6b1d0a9d7092a76d239ebf0cc6" + resolved "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz" integrity sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ== dependencies: append-transform "^2.0.0" istanbul-lib-instrument@^4.0.0: version "4.0.3" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz#873c6fff897450118222774696a3f28902d77c1d" + resolved "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz" integrity sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ== dependencies: "@babel/core" "^7.7.5" @@ -5654,7 +5982,7 @@ istanbul-lib-instrument@^4.0.0: istanbul-lib-processinfo@^2.0.2: version "2.0.3" - resolved "https://registry.yarnpkg.com/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.3.tgz#366d454cd0dcb7eb6e0e419378e60072c8626169" + resolved "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.3.tgz" integrity sha512-NkwHbo3E00oybX6NGJi6ar0B29vxyvNwoC7eJ4G4Yq28UfY758Hgn/heV8VRFhevPED4LXfFz0DQ8z/0kw9zMg== dependencies: archy "^1.0.0" @@ -5666,7 +5994,7 @@ istanbul-lib-processinfo@^2.0.2: istanbul-lib-report@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#7518fe52ea44de372f460a76b5ecda9ffb73d8a6" + resolved "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz" integrity sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw== dependencies: istanbul-lib-coverage "^3.0.0" @@ -5675,7 +6003,7 @@ istanbul-lib-report@^3.0.0: istanbul-lib-source-maps@^4.0.0: version "4.0.1" - resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz#895f3a709fcfba34c6de5a42939022f3e4358551" + resolved "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz" integrity sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw== dependencies: debug "^4.1.1" @@ -5684,7 +6012,7 @@ istanbul-lib-source-maps@^4.0.0: istanbul-reports@^3.0.2: version "3.1.5" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.5.tgz#cc9a6ab25cb25659810e4785ed9d9fb742578bae" + resolved "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz" integrity sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w== dependencies: html-escaper "^2.0.0" @@ -5692,7 +6020,7 @@ istanbul-reports@^3.0.2: jest-changed-files@^24.9.0: version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-24.9.0.tgz#08d8c15eb79a7fa3fc98269bc14b451ee82f8039" + resolved "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-24.9.0.tgz" integrity sha512-6aTWpe2mHF0DhL28WjdkO8LyGjs3zItPET4bMSeXU6T3ub4FPMw+mcOcbdGXQOAfmLcxofD23/5Bl9Z4AkFwqg== dependencies: "@jest/types" "^24.9.0" @@ -5701,136 +6029,148 @@ jest-changed-files@^24.9.0: js-sdsl@^4.1.4: version "4.3.0" - resolved "https://registry.yarnpkg.com/js-sdsl/-/js-sdsl-4.3.0.tgz#aeefe32a451f7af88425b11fdb5f58c90ae1d711" + resolved "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.3.0.tgz" integrity sha512-mifzlm2+5nZ+lEcLJMoBK0/IH/bDg8XnJfd/Wq6IP+xoCjLZsTOnV2QpxlVbX9bMnkl5PdEjNtBJ9Cj1NjifhQ== +js-sha3@^0.5.7: + version "0.5.7" + resolved "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz" + integrity sha512-GII20kjaPX0zJ8wzkTbNDYMY7msuZcTWk8S5UOh6806Jq/wz1J8/bnr8uGU0DAUmYDjj2Mr4X1cW8v/GLYnR+g== + +js-sha3@^0.8.0, js-sha3@0.8.0: + version "0.8.0" + resolved "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz" + integrity sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q== + js-sha3@0.5.5: version "0.5.5" - resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.5.5.tgz#baf0c0e8c54ad5903447df96ade7a4a1bca79a4a" + resolved "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.5.tgz" integrity sha512-yLLwn44IVeunwjpDVTDZmQeVbB0h+dZpY2eO68B/Zik8hu6dH+rKeLxwua79GGIvW6xr8NBAcrtiUbYrTjEFTA== -js-sha3@0.5.7, js-sha3@^0.5.7: +js-sha3@0.5.7: version "0.5.7" - resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.5.7.tgz#0d4ffd8002d5333aabaf4a23eed2f6374c9f28e7" + resolved "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz" integrity sha512-GII20kjaPX0zJ8wzkTbNDYMY7msuZcTWk8S5UOh6806Jq/wz1J8/bnr8uGU0DAUmYDjj2Mr4X1cW8v/GLYnR+g== -js-sha3@0.8.0, js-sha3@^0.8.0: - version "0.8.0" - resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.8.0.tgz#b9b7a5da73afad7dedd0f8c463954cbde6818840" - integrity sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q== - js-tokens@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== -js-yaml@3.13.1: - version "3.13.1" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" - integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== +js-yaml@^3.13.0, js-yaml@^3.13.1, js-yaml@^3.6.1, js-yaml@3.x: + version "3.14.1" + resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz" + integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== dependencies: argparse "^1.0.7" esprima "^4.0.0" -js-yaml@3.x, js-yaml@^3.13.0, js-yaml@^3.13.1, js-yaml@^3.6.1: - version "3.14.1" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" - integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== +js-yaml@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + +js-yaml@3.13.1: + version "3.13.1" + resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz" + integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== dependencies: argparse "^1.0.7" esprima "^4.0.0" -js-yaml@4.1.0, js-yaml@^4.1.0: +js-yaml@4.1.0: version "4.1.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz" integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== dependencies: argparse "^2.0.1" jsbn@~0.1.0: version "0.1.1" - resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" + resolved "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz" integrity sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg== jsesc@^2.5.1: version "2.5.2" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + resolved "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz" integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== json-buffer@3.0.1: version "3.0.1" - resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" + resolved "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz" integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== json-parse-better-errors@^1.0.1: version "1.0.2" - resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" + resolved "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz" integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== json-parse-even-better-errors@^2.3.0: version "2.3.1" - resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" + resolved "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz" integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== json-schema-traverse@^0.3.0: version "0.3.1" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340" + resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz" integrity sha512-4JD/Ivzg7PoW8NzdrBSr3UFwC9mHgvI7Z6z3QGBsSHgKaRTUDmyZAAKJo2UbG1kUVfS9WS8bi36N49U1xw43DA== json-schema-traverse@^0.4.1: version "0.4.1" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz" integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== json-schema-traverse@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" + resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz" integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== json-schema@0.4.0: version "0.4.0" - resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.4.0.tgz#f7de4cf6efab838ebaeb3236474cbba5a1930ab5" + resolved "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz" integrity sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA== json-stable-stringify-without-jsonify@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + resolved "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz" integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== json-stringify-safe@~5.0.1: version "5.0.1" - resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + resolved "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz" integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA== json5@^1.0.1: version "1.0.2" - resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593" + resolved "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz" integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== dependencies: minimist "^1.2.0" json5@^2.2.2: version "2.2.3" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" + resolved "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz" integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== jsonfile@^2.1.0: version "2.4.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8" + resolved "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz" integrity sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw== optionalDependencies: graceful-fs "^4.1.6" jsonfile@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" + resolved "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz" integrity sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg== optionalDependencies: graceful-fs "^4.1.6" jsonfile@^6.0.1: version "6.1.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" + resolved "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz" integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== dependencies: universalify "^2.0.0" @@ -5839,12 +6179,12 @@ jsonfile@^6.0.1: jsonschema@^1.2.4: version "1.4.1" - resolved "https://registry.yarnpkg.com/jsonschema/-/jsonschema-1.4.1.tgz#cc4c3f0077fb4542982973d8a083b6b34f482dab" + resolved "https://registry.npmjs.org/jsonschema/-/jsonschema-1.4.1.tgz" integrity sha512-S6cATIPVv1z0IlxdN+zUk5EPjkGCdnhN4wVSBlvoUO1tOLJootbo9CquNJmbIh4yikWHiUedhRYrNPn1arpEmQ== jsprim@^1.2.2: version "1.4.2" - resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.2.tgz#712c65533a15c878ba59e9ed5f0e26d5b77c5feb" + resolved "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz" integrity sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw== dependencies: assert-plus "1.0.0" @@ -5854,12 +6194,12 @@ jsprim@^1.2.2: just-extend@^4.0.2: version "4.2.1" - resolved "https://registry.yarnpkg.com/just-extend/-/just-extend-4.2.1.tgz#ef5e589afb61e5d66b24eca749409a8939a8c744" + resolved "https://registry.npmjs.org/just-extend/-/just-extend-4.2.1.tgz" integrity sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg== keccak@^3.0.0, keccak@^3.0.2: version "3.0.3" - resolved "https://registry.yarnpkg.com/keccak/-/keccak-3.0.3.tgz#4bc35ad917be1ef54ff246f904c2bbbf9ac61276" + resolved "https://registry.npmjs.org/keccak/-/keccak-3.0.3.tgz" integrity sha512-JZrLIAJWuZxKbCilMpNz5Vj7Vtb4scDG3dMXLOsbzBmQGyjwE61BbW7bJkfKKCShXiQZt3T6sBgALRtmd+nZaQ== dependencies: node-addon-api "^2.0.0" @@ -5868,50 +6208,50 @@ keccak@^3.0.0, keccak@^3.0.2: keyv@^4.0.0: version "4.5.2" - resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.2.tgz#0e310ce73bf7851ec702f2eaf46ec4e3805cce56" + resolved "https://registry.npmjs.org/keyv/-/keyv-4.5.2.tgz" integrity sha512-5MHbFaKn8cNSmVW7BYnijeAVlE4cYA/SVkifVgrh7yotnfhKmjuXpDKjrABLnT0SfHWV21P8ow07OGfRrNDg8g== dependencies: json-buffer "3.0.1" kind-of@^6.0.2, kind-of@^6.0.3: version "6.0.3" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" + resolved "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz" integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== klaw@^1.0.0: version "1.3.1" - resolved "https://registry.yarnpkg.com/klaw/-/klaw-1.3.1.tgz#4088433b46b3b1ba259d78785d8e96f73ba02439" + resolved "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz" integrity sha512-TED5xi9gGQjGpNnvRWknrwAB1eL5GciPfVFOt3Vk1OJCVDQbzuSfrF3hkUQKlsgKrG1F+0t5W0m+Fje1jIt8rw== optionalDependencies: graceful-fs "^4.1.9" kleur@^4.1.4: version "4.1.5" - resolved "https://registry.yarnpkg.com/kleur/-/kleur-4.1.5.tgz#95106101795f7050c6c650f350c683febddb1780" + resolved "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz" integrity sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ== lcid@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" + resolved "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz" integrity sha512-YiGkH6EnGrDGqLMITnGjXtGmNtjoXw9SVUzcaos8RBi7Ps0VBylkq+vOcY9QE5poLasPCR849ucFUkl0UzUyOw== dependencies: invert-kv "^1.0.0" lcid@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/lcid/-/lcid-2.0.0.tgz#6ef5d2df60e52f82eb228a4c373e8d1f397253cf" + resolved "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz" integrity sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA== dependencies: invert-kv "^2.0.0" level-supports@^4.0.0: version "4.0.1" - resolved "https://registry.yarnpkg.com/level-supports/-/level-supports-4.0.1.tgz#431546f9d81f10ff0fea0e74533a0e875c08c66a" + resolved "https://registry.npmjs.org/level-supports/-/level-supports-4.0.1.tgz" integrity sha512-PbXpve8rKeNcZ9C1mUicC9auIYFyGpkV9/i6g76tLgANwWhtG2v7I4xNBUlkn3lE2/dZF3Pi0ygYGtLc4RXXdA== level-transcoder@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/level-transcoder/-/level-transcoder-1.0.1.tgz#f8cef5990c4f1283d4c86d949e73631b0bc8ba9c" + resolved "https://registry.npmjs.org/level-transcoder/-/level-transcoder-1.0.1.tgz" integrity sha512-t7bFwFtsQeD8cl8NIoQ2iwxA0CL/9IFw7/9gAjOonH0PWTTiRfY7Hq+Ejbsxh86tXobDQ6IOiddjNYIfOBs06w== dependencies: buffer "^6.0.3" @@ -5919,7 +6259,7 @@ level-transcoder@^1.0.1: level@^8.0.0: version "8.0.0" - resolved "https://registry.yarnpkg.com/level/-/level-8.0.0.tgz#41b4c515dabe28212a3e881b61c161ffead14394" + resolved "https://registry.npmjs.org/level/-/level-8.0.0.tgz" integrity sha512-ypf0jjAk2BWI33yzEaaotpq7fkOPALKAgDBxggO6Q9HGX2MRXn0wbP1Jn/tJv1gtL867+YOjOB49WaUF3UoJNQ== dependencies: browser-level "^1.0.1" @@ -5927,7 +6267,7 @@ level@^8.0.0: levn@^0.4.1: version "0.4.1" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" + resolved "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz" integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== dependencies: prelude-ls "^1.2.1" @@ -5935,7 +6275,7 @@ levn@^0.4.1: levn@~0.3.0: version "0.3.0" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" + resolved "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz" integrity sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA== dependencies: prelude-ls "~1.1.2" @@ -5943,12 +6283,12 @@ levn@~0.3.0: lines-and-columns@^1.1.6: version "1.2.4" - resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" + resolved "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz" integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== load-json-file@^1.0.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" + resolved "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz" integrity sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A== dependencies: graceful-fs "^4.1.2" @@ -5959,7 +6299,7 @@ load-json-file@^1.0.0: load-json-file@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b" + resolved "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz" integrity sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw== dependencies: graceful-fs "^4.1.2" @@ -5969,7 +6309,7 @@ load-json-file@^4.0.0: load-yaml-file@^0.2.0: version "0.2.0" - resolved "https://registry.yarnpkg.com/load-yaml-file/-/load-yaml-file-0.2.0.tgz#af854edaf2bea89346c07549122753c07372f64d" + resolved "https://registry.npmjs.org/load-yaml-file/-/load-yaml-file-0.2.0.tgz" integrity sha512-OfCBkGEw4nN6JLtgRidPX6QxjBQGQf72q3si2uvqyFEMbycSFFHwAZeXx6cJgFM9wmLrf9zBwCP3Ivqa+LLZPw== dependencies: graceful-fs "^4.1.5" @@ -5979,7 +6319,7 @@ load-yaml-file@^0.2.0: locate-path@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" + resolved "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz" integrity sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA== dependencies: p-locate "^2.0.0" @@ -5987,7 +6327,7 @@ locate-path@^2.0.0: locate-path@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" + resolved "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz" integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== dependencies: p-locate "^3.0.0" @@ -5995,73 +6335,73 @@ locate-path@^3.0.0: locate-path@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" + resolved "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz" integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== dependencies: p-locate "^4.1.0" locate-path@^6.0.0: version "6.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + resolved "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz" integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== dependencies: p-locate "^5.0.0" lodash.assign@^4.0.3, lodash.assign@^4.0.6: version "4.2.0" - resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-4.2.0.tgz#0d99f3ccd7a6d261d19bdaeb9245005d285808e7" + resolved "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz" integrity sha512-hFuH8TY+Yji7Eja3mGiuAxBqLagejScbG8GbG0j6o9vzn0YL14My+ktnqtZgFTosKymC9/44wP6s7xyuLfnClw== lodash.camelcase@^4.3.0: version "4.3.0" - resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" + resolved "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz" integrity sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA== lodash.clonedeep@^4.5.0: version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" + resolved "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz" integrity sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ== lodash.flattendeep@^4.4.0: version "4.4.0" - resolved "https://registry.yarnpkg.com/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz#fb030917f86a3134e5bc9bec0d69e0013ddfedb2" + resolved "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz" integrity sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ== lodash.get@^4.4.2: version "4.4.2" - resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" + resolved "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz" integrity sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ== lodash.merge@^4.6.2: version "4.6.2" - resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" + resolved "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz" integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== lodash.startcase@^4.4.0: version "4.4.0" - resolved "https://registry.yarnpkg.com/lodash.startcase/-/lodash.startcase-4.4.0.tgz#9436e34ed26093ed7ffae1936144350915d9add8" + resolved "https://registry.npmjs.org/lodash.startcase/-/lodash.startcase-4.4.0.tgz" integrity sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg== lodash.truncate@^4.4.2: version "4.4.2" - resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193" + resolved "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz" integrity sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw== lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.16, lodash@^4.17.19, lodash@^4.17.21, lodash@^4.17.4: version "4.17.21" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== log-symbols@3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-3.0.0.tgz#f3a08516a5dea893336a7dee14d18a1cfdab77c4" + resolved "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz" integrity sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ== dependencies: chalk "^2.4.2" log-symbols@4.1.0: version "4.1.0" - resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" + resolved "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz" integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== dependencies: chalk "^4.1.0" @@ -6069,36 +6409,41 @@ log-symbols@4.1.0: loupe@^2.3.1: version "2.3.6" - resolved "https://registry.yarnpkg.com/loupe/-/loupe-2.3.6.tgz#76e4af498103c532d1ecc9be102036a21f787b53" + resolved "https://registry.npmjs.org/loupe/-/loupe-2.3.6.tgz" integrity sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA== dependencies: get-func-name "^2.0.0" lower-case-first@^1.0.0: version "1.0.2" - resolved "https://registry.yarnpkg.com/lower-case-first/-/lower-case-first-1.0.2.tgz#e5da7c26f29a7073be02d52bac9980e5922adfa1" + resolved "https://registry.npmjs.org/lower-case-first/-/lower-case-first-1.0.2.tgz" integrity sha512-UuxaYakO7XeONbKrZf5FEgkantPf5DUqDayzP5VXZrtRPdH86s4kN47I8B3TW10S4QKiE3ziHNf3kRN//okHjA== dependencies: lower-case "^1.1.2" lower-case@^1.1.0, lower-case@^1.1.1, lower-case@^1.1.2: version "1.1.4" - resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-1.1.4.tgz#9a2cabd1b9e8e0ae993a4bf7d5875c39c42e8eac" + resolved "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz" integrity sha512-2Fgx1Ycm599x+WGpIYwJOvsjmXFzTSc34IwDWALRA/8AopUKAVPwfJ+h5+f85BCp0PWmmJcWzEpxOpoXycMpdA== lowercase-keys@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479" + resolved "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz" integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== lowercase-keys@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-3.0.0.tgz#c5e7d442e37ead247ae9db117a9d0a467c89d4f2" + resolved "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz" integrity sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ== +lru_map@^0.3.3: + version "0.3.3" + resolved "https://registry.npmjs.org/lru_map/-/lru_map-0.3.3.tgz" + integrity sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ== + lru-cache@^4.0.1: version "4.1.5" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz" integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== dependencies: pseudomap "^1.0.2" @@ -6106,65 +6451,60 @@ lru-cache@^4.0.1: lru-cache@^5.1.1: version "5.1.1" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz" integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== dependencies: yallist "^3.0.2" lru-cache@^6.0.0: version "6.0.0" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz" integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== dependencies: yallist "^4.0.0" -lru_map@^0.3.3: - version "0.3.3" - resolved "https://registry.yarnpkg.com/lru_map/-/lru_map-0.3.3.tgz#b5c8351b9464cbd750335a79650a0ec0e56118dd" - integrity sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ== - make-dir@^3.0.0, make-dir@^3.0.2: version "3.1.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" + resolved "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz" integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== dependencies: semver "^6.0.0" make-error@^1.1.1: version "1.3.6" - resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" + resolved "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz" integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== map-age-cleaner@^0.1.1: version "0.1.3" - resolved "https://registry.yarnpkg.com/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz#7d583a7306434c055fe474b0f45078e6e1b4b92a" + resolved "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz" integrity sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w== dependencies: p-defer "^1.0.0" map-obj@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" + resolved "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz" integrity sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg== map-obj@^4.0.0: version "4.3.0" - resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-4.3.0.tgz#9304f906e93faae70880da102a9f1df0ea8bb05a" + resolved "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz" integrity sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ== markdown-table@^1.1.3: version "1.1.3" - resolved "https://registry.yarnpkg.com/markdown-table/-/markdown-table-1.1.3.tgz#9fcb69bcfdb8717bfd0398c6ec2d93036ef8de60" + resolved "https://registry.npmjs.org/markdown-table/-/markdown-table-1.1.3.tgz" integrity sha512-1RUZVgQlpJSPWYbFSpmudq5nHY1doEIv89gBtF0s4gW1GF2XorxcA/70M5vq7rLv0a6mhOUccRsqkwhwLCIQ2Q== mcl-wasm@^0.7.1: version "0.7.9" - resolved "https://registry.yarnpkg.com/mcl-wasm/-/mcl-wasm-0.7.9.tgz#c1588ce90042a8700c3b60e40efb339fc07ab87f" + resolved "https://registry.npmjs.org/mcl-wasm/-/mcl-wasm-0.7.9.tgz" integrity sha512-iJIUcQWA88IJB/5L15GnJVnSQJmf/YaxxV6zRavv83HILHaJQb6y0iFyDMdDO0gN8X37tdxmAOrH/P8B6RB8sQ== md5.js@^1.3.4: version "1.3.5" - resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" + resolved "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz" integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== dependencies: hash-base "^3.0.0" @@ -6173,12 +6513,12 @@ md5.js@^1.3.4: media-typer@0.3.0: version "0.3.0" - resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + resolved "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz" integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== mem@^4.0.0: version "4.3.0" - resolved "https://registry.yarnpkg.com/mem/-/mem-4.3.0.tgz#461af497bc4ae09608cdb2e60eefb69bff744178" + resolved "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz" integrity sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w== dependencies: map-age-cleaner "^0.1.1" @@ -6187,7 +6527,7 @@ mem@^4.0.0: memory-level@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/memory-level/-/memory-level-1.0.0.tgz#7323c3fd368f9af2f71c3cd76ba403a17ac41692" + resolved "https://registry.npmjs.org/memory-level/-/memory-level-1.0.0.tgz" integrity sha512-UXzwewuWeHBz5krr7EvehKcmLFNoXxGcvuYhC41tRnkrTbJohtS7kVn9akmgirtRygg+f7Yjsfi8Uu5SGSQ4Og== dependencies: abstract-level "^1.0.0" @@ -6196,12 +6536,12 @@ memory-level@^1.0.0: memorystream@^0.3.1: version "0.3.1" - resolved "https://registry.yarnpkg.com/memorystream/-/memorystream-0.3.1.tgz#86d7090b30ce455d63fbae12dda51a47ddcaf9b2" + resolved "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz" integrity sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw== meow@^6.0.0: version "6.1.1" - resolved "https://registry.yarnpkg.com/meow/-/meow-6.1.1.tgz#1ad64c4b76b2a24dfb2f635fddcadf320d251467" + resolved "https://registry.npmjs.org/meow/-/meow-6.1.1.tgz" integrity sha512-3YffViIt2QWgTy6Pale5QpopX/IvU3LPL03jOTqp6pGj3VjesdO/U8CuHMKpnQr4shCNCM5fd5XFFvIIl6JBHg== dependencies: "@types/minimist" "^1.2.0" @@ -6218,22 +6558,27 @@ meow@^6.0.0: merge-descriptors@1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" + resolved "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz" integrity sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w== merge2@^1.2.3, merge2@^1.3.0, merge2@^1.4.1: version "1.4.1" - resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + resolved "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== methods@~1.1.2: version "1.1.2" - resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + resolved "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz" integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== +micro-ftch@^0.3.1: + version "0.3.1" + resolved "https://registry.npmjs.org/micro-ftch/-/micro-ftch-0.3.1.tgz" + integrity sha512-/0LLxhzP0tfiR5hcQebtudP56gUurs2CLkGarnCiB/OqEyUFQ6U3paQi/tgLv0hBJYt2rnr9MNpxz4fiiugstg== + micromatch@^4.0.2, micromatch@^4.0.4: version "4.0.5" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" + resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz" integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== dependencies: braces "^3.0.2" @@ -6241,89 +6586,89 @@ micromatch@^4.0.2, micromatch@^4.0.4: mime-db@1.52.0: version "1.52.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== mime-types@^2.1.12, mime-types@^2.1.16, mime-types@~2.1.19, mime-types@~2.1.24, mime-types@~2.1.34: version "2.1.35" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz" integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== dependencies: mime-db "1.52.0" mime@1.6.0: version "1.6.0" - resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" + resolved "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz" integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== mimic-fn@^2.0.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== mimic-response@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" + resolved "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz" integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== mimic-response@^3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9" + resolved "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz" integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ== min-document@^2.19.0: version "2.19.0" - resolved "https://registry.yarnpkg.com/min-document/-/min-document-2.19.0.tgz#7bd282e3f5842ed295bb748cdd9f1ffa2c824685" + resolved "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz" integrity sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ== dependencies: dom-walk "^0.1.0" min-indent@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" + resolved "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz" integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" + resolved "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz" integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== -minimalistic-crypto-utils@^1.0.1: +minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" + resolved "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz" integrity sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg== -"minimatch@2 || 3", minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1: +minimatch@^3.0.4, minimatch@^3.0.5, "minimatch@2 || 3": version "3.1.2" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== dependencies: brace-expansion "^1.1.7" +minimatch@^5.0.1: + version "5.1.6" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz" + integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== + dependencies: + brace-expansion "^2.0.1" + minimatch@3.0.4: version "3.0.4" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz" integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== dependencies: brace-expansion "^1.1.7" minimatch@5.0.1: version "5.0.1" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.0.1.tgz#fb9022f7528125187c92bd9e9b6366be1cf3415b" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz" integrity sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g== dependencies: brace-expansion "^2.0.1" -minimatch@^5.0.1: - version "5.1.6" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96" - integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== - dependencies: - brace-expansion "^2.0.1" - minimist-options@^4.0.2: version "4.1.0" - resolved "https://registry.yarnpkg.com/minimist-options/-/minimist-options-4.1.0.tgz#c0655713c53a8a2ebd77ffa247d342c40f010619" + resolved "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz" integrity sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A== dependencies: arrify "^1.0.1" @@ -6332,12 +6677,12 @@ minimist-options@^4.0.2: minimist@^1.2.0, minimist@^1.2.5, minimist@^1.2.6: version "1.2.8" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" + resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz" integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== minipass@^2.6.0, minipass@^2.9.0: version "2.9.0" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.9.0.tgz#e713762e7d3e32fed803115cf93e04bca9fcc9a6" + resolved "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz" integrity sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg== dependencies: safe-buffer "^5.1.2" @@ -6345,87 +6690,59 @@ minipass@^2.6.0, minipass@^2.9.0: minizlib@^1.3.3: version "1.3.3" - resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.3.3.tgz#2290de96818a34c29551c8a8d301216bd65a861d" + resolved "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz" integrity sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q== dependencies: minipass "^2.9.0" mixme@^0.5.1: version "0.5.5" - resolved "https://registry.yarnpkg.com/mixme/-/mixme-0.5.5.tgz#bf8f67d8caf10fdb49fd23198fd1fa6d8e406627" + resolved "https://registry.npmjs.org/mixme/-/mixme-0.5.5.tgz" integrity sha512-/6IupbRx32s7jjEwHcycXikJwFD5UujbVNuJFkeKLYje+92OvtuPniF6JhnFm5JCTDUhS+kYK3W/4BWYQYXz7w== mkdirp-promise@^5.0.1: version "5.0.1" - resolved "https://registry.yarnpkg.com/mkdirp-promise/-/mkdirp-promise-5.0.1.tgz#e9b8f68e552c68a9c1713b84883f7a1dd039b8a1" + resolved "https://registry.npmjs.org/mkdirp-promise/-/mkdirp-promise-5.0.1.tgz" integrity sha512-Hepn5kb1lJPtVW84RFT40YG1OddBNTOVUZR2bzQUHc+Z03en8/3uX0+060JDhcEzyO08HmipsN9DcnFMxhIL9w== dependencies: mkdirp "*" -mkdirp@*: - version "2.1.3" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-2.1.3.tgz#b083ff37be046fd3d6552468c1f0ff44c1545d1f" - integrity sha512-sjAkg21peAG9HS+Dkx7hlG9Ztx7HLeKnvB3NQRcu/mltCVmvkF0pisbiTSfDVYTT86XEfZrTUosLdZLStquZUw== +mkdirp@*, mkdirp@^1.0.3, mkdirp@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz" + integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== + +mkdirp@^0.5.5: + version "0.5.6" + resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz" + integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== + dependencies: + minimist "^1.2.6" mkdirp@0.5.5: version "0.5.5" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" + resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz" integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== dependencies: minimist "^1.2.5" -mkdirp@0.5.x, mkdirp@^0.5.5: +mkdirp@0.5.x: version "0.5.6" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" + resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz" integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== dependencies: minimist "^1.2.6" -mkdirp@^1.0.3, mkdirp@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" - integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== - mnemonist@^0.38.0: version "0.38.5" - resolved "https://registry.yarnpkg.com/mnemonist/-/mnemonist-0.38.5.tgz#4adc7f4200491237fe0fa689ac0b86539685cade" + resolved "https://registry.npmjs.org/mnemonist/-/mnemonist-0.38.5.tgz" integrity sha512-bZTFT5rrPKtPJxj8KSV0WkPyNxl72vQepqqVUAW2ARUpUSF2qXMB6jZj7hW5/k7C1rtpzqbD/IIbJwLXUjCHeg== dependencies: obliterator "^2.0.0" -mocha@7.1.2: - version "7.1.2" - resolved "https://registry.yarnpkg.com/mocha/-/mocha-7.1.2.tgz#8e40d198acf91a52ace122cd7599c9ab857b29e6" - integrity sha512-o96kdRKMKI3E8U0bjnfqW4QMk12MwZ4mhdBTf+B5a1q9+aq2HRnj+3ZdJu0B/ZhJeK78MgYuv6L8d/rA5AeBJA== - dependencies: - ansi-colors "3.2.3" - browser-stdout "1.3.1" - chokidar "3.3.0" - debug "3.2.6" - diff "3.5.0" - escape-string-regexp "1.0.5" - find-up "3.0.0" - glob "7.1.3" - growl "1.10.5" - he "1.2.0" - js-yaml "3.13.1" - log-symbols "3.0.0" - minimatch "3.0.4" - mkdirp "0.5.5" - ms "2.1.1" - node-environment-flags "1.0.6" - object.assign "4.1.0" - strip-json-comments "2.0.1" - supports-color "6.0.0" - which "1.3.1" - wide-align "1.1.3" - yargs "13.3.2" - yargs-parser "13.1.2" - yargs-unparser "1.6.0" - mocha@^10.0.0: version "10.2.0" - resolved "https://registry.yarnpkg.com/mocha/-/mocha-10.2.0.tgz#1fd4a7c32ba5ac372e03a17eef435bd00e5c68b8" + resolved "https://registry.npmjs.org/mocha/-/mocha-10.2.0.tgz" integrity sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg== dependencies: ansi-colors "4.1.1" @@ -6452,7 +6769,7 @@ mocha@^10.0.0: mocha@^7.1.1: version "7.2.0" - resolved "https://registry.yarnpkg.com/mocha/-/mocha-7.2.0.tgz#01cc227b00d875ab1eed03a75106689cfed5a604" + resolved "https://registry.npmjs.org/mocha/-/mocha-7.2.0.tgz" integrity sha512-O9CIypScywTVpNaRrCAgoUnJgozpIofjKUYmJhiCIJMiuYnLI6otcb1/kpW9/n/tJODHGZ7i8aLQoDVsMtOKQQ== dependencies: ansi-colors "3.2.3" @@ -6480,39 +6797,69 @@ mocha@^7.1.1: yargs-parser "13.1.2" yargs-unparser "1.6.0" +mocha@7.1.2: + version "7.1.2" + resolved "https://registry.npmjs.org/mocha/-/mocha-7.1.2.tgz" + integrity sha512-o96kdRKMKI3E8U0bjnfqW4QMk12MwZ4mhdBTf+B5a1q9+aq2HRnj+3ZdJu0B/ZhJeK78MgYuv6L8d/rA5AeBJA== + dependencies: + ansi-colors "3.2.3" + browser-stdout "1.3.1" + chokidar "3.3.0" + debug "3.2.6" + diff "3.5.0" + escape-string-regexp "1.0.5" + find-up "3.0.0" + glob "7.1.3" + growl "1.10.5" + he "1.2.0" + js-yaml "3.13.1" + log-symbols "3.0.0" + minimatch "3.0.4" + mkdirp "0.5.5" + ms "2.1.1" + node-environment-flags "1.0.6" + object.assign "4.1.0" + strip-json-comments "2.0.1" + supports-color "6.0.0" + which "1.3.1" + wide-align "1.1.3" + yargs "13.3.2" + yargs-parser "13.1.2" + yargs-unparser "1.6.0" + mock-fs@^4.1.0: version "4.14.0" - resolved "https://registry.yarnpkg.com/mock-fs/-/mock-fs-4.14.0.tgz#ce5124d2c601421255985e6e94da80a7357b1b18" + resolved "https://registry.npmjs.org/mock-fs/-/mock-fs-4.14.0.tgz" integrity sha512-qYvlv/exQ4+svI3UOvPUpLDF0OMX5euvUH0Ny4N5QyRyhNdgAgUrVH3iUINSzEPLvx0kbo/Bp28GJKIqvE7URw== module-error@^1.0.1, module-error@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/module-error/-/module-error-1.0.2.tgz#8d1a48897ca883f47a45816d4fb3e3c6ba404d86" + resolved "https://registry.npmjs.org/module-error/-/module-error-1.0.2.tgz" integrity sha512-0yuvsqSCv8LbaOKhnsQ/T5JhyFlCYLPXK3U2sgV10zoKQwzs/MyfuQUOZQ1V/6OCOJsK/TRgNVrPuPDqtdMFtA== +ms@^2.1.1, ms@2.1.2: + version "2.1.2" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + ms@2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + resolved "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz" integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== ms@2.1.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz" integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== -ms@2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - -ms@2.1.3, ms@^2.1.1: +ms@2.1.3: version "2.1.3" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== multibase@^0.7.0: version "0.7.0" - resolved "https://registry.yarnpkg.com/multibase/-/multibase-0.7.0.tgz#1adfc1c50abe05eefeb5091ac0c2728d6b84581b" + resolved "https://registry.npmjs.org/multibase/-/multibase-0.7.0.tgz" integrity sha512-TW8q03O0f6PNFTQDvh3xxH03c8CjGaaYrjkl9UQPG6rz53TQzzxJVCIWVjzcbN/Q5Y53Zd0IBQBMVktVgNx4Fg== dependencies: base-x "^3.0.8" @@ -6520,7 +6867,7 @@ multibase@^0.7.0: multibase@~0.6.0: version "0.6.1" - resolved "https://registry.yarnpkg.com/multibase/-/multibase-0.6.1.tgz#b76df6298536cc17b9f6a6db53ec88f85f8cc12b" + resolved "https://registry.npmjs.org/multibase/-/multibase-0.6.1.tgz" integrity sha512-pFfAwyTjbbQgNc3G7D48JkJxWtoJoBMaR4xQUOuB8RnCgRqaYmWNFeJTTvrJ2w51bjLq2zTby6Rqj9TQ9elSUw== dependencies: base-x "^3.0.8" @@ -6528,14 +6875,14 @@ multibase@~0.6.0: multicodec@^0.5.5: version "0.5.7" - resolved "https://registry.yarnpkg.com/multicodec/-/multicodec-0.5.7.tgz#1fb3f9dd866a10a55d226e194abba2dcc1ee9ffd" + resolved "https://registry.npmjs.org/multicodec/-/multicodec-0.5.7.tgz" integrity sha512-PscoRxm3f+88fAtELwUnZxGDkduE2HD9Q6GHUOywQLjOGT/HAdhjLDYNZ1e7VR0s0TP0EwZ16LNUTFpoBGivOA== dependencies: varint "^5.0.0" multicodec@^1.0.0: version "1.0.4" - resolved "https://registry.yarnpkg.com/multicodec/-/multicodec-1.0.4.tgz#46ac064657c40380c28367c90304d8ed175a714f" + resolved "https://registry.npmjs.org/multicodec/-/multicodec-1.0.4.tgz" integrity sha512-NDd7FeS3QamVtbgfvu5h7fd1IlbaC4EQ0/pgU4zqE2vdHCmBGsUa0TiM8/TdSeG6BMPC92OOCf8F1ocE/Wkrrg== dependencies: buffer "^5.6.0" @@ -6543,7 +6890,7 @@ multicodec@^1.0.0: multihashes@^0.4.15, multihashes@~0.4.15: version "0.4.21" - resolved "https://registry.yarnpkg.com/multihashes/-/multihashes-0.4.21.tgz#dc02d525579f334a7909ade8a122dabb58ccfcb5" + resolved "https://registry.npmjs.org/multihashes/-/multihashes-0.4.21.tgz" integrity sha512-uVSvmeCWf36pU2nB4/1kzYZjsXD9vofZKpgudqkceYY5g2aZZXJ5r9lxuzoRLl1OAp28XljXsEJ/X/85ZsKmKw== dependencies: buffer "^5.5.0" @@ -6552,7 +6899,7 @@ multihashes@^0.4.15, multihashes@~0.4.15: mz@^2.7.0: version "2.7.0" - resolved "https://registry.yarnpkg.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32" + resolved "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz" integrity sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q== dependencies: any-promise "^1.0.0" @@ -6561,57 +6908,57 @@ mz@^2.7.0: nano-base32@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/nano-base32/-/nano-base32-1.0.1.tgz#ba548c879efcfb90da1c4d9e097db4a46c9255ef" + resolved "https://registry.npmjs.org/nano-base32/-/nano-base32-1.0.1.tgz" integrity sha512-sxEtoTqAPdjWVGv71Q17koMFGsOMSiHsIFEvzOM7cNp8BXB4AnEwmDabm5dorusJf/v1z7QxaZYxUorU9RKaAw== nano-json-stream-parser@^0.1.2: version "0.1.2" - resolved "https://registry.yarnpkg.com/nano-json-stream-parser/-/nano-json-stream-parser-0.1.2.tgz#0cc8f6d0e2b622b479c40d499c46d64b755c6f5f" + resolved "https://registry.npmjs.org/nano-json-stream-parser/-/nano-json-stream-parser-0.1.2.tgz" integrity sha512-9MqxMH/BSJC7dnLsEMPyfN5Dvoo49IsPFYMcHw3Bcfc2kN0lpHRBSzlMSVx4HGyJ7s9B31CyBTVehWJoQ8Ctew== nanoid@3.3.3: version "3.3.3" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.3.tgz#fd8e8b7aa761fe807dba2d1b98fb7241bb724a25" + resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz" integrity sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w== napi-macros@~2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/napi-macros/-/napi-macros-2.0.0.tgz#2b6bae421e7b96eb687aa6c77a7858640670001b" + resolved "https://registry.npmjs.org/napi-macros/-/napi-macros-2.0.0.tgz" integrity sha512-A0xLykHtARfueITVDernsAWdtIMbOJgKgcluwENp3AlsKN/PloyO10HtmoqnFAQAcxPkgZN7wdfPfEd0zNGxbg== natural-compare-lite@^1.4.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz#17b09581988979fddafe0201e931ba933c96cbb4" + resolved "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz" integrity sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g== natural-compare@^1.4.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz" integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== negotiator@0.6.3: version "0.6.3" - resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" + resolved "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz" integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== neo-async@^2.6.0: version "2.6.2" - resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" + resolved "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz" integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== next-tick@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.1.0.tgz#1836ee30ad56d67ef281b22bd199f709449b35eb" + resolved "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz" integrity sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ== nice-try@^1.0.4: version "1.0.5" - resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" + resolved "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz" integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== nise@^4.0.4: version "4.1.0" - resolved "https://registry.yarnpkg.com/nise/-/nise-4.1.0.tgz#8fb75a26e90b99202fa1e63f448f58efbcdedaf6" + resolved "https://registry.npmjs.org/nise/-/nise-4.1.0.tgz" integrity sha512-eQMEmGN/8arp0xsvGoQ+B1qvSkR73B1nWSCh7nOt5neMCtwcQVYQGdzQMhcNscktTsWB54xnlSQFzOAPJD8nXA== dependencies: "@sinonjs/commons" "^1.7.0" @@ -6622,26 +6969,26 @@ nise@^4.0.4: no-case@^2.2.0, no-case@^2.3.2: version "2.3.2" - resolved "https://registry.yarnpkg.com/no-case/-/no-case-2.3.2.tgz#60b813396be39b3f1288a4c1ed5d1e7d28b464ac" + resolved "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz" integrity sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ== dependencies: lower-case "^1.1.1" node-addon-api@^2.0.0: version "2.0.2" - resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-2.0.2.tgz#432cfa82962ce494b132e9d72a15b29f71ff5d32" + resolved "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz" integrity sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA== node-emoji@^1.10.0: version "1.11.0" - resolved "https://registry.yarnpkg.com/node-emoji/-/node-emoji-1.11.0.tgz#69a0150e6946e2f115e9d7ea4df7971e2628301c" + resolved "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz" integrity sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A== dependencies: lodash "^4.17.21" node-environment-flags@1.0.6: version "1.0.6" - resolved "https://registry.yarnpkg.com/node-environment-flags/-/node-environment-flags-1.0.6.tgz#a30ac13621f6f7d674260a54dede048c3982c088" + resolved "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.6.tgz" integrity sha512-5Evy2epuL+6TM0lCQGpFIj6KwiEsGh1SrHUhTbNX+sLbBtjidPZFAnVK9y5yU1+h//RitLbRHTIMyxQPtxMdHw== dependencies: object.getownpropertydescriptors "^2.0.3" @@ -6649,48 +6996,48 @@ node-environment-flags@1.0.6: node-fetch@2.6.7: version "2.6.7" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" + resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz" integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== dependencies: whatwg-url "^5.0.0" node-gyp-build@^4.2.0, node-gyp-build@^4.3.0: version "4.6.0" - resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.6.0.tgz#0c52e4cbf54bbd28b709820ef7b6a3c2d6209055" + resolved "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.6.0.tgz" integrity sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ== node-preload@^0.2.1: version "0.2.1" - resolved "https://registry.yarnpkg.com/node-preload/-/node-preload-0.2.1.tgz#c03043bb327f417a18fee7ab7ee57b408a144301" + resolved "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz" integrity sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ== dependencies: process-on-spawn "^1.0.0" node-releases@^2.0.8: version "2.0.10" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.10.tgz#c311ebae3b6a148c89b1813fd7c4d3c024ef537f" + resolved "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz" integrity sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w== nofilter@^1.0.4: version "1.0.4" - resolved "https://registry.yarnpkg.com/nofilter/-/nofilter-1.0.4.tgz#78d6f4b6a613e7ced8b015cec534625f7667006e" + resolved "https://registry.npmjs.org/nofilter/-/nofilter-1.0.4.tgz" integrity sha512-N8lidFp+fCz+TD51+haYdbDGrcBWwuHX40F5+z0qkUjMJ5Tp+rdSuAkMJ9N9eoolDlEVTf6u5icM+cNKkKW2mA== nofilter@^3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/nofilter/-/nofilter-3.1.0.tgz#c757ba68801d41ff930ba2ec55bab52ca184aa66" + resolved "https://registry.npmjs.org/nofilter/-/nofilter-3.1.0.tgz" integrity sha512-l2NNj07e9afPnhAhvgVrCD/oy2Ai1yfLpuo3EpiO1jFTsB4sFz6oIfAfSZyQzVpkZQ9xS8ZS5g1jCBgq4Hwo0g== nopt@3.x: version "3.0.6" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" + resolved "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz" integrity sha512-4GUt3kSEYmk4ITxzB/b9vaIDfUVWN/Ml1Fwl11IlnIG2iaJ9O6WXZ9SrYM9NLI8OCBieN2Y8SWC2oJV0RQ7qYg== dependencies: abbrev "1" normalize-package-data@^2.3.2, normalize-package-data@^2.5.0: version "2.5.0" - resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" + resolved "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz" integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== dependencies: hosted-git-info "^2.1.4" @@ -6700,36 +7047,36 @@ normalize-package-data@^2.3.2, normalize-package-data@^2.5.0: normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== normalize-url@^6.0.1: version "6.1.0" - resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-6.1.0.tgz#40d0885b535deffe3f3147bec877d05fe4c5668a" + resolved "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz" integrity sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A== npm-run-path@^2.0.0: version "2.0.2" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" + resolved "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz" integrity sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw== dependencies: path-key "^2.0.0" nth-check@^2.0.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.1.1.tgz#c9eab428effce36cd6b92c924bdb000ef1f1ed1d" + resolved "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz" integrity sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w== dependencies: boolbase "^1.0.0" number-is-nan@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" + resolved "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz" integrity sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ== number-to-bn@1.7.0: version "1.7.0" - resolved "https://registry.yarnpkg.com/number-to-bn/-/number-to-bn-1.7.0.tgz#bb3623592f7e5f9e0030b1977bd41a0c53fe1ea0" + resolved "https://registry.npmjs.org/number-to-bn/-/number-to-bn-1.7.0.tgz" integrity sha512-wsJ9gfSz1/s4ZsJN01lyonwuxA1tml6X1yBDnfpMglypcBRFZZkus26EdPSlqS5GJfYddVZa22p3VNb3z5m5Ig== dependencies: bn.js "4.11.6" @@ -6737,7 +7084,7 @@ number-to-bn@1.7.0: nyc@^15.1.0: version "15.1.0" - resolved "https://registry.yarnpkg.com/nyc/-/nyc-15.1.0.tgz#1335dae12ddc87b6e249d5a1994ca4bdaea75f02" + resolved "https://registry.npmjs.org/nyc/-/nyc-15.1.0.tgz" integrity sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A== dependencies: "@istanbuljs/load-nyc-config" "^1.0.0" @@ -6770,37 +7117,27 @@ nyc@^15.1.0: oauth-sign@~0.9.0: version "0.9.0" - resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" + resolved "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz" integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== object-assign@^4, object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: version "4.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== object-inspect@^1.12.2, object-inspect@^1.9.0: version "1.12.3" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.3.tgz#ba62dffd67ee256c8c086dfae69e016cd1f198b9" + resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz" integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g== object-keys@^1.0.11, object-keys@^1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + resolved "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz" integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== -object.assign@4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da" - integrity sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w== - dependencies: - define-properties "^1.1.2" - function-bind "^1.1.1" - has-symbols "^1.0.0" - object-keys "^1.0.11" - object.assign@^4.1.4: version "4.1.4" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.4.tgz#9673c7c7c351ab8c4d0b516f4343ebf4dfb7799f" + resolved "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz" integrity sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ== dependencies: call-bind "^1.0.2" @@ -6808,9 +7145,19 @@ object.assign@^4.1.4: has-symbols "^1.0.3" object-keys "^1.1.1" +object.assign@4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz" + integrity sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w== + dependencies: + define-properties "^1.1.2" + function-bind "^1.1.1" + has-symbols "^1.0.0" + object-keys "^1.0.11" + object.getownpropertydescriptors@^2.0.3: version "2.1.5" - resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.5.tgz#db5a9002489b64eef903df81d6623c07e5b4b4d3" + resolved "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.5.tgz" integrity sha512-yDNzckpM6ntyQiGTik1fKV1DcVDRS+w8bvpWNCBanvH5LfRX9O8WTHqQzG4RZwRAM4I0oU7TV11Lj5v0g20ibw== dependencies: array.prototype.reduce "^1.0.5" @@ -6820,7 +7167,7 @@ object.getownpropertydescriptors@^2.0.3: object.values@^1.1.4: version "1.1.6" - resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.6.tgz#4abbaa71eba47d63589d402856f908243eea9b1d" + resolved "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz" integrity sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw== dependencies: call-bind "^1.0.2" @@ -6829,33 +7176,33 @@ object.values@^1.1.4: obliterator@^2.0.0: version "2.0.4" - resolved "https://registry.yarnpkg.com/obliterator/-/obliterator-2.0.4.tgz#fa650e019b2d075d745e44f1effeb13a2adbe816" + resolved "https://registry.npmjs.org/obliterator/-/obliterator-2.0.4.tgz" integrity sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ== oboe@2.1.5: version "2.1.5" - resolved "https://registry.yarnpkg.com/oboe/-/oboe-2.1.5.tgz#5554284c543a2266d7a38f17e073821fbde393cd" + resolved "https://registry.npmjs.org/oboe/-/oboe-2.1.5.tgz" integrity sha512-zRFWiF+FoicxEs3jNI/WYUrVEgA7DeET/InK0XQuudGHRg8iIob3cNPrJTKaz4004uaA9Pbe+Dwa8iluhjLZWA== dependencies: http-https "^1.0.0" on-finished@2.4.1: version "2.4.1" - resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" + resolved "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz" integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== dependencies: ee-first "1.1.1" -once@1.x, once@^1.3.0, once@^1.3.1, once@^1.4.0: +once@^1.3.0, once@^1.3.1, once@^1.4.0, once@1.x: version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz" integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== dependencies: wrappy "1" optionator@^0.8.1: version "0.8.3" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" + resolved "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz" integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== dependencies: deep-is "~0.1.3" @@ -6867,7 +7214,7 @@ optionator@^0.8.1: optionator@^0.9.1: version "0.9.1" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" + resolved "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz" integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== dependencies: deep-is "^0.1.3" @@ -6879,19 +7226,19 @@ optionator@^0.9.1: ordinal@^1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/ordinal/-/ordinal-1.0.3.tgz#1a3c7726a61728112f50944ad7c35c06ae3a0d4d" + resolved "https://registry.npmjs.org/ordinal/-/ordinal-1.0.3.tgz" integrity sha512-cMddMgb2QElm8G7vdaa02jhUNbTSrhsgAGUz1OokD83uJTwSUn+nKoNoKVVaRa08yF6sgfO7Maou1+bgLd9rdQ== os-locale@^1.4.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9" + resolved "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz" integrity sha512-PRT7ZORmwu2MEFt4/fv3Q+mEfN4zetKxufQrkShY2oGvUms9r8otu5HfdyIFHkYXjO7laNsoVGmM2MANfuTA8g== dependencies: lcid "^1.0.0" os-locale@^3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-3.1.0.tgz#a802a6ee17f24c10483ab9935719cef4ed16bf1a" + resolved "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz" integrity sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q== dependencies: execa "^1.0.0" @@ -6900,127 +7247,127 @@ os-locale@^3.1.0: os-tmpdir@~1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + resolved "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz" integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g== outdent@^0.5.0: version "0.5.0" - resolved "https://registry.yarnpkg.com/outdent/-/outdent-0.5.0.tgz#9e10982fdc41492bb473ad13840d22f9655be2ff" + resolved "https://registry.npmjs.org/outdent/-/outdent-0.5.0.tgz" integrity sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q== p-cancelable@^2.0.0: version "2.1.1" - resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-2.1.1.tgz#aab7fbd416582fa32a3db49859c122487c5ed2cf" + resolved "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz" integrity sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg== p-cancelable@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-3.0.0.tgz#63826694b54d61ca1c20ebcb6d3ecf5e14cd8050" + resolved "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz" integrity sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw== p-defer@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c" + resolved "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz" integrity sha512-wB3wfAxZpk2AzOfUMJNL+d36xothRSyj8EXOa4f6GMqYDN9BJaaSISbsk+wS9abmnebVw95C2Kb5t85UmpCxuw== p-filter@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/p-filter/-/p-filter-2.1.0.tgz#1b1472562ae7a0f742f0f3d3d3718ea66ff9c09c" + resolved "https://registry.npmjs.org/p-filter/-/p-filter-2.1.0.tgz" integrity sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw== dependencies: p-map "^2.0.0" p-finally@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" + resolved "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz" integrity sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow== p-is-promise@^2.0.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-2.1.0.tgz#918cebaea248a62cf7ffab8e3bca8c5f882fc42e" + resolved "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz" integrity sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg== p-limit@^1.1.0: version "1.3.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz" integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== dependencies: p-try "^1.0.0" p-limit@^2.0.0, p-limit@^2.2.0: version "2.3.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz" integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== dependencies: p-try "^2.0.0" p-limit@^3.0.2: version "3.1.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz" integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== dependencies: yocto-queue "^0.1.0" p-locate@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" + resolved "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz" integrity sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg== dependencies: p-limit "^1.1.0" p-locate@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" + resolved "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz" integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== dependencies: p-limit "^2.0.0" p-locate@^4.1.0: version "4.1.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" + resolved "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz" integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== dependencies: p-limit "^2.2.0" p-locate@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + resolved "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz" integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== dependencies: p-limit "^3.0.2" p-map@^2.0.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/p-map/-/p-map-2.1.0.tgz#310928feef9c9ecc65b68b17693018a665cea175" + resolved "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz" integrity sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw== p-map@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/p-map/-/p-map-3.0.0.tgz#d704d9af8a2ba684e2600d9a215983d4141a979d" + resolved "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz" integrity sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ== dependencies: aggregate-error "^3.0.0" p-map@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" + resolved "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz" integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== dependencies: aggregate-error "^3.0.0" p-try@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" + resolved "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz" integrity sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww== p-try@^2.0.0: version "2.2.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + resolved "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz" integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== package-hash@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/package-hash/-/package-hash-4.0.0.tgz#3537f654665ec3cc38827387fc904c163c54f506" + resolved "https://registry.npmjs.org/package-hash/-/package-hash-4.0.0.tgz" integrity sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ== dependencies: graceful-fs "^4.1.15" @@ -7030,43 +7377,43 @@ package-hash@^4.0.0: pako@^1.0.4: version "1.0.11" - resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" + resolved "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz" integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== param-case@^2.1.0: version "2.1.1" - resolved "https://registry.yarnpkg.com/param-case/-/param-case-2.1.1.tgz#df94fd8cf6531ecf75e6bef9a0858fbc72be2247" + resolved "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz" integrity sha512-eQE845L6ot89sk2N8liD8HAuH4ca6Vvr7VWAWwt7+kvvG5aBcPmmphQ68JsEG2qa9n1TykS2DLeMt363AAH8/w== dependencies: no-case "^2.2.0" parent-module@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + resolved "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz" integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== dependencies: callsites "^3.0.0" parse-cache-control@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/parse-cache-control/-/parse-cache-control-1.0.1.tgz#8eeab3e54fa56920fe16ba38f77fa21aacc2d74e" + resolved "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz" integrity sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg== parse-headers@^2.0.0: version "2.0.5" - resolved "https://registry.yarnpkg.com/parse-headers/-/parse-headers-2.0.5.tgz#069793f9356a54008571eb7f9761153e6c770da9" + resolved "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.5.tgz" integrity sha512-ft3iAoLOB/MlwbNXgzy43SWGP6sQki2jQvAyBg/zDFAgr9bfNWZIUj42Kw2eJIl8kEi4PbgE6U1Zau/HwI75HA== parse-json@^2.2.0: version "2.2.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" + resolved "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz" integrity sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ== dependencies: error-ex "^1.2.0" parse-json@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" + resolved "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz" integrity sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw== dependencies: error-ex "^1.3.1" @@ -7074,7 +7421,7 @@ parse-json@^4.0.0: parse-json@^5.0.0: version "5.2.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" + resolved "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz" integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== dependencies: "@babel/code-frame" "^7.0.0" @@ -7084,12 +7431,12 @@ parse-json@^5.0.0: parse-ms@^0.1.0: version "0.1.2" - resolved "https://registry.yarnpkg.com/parse-ms/-/parse-ms-0.1.2.tgz#dd3fa25ed6c2efc7bdde12ad9b46c163aa29224e" + resolved "https://registry.npmjs.org/parse-ms/-/parse-ms-0.1.2.tgz" integrity sha512-VwMglE9412ifMHcRFEVJePEpreQh90wjIiOdP0UQQGKV4l+QprdKI+p5noXTkmGjznBMb40s+VymcclATAVvYA== parse5-htmlparser2-tree-adapter@^7.0.0: version "7.0.0" - resolved "https://registry.yarnpkg.com/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz#23c2cc233bcf09bb7beba8b8a69d46b08c62c2f1" + resolved "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz" integrity sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g== dependencies: domhandler "^5.0.2" @@ -7097,19 +7444,19 @@ parse5-htmlparser2-tree-adapter@^7.0.0: parse5@^7.0.0: version "7.1.2" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-7.1.2.tgz#0736bebbfd77793823240a23b7fc5e010b7f8e32" + resolved "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz" integrity sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw== dependencies: entities "^4.4.0" parseurl@~1.3.3: version "1.3.3" - resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" + resolved "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz" integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== pascal-case@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/pascal-case/-/pascal-case-2.0.1.tgz#2d578d3455f660da65eca18ef95b4e0de912761e" + resolved "https://registry.npmjs.org/pascal-case/-/pascal-case-2.0.1.tgz" integrity sha512-qjS4s8rBOJa2Xm0jmxXiyh1+OFf6ekCWOvUaRgAQSktzlTbMotS0nmG9gyYAybCWBcuP4fsBeRCKNwGBnMe2OQ== dependencies: camel-case "^3.0.0" @@ -7117,63 +7464,63 @@ pascal-case@^2.0.0: path-case@^2.1.0: version "2.1.1" - resolved "https://registry.yarnpkg.com/path-case/-/path-case-2.1.1.tgz#94b8037c372d3fe2906e465bb45e25d226e8eea5" + resolved "https://registry.npmjs.org/path-case/-/path-case-2.1.1.tgz" integrity sha512-Ou0N05MioItesaLr9q8TtHVWmJ6fxWdqKB2RohFmNWVyJ+2zeKIeDNWAN6B/Pe7wpzWChhZX6nONYmOnMeJQ/Q== dependencies: no-case "^2.2.0" path-exists@^2.0.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" + resolved "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz" integrity sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ== dependencies: pinkie-promise "^2.0.0" path-exists@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + resolved "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz" integrity sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ== path-exists@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + resolved "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz" integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== path-is-absolute@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== path-key@^2.0.0, path-key@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" + resolved "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz" integrity sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw== path-key@^3.1.0: version "3.1.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== path-parse@^1.0.6, path-parse@^1.0.7: version "1.0.7" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== -path-to-regexp@0.1.7: - version "0.1.7" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" - integrity sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ== - path-to-regexp@^1.7.0: version "1.8.0" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.8.0.tgz#887b3ba9d84393e87a0a0b9f4cb756198b53548a" + resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz" integrity sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA== dependencies: isarray "0.0.1" +path-to-regexp@0.1.7: + version "0.1.7" + resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz" + integrity sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ== + path-type@^1.0.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" + resolved "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz" integrity sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg== dependencies: graceful-fs "^4.1.2" @@ -7182,24 +7529,24 @@ path-type@^1.0.0: path-type@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" + resolved "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz" integrity sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg== dependencies: pify "^3.0.0" path-type@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + resolved "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz" integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== pathval@^1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.1.tgz#8534e77a77ce7ac5a2512ea21e0fdb8fcf6c3d8d" + resolved "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz" integrity sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ== pbkdf2@^3.0.17: version "3.1.2" - resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.2.tgz#dd822aa0887580e52f1a039dc3eda108efae3075" + resolved "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz" integrity sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA== dependencies: create-hash "^1.1.2" @@ -7210,68 +7557,68 @@ pbkdf2@^3.0.17: performance-now@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" + resolved "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz" integrity sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow== picocolors@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" + resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz" integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: version "2.3.1" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== pify@^2.0.0: version "2.3.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + resolved "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz" integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== pify@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" + resolved "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz" integrity sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg== pify@^4.0.1: version "4.0.1" - resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" + resolved "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz" integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== pinkie-promise@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" + resolved "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz" integrity sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw== dependencies: pinkie "^2.0.0" pinkie@^2.0.0: version "2.0.4" - resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" + resolved "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz" integrity sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg== pkg-dir@^4.1.0, pkg-dir@^4.2.0: version "4.2.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" + resolved "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz" integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== dependencies: find-up "^4.0.0" pkg-up@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-2.0.0.tgz#c819ac728059a461cab1c3889a2be3c49a004d7f" + resolved "https://registry.npmjs.org/pkg-up/-/pkg-up-2.0.0.tgz" integrity sha512-fjAPuiws93rm7mPUu21RdBnkeZNrbfCFCwfAhPWY+rR3zG0ubpe5cEReHOw5fIbfmsxEV/g2kSxGTATY3Bpnwg== dependencies: find-up "^2.1.0" pluralize@^8.0.0: version "8.0.0" - resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-8.0.0.tgz#1a6fa16a38d12a1901e0320fa017051c539ce3b1" + resolved "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz" integrity sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA== preferred-pm@^3.0.0: version "3.0.3" - resolved "https://registry.yarnpkg.com/preferred-pm/-/preferred-pm-3.0.3.tgz#1b6338000371e3edbce52ef2e4f65eb2e73586d6" + resolved "https://registry.npmjs.org/preferred-pm/-/preferred-pm-3.0.3.tgz" integrity sha512-+wZgbxNES/KlJs9q40F/1sfOd/j7f1O9JaHcW5Dsn3aUUOZg3L2bjpVUcKV2jvtElYfoTuQiNeMfQJ4kwUAhCQ== dependencies: find-up "^5.0.0" @@ -7281,70 +7628,75 @@ preferred-pm@^3.0.0: prelude-ls@^1.2.1: version "1.2.1" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" + resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz" integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== prelude-ls@~1.1.2: version "1.1.2" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" + resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz" integrity sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w== prettier-linter-helpers@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz#d23d41fe1375646de2d0104d3454a3008802cf7b" + resolved "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz" integrity sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w== dependencies: fast-diff "^1.1.2" -prettier@2.4.1: +prettier@^2.3.1, prettier@>=1.13.0, prettier@2.4.1: version "2.4.1" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.4.1.tgz#671e11c89c14a4cfc876ce564106c4a6726c9f5c" + resolved "https://registry.npmjs.org/prettier/-/prettier-2.4.1.tgz" integrity sha512-9fbDAXSBcc6Bs1mZrDYb3XKzDLm4EXXL9sC1LqKP5rZkT6KRr/rf9amVUcODVXgguK/isJz0d0hP72WeaKWsvA== -prettier@^2.3.1, prettier@^2.7.1, prettier@^2.8.3: +prettier@^2.7.1: version "2.8.4" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.4.tgz#34dd2595629bfbb79d344ac4a91ff948694463c3" + resolved "https://registry.npmjs.org/prettier/-/prettier-2.8.4.tgz" + integrity sha512-vIS4Rlc2FNh0BySk3Wkd6xmwxB0FpOndW5fisM5H8hsZSxU2VWVB5CWIkIjWvrHjIhxk2g3bfMKM87zNTrZddw== + +prettier@^2.8.3: + version "2.8.4" + resolved "https://registry.npmjs.org/prettier/-/prettier-2.8.4.tgz" integrity sha512-vIS4Rlc2FNh0BySk3Wkd6xmwxB0FpOndW5fisM5H8hsZSxU2VWVB5CWIkIjWvrHjIhxk2g3bfMKM87zNTrZddw== pretty-ms@^0.2.1: version "0.2.2" - resolved "https://registry.yarnpkg.com/pretty-ms/-/pretty-ms-0.2.2.tgz#da879a682ff33a37011046f13d627f67c73b84f6" + resolved "https://registry.npmjs.org/pretty-ms/-/pretty-ms-0.2.2.tgz" integrity sha512-ah/vWDJAT0arxQwVcSGp6etaLTZr4IsrXTy/khfjimzdYgSxYWzTMByrtpJUWinAnVY8szDg+qQhsE5MUMz3lQ== dependencies: parse-ms "^0.1.0" process-nextick-args@~2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + resolved "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz" integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== process-on-spawn@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/process-on-spawn/-/process-on-spawn-1.0.0.tgz#95b05a23073d30a17acfdc92a440efd2baefdc93" + resolved "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.0.0.tgz" integrity sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg== dependencies: fromentries "^1.2.0" process@^0.11.10: version "0.11.10" - resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" + resolved "https://registry.npmjs.org/process/-/process-0.11.10.tgz" integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A== progress@^2.0.0: version "2.0.3" - resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" + resolved "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz" integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== promise@^8.0.0: version "8.3.0" - resolved "https://registry.yarnpkg.com/promise/-/promise-8.3.0.tgz#8cb333d1edeb61ef23869fbb8a4ea0279ab60e0a" + resolved "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz" integrity sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg== dependencies: asap "~2.0.6" proxy-addr@~2.0.7: version "2.0.7" - resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" + resolved "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz" integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== dependencies: forwarded "0.2.0" @@ -7352,52 +7704,52 @@ proxy-addr@~2.0.7: pseudomap@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" + resolved "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz" integrity sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ== psl@^1.1.28: version "1.9.0" - resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7" + resolved "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz" integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== pump@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + resolved "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz" integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== dependencies: end-of-stream "^1.1.0" once "^1.3.1" -punycode@2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.0.tgz#5f863edc89b96db09074bad7947bf09056ca4e7d" - integrity sha512-Yxz2kRwT90aPiWEMHVYnEf4+rhwF1tBmmZ4KepCP+Wkium9JxtWnUm1nqGwpiAHr/tnTSeHqr3wb++jgSkXjhA== - punycode@^2.1.0, punycode@^2.1.1: version "2.3.0" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f" + resolved "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz" integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== +punycode@2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/punycode/-/punycode-2.1.0.tgz" + integrity sha512-Yxz2kRwT90aPiWEMHVYnEf4+rhwF1tBmmZ4KepCP+Wkium9JxtWnUm1nqGwpiAHr/tnTSeHqr3wb++jgSkXjhA== + pure-rand@^5.0.1: version "5.0.5" - resolved "https://registry.yarnpkg.com/pure-rand/-/pure-rand-5.0.5.tgz#bda2a7f6a1fc0f284d78d78ca5902f26f2ad35cf" + resolved "https://registry.npmjs.org/pure-rand/-/pure-rand-5.0.5.tgz" integrity sha512-BwQpbqxSCBJVpamI6ydzcKqyFmnd5msMWUGvzXLm1aXvusbbgkbOto/EUPM00hjveJEaJtdbhUjKSzWRhQVkaw== -qs@6.11.0, qs@^6.4.0, qs@^6.7.0: +qs@^6.4.0, qs@^6.7.0, qs@6.11.0: version "6.11.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.0.tgz#fd0d963446f7a65e1367e01abd85429453f0c37a" + resolved "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz" integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== dependencies: side-channel "^1.0.4" qs@~6.5.2: version "6.5.3" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.3.tgz#3aeeffc91967ef6e35c0e488ef46fb296ab76aad" + resolved "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz" integrity sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA== query-string@^5.0.1: version "5.1.1" - resolved "https://registry.yarnpkg.com/query-string/-/query-string-5.1.1.tgz#a78c012b71c17e05f2e3fa2319dd330682efb3cb" + resolved "https://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz" integrity sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw== dependencies: decode-uri-component "^0.2.0" @@ -7406,34 +7758,34 @@ query-string@^5.0.1: queue-microtask@^1.2.2, queue-microtask@^1.2.3: version "1.2.3" - resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz" integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== quick-lru@^4.0.1: version "4.0.1" - resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-4.0.1.tgz#5b8878f113a58217848c6482026c73e1ba57727f" + resolved "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz" integrity sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g== quick-lru@^5.1.1: version "5.1.1" - resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-5.1.1.tgz#366493e6b3e42a3a6885e2e99d18f80fb7a8c932" + resolved "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz" integrity sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA== randombytes@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + resolved "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz" integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== dependencies: safe-buffer "^5.1.0" range-parser@~1.2.1: version "1.2.1" - resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" + resolved "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz" integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== -raw-body@2.5.1, raw-body@^2.4.1: +raw-body@^2.4.1, raw-body@2.5.1: version "2.5.1" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.1.tgz#fe1b1628b181b700215e5fd42389f98b71392857" + resolved "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz" integrity sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig== dependencies: bytes "3.1.2" @@ -7443,7 +7795,7 @@ raw-body@2.5.1, raw-body@^2.4.1: read-pkg-up@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" + resolved "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz" integrity sha512-WD9MTlNtI55IwYUS27iHh9tK3YoIVhxis8yKhLpTqWtml739uXc9NWTpxoHkfZf3+DkCCsXox94/VWZniuZm6A== dependencies: find-up "^1.0.0" @@ -7451,7 +7803,7 @@ read-pkg-up@^1.0.1: read-pkg-up@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-3.0.0.tgz#3ed496685dba0f8fe118d0691dc51f4a1ff96f07" + resolved "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz" integrity sha512-YFzFrVvpC6frF1sz8psoHDBGF7fLPc+llq/8NB43oagqWkx8ar5zYtsTORtOjw9W2RHLpWP+zTWwBvf1bCmcSw== dependencies: find-up "^2.0.0" @@ -7459,7 +7811,7 @@ read-pkg-up@^3.0.0: read-pkg-up@^7.0.1: version "7.0.1" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-7.0.1.tgz#f3a6135758459733ae2b95638056e1854e7ef507" + resolved "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz" integrity sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg== dependencies: find-up "^4.1.0" @@ -7468,7 +7820,7 @@ read-pkg-up@^7.0.1: read-pkg@^1.0.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" + resolved "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz" integrity sha512-7BGwRHqt4s/uVbuyoeejRn4YmFnYZiFl4AuaeXHlgZf3sONF0SOGlxs2Pw8g6hCKupo08RafIO5YXFNOKTfwsQ== dependencies: load-json-file "^1.0.0" @@ -7477,7 +7829,7 @@ read-pkg@^1.0.0: read-pkg@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389" + resolved "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz" integrity sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA== dependencies: load-json-file "^4.0.0" @@ -7486,7 +7838,7 @@ read-pkg@^3.0.0: read-pkg@^5.2.0: version "5.2.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-5.2.0.tgz#7bf295438ca5a33e56cd30e053b34ee7250c93cc" + resolved "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz" integrity sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg== dependencies: "@types/normalize-package-data" "^2.4.0" @@ -7496,7 +7848,7 @@ read-pkg@^5.2.0: read-yaml-file@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/read-yaml-file/-/read-yaml-file-1.1.0.tgz#9362bbcbdc77007cc8ea4519fe1c0b821a7ce0d8" + resolved "https://registry.npmjs.org/read-yaml-file/-/read-yaml-file-1.1.0.tgz" integrity sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA== dependencies: graceful-fs "^4.1.5" @@ -7506,7 +7858,7 @@ read-yaml-file@^1.1.0: readable-stream@^2.2.2: version "2.3.7" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" + resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz" integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== dependencies: core-util-is "~1.0.0" @@ -7519,7 +7871,7 @@ readable-stream@^2.2.2: readable-stream@^3.6.0: version "3.6.0" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" + resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz" integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== dependencies: inherits "^2.0.3" @@ -7528,35 +7880,35 @@ readable-stream@^3.6.0: readdirp@~3.2.0: version "3.2.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.2.0.tgz#c30c33352b12c96dfb4b895421a49fd5a9593839" + resolved "https://registry.npmjs.org/readdirp/-/readdirp-3.2.0.tgz" integrity sha512-crk4Qu3pmXwgxdSgGhgA/eXiJAPQiX4GMOZZMXnqKxHX7TaoL+3gQVo/WeuAiogr07DpnfjIMpXXa+PAIvwPGQ== dependencies: picomatch "^2.0.4" readdirp@~3.6.0: version "3.6.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + resolved "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz" integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== dependencies: picomatch "^2.2.1" rechoir@^0.6.2: version "0.6.2" - resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" + resolved "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz" integrity sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw== dependencies: resolve "^1.1.6" recursive-readdir@^2.2.2: version "2.2.3" - resolved "https://registry.yarnpkg.com/recursive-readdir/-/recursive-readdir-2.2.3.tgz#e726f328c0d69153bcabd5c322d3195252379372" + resolved "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.3.tgz" integrity sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA== dependencies: minimatch "^3.0.5" redent@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/redent/-/redent-3.0.0.tgz#e557b7998316bb53c9f1f56fa626352c6963059f" + resolved "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz" integrity sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg== dependencies: indent-string "^4.0.0" @@ -7564,17 +7916,17 @@ redent@^3.0.0: reduce-flatten@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/reduce-flatten/-/reduce-flatten-2.0.0.tgz#734fd84e65f375d7ca4465c69798c25c9d10ae27" + resolved "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-2.0.0.tgz" integrity sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w== regenerator-runtime@^0.13.11: version "0.13.11" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz#f6dca3e7ceec20590d07ada785636a90cdca17f9" + resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz" integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg== regexp.prototype.flags@^1.4.3: version "1.4.3" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz#87cab30f80f66660181a3bb7bf5981a872b367ac" + resolved "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz" integrity sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA== dependencies: call-bind "^1.0.2" @@ -7583,49 +7935,49 @@ regexp.prototype.flags@^1.4.3: regexpp@^3.1.0, regexpp@^3.2.0: version "3.2.0" - resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" + resolved "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz" integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== release-zalgo@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/release-zalgo/-/release-zalgo-1.0.0.tgz#09700b7e5074329739330e535c5a90fb67851730" + resolved "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz" integrity sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA== dependencies: es6-error "^4.0.1" req-cwd@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/req-cwd/-/req-cwd-2.0.0.tgz#d4082b4d44598036640fb73ddea01ed53db49ebc" + resolved "https://registry.npmjs.org/req-cwd/-/req-cwd-2.0.0.tgz" integrity sha512-ueoIoLo1OfB6b05COxAA9UpeoscNpYyM+BqYlA7H6LVF4hKGPXQQSSaD2YmvDVJMkk4UDpAHIeU1zG53IqjvlQ== dependencies: req-from "^2.0.0" req-from@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/req-from/-/req-from-2.0.0.tgz#d74188e47f93796f4aa71df6ee35ae689f3e0e70" + resolved "https://registry.npmjs.org/req-from/-/req-from-2.0.0.tgz" integrity sha512-LzTfEVDVQHBRfjOUMgNBA+V6DWsSnoeKzf42J7l0xa/B4jyPOuuF5MlNSmomLNGemWTnV2TIdjSSLnEn95fOQA== dependencies: resolve-from "^3.0.0" request-promise-core@1.1.4: version "1.1.4" - resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.4.tgz#3eedd4223208d419867b78ce815167d10593a22f" + resolved "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz" integrity sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw== dependencies: lodash "^4.17.19" request-promise-native@^1.0.5: version "1.0.9" - resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.9.tgz#e407120526a5efdc9a39b28a5679bf47b9d9dc28" + resolved "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.9.tgz" integrity sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g== dependencies: request-promise-core "1.1.4" stealthy-require "^1.1.1" tough-cookie "^2.3.3" -request@^2.79.0, request@^2.88.0: +request@^2.34, request@^2.79.0, request@^2.88.0: version "2.88.2" - resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" + resolved "https://registry.npmjs.org/request/-/request-2.88.2.tgz" integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== dependencies: aws-sign2 "~0.7.0" @@ -7651,104 +8003,113 @@ request@^2.79.0, request@^2.88.0: require-directory@^2.1.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + resolved "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz" integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== require-from-string@^1.1.0: version "1.2.1" - resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-1.2.1.tgz#529c9ccef27380adfec9a2f965b649bbee636418" + resolved "https://registry.npmjs.org/require-from-string/-/require-from-string-1.2.1.tgz" integrity sha512-H7AkJWMobeskkttHyhTVtS0fxpFLjxhbfMa6Bk3wimP7sdPRGL3EyCg3sAQenFfAe+xQ+oAc85Nmtvq0ROM83Q== require-from-string@^2.0.0, require-from-string@^2.0.2: version "2.0.2" - resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" + resolved "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz" integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== require-main-filename@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" + resolved "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz" integrity sha512-IqSUtOVP4ksd1C/ej5zeEh/BIP2ajqpn8c5x+q99gvcIG/Qf0cud5raVnE/Dwd0ua9TXYDoDc0RE5hBSdz22Ug== require-main-filename@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" + resolved "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz" integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== resolve-alpn@^1.0.0, resolve-alpn@^1.2.0: version "1.2.1" - resolved "https://registry.yarnpkg.com/resolve-alpn/-/resolve-alpn-1.2.1.tgz#b7adbdac3546aaaec20b45e7d8265927072726f9" + resolved "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz" integrity sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g== resolve-from@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" + resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz" integrity sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw== resolve-from@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz" integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== resolve-from@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" + resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz" integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== -resolve@1.1.x: - version "1.1.7" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" - integrity sha512-9znBF0vBcaSN3W2j7wKvdERPwqTxSpCq+if5C0WoTCyV9n24rua28jeuQ2pL/HOf+yUe/Mef+H/5p60K0Id3bg== - -resolve@1.17.0: +resolve@^1.1.6, resolve@^1.10.0, resolve@1.17.0: version "1.17.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444" + resolved "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz" integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w== dependencies: path-parse "^1.0.6" -resolve@^1.1.6, resolve@^1.10.0, resolve@^1.20.0, resolve@^1.22.1: +resolve@^1.20.0: + version "1.22.1" + resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz" + integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== + dependencies: + is-core-module "^2.9.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +resolve@^1.22.1: version "1.22.1" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177" + resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz" integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== dependencies: is-core-module "^2.9.0" path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" +resolve@1.1.x: + version "1.1.7" + resolved "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz" + integrity sha512-9znBF0vBcaSN3W2j7wKvdERPwqTxSpCq+if5C0WoTCyV9n24rua28jeuQ2pL/HOf+yUe/Mef+H/5p60K0Id3bg== + responselike@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/responselike/-/responselike-2.0.1.tgz#9a0bc8fdc252f3fb1cca68b016591059ba1422bc" + resolved "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz" integrity sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw== dependencies: lowercase-keys "^2.0.0" reusify@^1.0.4: version "1.0.4" - resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + resolved "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz" integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== rimraf@^2.2.8: version "2.7.1" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" + resolved "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz" integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== dependencies: glob "^7.1.3" rimraf@^3.0.0, rimraf@^3.0.2: version "3.0.2" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + resolved "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz" integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== dependencies: glob "^7.1.3" ripemd160-min@0.0.6: version "0.0.6" - resolved "https://registry.yarnpkg.com/ripemd160-min/-/ripemd160-min-0.0.6.tgz#a904b77658114474d02503e819dcc55853b67e62" + resolved "https://registry.npmjs.org/ripemd160-min/-/ripemd160-min-0.0.6.tgz" integrity sha512-+GcJgQivhs6S9qvLogusiTcS9kQUfgR75whKuy5jIhuiOfQuJ8fjqxV6EGD5duH1Y/FawFUMtMhyeq3Fbnib8A== ripemd160@^2.0.0, ripemd160@^2.0.1, ripemd160@^2.0.2: version "2.0.2" - resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" + resolved "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz" integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== dependencies: hash-base "^3.0.0" @@ -7756,57 +8117,72 @@ ripemd160@^2.0.0, ripemd160@^2.0.1, ripemd160@^2.0.2: rlp@^2.2.3, rlp@^2.2.4: version "2.2.7" - resolved "https://registry.yarnpkg.com/rlp/-/rlp-2.2.7.tgz#33f31c4afac81124ac4b283e2bd4d9720b30beaf" + resolved "https://registry.npmjs.org/rlp/-/rlp-2.2.7.tgz" integrity sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ== dependencies: bn.js "^5.2.0" run-parallel-limit@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/run-parallel-limit/-/run-parallel-limit-1.1.0.tgz#be80e936f5768623a38a963262d6bef8ff11e7ba" + resolved "https://registry.npmjs.org/run-parallel-limit/-/run-parallel-limit-1.1.0.tgz" integrity sha512-jJA7irRNM91jaKc3Hcl1npHsFLOXOoTkPCUL1JEa1R82O2miplXXRaGdjW/KM/98YQWDhJLiSs793CnXfblJUw== dependencies: queue-microtask "^1.2.2" run-parallel@^1.1.9: version "1.2.0" - resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + resolved "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz" integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== dependencies: queue-microtask "^1.2.2" rustbn.js@~0.2.0: version "0.2.0" - resolved "https://registry.yarnpkg.com/rustbn.js/-/rustbn.js-0.2.0.tgz#8082cb886e707155fd1cb6f23bd591ab8d55d0ca" + resolved "https://registry.npmjs.org/rustbn.js/-/rustbn.js-0.2.0.tgz" integrity sha512-4VlvkRUuCJvr2J6Y0ImW7NvTCriMi7ErOAqWk1y69vAdoNIzCF3yPmgeNzx+RQTLEDFq5sHfscn1MwHxP9hNfA== -safe-buffer@5.2.1, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@^5.2.1, safe-buffer@~5.2.0: +safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +safe-buffer@^5.2.0, safe-buffer@~5.2.0: version "5.2.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== -safe-buffer@~5.1.0, safe-buffer@~5.1.1: - version "5.1.2" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" - integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== +safe-buffer@^5.2.1: + version "5.2.1" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +safe-buffer@5.2.1: + version "5.2.1" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== safe-regex-test@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.0.tgz#793b874d524eb3640d1873aad03596db2d4f2295" + resolved "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz" integrity sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA== dependencies: call-bind "^1.0.2" get-intrinsic "^1.1.3" is-regex "^1.1.4" -"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: +safer-buffer@^2.0.2, safer-buffer@^2.1.0, "safer-buffer@>= 2.1.2 < 3", safer-buffer@~2.1.0: version "2.1.2" - resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== sc-istanbul@^0.4.5: version "0.4.6" - resolved "https://registry.yarnpkg.com/sc-istanbul/-/sc-istanbul-0.4.6.tgz#cf6784355ff2076f92d70d59047d71c13703e839" + resolved "https://registry.npmjs.org/sc-istanbul/-/sc-istanbul-0.4.6.tgz" integrity sha512-qJFF/8tW/zJsbyfh/iT/ZM5QNHE3CXxtLJbZsL+CzdJLBsPD7SedJZoUA4d8iAcN2IoMp/Dx80shOOd2x96X/g== dependencies: abbrev "1.0.x" @@ -7824,52 +8200,78 @@ sc-istanbul@^0.4.5: which "^1.1.1" wordwrap "^1.0.0" +scrypt-js@^3.0.0, scrypt-js@^3.0.1, scrypt-js@3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz" + integrity sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA== + scrypt-js@2.0.4: version "2.0.4" - resolved "https://registry.yarnpkg.com/scrypt-js/-/scrypt-js-2.0.4.tgz#32f8c5149f0797672e551c07e230f834b6af5f16" + resolved "https://registry.npmjs.org/scrypt-js/-/scrypt-js-2.0.4.tgz" integrity sha512-4KsaGcPnuhtCZQCxFxN3GVYIhKFPTdLd8PLC552XwbMndtD0cjRFAhDuuydXQ0h08ZfPgzqe6EKHozpuH74iDw== -scrypt-js@3.0.1, scrypt-js@^3.0.0, scrypt-js@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/scrypt-js/-/scrypt-js-3.0.1.tgz#d314a57c2aef69d1ad98a138a21fe9eafa9ee312" - integrity sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA== - secp256k1@^4.0.1: version "4.0.3" - resolved "https://registry.yarnpkg.com/secp256k1/-/secp256k1-4.0.3.tgz#c4559ecd1b8d3c1827ed2d1b94190d69ce267303" + resolved "https://registry.npmjs.org/secp256k1/-/secp256k1-4.0.3.tgz" integrity sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA== dependencies: elliptic "^6.5.4" node-addon-api "^2.0.0" node-gyp-build "^4.2.0" -"semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.6.0, semver@^5.7.0: +semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.6.0, semver@^5.7.0, "semver@2 || 3 || 4 || 5": version "5.7.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" + resolved "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== -semver@7.3.7: - version "7.3.7" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.7.tgz#12c5b649afdbf9049707796e22a4028814ce523f" - integrity sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g== - dependencies: - lru-cache "^6.0.0" +semver@^6.0.0: + version "6.3.0" + resolved "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz" + integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== -semver@^6.0.0, semver@^6.3.0: +semver@^6.3.0: version "6.3.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" + resolved "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== -semver@^7.2.1, semver@^7.3.4, semver@^7.3.5, semver@^7.3.7: +semver@^7.2.1: + version "7.3.8" + resolved "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz" + integrity sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A== + dependencies: + lru-cache "^6.0.0" + +semver@^7.3.4: + version "7.3.8" + resolved "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz" + integrity sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A== + dependencies: + lru-cache "^6.0.0" + +semver@^7.3.5: + version "7.3.8" + resolved "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz" + integrity sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A== + dependencies: + lru-cache "^6.0.0" + +semver@^7.3.7: version "7.3.8" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.8.tgz#07a78feafb3f7b32347d725e33de7e2a2df67798" + resolved "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz" integrity sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A== dependencies: lru-cache "^6.0.0" +semver@7.3.7: + version "7.3.7" + resolved "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz" + integrity sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g== + dependencies: + lru-cache "^6.0.0" + send@0.18.0: version "0.18.0" - resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" + resolved "https://registry.npmjs.org/send/-/send-0.18.0.tgz" integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg== dependencies: debug "2.6.9" @@ -7888,7 +8290,7 @@ send@0.18.0: sentence-case@^2.1.0: version "2.1.1" - resolved "https://registry.yarnpkg.com/sentence-case/-/sentence-case-2.1.1.tgz#1f6e2dda39c168bf92d13f86d4a918933f667ed4" + resolved "https://registry.npmjs.org/sentence-case/-/sentence-case-2.1.1.tgz" integrity sha512-ENl7cYHaK/Ktwk5OTD+aDbQ3uC8IByu/6Bkg+HDv8Mm+XnBnppVNalcfJTNsp1ibstKh030/JKQQWglDvtKwEQ== dependencies: no-case "^2.2.0" @@ -7896,14 +8298,14 @@ sentence-case@^2.1.0: serialize-javascript@6.0.0: version "6.0.0" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz#efae5d88f45d7924141da8b5c3a7a7e663fefeb8" + resolved "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz" integrity sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag== dependencies: randombytes "^2.1.0" serve-static@1.15.0: version "1.15.0" - resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.15.0.tgz#faaef08cffe0a1a62f60cad0c4e513cff0ac9540" + resolved "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz" integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g== dependencies: encodeurl "~1.0.2" @@ -7913,7 +8315,7 @@ serve-static@1.15.0: servify@^0.1.12: version "0.1.12" - resolved "https://registry.yarnpkg.com/servify/-/servify-0.1.12.tgz#142ab7bee1f1d033b66d0707086085b17c06db95" + resolved "https://registry.npmjs.org/servify/-/servify-0.1.12.tgz" integrity sha512-/xE6GvsKKqyo1BAY+KxOWXcLpPsUUyji7Qg3bVD7hh1eRze5bR1uYiuDA/k3Gof1s9BTzQZEJK8sNcNGFIzeWw== dependencies: body-parser "^1.16.0" @@ -7924,27 +8326,27 @@ servify@^0.1.12: set-blocking@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + resolved "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz" integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== -setimmediate@1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.4.tgz#20e81de622d4a02588ce0c8da8973cbcf1d3138f" - integrity sha512-/TjEmXQVEzdod/FFskf3o7oOAsGhHf2j1dZqRFbDzq4F3mvvxflIIi4Hd3bLQE9y/CpwqfSQam5JakI/mi3Pog== - setimmediate@^1.0.5: version "1.0.5" - resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" + resolved "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz" integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA== +setimmediate@1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.4.tgz" + integrity sha512-/TjEmXQVEzdod/FFskf3o7oOAsGhHf2j1dZqRFbDzq4F3mvvxflIIi4Hd3bLQE9y/CpwqfSQam5JakI/mi3Pog== + setprototypeof@1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" + resolved "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz" integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== sha.js@^2.4.0, sha.js@^2.4.8: version "2.4.11" - resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" + resolved "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz" integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== dependencies: inherits "^2.0.1" @@ -7952,7 +8354,7 @@ sha.js@^2.4.0, sha.js@^2.4.8: sha1@^1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/sha1/-/sha1-1.1.1.tgz#addaa7a93168f393f19eb2b15091618e2700f848" + resolved "https://registry.npmjs.org/sha1/-/sha1-1.1.1.tgz" integrity sha512-dZBS6OrMjtgVkopB1Gmo4RQCDKiZsqcpAQpkV/aaj+FCrCg8r4I4qMkDPQjBgLIxlmu9k4nUbWq6ohXahOneYA== dependencies: charenc ">= 0.0.1" @@ -7960,38 +8362,38 @@ sha1@^1.1.1: sha3@^2.1.1: version "2.1.4" - resolved "https://registry.yarnpkg.com/sha3/-/sha3-2.1.4.tgz#000fac0fe7c2feac1f48a25e7a31b52a6492cc8f" + resolved "https://registry.npmjs.org/sha3/-/sha3-2.1.4.tgz" integrity sha512-S8cNxbyb0UGUM2VhRD4Poe5N58gJnJsLJ5vC7FYWGUmGhcsj4++WaIOBFVDxlG0W3To6xBuiRh+i0Qp2oNCOtg== dependencies: buffer "6.0.3" shebang-command@^1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" + resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz" integrity sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg== dependencies: shebang-regex "^1.0.0" shebang-command@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz" integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== dependencies: shebang-regex "^3.0.0" shebang-regex@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" + resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz" integrity sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ== shebang-regex@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== shelljs@^0.8.3, shelljs@^0.8.5: version "0.8.5" - resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.8.5.tgz#de055408d8361bed66c669d2f000538ced8ee20c" + resolved "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz" integrity sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow== dependencies: glob "^7.0.0" @@ -8000,7 +8402,7 @@ shelljs@^0.8.3, shelljs@^0.8.5: side-channel@^1.0.4: version "1.0.4" - resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" + resolved "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz" integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== dependencies: call-bind "^1.0.0" @@ -8009,17 +8411,17 @@ side-channel@^1.0.4: signal-exit@^3.0.0, signal-exit@^3.0.2: version "3.0.7" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" + resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== simple-concat@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.1.tgz#f46976082ba35c2263f1c8ab5edfe26c41c9552f" + resolved "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz" integrity sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q== simple-get@^2.7.0: version "2.8.2" - resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-2.8.2.tgz#5708fb0919d440657326cd5fe7d2599d07705019" + resolved "https://registry.npmjs.org/simple-get/-/simple-get-2.8.2.tgz" integrity sha512-Ijd/rV5o+mSBBs4F/x9oDPtTx9Zb6X9brmnXvMW4J7IR15ngi9q5xxqWBKU744jTZiaXtxaPL7uHG6vtN8kUkw== dependencies: decompress-response "^3.3.0" @@ -8028,12 +8430,12 @@ simple-get@^2.7.0: sinon-chai@^3.7.0: version "3.7.0" - resolved "https://registry.yarnpkg.com/sinon-chai/-/sinon-chai-3.7.0.tgz#cfb7dec1c50990ed18c153f1840721cf13139783" + resolved "https://registry.npmjs.org/sinon-chai/-/sinon-chai-3.7.0.tgz" integrity sha512-mf5NURdUaSdnatJx3uhoBOrY9dtL19fiOtAdT1Azxg3+lNJFiuN0uzaU3xX1LeAfL17kHQhTAJgpsfhbMJMY2g== -sinon@^9.0.0: +sinon@^9.0.0, sinon@>=4.0.0: version "9.2.4" - resolved "https://registry.yarnpkg.com/sinon/-/sinon-9.2.4.tgz#e55af4d3b174a4443a8762fa8421c2976683752b" + resolved "https://registry.npmjs.org/sinon/-/sinon-9.2.4.tgz" integrity sha512-zljcULZQsJxVra28qIAL6ow1Z9tpattkCTEJR4RBP3TGc00FcttsP5pK284Nas5WjMZU5Yzy3kAIp3B3KRf5Yg== dependencies: "@sinonjs/commons" "^1.8.1" @@ -8045,12 +8447,12 @@ sinon@^9.0.0: slash@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + resolved "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz" integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== slice-ansi@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" + resolved "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz" integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== dependencies: ansi-styles "^4.0.0" @@ -8059,7 +8461,7 @@ slice-ansi@^4.0.0: smartwrap@^2.0.2: version "2.0.2" - resolved "https://registry.yarnpkg.com/smartwrap/-/smartwrap-2.0.2.tgz#7e25d3dd58b51c6ca4aba3a9e391650ea62698a4" + resolved "https://registry.npmjs.org/smartwrap/-/smartwrap-2.0.2.tgz" integrity sha512-vCsKNQxb7PnCNd2wY1WClWifAc2lwqsG8OaswpJkVJsvMGcnEntdTCDajZCkk93Ay1U3t/9puJmb525Rg5MZBA== dependencies: array.prototype.flat "^1.2.3" @@ -8071,29 +8473,14 @@ smartwrap@^2.0.2: snake-case@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/snake-case/-/snake-case-2.1.0.tgz#41bdb1b73f30ec66a04d4e2cad1b76387d4d6d9f" + resolved "https://registry.npmjs.org/snake-case/-/snake-case-2.1.0.tgz" integrity sha512-FMR5YoPFwOLuh4rRz92dywJjyKYZNLpMn1R5ujVpIYkbA9p01fq8RMg0FkO4M+Yobt4MjHeLTJVm5xFFBHSV2Q== dependencies: no-case "^2.2.0" -solc@0.7.3: - version "0.7.3" - resolved "https://registry.yarnpkg.com/solc/-/solc-0.7.3.tgz#04646961bd867a744f63d2b4e3c0701ffdc7d78a" - integrity sha512-GAsWNAjGzIDg7VxzP6mPjdurby3IkGCjQcM8GFYZT6RyaoUZKmMU6Y7YwG+tFGhv7dwZ8rmR4iwFDrrD99JwqA== - dependencies: - command-exists "^1.2.8" - commander "3.0.2" - follow-redirects "^1.12.1" - fs-extra "^0.30.0" - js-sha3 "0.8.0" - memorystream "^0.3.1" - require-from-string "^2.0.0" - semver "^5.5.0" - tmp "0.0.33" - solc@^0.4.20: version "0.4.26" - resolved "https://registry.yarnpkg.com/solc/-/solc-0.4.26.tgz#5390a62a99f40806b86258c737c1cf653cc35cb5" + resolved "https://registry.npmjs.org/solc/-/solc-0.4.26.tgz" integrity sha512-o+c6FpkiHd+HPjmjEVpQgH7fqZ14tJpXhho+/bQXlXbliLIS/xjXb42Vxh+qQY1WCSTMQ0+a5vR9vi0MfhU6mA== dependencies: fs-extra "^0.30.0" @@ -8102,9 +8489,24 @@ solc@^0.4.20: semver "^5.3.0" yargs "^4.7.1" +solc@0.7.3: + version "0.7.3" + resolved "https://registry.npmjs.org/solc/-/solc-0.7.3.tgz" + integrity sha512-GAsWNAjGzIDg7VxzP6mPjdurby3IkGCjQcM8GFYZT6RyaoUZKmMU6Y7YwG+tFGhv7dwZ8rmR4iwFDrrD99JwqA== + dependencies: + command-exists "^1.2.8" + commander "3.0.2" + follow-redirects "^1.12.1" + fs-extra "^0.30.0" + js-sha3 "0.8.0" + memorystream "^0.3.1" + require-from-string "^2.0.0" + semver "^5.5.0" + tmp "0.0.33" + solhint@^3.4.0: version "3.4.0" - resolved "https://registry.yarnpkg.com/solhint/-/solhint-3.4.0.tgz#a7e4f2d73e679cb197a1ca5279aa7534bd323e4d" + resolved "https://registry.npmjs.org/solhint/-/solhint-3.4.0.tgz" integrity sha512-FYEs/LoTxMsWFP/OGsEqR1CBDn3Bn7hrTWsgtjai17MzxITgearIdlo374KKZjjIycu8E2xBcJ+RSWeoBvQmkw== dependencies: "@solidity-parser/parser" "^0.15.0" @@ -8129,7 +8531,7 @@ solhint@^3.4.0: solidity-coverage@^0.8.1: version "0.8.2" - resolved "https://registry.yarnpkg.com/solidity-coverage/-/solidity-coverage-0.8.2.tgz#bc39604ab7ce0a3fa7767b126b44191830c07813" + resolved "https://registry.npmjs.org/solidity-coverage/-/solidity-coverage-0.8.2.tgz" integrity sha512-cv2bWb7lOXPE9/SSleDO6czkFiMHgP4NXPj+iW9W7iEKLBk7Cj0AGBiNmGX3V1totl9wjPrT0gHmABZKZt65rQ== dependencies: "@ethersproject/abi" "^5.0.9" @@ -8155,7 +8557,7 @@ solidity-coverage@^0.8.1: solpp@^0.11.5: version "0.11.5" - resolved "https://registry.yarnpkg.com/solpp/-/solpp-0.11.5.tgz#e5f38b5acc952e1cc2e3871d490fdbed910938dd" + resolved "https://registry.npmjs.org/solpp/-/solpp-0.11.5.tgz" integrity sha512-LjzCGMrTDXtera2C4mbQGZSpBznP+o3/82L2CneAAMNbm+t4xPsvfrgJkIaY+IZ5YLrB8IXn7cYthwHMKvAWnQ== dependencies: antlr4 "~4.8.0" @@ -8168,37 +8570,37 @@ solpp@^0.11.5: resolve "^1.10.0" semver "^5.6.0" -source-map-support@0.5.12: - version "0.5.12" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.12.tgz#b4f3b10d51857a5af0138d3ce8003b201613d599" - integrity sha512-4h2Pbvyy15EE02G+JOZpUCmqWJuqrs+sEkzewTm++BPi7Hvn/HwcqLAcNxYAyI0x13CpPPn+kMjl+hplXMHITQ== +source-map-support@^0.5.13, source-map-support@^0.5.19: + version "0.5.21" + resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz" + integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== dependencies: buffer-from "^1.0.0" source-map "^0.6.0" -source-map-support@^0.5.13, source-map-support@^0.5.19: - version "0.5.21" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" - integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== +source-map-support@0.5.12: + version "0.5.12" + resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.12.tgz" + integrity sha512-4h2Pbvyy15EE02G+JOZpUCmqWJuqrs+sEkzewTm++BPi7Hvn/HwcqLAcNxYAyI0x13CpPPn+kMjl+hplXMHITQ== dependencies: buffer-from "^1.0.0" source-map "^0.6.0" source-map@^0.6.0, source-map@^0.6.1: version "0.6.1" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== source-map@~0.2.0: version "0.2.0" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.2.0.tgz#dab73fbcfc2ba819b4de03bd6f6eaa48164b3f9d" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz" integrity sha512-CBdZ2oa/BHhS4xj5DlhjWNHcan57/5YuvfdLf17iVmIpd9KRm+DFLmC6nBNj+6Ua7Kt3TmOjDpQT1aTYOQtoUA== dependencies: amdefine ">=0.0.4" spawn-wrap@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/spawn-wrap/-/spawn-wrap-2.0.0.tgz#103685b8b8f9b79771318827aa78650a610d457e" + resolved "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz" integrity sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg== dependencies: foreground-child "^2.0.0" @@ -8210,7 +8612,7 @@ spawn-wrap@^2.0.0: spawndamnit@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/spawndamnit/-/spawndamnit-2.0.0.tgz#9f762ac5c3476abb994b42ad592b5ad22bb4b0ad" + resolved "https://registry.npmjs.org/spawndamnit/-/spawndamnit-2.0.0.tgz" integrity sha512-j4JKEcncSjFlqIwU5L/rp2N5SIPsdxaRsIv678+TZxZ0SRDJTm8JrxJMjE/XuiEZNEir3S8l0Fa3Ke339WI4qA== dependencies: cross-spawn "^5.1.0" @@ -8218,7 +8620,7 @@ spawndamnit@^2.0.0: spdx-correct@^3.0.0: version "3.1.1" - resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9" + resolved "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz" integrity sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w== dependencies: spdx-expression-parse "^3.0.0" @@ -8226,12 +8628,12 @@ spdx-correct@^3.0.0: spdx-exceptions@^2.1.0: version "2.3.0" - resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d" + resolved "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz" integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== spdx-expression-parse@^3.0.0: version "3.0.1" - resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" + resolved "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz" integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== dependencies: spdx-exceptions "^2.1.0" @@ -8239,24 +8641,24 @@ spdx-expression-parse@^3.0.0: spdx-license-ids@^3.0.0: version "3.0.12" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.12.tgz#69077835abe2710b65f03969898b6637b505a779" + resolved "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.12.tgz" integrity sha512-rr+VVSXtRhO4OHbXUiAF7xW3Bo9DuuF6C5jH+q/x15j2jniycgKbxU09Hr0WqlSLUs4i4ltHGXqTe7VHclYWyA== split@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/split/-/split-1.0.1.tgz#605bd9be303aa59fb35f9229fbea0ddec9ea07d9" + resolved "https://registry.npmjs.org/split/-/split-1.0.1.tgz" integrity sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg== dependencies: through "2" sprintf-js@~1.0.2: version "1.0.3" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + resolved "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz" integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== sshpk@^1.7.0: version "1.17.0" - resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.17.0.tgz#578082d92d4fe612b13007496e543fa0fbcbe4c5" + resolved "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz" integrity sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ== dependencies: asn1 "~0.2.3" @@ -8271,46 +8673,60 @@ sshpk@^1.7.0: stacktrace-parser@^0.1.10: version "0.1.10" - resolved "https://registry.yarnpkg.com/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz#29fb0cae4e0d0b85155879402857a1639eb6051a" + resolved "https://registry.npmjs.org/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz" integrity sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg== dependencies: type-fest "^0.7.1" statuses@2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" + resolved "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz" integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== stealthy-require@^1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" + resolved "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz" integrity sha512-ZnWpYnYugiOVEY5GkcuJK1io5V8QmNYChG62gSit9pQVGErXtrKuPC55ITaVSukmMta5qpMU7vqLt2Lnni4f/g== stream-transform@^2.1.3: version "2.1.3" - resolved "https://registry.yarnpkg.com/stream-transform/-/stream-transform-2.1.3.tgz#a1c3ecd72ddbf500aa8d342b0b9df38f5aa598e3" + resolved "https://registry.npmjs.org/stream-transform/-/stream-transform-2.1.3.tgz" integrity sha512-9GHUiM5hMiCi6Y03jD2ARC1ettBXkQBoQAe7nJsPknnI0ow10aXjTnew8QtYQmLjzn974BnmWEAJgCY6ZP1DeQ== dependencies: mixme "^0.5.1" streamsearch@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-1.1.0.tgz#404dd1e2247ca94af554e841a8ef0eaa238da764" + resolved "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz" integrity sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg== strict-uri-encode@^1.0.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" + resolved "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz" integrity sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ== +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + string-format@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/string-format/-/string-format-2.0.0.tgz#f2df2e7097440d3b65de31b6d40d54c96eaffb9b" + resolved "https://registry.npmjs.org/string-format/-/string-format-2.0.0.tgz" integrity sha512-bbEs3scLeYNXLecRRuk6uJxdXUSj6le/8rNPHChIJTn2V79aXVTR1EH2OH5zLKKoz0V02fOUKZZcw01pLUShZA== string-width@^1.0.1: version "1.0.2" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" + resolved "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz" integrity sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw== dependencies: code-point-at "^1.0.0" @@ -8319,7 +8735,7 @@ string-width@^1.0.1: "string-width@^1.0.2 || 2", string-width@^2.1.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" + resolved "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz" integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== dependencies: is-fullwidth-code-point "^2.0.0" @@ -8327,7 +8743,7 @@ string-width@^1.0.1: string-width@^3.0.0, string-width@^3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" + resolved "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz" integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== dependencies: emoji-regex "^7.0.1" @@ -8336,7 +8752,7 @@ string-width@^3.0.0, string-width@^3.1.0: string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== dependencies: emoji-regex "^8.0.0" @@ -8345,7 +8761,7 @@ string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: string.prototype.trimend@^1.0.6: version "1.0.6" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz#c4a27fa026d979d79c04f17397f250a462944533" + resolved "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz" integrity sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ== dependencies: call-bind "^1.0.2" @@ -8354,154 +8770,140 @@ string.prototype.trimend@^1.0.6: string.prototype.trimstart@^1.0.6: version "1.0.6" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz#e90ab66aa8e4007d92ef591bbf3cd422c56bdcf4" + resolved "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz" integrity sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA== dependencies: call-bind "^1.0.2" define-properties "^1.1.4" es-abstract "^1.20.4" -string_decoder@^1.1.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" - integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== - dependencies: - safe-buffer "~5.2.0" - -string_decoder@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" - integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== - dependencies: - safe-buffer "~5.1.0" - strip-ansi@^3.0.0, strip-ansi@^3.0.1: version "3.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz" integrity sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg== dependencies: ansi-regex "^2.0.0" strip-ansi@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz" integrity sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow== dependencies: ansi-regex "^3.0.0" strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: version "5.2.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz" integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== dependencies: ansi-regex "^4.1.0" strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== dependencies: ansi-regex "^5.0.1" strip-ansi@~0.1.0: version "0.1.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-0.1.1.tgz#39e8a98d044d150660abe4a6808acf70bb7bc991" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.1.1.tgz" integrity sha512-behete+3uqxecWlDAm5lmskaSaISA+ThQ4oNNBDTBJt0x2ppR6IPqfZNuj6BLaLJ/Sji4TPZlcRyOis8wXQTLg== strip-bom@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" + resolved "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz" integrity sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g== dependencies: is-utf8 "^0.2.0" strip-bom@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + resolved "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz" integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== strip-bom@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" + resolved "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz" integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== strip-eof@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" + resolved "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz" integrity sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q== strip-hex-prefix@1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz#0c5f155fef1151373377de9dbb588da05500e36f" + resolved "https://registry.npmjs.org/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz" integrity sha512-q8d4ue7JGEiVcypji1bALTos+0pWtyGlivAWyPuTkHzuTCJqrK9sWxYQZUq6Nq3cuyv3bm734IhHvHtGGURU6A== dependencies: is-hex-prefixed "1.0.0" strip-indent@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-2.0.0.tgz#5ef8db295d01e6ed6cbf7aab96998d7822527b68" + resolved "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz" integrity sha512-RsSNPLpq6YUL7QYy44RnPVTn/lcVZtb48Uof3X5JLbF4zD/Gs7ZFDv2HWol+leoQN2mT86LAzSshGfkTlSOpsA== strip-indent@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-3.0.0.tgz#c32e1cee940b6b3432c771bc2c54bcce73cd3001" + resolved "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz" integrity sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ== dependencies: min-indent "^1.0.0" -strip-json-comments@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" - integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== - -strip-json-comments@3.1.1, strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: +strip-json-comments@^3.1.0, strip-json-comments@^3.1.1, strip-json-comments@3.1.1: version "3.1.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== -supports-color@6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.0.0.tgz#76cfe742cf1f41bb9b1c29ad03068c05b4c0e40a" - integrity sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg== - dependencies: - has-flag "^3.0.0" - -supports-color@8.1.1: - version "8.1.1" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" - integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== - dependencies: - has-flag "^4.0.0" +strip-json-comments@2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz" + integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== supports-color@^3.1.0: version "3.2.3" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz" integrity sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A== dependencies: has-flag "^1.0.0" supports-color@^5.3.0: version "5.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz" integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== dependencies: has-flag "^3.0.0" supports-color@^7.1.0: version "7.2.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== dependencies: has-flag "^4.0.0" +supports-color@6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz" + integrity sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg== + dependencies: + has-flag "^3.0.0" + +supports-color@8.1.1: + version "8.1.1" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + supports-preserve-symlinks-flag@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + resolved "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz" integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== swap-case@^1.1.0: version "1.1.2" - resolved "https://registry.yarnpkg.com/swap-case/-/swap-case-1.1.2.tgz#c39203a4587385fad3c850a0bd1bcafa081974e3" + resolved "https://registry.npmjs.org/swap-case/-/swap-case-1.1.2.tgz" integrity sha512-BAmWG6/bx8syfc6qXPprof3Mn5vQgf5dwdUNJhsNqU9WdPt5P+ES/wQ5bxfijy8zwZgZZHslC3iAsxsuQMCzJQ== dependencies: lower-case "^1.1.1" @@ -8509,7 +8911,7 @@ swap-case@^1.1.0: swarm-js@^0.1.40: version "0.1.42" - resolved "https://registry.yarnpkg.com/swarm-js/-/swarm-js-0.1.42.tgz#497995c62df6696f6e22372f457120e43e727979" + resolved "https://registry.npmjs.org/swarm-js/-/swarm-js-0.1.42.tgz" integrity sha512-BV7c/dVlA3R6ya1lMlSSNPLYrntt0LUq4YMgy3iwpCIc6rZnS5W2wUoctarZ5pXlpKtxDDf9hNziEkcfrxdhqQ== dependencies: bluebird "^3.5.0" @@ -8526,7 +8928,7 @@ swarm-js@^0.1.40: sync-request@^6.0.0: version "6.1.0" - resolved "https://registry.yarnpkg.com/sync-request/-/sync-request-6.1.0.tgz#e96217565b5e50bbffe179868ba75532fb597e68" + resolved "https://registry.npmjs.org/sync-request/-/sync-request-6.1.0.tgz" integrity sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw== dependencies: http-response-object "^3.0.1" @@ -8535,14 +8937,14 @@ sync-request@^6.0.0: sync-rpc@^1.2.1: version "1.3.6" - resolved "https://registry.yarnpkg.com/sync-rpc/-/sync-rpc-1.3.6.tgz#b2e8b2550a12ccbc71df8644810529deb68665a7" + resolved "https://registry.npmjs.org/sync-rpc/-/sync-rpc-1.3.6.tgz" integrity sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw== dependencies: get-port "^3.1.0" table-layout@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/table-layout/-/table-layout-1.0.2.tgz#c4038a1853b0136d63365a734b6931cf4fad4a04" + resolved "https://registry.npmjs.org/table-layout/-/table-layout-1.0.2.tgz" integrity sha512-qd/R7n5rQTRFi+Zf2sk5XVVd9UQl6ZkduPFC3S7WEGJAmetDTjY3qPN50eSKzwuzEyQKy5TN2TiZdkIjos2L6A== dependencies: array-back "^4.0.1" @@ -8552,7 +8954,7 @@ table-layout@^1.0.2: table@^6.0.9, table@^6.8.0, table@^6.8.1: version "6.8.1" - resolved "https://registry.yarnpkg.com/table/-/table-6.8.1.tgz#ea2b71359fe03b017a5fbc296204471158080bdf" + resolved "https://registry.npmjs.org/table/-/table-6.8.1.tgz" integrity sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA== dependencies: ajv "^8.0.1" @@ -8563,7 +8965,7 @@ table@^6.0.9, table@^6.8.0, table@^6.8.1: tar@^4.0.2: version "4.4.19" - resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.19.tgz#2e4d7263df26f2b914dee10c825ab132123742f3" + resolved "https://registry.npmjs.org/tar/-/tar-4.4.19.tgz" integrity sha512-a20gEsvHnWe0ygBY8JbxoM4w3SJdhc7ZAuxkLqh+nvNQN2IOt0B5lLgM490X5Hl8FF0dl0tOf2ewFYAlIFgzVA== dependencies: chownr "^1.1.4" @@ -8576,12 +8978,12 @@ tar@^4.0.2: term-size@^2.1.0: version "2.2.1" - resolved "https://registry.yarnpkg.com/term-size/-/term-size-2.2.1.tgz#2a6a54840432c2fb6320fea0f415531e90189f54" + resolved "https://registry.npmjs.org/term-size/-/term-size-2.2.1.tgz" integrity sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg== test-exclude@^6.0.0: version "6.0.0" - resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" + resolved "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz" integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w== dependencies: "@istanbuljs/schema" "^0.1.2" @@ -8590,17 +8992,17 @@ test-exclude@^6.0.0: testrpc@0.0.1: version "0.0.1" - resolved "https://registry.yarnpkg.com/testrpc/-/testrpc-0.0.1.tgz#83e2195b1f5873aec7be1af8cbe6dcf39edb7aed" + resolved "https://registry.npmjs.org/testrpc/-/testrpc-0.0.1.tgz" integrity sha512-afH1hO+SQ/VPlmaLUFj2636QMeDvPCeQMc/9RBMW0IfjNe9gFD9Ra3ShqYkB7py0do1ZcCna/9acHyzTJ+GcNA== text-table@^0.2.0: version "0.2.0" - resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + resolved "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz" integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== then-request@^6.0.0: version "6.0.2" - resolved "https://registry.yarnpkg.com/then-request/-/then-request-6.0.2.tgz#ec18dd8b5ca43aaee5cb92f7e4c1630e950d4f0c" + resolved "https://registry.npmjs.org/then-request/-/then-request-6.0.2.tgz" integrity sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA== dependencies: "@types/concat-stream" "^1.6.0" @@ -8617,31 +9019,31 @@ then-request@^6.0.0: thenify-all@^1.0.0: version "1.6.0" - resolved "https://registry.yarnpkg.com/thenify-all/-/thenify-all-1.6.0.tgz#1a1918d402d8fc3f98fbf234db0bcc8cc10e9726" + resolved "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz" integrity sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA== dependencies: thenify ">= 3.1.0 < 4" "thenify@>= 3.1.0 < 4": version "3.3.1" - resolved "https://registry.yarnpkg.com/thenify/-/thenify-3.3.1.tgz#8932e686a4066038a016dd9e2ca46add9838a95f" + resolved "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz" integrity sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw== dependencies: any-promise "^1.0.0" throat@^4.0.0, throat@^4.1.0: version "4.1.0" - resolved "https://registry.yarnpkg.com/throat/-/throat-4.1.0.tgz#89037cbc92c56ab18926e6ba4cbb200e15672a6a" + resolved "https://registry.npmjs.org/throat/-/throat-4.1.0.tgz" integrity sha512-wCVxLDcFxw7ujDxaeJC6nfl2XfHJNYs8yUYJnvMgtPEFlttP9tHSfRUv2vBe6C4hkVFPWoP1P6ZccbYjmSEkKA== through@2: version "2.3.8" - resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + resolved "https://registry.npmjs.org/through/-/through-2.3.8.tgz" integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== time-require@^0.1.2: version "0.1.2" - resolved "https://registry.yarnpkg.com/time-require/-/time-require-0.1.2.tgz#f9e12cb370fc2605e11404582ba54ef5ca2b2d98" + resolved "https://registry.npmjs.org/time-require/-/time-require-0.1.2.tgz" integrity sha512-IqcSpa1sVNleRbC9eHnN7p7vwEHNmsjsXUDqjlnvo4+2VLJ7/gIY2XACTBuRhMB4weYbDYKsR3av2ySykRhDIA== dependencies: chalk "^0.4.0" @@ -8651,44 +9053,44 @@ time-require@^0.1.2: timed-out@^4.0.1: version "4.0.1" - resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f" + resolved "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz" integrity sha512-G7r3AhovYtr5YKOWQkta8RKAPb+J9IsO4uVmzjl8AZwfhs8UcUwTiD6gcJYSgOtzyjvQKrKYn41syHbUWMkafA== title-case@^2.1.0: version "2.1.1" - resolved "https://registry.yarnpkg.com/title-case/-/title-case-2.1.1.tgz#3e127216da58d2bc5becf137ab91dae3a7cd8faa" + resolved "https://registry.npmjs.org/title-case/-/title-case-2.1.1.tgz" integrity sha512-EkJoZ2O3zdCz3zJsYCsxyq2OC5hrxR9mfdd5I+w8h/tmFfeOxJ+vvkxsKxdmN0WtS9zLdHEgfgVOiMVgv+Po4Q== dependencies: no-case "^2.2.0" upper-case "^1.0.3" -tmp@0.0.33, tmp@^0.0.33: +tmp@^0.0.33, tmp@0.0.33: version "0.0.33" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" + resolved "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz" integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== dependencies: os-tmpdir "~1.0.2" to-fast-properties@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + resolved "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz" integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== to-regex-range@^5.0.1: version "5.0.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== dependencies: is-number "^7.0.0" toidentifier@1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" + resolved "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz" integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== tough-cookie@^2.3.3, tough-cookie@~2.5.0: version "2.5.0" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" + resolved "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz" integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== dependencies: psl "^1.1.28" @@ -8696,22 +9098,22 @@ tough-cookie@^2.3.3, tough-cookie@~2.5.0: tr46@~0.0.3: version "0.0.3" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + resolved "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz" integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== trim-newlines@^3.0.0: version "3.0.1" - resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-3.0.1.tgz#260a5d962d8b752425b32f3a7db0dcacd176c144" + resolved "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz" integrity sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw== truffle-blockchain-utils@^0.0.5: version "0.0.5" - resolved "https://registry.yarnpkg.com/truffle-blockchain-utils/-/truffle-blockchain-utils-0.0.5.tgz#a4e5c064dadd69f782a137f3d276d21095da7a47" + resolved "https://registry.npmjs.org/truffle-blockchain-utils/-/truffle-blockchain-utils-0.0.5.tgz" integrity sha512-eCCV8FbYOuKagRY5NiqJCZrrh9GjWX2573ahqZPvUrzxYGIvCpSsHpGCub2e00YefpMfBqwscbsDTK7WNVfwoA== truffle-contract-schema@^2.0.3: version "2.0.3" - resolved "https://registry.yarnpkg.com/truffle-contract-schema/-/truffle-contract-schema-2.0.3.tgz#0af8e19a39c630730bc19dd41b48f5b4137a6977" + resolved "https://registry.npmjs.org/truffle-contract-schema/-/truffle-contract-schema-2.0.3.tgz" integrity sha512-eI5cFifbB3zpcO4RsXSnjN9JMSlJ4M50GQPdrfbrIXRTXHsyQ433SkgFjIATUwfq++TXWkCRfKMjN8eA7YQ3+Q== dependencies: ajv "^5.1.1" @@ -8720,7 +9122,7 @@ truffle-contract-schema@^2.0.3: truffle-contract@^3.0.7: version "3.0.8" - resolved "https://registry.yarnpkg.com/truffle-contract/-/truffle-contract-3.0.8.tgz#6588b1b816060f6ac6876d77948934b929574067" + resolved "https://registry.npmjs.org/truffle-contract/-/truffle-contract-3.0.8.tgz" integrity sha512-uhXb/G4dORU4RjFlwZZbFT0n5BS8akify+MaRsnWWs4SA/bo6x4/bQs1xtdO3b5Cl9nXiOX88wdQzRj3xtPVUg== dependencies: ethjs-abi "0.1.8" @@ -8731,12 +9133,12 @@ truffle-contract@^3.0.7: truffle-error@^0.0.3: version "0.0.3" - resolved "https://registry.yarnpkg.com/truffle-error/-/truffle-error-0.0.3.tgz#4bf55242e14deee1c7194932709182deff2c97ca" + resolved "https://registry.npmjs.org/truffle-error/-/truffle-error-0.0.3.tgz" integrity sha512-9gxs1z6BUn7MqrE4NPm/jcYe8rLok3Z57aweGIh1+CoRJSttzYqwcXCqaPRSNrTFnsTeZMBukkYr/PUcADoihw== ts-command-line-args@^2.2.0: version "2.4.2" - resolved "https://registry.yarnpkg.com/ts-command-line-args/-/ts-command-line-args-2.4.2.tgz#b4815b23c35f8a0159d4e69e01012d95690bc448" + resolved "https://registry.npmjs.org/ts-command-line-args/-/ts-command-line-args-2.4.2.tgz" integrity sha512-mJLQQBOdyD4XI/ZWQY44PIdYde47JhV2xl380O7twPkTQ+Y5vFDHsk8LOeXKuz7dVY5aDCfAzRarNfSqtKOkQQ== dependencies: "@morgan-stanley/ts-mocking-bird" "^0.6.2" @@ -8747,12 +9149,12 @@ ts-command-line-args@^2.2.0: ts-essentials@^7.0.1: version "7.0.3" - resolved "https://registry.yarnpkg.com/ts-essentials/-/ts-essentials-7.0.3.tgz#686fd155a02133eedcc5362dc8b5056cde3e5a38" + resolved "https://registry.npmjs.org/ts-essentials/-/ts-essentials-7.0.3.tgz" integrity sha512-8+gr5+lqO3G84KdiTSMRLtuyJ+nTBVRKuCrK4lidMPdVeEp0uqC875uE5NMcaA7YYMN7XsNiFQuMvasF8HT/xQ== ts-node@^10.8.0: version "10.9.1" - resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.1.tgz#e73de9102958af9e1f0b168a6ff320e25adcff4b" + resolved "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz" integrity sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw== dependencies: "@cspotcode/source-map-support" "^0.8.0" @@ -8771,7 +9173,7 @@ ts-node@^10.8.0: tsconfig-paths@^3.10.1: version "3.14.1" - resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz#ba0734599e8ea36c862798e920bcf163277b137a" + resolved "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz" integrity sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ== dependencies: "@types/json5" "^0.0.29" @@ -8781,24 +9183,24 @@ tsconfig-paths@^3.10.1: tslib@^1.8.1, tslib@^1.9.3: version "1.14.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" + resolved "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== tsort@0.0.1: version "0.0.1" - resolved "https://registry.yarnpkg.com/tsort/-/tsort-0.0.1.tgz#e2280f5e817f8bf4275657fd0f9aebd44f5a2786" + resolved "https://registry.npmjs.org/tsort/-/tsort-0.0.1.tgz" integrity sha512-Tyrf5mxF8Ofs1tNoxA13lFeZ2Zrbd6cKbuH3V+MQ5sb6DtBj5FjrXVsRWT8YvNAQTqNoz66dz1WsbigI22aEnw== tsutils@^3.21.0: version "3.21.0" - resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" + resolved "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz" integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== dependencies: tslib "^1.8.1" tty-table@^4.1.5: version "4.1.6" - resolved "https://registry.yarnpkg.com/tty-table/-/tty-table-4.1.6.tgz#6bd58338f36c94cce478c3337934d8a65ab40a73" + resolved "https://registry.npmjs.org/tty-table/-/tty-table-4.1.6.tgz" integrity sha512-kRj5CBzOrakV4VRRY5kUWbNYvo/FpOsz65DzI5op9P+cHov3+IqPbo1JE1ZnQGkHdZgNFDsrEjrfqqy/Ply9fw== dependencies: chalk "^4.1.2" @@ -8811,78 +9213,88 @@ tty-table@^4.1.5: tunnel-agent@^0.6.0: version "0.6.0" - resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + resolved "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz" integrity sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w== dependencies: safe-buffer "^5.0.1" tweetnacl-util@^0.15.1: version "0.15.1" - resolved "https://registry.yarnpkg.com/tweetnacl-util/-/tweetnacl-util-0.15.1.tgz#b80fcdb5c97bcc508be18c44a4be50f022eea00b" + resolved "https://registry.npmjs.org/tweetnacl-util/-/tweetnacl-util-0.15.1.tgz" integrity sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw== -tweetnacl@^0.14.3, tweetnacl@~0.14.0: +tweetnacl@^0.14.3: version "0.14.5" - resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" + resolved "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz" integrity sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA== tweetnacl@^1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-1.0.3.tgz#ac0af71680458d8a6378d0d0d050ab1407d35596" + resolved "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz" integrity sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw== +tweetnacl@~0.14.0: + version "0.14.5" + resolved "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz" + integrity sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA== + type-check@^0.4.0, type-check@~0.4.0: version "0.4.0" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" + resolved "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz" integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== dependencies: prelude-ls "^1.2.1" type-check@~0.3.2: version "0.3.2" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" + resolved "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz" integrity sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg== dependencies: prelude-ls "~1.1.2" -type-detect@4.0.8, type-detect@^4.0.0, type-detect@^4.0.5, type-detect@^4.0.8: +type-detect@^4.0.0, type-detect@^4.0.5, type-detect@^4.0.8, type-detect@4.0.8: version "4.0.8" - resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" + resolved "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz" integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== type-fest@^0.13.1: version "0.13.1" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.13.1.tgz#0172cb5bce80b0bd542ea348db50c7e21834d934" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz" integrity sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg== type-fest@^0.20.2: version "0.20.2" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz" integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== type-fest@^0.21.3: version "0.21.3" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz" integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== type-fest@^0.6.0: version "0.6.0" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.6.0.tgz#8d2a2370d3df886eb5c90ada1c5bf6188acf838b" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz" integrity sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg== type-fest@^0.7.1: version "0.7.1" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.7.1.tgz#8dda65feaf03ed78f0a3f9678f1869147f7c5c48" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.7.1.tgz" integrity sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg== -type-fest@^0.8.0, type-fest@^0.8.1: +type-fest@^0.8.0: + version "0.8.1" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz" + integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== + +type-fest@^0.8.1: version "0.8.1" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz" integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== type-is@~1.6.18: version "1.6.18" - resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" + resolved "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz" integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== dependencies: media-typer "0.3.0" @@ -8890,17 +9302,17 @@ type-is@~1.6.18: type@^1.0.1: version "1.2.0" - resolved "https://registry.yarnpkg.com/type/-/type-1.2.0.tgz#848dd7698dafa3e54a6c479e759c4bc3f18847a0" + resolved "https://registry.npmjs.org/type/-/type-1.2.0.tgz" integrity sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg== type@^2.7.2: version "2.7.2" - resolved "https://registry.yarnpkg.com/type/-/type-2.7.2.tgz#2376a15a3a28b1efa0f5350dcf72d24df6ef98d0" + resolved "https://registry.npmjs.org/type/-/type-2.7.2.tgz" integrity sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw== -typechain@^8.1.0: +typechain@^8.1.0, typechain@^8.1.1: version "8.1.1" - resolved "https://registry.yarnpkg.com/typechain/-/typechain-8.1.1.tgz#9c2e8012c2c4c586536fc18402dcd7034c4ff0bd" + resolved "https://registry.npmjs.org/typechain/-/typechain-8.1.1.tgz" integrity sha512-uF/sUvnXTOVF2FHKhQYnxHk4su4JjZR8vr4mA2mBaRwHTbwh0jIlqARz9XJr1tA0l7afJGvEa1dTSi4zt039LQ== dependencies: "@types/prettier" "^2.1.1" @@ -8916,7 +9328,7 @@ typechain@^8.1.0: typed-array-length@^1.0.4: version "1.0.4" - resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.4.tgz#89d83785e5c4098bec72e08b319651f0eac9c1bb" + resolved "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz" integrity sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng== dependencies: call-bind "^1.0.2" @@ -8925,44 +9337,44 @@ typed-array-length@^1.0.4: typedarray-to-buffer@^3.1.5: version "3.1.5" - resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" + resolved "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz" integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== dependencies: is-typedarray "^1.0.0" typedarray@^0.0.6: version "0.0.6" - resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" + resolved "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz" integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA== -typescript@~4.7.4: +typescript@>=2.7, "typescript@>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta", typescript@>=3.7.0, typescript@>=4.2, typescript@>=4.3.0, typescript@~4.7.4: version "4.7.4" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.7.4.tgz#1a88596d1cf47d59507a1bcdfb5b9dfe4d488235" + resolved "https://registry.npmjs.org/typescript/-/typescript-4.7.4.tgz" integrity sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ== typical@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/typical/-/typical-4.0.0.tgz#cbeaff3b9d7ae1e2bbfaf5a4e6f11eccfde94fc4" + resolved "https://registry.npmjs.org/typical/-/typical-4.0.0.tgz" integrity sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw== typical@^5.2.0: version "5.2.0" - resolved "https://registry.yarnpkg.com/typical/-/typical-5.2.0.tgz#4daaac4f2b5315460804f0acf6cb69c52bb93066" + resolved "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz" integrity sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg== uglify-js@^3.1.4: version "3.17.4" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.17.4.tgz#61678cf5fa3f5b7eb789bb345df29afb8257c22c" + resolved "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz" integrity sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g== ultron@~1.1.0: version "1.1.1" - resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.1.1.tgz#9fe1536a10a664a65266a1e3ccf85fd36302bc9c" + resolved "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz" integrity sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og== unbox-primitive@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" + resolved "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz" integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== dependencies: call-bind "^1.0.2" @@ -8972,39 +9384,39 @@ unbox-primitive@^1.0.2: underscore@^1.8.3: version "1.13.6" - resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.13.6.tgz#04786a1f589dc6c09f761fc5f45b89e935136441" + resolved "https://registry.npmjs.org/underscore/-/underscore-1.13.6.tgz" integrity sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A== undici@^5.14.0: version "5.18.0" - resolved "https://registry.yarnpkg.com/undici/-/undici-5.18.0.tgz#e88a77a74d991a30701e9a6751e4193a26fabda9" + resolved "https://registry.npmjs.org/undici/-/undici-5.18.0.tgz" integrity sha512-1iVwbhonhFytNdg0P4PqyIAXbdlVZVebtPDvuM36m66mRw4OGrCm2MYynJv/UENFLdP13J1nPVQzVE2zTs1OeA== dependencies: busboy "^1.6.0" universalify@^0.1.0: version "0.1.2" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" + resolved "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz" integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== universalify@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" + resolved "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz" integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== -unpipe@1.0.0, unpipe@~1.0.0: +unpipe@~1.0.0, unpipe@1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + resolved "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz" integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== untildify@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/untildify/-/untildify-4.0.0.tgz#2bc947b953652487e4600949fb091e3ae8cd919b" + resolved "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz" integrity sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw== update-browserslist-db@^1.0.10: version "1.0.11" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz#9a2a641ad2907ae7b3616506f4b977851db5b940" + resolved "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz" integrity sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA== dependencies: escalade "^3.1.1" @@ -9012,53 +9424,53 @@ update-browserslist-db@^1.0.10: upper-case-first@^1.1.0, upper-case-first@^1.1.2: version "1.1.2" - resolved "https://registry.yarnpkg.com/upper-case-first/-/upper-case-first-1.1.2.tgz#5d79bedcff14419518fd2edb0a0507c9b6859115" + resolved "https://registry.npmjs.org/upper-case-first/-/upper-case-first-1.1.2.tgz" integrity sha512-wINKYvI3Db8dtjikdAqoBbZoP6Q+PZUyfMR7pmwHzjC2quzSkUq5DmPrTtPEqHaz8AGtmsB4TqwapMTM1QAQOQ== dependencies: upper-case "^1.1.1" upper-case@^1.0.3, upper-case@^1.1.0, upper-case@^1.1.1, upper-case@^1.1.3: version "1.1.3" - resolved "https://registry.yarnpkg.com/upper-case/-/upper-case-1.1.3.tgz#f6b4501c2ec4cdd26ba78be7222961de77621598" + resolved "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz" integrity sha512-WRbjgmYzgXkCV7zNVpy5YgrHgbBv126rMALQQMrmzOVC4GM2waQ9x7xtm8VU+1yF2kWyPzI9zbZ48n4vSxwfSA== uri-js@^4.2.2: version "4.4.1" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + resolved "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz" integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== dependencies: punycode "^2.1.0" url-set-query@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/url-set-query/-/url-set-query-1.0.0.tgz#016e8cfd7c20ee05cafe7795e892bd0702faa339" + resolved "https://registry.npmjs.org/url-set-query/-/url-set-query-1.0.0.tgz" integrity sha512-3AChu4NiXquPfeckE5R5cGdiHCMWJx1dwCWOmWIL4KHAziJNOFIYJlpGFeKDvwLPHovZRCxK3cYlwzqI9Vp+Gg== utf-8-validate@^5.0.2: version "5.0.10" - resolved "https://registry.yarnpkg.com/utf-8-validate/-/utf-8-validate-5.0.10.tgz#d7d10ea39318171ca982718b6b96a8d2442571a2" + resolved "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.10.tgz" integrity sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ== dependencies: node-gyp-build "^4.3.0" -utf8@3.0.0, utf8@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/utf8/-/utf8-3.0.0.tgz#f052eed1364d696e769ef058b183df88c87f69d1" - integrity sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ== - utf8@^2.1.1: version "2.1.2" - resolved "https://registry.yarnpkg.com/utf8/-/utf8-2.1.2.tgz#1fa0d9270e9be850d9b05027f63519bf46457d96" + resolved "https://registry.npmjs.org/utf8/-/utf8-2.1.2.tgz" integrity sha512-QXo+O/QkLP/x1nyi54uQiG0XrODxdysuQvE5dtVqv7F5K2Qb6FsN+qbr6KhF5wQ20tfcV3VQp0/2x1e1MRSPWg== +utf8@^3.0.0, utf8@3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/utf8/-/utf8-3.0.0.tgz" + integrity sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ== + util-deprecate@^1.0.1, util-deprecate@~1.0.1: version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== util@^0.12.5: version "0.12.5" - resolved "https://registry.yarnpkg.com/util/-/util-0.12.5.tgz#5f17a6059b73db61a875668781a1c2b136bd6fbc" + resolved "https://registry.npmjs.org/util/-/util-0.12.5.tgz" integrity sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA== dependencies: inherits "^2.0.3" @@ -9069,47 +9481,47 @@ util@^0.12.5: utils-merge@1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" + resolved "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz" integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== -uuid@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-2.0.1.tgz#c2a30dedb3e535d72ccf82e343941a50ba8533ac" - integrity sha512-nWg9+Oa3qD2CQzHIP4qKUqwNfzKn8P0LtFhotaCTFchsV7ZfDhAybeip/HZVeMIpZi9JgY1E3nUlwaCmZT1sEg== - uuid@^3.3.2: version "3.4.0" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" + resolved "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz" integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== uuid@^7.0.3: version "7.0.3" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-7.0.3.tgz#c5c9f2c8cf25dc0a372c4df1441c41f5bd0c680b" + resolved "https://registry.npmjs.org/uuid/-/uuid-7.0.3.tgz" integrity sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg== uuid@^8.3.2: version "8.3.2" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" + resolved "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz" integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== uuid@^9.0.0: version "9.0.0" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.0.tgz#592f550650024a38ceb0c562f2f6aa435761efb5" + resolved "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz" integrity sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg== +uuid@2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/uuid/-/uuid-2.0.1.tgz" + integrity sha512-nWg9+Oa3qD2CQzHIP4qKUqwNfzKn8P0LtFhotaCTFchsV7ZfDhAybeip/HZVeMIpZi9JgY1E3nUlwaCmZT1sEg== + v8-compile-cache-lib@^3.0.1: version "3.0.1" - resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" + resolved "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz" integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== v8-compile-cache@^2.0.3: version "2.3.0" - resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" + resolved "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz" integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== validate-npm-package-license@^3.0.1: version "3.0.4" - resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" + resolved "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz" integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== dependencies: spdx-correct "^3.0.0" @@ -9117,17 +9529,17 @@ validate-npm-package-license@^3.0.1: varint@^5.0.0: version "5.0.2" - resolved "https://registry.yarnpkg.com/varint/-/varint-5.0.2.tgz#5b47f8a947eb668b848e034dcfa87d0ff8a7f7a4" + resolved "https://registry.npmjs.org/varint/-/varint-5.0.2.tgz" integrity sha512-lKxKYG6H03yCZUpAGOPOsMcGxd1RHCu1iKvEHYDPmTyq2HueGhD73ssNBqqQWfvYs04G9iUFRvmAVLW20Jw6ow== vary@^1, vary@~1.1.2: version "1.1.2" - resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + resolved "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz" integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== verror@1.10.0: version "1.10.0" - resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" + resolved "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz" integrity sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw== dependencies: assert-plus "^1.0.0" @@ -9136,23 +9548,31 @@ verror@1.10.0: wcwidth@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" + resolved "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz" integrity sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg== dependencies: defaults "^1.0.3" web3-bzz@1.8.2: version "1.8.2" - resolved "https://registry.yarnpkg.com/web3-bzz/-/web3-bzz-1.8.2.tgz#67ea1c775874056250eece551ded22905ed08784" + resolved "https://registry.npmjs.org/web3-bzz/-/web3-bzz-1.8.2.tgz" integrity sha512-1EEnxjPnFnvNWw3XeeKuTR8PBxYd0+XWzvaLK7OJC/Go9O8llLGxrxICbKV+8cgIE0sDRBxiYx02X+6OhoAQ9w== dependencies: "@types/node" "^12.12.6" got "12.1.0" swarm-js "^0.1.40" +web3-core-helpers@^1.2.1: + version "1.10.3" + resolved "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.10.3.tgz" + integrity sha512-Yv7dQC3B9ipOc5sWm3VAz1ys70Izfzb8n9rSiQYIPjpqtJM+3V4EeK6ghzNR6CO2es0+Yu9CtCkw0h8gQhrTxA== + dependencies: + web3-eth-iban "1.10.3" + web3-utils "1.10.3" + web3-core-helpers@1.8.2: version "1.8.2" - resolved "https://registry.yarnpkg.com/web3-core-helpers/-/web3-core-helpers-1.8.2.tgz#82066560f8085e6c7b93bcc8e88b441289ea9f9f" + resolved "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.8.2.tgz" integrity sha512-6B1eLlq9JFrfealZBomd1fmlq1o4A09vrCVQSa51ANoib/jllT3atZrRDr0zt1rfI7TSZTZBXdN/aTdeN99DWw== dependencies: web3-eth-iban "1.8.2" @@ -9160,7 +9580,7 @@ web3-core-helpers@1.8.2: web3-core-method@1.8.2: version "1.8.2" - resolved "https://registry.yarnpkg.com/web3-core-method/-/web3-core-method-1.8.2.tgz#ba5ec68084e903f0516415010477618be017eac2" + resolved "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.8.2.tgz" integrity sha512-1qnr5mw5wVyULzLOrk4B+ryO3gfGjGd/fx8NR+J2xCGLf1e6OSjxT9vbfuQ3fErk/NjSTWWreieYWLMhaogcRA== dependencies: "@ethersproject/transactions" "^5.6.2" @@ -9169,16 +9589,23 @@ web3-core-method@1.8.2: web3-core-subscriptions "1.8.2" web3-utils "1.8.2" +web3-core-promievent@^1.2.1: + version "1.10.3" + resolved "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.10.3.tgz" + integrity sha512-HgjY+TkuLm5uTwUtaAfkTgRx/NzMxvVradCi02gy17NxDVdg/p6svBHcp037vcNpkuGeFznFJgULP+s2hdVgUQ== + dependencies: + eventemitter3 "4.0.4" + web3-core-promievent@1.8.2: version "1.8.2" - resolved "https://registry.yarnpkg.com/web3-core-promievent/-/web3-core-promievent-1.8.2.tgz#e670d6b4453632e6ecfd9ad82da44f77ac1585c9" + resolved "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.8.2.tgz" integrity sha512-nvkJWDVgoOSsolJldN33tKW6bKKRJX3MCPDYMwP5SUFOA/mCzDEoI88N0JFofDTXkh1k7gOqp1pvwi9heuaxGg== dependencies: eventemitter3 "4.0.4" web3-core-requestmanager@1.8.2: version "1.8.2" - resolved "https://registry.yarnpkg.com/web3-core-requestmanager/-/web3-core-requestmanager-1.8.2.tgz#dda95e83ca4808949612a41e54ecea557f78ef26" + resolved "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.8.2.tgz" integrity sha512-p1d090RYs5Mu7DK1yyc3GCBVZB/03rBtFhYFoS2EruGzOWs/5Q0grgtpwS/DScdRAm8wB8mYEBhY/RKJWF6B2g== dependencies: util "^0.12.5" @@ -9189,7 +9616,7 @@ web3-core-requestmanager@1.8.2: web3-core-subscriptions@1.8.2: version "1.8.2" - resolved "https://registry.yarnpkg.com/web3-core-subscriptions/-/web3-core-subscriptions-1.8.2.tgz#0c8bd49439d83c6f0a03c70f00b24a915a70a5ed" + resolved "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.8.2.tgz" integrity sha512-vXQogHDmAIQcKpXvGiMddBUeP9lnKgYF64+yQJhPNE5PnWr1sAibXuIPV7mIPihpFr/n/DORRj6Wh1pUv9zaTw== dependencies: eventemitter3 "4.0.4" @@ -9197,7 +9624,7 @@ web3-core-subscriptions@1.8.2: web3-core@1.8.2: version "1.8.2" - resolved "https://registry.yarnpkg.com/web3-core/-/web3-core-1.8.2.tgz#333e93d7872b1a36efe758ed8b89a7acbdd962c2" + resolved "https://registry.npmjs.org/web3-core/-/web3-core-1.8.2.tgz" integrity sha512-DJTVEAYcNqxkqruJE+Rxp3CIv0y5AZMwPHQmOkz/cz+MM75SIzMTc0AUdXzGyTS8xMF8h3YWMQGgGEy8SBf1PQ== dependencies: "@types/bn.js" "^5.1.0" @@ -9208,9 +9635,17 @@ web3-core@1.8.2: web3-core-requestmanager "1.8.2" web3-utils "1.8.2" +web3-eth-abi@^1.2.1: + version "1.10.3" + resolved "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.10.3.tgz" + integrity sha512-O8EvV67uhq0OiCMekqYsDtb6FzfYzMXT7VMHowF8HV6qLZXCGTdB/NH4nJrEh2mFtEwVdS6AmLFJAQd2kVyoMQ== + dependencies: + "@ethersproject/abi" "^5.6.3" + web3-utils "1.10.3" + web3-eth-abi@1.8.2: version "1.8.2" - resolved "https://registry.yarnpkg.com/web3-eth-abi/-/web3-eth-abi-1.8.2.tgz#16e1e9be40e2527404f041a4745111211488f31a" + resolved "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.8.2.tgz" integrity sha512-Om9g3kaRNjqiNPAgKwGT16y+ZwtBzRe4ZJFGjLiSs6v5I7TPNF+rRMWuKnR6jq0azQZDj6rblvKFMA49/k48Og== dependencies: "@ethersproject/abi" "^5.6.3" @@ -9218,7 +9653,7 @@ web3-eth-abi@1.8.2: web3-eth-accounts@1.8.2: version "1.8.2" - resolved "https://registry.yarnpkg.com/web3-eth-accounts/-/web3-eth-accounts-1.8.2.tgz#b894f5d5158fcae429da42de75d96520d0712971" + resolved "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.8.2.tgz" integrity sha512-c367Ij63VCz9YdyjiHHWLFtN85l6QghgwMQH2B1eM/p9Y5lTlTX7t/Eg/8+f1yoIStXbk2w/PYM2lk+IkbqdLA== dependencies: "@ethereumjs/common" "2.5.0" @@ -9234,7 +9669,7 @@ web3-eth-accounts@1.8.2: web3-eth-contract@1.8.2: version "1.8.2" - resolved "https://registry.yarnpkg.com/web3-eth-contract/-/web3-eth-contract-1.8.2.tgz#5388b7130923d2b790c09a420391a81312a867fb" + resolved "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.8.2.tgz" integrity sha512-ID5A25tHTSBNwOPjiXSVzxruz006ULRIDbzWTYIFTp7NJ7vXu/kynKK2ag/ObuTqBpMbobP8nXcA9b5EDkIdQA== dependencies: "@types/bn.js" "^5.1.0" @@ -9248,7 +9683,7 @@ web3-eth-contract@1.8.2: web3-eth-ens@1.8.2: version "1.8.2" - resolved "https://registry.yarnpkg.com/web3-eth-ens/-/web3-eth-ens-1.8.2.tgz#0a086ad4d919102e28b9fd3036df246add9df22a" + resolved "https://registry.npmjs.org/web3-eth-ens/-/web3-eth-ens-1.8.2.tgz" integrity sha512-PWph7C/CnqdWuu1+SH4U4zdrK4t2HNt0I4XzPYFdv9ugE8EuojselioPQXsVGvjql+Nt3jDLvQvggPqlMbvwRw== dependencies: content-hash "^2.5.2" @@ -9260,9 +9695,17 @@ web3-eth-ens@1.8.2: web3-eth-contract "1.8.2" web3-utils "1.8.2" +web3-eth-iban@1.10.3: + version "1.10.3" + resolved "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.10.3.tgz" + integrity sha512-ZCfOjYKAjaX2TGI8uif5ah+J3BYFuo+47JOIV1RIz2l7kD9VfnxvRH5UiQDRyMALQC7KFd2hUqIEtHklapNyKA== + dependencies: + bn.js "^5.2.1" + web3-utils "1.10.3" + web3-eth-iban@1.8.2: version "1.8.2" - resolved "https://registry.yarnpkg.com/web3-eth-iban/-/web3-eth-iban-1.8.2.tgz#5cb3022234b13986f086353b53f0379a881feeaf" + resolved "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.8.2.tgz" integrity sha512-h3vNblDWkWMuYx93Q27TAJz6lhzpP93EiC3+45D6xoz983p6si773vntoQ+H+5aZhwglBtoiBzdh7PSSOnP/xQ== dependencies: bn.js "^5.2.1" @@ -9270,7 +9713,7 @@ web3-eth-iban@1.8.2: web3-eth-personal@1.8.2: version "1.8.2" - resolved "https://registry.yarnpkg.com/web3-eth-personal/-/web3-eth-personal-1.8.2.tgz#3526c1ebaa4e7bf3a0a8ec77e34f067cc9a750b2" + resolved "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.8.2.tgz" integrity sha512-Vg4HfwCr7doiUF/RC+Jz0wT4+cYaXcOWMAW2AHIjHX6Z7Xwa8nrURIeQgeEE62qcEHAzajyAdB1u6bJyTfuCXw== dependencies: "@types/node" "^12.12.6" @@ -9282,7 +9725,7 @@ web3-eth-personal@1.8.2: web3-eth@1.8.2: version "1.8.2" - resolved "https://registry.yarnpkg.com/web3-eth/-/web3-eth-1.8.2.tgz#8562287ae1803c30eb54dc7d832092e5739ce06a" + resolved "https://registry.npmjs.org/web3-eth/-/web3-eth-1.8.2.tgz" integrity sha512-JoTiWWc4F4TInpbvDUGb0WgDYJsFhuIjJlinc5ByjWD88Gvh+GKLsRjjFdbqe5YtwIGT4NymwoC5LQd1K6u/QQ== dependencies: web3-core "1.8.2" @@ -9300,7 +9743,7 @@ web3-eth@1.8.2: web3-net@1.8.2: version "1.8.2" - resolved "https://registry.yarnpkg.com/web3-net/-/web3-net-1.8.2.tgz#97e1e0015fabc4cda31017813e98d0b5468dd04f" + resolved "https://registry.npmjs.org/web3-net/-/web3-net-1.8.2.tgz" integrity sha512-1itkDMGmbgb83Dg9nporFes9/fxsU7smJ3oRXlFkg4ZHn8YJyP1MSQFPJWWwSc+GrcCFt4O5IrUTvEkHqE3xag== dependencies: web3-core "1.8.2" @@ -9309,7 +9752,7 @@ web3-net@1.8.2: web3-providers-http@1.8.2: version "1.8.2" - resolved "https://registry.yarnpkg.com/web3-providers-http/-/web3-providers-http-1.8.2.tgz#fbda3a3bbc8db004af36e91bec35f80273b37885" + resolved "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.8.2.tgz" integrity sha512-2xY94IIEQd16+b+vIBF4IC1p7GVaz9q4EUFscvMUjtEq4ru4Atdzjs9GP+jmcoo49p70II0UV3bqQcz0TQfVyQ== dependencies: abortcontroller-polyfill "^1.7.3" @@ -9319,7 +9762,7 @@ web3-providers-http@1.8.2: web3-providers-ipc@1.8.2: version "1.8.2" - resolved "https://registry.yarnpkg.com/web3-providers-ipc/-/web3-providers-ipc-1.8.2.tgz#e52a7250f40c83b99a2482ec5b4cf2728377ae5c" + resolved "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.8.2.tgz" integrity sha512-p6fqKVGFg+WiXGHWnB1hu43PbvPkDHTz4RgoEzbXugv5rtv5zfYLqm8Ba6lrJOS5ks9kGKR21a0y3NzE3u7V4w== dependencies: oboe "2.1.5" @@ -9327,7 +9770,7 @@ web3-providers-ipc@1.8.2: web3-providers-ws@1.8.2: version "1.8.2" - resolved "https://registry.yarnpkg.com/web3-providers-ws/-/web3-providers-ws-1.8.2.tgz#56a2b701387011aca9154ca4bc06ea4b5f27e4ef" + resolved "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.8.2.tgz" integrity sha512-3s/4K+wHgbiN+Zrp9YjMq2eqAF6QGABw7wFftPdx+m5hWImV27/MoIx57c6HffNRqZXmCHnfWWFCNHHsi7wXnA== dependencies: eventemitter3 "4.0.4" @@ -9336,7 +9779,7 @@ web3-providers-ws@1.8.2: web3-shh@1.8.2: version "1.8.2" - resolved "https://registry.yarnpkg.com/web3-shh/-/web3-shh-1.8.2.tgz#217a417f0d6e243dd4d441848ffc2bd164cea8a0" + resolved "https://registry.npmjs.org/web3-shh/-/web3-shh-1.8.2.tgz" integrity sha512-uZ+3MAoNcaJsXXNCDnizKJ5viBNeHOFYsCbFhV755Uu52FswzTOw6DtE7yK9nYXMtIhiSgi7nwl1RYzP8pystw== dependencies: web3-core "1.8.2" @@ -9344,9 +9787,23 @@ web3-shh@1.8.2: web3-core-subscriptions "1.8.2" web3-net "1.8.2" -web3-utils@1.8.2, web3-utils@^1.0.0-beta.31, web3-utils@^1.3.6: +web3-utils@^1.0.0-beta.31, web3-utils@^1.3.6, web3-utils@1.10.3: + version "1.10.3" + resolved "https://registry.npmjs.org/web3-utils/-/web3-utils-1.10.3.tgz" + integrity sha512-OqcUrEE16fDBbGoQtZXWdavsPzbGIDc5v3VrRTZ0XrIpefC/viZ1ZU9bGEemazyS0catk/3rkOOxpzTfY+XsyQ== + dependencies: + "@ethereumjs/util" "^8.1.0" + bn.js "^5.2.1" + ethereum-bloom-filters "^1.0.6" + ethereum-cryptography "^2.1.2" + ethjs-unit "0.1.6" + number-to-bn "1.7.0" + randombytes "^2.1.0" + utf8 "3.0.0" + +web3-utils@^1.2.1, web3-utils@1.8.2: version "1.8.2" - resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.8.2.tgz#c32dec5e9b955acbab220eefd7715bc540b75cc9" + resolved "https://registry.npmjs.org/web3-utils/-/web3-utils-1.8.2.tgz" integrity sha512-v7j6xhfLQfY7xQDrUP0BKbaNrmZ2/+egbqP9q3KYmOiPpnvAfol+32slgL0WX/5n8VPvKCK5EZ1HGrAVICSToA== dependencies: bn.js "^5.2.1" @@ -9357,20 +9814,20 @@ web3-utils@1.8.2, web3-utils@^1.0.0-beta.31, web3-utils@^1.3.6: randombytes "^2.1.0" utf8 "3.0.0" -web3@0.20.6: - version "0.20.6" - resolved "https://registry.yarnpkg.com/web3/-/web3-0.20.6.tgz#3e97306ae024fb24e10a3d75c884302562215120" - integrity sha512-diON1+Y8sPQ33htuTMZfyo+qlsmCBSYwi+MVTRneS8anqZUaTrGaBkTpPkPUvfX1X+NK+Y2spLaaei3HfXeSuw== +web3@^0.20.0: + version "0.20.7" + resolved "https://registry.npmjs.org/web3/-/web3-0.20.7.tgz" + integrity sha512-VU6/DSUX93d1fCzBz7WP/SGCQizO1rKZi4Px9j/3yRyfssHyFcZamMw2/sj4E8TlfMXONvZLoforR8B4bRoyTQ== dependencies: bignumber.js "git+https://github.com/frozeman/bignumber.js-nolookahead.git" crypto-js "^3.1.4" utf8 "^2.1.1" - xhr2 "*" + xhr2-cookies "^1.1.0" xmlhttprequest "*" -web3@1.8.2, web3@^1.0.0-beta.34, web3@^1.0.0-beta.36: +web3@^1.0.0-beta.34: version "1.8.2" - resolved "https://registry.yarnpkg.com/web3/-/web3-1.8.2.tgz#95a4e5398fd0f01325264bf8e5e8cdc69a7afe86" + resolved "https://registry.npmjs.org/web3/-/web3-1.8.2.tgz" integrity sha512-92h0GdEHW9wqDICQQKyG4foZBYi0OQkyg4CRml2F7XBl/NG+fu9o6J19kzfFXzSBoA4DnJXbyRgj/RHZv5LRiw== dependencies: web3-bzz "1.8.2" @@ -9381,25 +9838,51 @@ web3@1.8.2, web3@^1.0.0-beta.34, web3@^1.0.0-beta.36: web3-shh "1.8.2" web3-utils "1.8.2" -web3@^0.20.0: - version "0.20.7" - resolved "https://registry.yarnpkg.com/web3/-/web3-0.20.7.tgz#1605e6d81399ed6f85a471a4f3da0c8be57df2f7" - integrity sha512-VU6/DSUX93d1fCzBz7WP/SGCQizO1rKZi4Px9j/3yRyfssHyFcZamMw2/sj4E8TlfMXONvZLoforR8B4bRoyTQ== +web3@^1.0.0-beta.36, web3@^1.2.1: + version "1.8.2" + resolved "https://registry.npmjs.org/web3/-/web3-1.8.2.tgz" + integrity sha512-92h0GdEHW9wqDICQQKyG4foZBYi0OQkyg4CRml2F7XBl/NG+fu9o6J19kzfFXzSBoA4DnJXbyRgj/RHZv5LRiw== + dependencies: + web3-bzz "1.8.2" + web3-core "1.8.2" + web3-eth "1.8.2" + web3-eth-personal "1.8.2" + web3-net "1.8.2" + web3-shh "1.8.2" + web3-utils "1.8.2" + +web3@0.20.6: + version "0.20.6" + resolved "https://registry.npmjs.org/web3/-/web3-0.20.6.tgz" + integrity sha512-diON1+Y8sPQ33htuTMZfyo+qlsmCBSYwi+MVTRneS8anqZUaTrGaBkTpPkPUvfX1X+NK+Y2spLaaei3HfXeSuw== dependencies: bignumber.js "git+https://github.com/frozeman/bignumber.js-nolookahead.git" crypto-js "^3.1.4" utf8 "^2.1.1" - xhr2-cookies "^1.1.0" + xhr2 "*" xmlhttprequest "*" +web3@1.8.2: + version "1.8.2" + resolved "https://registry.npmjs.org/web3/-/web3-1.8.2.tgz" + integrity sha512-92h0GdEHW9wqDICQQKyG4foZBYi0OQkyg4CRml2F7XBl/NG+fu9o6J19kzfFXzSBoA4DnJXbyRgj/RHZv5LRiw== + dependencies: + web3-bzz "1.8.2" + web3-core "1.8.2" + web3-eth "1.8.2" + web3-eth-personal "1.8.2" + web3-net "1.8.2" + web3-shh "1.8.2" + web3-utils "1.8.2" + webidl-conversions@^3.0.0: version "3.0.1" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" + resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz" integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== websocket@^1.0.32: version "1.0.34" - resolved "https://registry.yarnpkg.com/websocket/-/websocket-1.0.34.tgz#2bdc2602c08bf2c82253b730655c0ef7dcab3111" + resolved "https://registry.npmjs.org/websocket/-/websocket-1.0.34.tgz" integrity sha512-PRDso2sGwF6kM75QykIesBijKSVceR6jL2G8NGYyq2XrItNC2P5/qL5XeR056GhA+Ly7JMFvJb9I312mJfmqnQ== dependencies: bufferutil "^4.0.1" @@ -9411,7 +9894,7 @@ websocket@^1.0.32: whatwg-url@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" + resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz" integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== dependencies: tr46 "~0.0.3" @@ -9419,7 +9902,7 @@ whatwg-url@^5.0.0: which-boxed-primitive@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" + resolved "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz" integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== dependencies: is-bigint "^1.0.1" @@ -9430,17 +9913,17 @@ which-boxed-primitive@^1.0.2: which-module@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f" + resolved "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz" integrity sha512-F6+WgncZi/mJDrammbTuHe1q0R5hOXv/mBaiNA2TCNT/LTHusX0V+CJnj9XT8ki5ln2UZyyddDgHfCzyrOH7MQ== which-module@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" + resolved "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz" integrity sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q== which-pm@2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/which-pm/-/which-pm-2.0.0.tgz#8245609ecfe64bf751d0eef2f376d83bf1ddb7ae" + resolved "https://registry.npmjs.org/which-pm/-/which-pm-2.0.0.tgz" integrity sha512-Lhs9Pmyph0p5n5Z3mVnN0yWcbQYUAD7rbQUiMsQxOJ3T57k7RFe35SUwWMf7dsbDZks1uOmw4AecB/JMDj3v/w== dependencies: load-yaml-file "^0.2.0" @@ -9448,7 +9931,7 @@ which-pm@2.0.0: which-typed-array@^1.1.2, which-typed-array@^1.1.9: version "1.1.9" - resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.9.tgz#307cf898025848cf995e795e8423c7f337efbde6" + resolved "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz" integrity sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA== dependencies: available-typed-arrays "^1.0.5" @@ -9458,45 +9941,66 @@ which-typed-array@^1.1.2, which-typed-array@^1.1.9: has-tostringtag "^1.0.0" is-typed-array "^1.1.10" -which@1.3.1, which@^1.1.1, which@^1.2.9, which@^1.3.1: +which@^1.1.1: + version "1.3.1" + resolved "https://registry.npmjs.org/which/-/which-1.3.1.tgz" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== + dependencies: + isexe "^2.0.0" + +which@^1.2.9: + version "1.3.1" + resolved "https://registry.npmjs.org/which/-/which-1.3.1.tgz" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== + dependencies: + isexe "^2.0.0" + +which@^1.3.1: version "1.3.1" - resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + resolved "https://registry.npmjs.org/which/-/which-1.3.1.tgz" integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== dependencies: isexe "^2.0.0" which@^2.0.1: version "2.0.2" - resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz" integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== dependencies: isexe "^2.0.0" +which@1.3.1: + version "1.3.1" + resolved "https://registry.npmjs.org/which/-/which-1.3.1.tgz" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== + dependencies: + isexe "^2.0.0" + wide-align@1.1.3: version "1.1.3" - resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" + resolved "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz" integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== dependencies: string-width "^1.0.2 || 2" window-size@^0.2.0: version "0.2.0" - resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.2.0.tgz#b4315bb4214a3d7058ebeee892e13fa24d98b075" + resolved "https://registry.npmjs.org/window-size/-/window-size-0.2.0.tgz" integrity sha512-UD7d8HFA2+PZsbKyaOCEy8gMh1oDtHgJh1LfgjQ4zVXmYjAT/kvz3PueITKuqDiIXQe7yzpPnxX3lNc+AhQMyw== word-wrap@^1.2.3, word-wrap@~1.2.3: version "1.2.3" - resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" + resolved "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz" integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== wordwrap@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" + resolved "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz" integrity sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q== wordwrapjs@^4.0.0: version "4.0.1" - resolved "https://registry.yarnpkg.com/wordwrapjs/-/wordwrapjs-4.0.1.tgz#d9790bccfb110a0fc7836b5ebce0937b37a8b98f" + resolved "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-4.0.1.tgz" integrity sha512-kKlNACbvHrkpIw6oPeYDSmdCTu2hdMHoyXLTcUKala++lx5Y+wjJ/e474Jqv5abnVmwxw08DiTuHmw69lJGksA== dependencies: reduce-flatten "^2.0.0" @@ -9504,12 +10008,12 @@ wordwrapjs@^4.0.0: workerpool@6.2.1: version "6.2.1" - resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.2.1.tgz#46fc150c17d826b86a008e5a4508656777e9c343" + resolved "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz" integrity sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw== wrap-ansi@^2.0.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" + resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz" integrity sha512-vAaEaDM946gbNpH5pLVNR+vX2ht6n0Bt3GXwVB1AuAqZosOvHNF3P7wDnh8KLkSqgUh0uh77le7Owgoz+Z9XBw== dependencies: string-width "^1.0.1" @@ -9517,7 +10021,7 @@ wrap-ansi@^2.0.0: wrap-ansi@^5.1.0: version "5.1.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" + resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz" integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q== dependencies: ansi-styles "^3.2.0" @@ -9526,7 +10030,7 @@ wrap-ansi@^5.1.0: wrap-ansi@^6.2.0: version "6.2.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" + resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz" integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== dependencies: ansi-styles "^4.0.0" @@ -9535,7 +10039,7 @@ wrap-ansi@^6.2.0: wrap-ansi@^7.0.0: version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== dependencies: ansi-styles "^4.0.0" @@ -9544,12 +10048,12 @@ wrap-ansi@^7.0.0: wrappy@1: version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== write-file-atomic@^3.0.0: version "3.0.3" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8" + resolved "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz" integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q== dependencies: imurmurhash "^0.1.4" @@ -9557,14 +10061,9 @@ write-file-atomic@^3.0.0: signal-exit "^3.0.2" typedarray-to-buffer "^3.1.5" -ws@7.4.6: - version "7.4.6" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.6.tgz#5654ca8ecdeee47c33a9a4bf6d28e2be2980377c" - integrity sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A== - ws@^3.0.0: version "3.3.3" - resolved "https://registry.yarnpkg.com/ws/-/ws-3.3.3.tgz#f1cf84fe2d5e901ebce94efaece785f187a228f2" + resolved "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz" integrity sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA== dependencies: async-limiter "~1.0.0" @@ -9573,12 +10072,17 @@ ws@^3.0.0: ws@^7.4.6: version "7.5.9" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591" + resolved "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz" integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== +ws@7.4.6: + version "7.4.6" + resolved "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz" + integrity sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A== + wsrun@^5.2.2: version "5.2.4" - resolved "https://registry.yarnpkg.com/wsrun/-/wsrun-5.2.4.tgz#6eb6c3ccd3327721a8df073a5e3578fb0dea494e" + resolved "https://registry.npmjs.org/wsrun/-/wsrun-5.2.4.tgz" integrity sha512-akv3WtKBohdHsD/5uqhYRHw6GXeCXe87FsSg28Szq+2cpoqRW2SY4yPfm1D0za1cS6MgNy5hPgzS5SqYJaGUxg== dependencies: bluebird "^3.5.1" @@ -9593,14 +10097,14 @@ wsrun@^5.2.2: xhr-request-promise@^0.1.2: version "0.1.3" - resolved "https://registry.yarnpkg.com/xhr-request-promise/-/xhr-request-promise-0.1.3.tgz#2d5f4b16d8c6c893be97f1a62b0ed4cf3ca5f96c" + resolved "https://registry.npmjs.org/xhr-request-promise/-/xhr-request-promise-0.1.3.tgz" integrity sha512-YUBytBsuwgitWtdRzXDDkWAXzhdGB8bYm0sSzMPZT7Z2MBjMSTHFsyCT1yCRATY+XC69DUrQraRAEgcoCRaIPg== dependencies: xhr-request "^1.1.0" xhr-request@^1.0.1, xhr-request@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/xhr-request/-/xhr-request-1.1.0.tgz#f4a7c1868b9f198723444d82dcae317643f2e2ed" + resolved "https://registry.npmjs.org/xhr-request/-/xhr-request-1.1.0.tgz" integrity sha512-Y7qzEaR3FDtL3fP30k9wO/e+FBnBByZeybKOhASsGP30NIkRAAkKD/sCnLvgEfAIEC1rcmK7YG8f4oEnIrrWzA== dependencies: buffer-to-arraybuffer "^0.0.5" @@ -9611,89 +10115,92 @@ xhr-request@^1.0.1, xhr-request@^1.1.0: url-set-query "^1.0.0" xhr "^2.0.4" +xhr@^2.0.4, xhr@^2.3.3: + version "2.6.0" + resolved "https://registry.npmjs.org/xhr/-/xhr-2.6.0.tgz" + integrity sha512-/eCGLb5rxjx5e3mF1A7s+pLlR6CGyqWN91fv1JgER5mVWg1MZmlhBvy9kjcsOdRk8RrIujotWyJamfyrp+WIcA== + dependencies: + global "~4.4.0" + is-function "^1.0.1" + parse-headers "^2.0.0" + xtend "^4.0.0" + xhr2-cookies@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/xhr2-cookies/-/xhr2-cookies-1.1.0.tgz#7d77449d0999197f155cb73b23df72505ed89d48" + resolved "https://registry.npmjs.org/xhr2-cookies/-/xhr2-cookies-1.1.0.tgz" integrity sha512-hjXUA6q+jl/bd8ADHcVfFsSPIf+tyLIjuO9TwJC9WI6JP2zKcS7C+p56I9kCLLsaCiNT035iYvEUUzdEFj/8+g== dependencies: cookiejar "^2.1.1" xhr2@*: version "0.2.1" - resolved "https://registry.yarnpkg.com/xhr2/-/xhr2-0.2.1.tgz#4e73adc4f9cfec9cbd2157f73efdce3a5f108a93" + resolved "https://registry.npmjs.org/xhr2/-/xhr2-0.2.1.tgz" integrity sha512-sID0rrVCqkVNUn8t6xuv9+6FViXjUVXq8H5rWOH2rz9fDNQEd4g0EA2XlcEdJXRz5BMEn4O1pJFdT+z4YHhoWw== -xhr@^2.0.4, xhr@^2.3.3: - version "2.6.0" - resolved "https://registry.yarnpkg.com/xhr/-/xhr-2.6.0.tgz#b69d4395e792b4173d6b7df077f0fc5e4e2b249d" - integrity sha512-/eCGLb5rxjx5e3mF1A7s+pLlR6CGyqWN91fv1JgER5mVWg1MZmlhBvy9kjcsOdRk8RrIujotWyJamfyrp+WIcA== - dependencies: - global "~4.4.0" - is-function "^1.0.1" - parse-headers "^2.0.0" - xtend "^4.0.0" - xmlhttprequest@*, xmlhttprequest@1.8.0: version "1.8.0" - resolved "https://registry.yarnpkg.com/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz#67fe075c5c24fef39f9d65f5f7b7fe75171968fc" + resolved "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz" integrity sha512-58Im/U0mlVBLM38NdZjHyhuMtCqa61469k2YP/AaPbvCoV9aQGUpbJBj1QRm2ytRiVQBD/fsw7L2bJGDVQswBA== xtend@^4.0.0: version "4.0.2" - resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" + resolved "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz" integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== y18n@^3.2.1: version "3.2.2" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.2.tgz#85c901bd6470ce71fc4bb723ad209b70f7f28696" + resolved "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz" integrity sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ== y18n@^4.0.0: version "4.0.3" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf" + resolved "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz" integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ== y18n@^5.0.5: version "5.0.8" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" + resolved "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz" integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== yaeti@^0.0.6: version "0.0.6" - resolved "https://registry.yarnpkg.com/yaeti/-/yaeti-0.0.6.tgz#f26f484d72684cf42bedfb76970aa1608fbf9577" + resolved "https://registry.npmjs.org/yaeti/-/yaeti-0.0.6.tgz" integrity sha512-MvQa//+KcZCUkBTIC9blM+CU9J2GzuTytsOUwf2lidtvkx/6gnEp1QvJv34t9vdjhFmha/mUiNDbN0D0mJWdug== yallist@^2.1.2: version "2.1.2" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" + resolved "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz" integrity sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A== yallist@^3.0.0, yallist@^3.0.2, yallist@^3.1.1: version "3.1.1" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + resolved "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz" integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== yallist@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + resolved "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz" integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== -yargs-parser@13.1.2, yargs-parser@^13.1.0, yargs-parser@^13.1.2: +yargs-parser@^13.1.0: version "13.1.2" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38" + resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz" integrity sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg== dependencies: camelcase "^5.0.0" decamelize "^1.2.0" -yargs-parser@20.2.4: - version "20.2.4" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54" - integrity sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA== +yargs-parser@^13.1.2, yargs-parser@13.1.2: + version "13.1.2" + resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz" + integrity sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" yargs-parser@^18.1.2, yargs-parser@^18.1.3: version "18.1.3" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0" + resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz" integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ== dependencies: camelcase "^5.0.0" @@ -9701,7 +10208,7 @@ yargs-parser@^18.1.2, yargs-parser@^18.1.3: yargs-parser@^2.4.1: version "2.4.1" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-2.4.1.tgz#85568de3cf150ff49fa51825f03a8c880ddcc5c4" + resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-2.4.1.tgz" integrity sha512-9pIKIJhnI5tonzG6OnCFlz/yln8xHYcGl+pn3xR0Vzff0vzN1PbNRaelgfgRUwZ3s4i3jvxT9WhmUGL4whnasA== dependencies: camelcase "^3.0.0" @@ -9709,17 +10216,22 @@ yargs-parser@^2.4.1: yargs-parser@^20.2.2: version "20.2.9" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" + resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz" integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== yargs-parser@^21.1.1: version "21.1.1" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" + resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz" integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== +yargs-parser@20.2.4: + version "20.2.4" + resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz" + integrity sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA== + yargs-unparser@1.6.0: version "1.6.0" - resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-1.6.0.tgz#ef25c2c769ff6bd09e4b0f9d7c605fb27846ea9f" + resolved "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.0.tgz" integrity sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw== dependencies: flat "^4.1.0" @@ -9728,7 +10240,7 @@ yargs-unparser@1.6.0: yargs-unparser@2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-2.0.0.tgz#f131f9226911ae5d9ad38c432fe809366c2325eb" + resolved "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz" integrity sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA== dependencies: camelcase "^6.0.0" @@ -9736,26 +10248,25 @@ yargs-unparser@2.0.0: flat "^5.0.2" is-plain-obj "^2.1.0" -yargs@13.2.4: - version "13.2.4" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.2.4.tgz#0b562b794016eb9651b98bd37acf364aa5d6dc83" - integrity sha512-HG/DWAJa1PAnHT9JAhNa8AbAv3FPaiLzioSjCcmuXXhP8MlpHO5vwls4g4j6n30Z74GVQj8Xa62dWVx1QCGklg== +yargs@^13.0.0: + version "13.3.2" + resolved "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz" + integrity sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw== dependencies: cliui "^5.0.0" find-up "^3.0.0" get-caller-file "^2.0.1" - os-locale "^3.1.0" require-directory "^2.1.1" require-main-filename "^2.0.0" set-blocking "^2.0.0" string-width "^3.0.0" which-module "^2.0.0" y18n "^4.0.0" - yargs-parser "^13.1.0" + yargs-parser "^13.1.2" -yargs@13.3.2, yargs@^13.0.0, yargs@^13.3.0: +yargs@^13.3.0, yargs@13.3.2: version "13.3.2" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd" + resolved "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz" integrity sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw== dependencies: cliui "^5.0.0" @@ -9769,22 +10280,26 @@ yargs@13.3.2, yargs@^13.0.0, yargs@^13.3.0: y18n "^4.0.0" yargs-parser "^13.1.2" -yargs@16.2.0: - version "16.2.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" - integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== +yargs@^15.0.2: + version "15.4.1" + resolved "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz" + integrity sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A== dependencies: - cliui "^7.0.2" - escalade "^3.1.1" - get-caller-file "^2.0.5" + cliui "^6.0.0" + decamelize "^1.2.0" + find-up "^4.1.0" + get-caller-file "^2.0.1" require-directory "^2.1.1" + require-main-filename "^2.0.0" + set-blocking "^2.0.0" string-width "^4.2.0" - y18n "^5.0.5" - yargs-parser "^20.2.2" + which-module "^2.0.0" + y18n "^4.0.0" + yargs-parser "^18.1.2" -yargs@^15.0.2, yargs@^15.1.0: +yargs@^15.1.0: version "15.4.1" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8" + resolved "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz" integrity sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A== dependencies: cliui "^6.0.0" @@ -9801,7 +10316,7 @@ yargs@^15.0.2, yargs@^15.1.0: yargs@^17.1.1: version "17.6.2" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.6.2.tgz#2e23f2944e976339a1ee00f18c77fedee8332541" + resolved "https://registry.npmjs.org/yargs/-/yargs-17.6.2.tgz" integrity sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw== dependencies: cliui "^8.0.1" @@ -9814,7 +10329,7 @@ yargs@^17.1.1: yargs@^4.7.1: version "4.8.1" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-4.8.1.tgz#c0c42924ca4aaa6b0e6da1739dfb216439f9ddc0" + resolved "https://registry.npmjs.org/yargs/-/yargs-4.8.1.tgz" integrity sha512-LqodLrnIDM3IFT+Hf/5sxBnEGECrfdC1uIbgZeJmESCSo4HoCAaKEus8MylXHAkdacGc0ye+Qa+dpkuom8uVYA== dependencies: cliui "^3.2.0" @@ -9832,12 +10347,42 @@ yargs@^4.7.1: y18n "^3.2.1" yargs-parser "^2.4.1" +yargs@13.2.4: + version "13.2.4" + resolved "https://registry.npmjs.org/yargs/-/yargs-13.2.4.tgz" + integrity sha512-HG/DWAJa1PAnHT9JAhNa8AbAv3FPaiLzioSjCcmuXXhP8MlpHO5vwls4g4j6n30Z74GVQj8Xa62dWVx1QCGklg== + dependencies: + cliui "^5.0.0" + find-up "^3.0.0" + get-caller-file "^2.0.1" + os-locale "^3.1.0" + require-directory "^2.1.1" + require-main-filename "^2.0.0" + set-blocking "^2.0.0" + string-width "^3.0.0" + which-module "^2.0.0" + y18n "^4.0.0" + yargs-parser "^13.1.0" + +yargs@16.2.0: + version "16.2.0" + resolved "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz" + integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== + dependencies: + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.0" + y18n "^5.0.5" + yargs-parser "^20.2.2" + yn@3.1.1: version "3.1.1" - resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" + resolved "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz" integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== yocto-queue@^0.1.0: version "0.1.0" - resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz" integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==